Il y a actuellement 131 visiteurs
Vendredi 10 Mai 2024
accueilactualitésdossierscomparer les prixtélécharger gratuitement vos logicielsoffres d'emploiforum informatique
Connexion
Créer un compte

Simplification en Basic

Besoin d'aide pour configurer un serveur ? Vous souhaitez obtenir des conseils pour référencer votre site ? Un petit souci pour accéder à votre FTP ? Des soucis de programmation en PHP / ASP / HTML / XHTML / XML / XSLT / CSS / ReactJS / AngularJS / VueJS / CGI / PERL / C / MySQL / PostgreSQL ??? Nous avons peut-être la solution dans ce forum ...

Simplification en Basic

Message le 29 Mar 2008 00:54

Salut !!

Je sais pas si certains pourront m'aider mais je tente ma chance quand même :roll:

Pour mes cours, je dois faire un joli programme en BASIC (oui l'éducation national est en avance sur son temps ...)

J'utilise MicroCode Studio pour ceux que ça intéresse.

Le but du programme est : Lorsque je rentre un code en Hexadécimal, je dois commander 4 relais indépendamment.

Avec sur le même octet :
¤ 4 Premiers bits => Définir quel Relais activer
¤ 4 Derniers bits => Mettre le Relais en position Travail ou Repos
Ce sont des relais bistables

Bref c'est pour expliquer brièvement le programme ;)

Mais mes professeurs me demandent de le simplifier au maximum pour éviter d'avoir un programme trop lourd ...
Et étant un vrai bille en Maths et en Programmation, je me retrouve sacrement coincé ...

Il faut apparemment faire une boucle ou je ne sais quoi de ce genre.

Bref si quelqu'un peut m'aider ce serait super. Si il vous manque quelques chose, je peux tout mettre à disposition évidemment.

Je met mon programme dans le prochain message pour plus de lisibilité !!
Avatar de l'utilisateur
Neptunes
PC-Infopraticien
PC-Infopraticien
 
Messages: 2074
Inscription: 27 Fév 2008 22:28
Localisation: Grenoble et c'est pour la vie !!
 


Message le 29 Mar 2008 00:54

'------------------------------------------
' SORTIE
' commande d'une sortie
' entrée : A (byte) adresse sur le bus I2C
' B (byte) Quartet haut (OFF = 0, ON <> 0) quartet bas (N° du relais 1 à 4)
' sortie : rien
'--------------------------------------------


DEFINE LOADER_USED 1
DEFINE OSC 4


B var byte
Relais var byte


i2cwrite PortC.4,PortC.3, $42, $01, [$00] 'Tout le PortB mis en sortie


while 1 'Initialisation

Relais = B & %00001111 'on fait un ET logique sur les 4 premiers bits pour le N° du relais
B = B & %11110000 'on fait un ET logique sur les 4 derniers bits pour le ON/OFF des relais


If Relais = $01 and B != $00 then 'si Relais 1 et ON Alors
i2cwrite PortC.4, PortC.3, $42, $13, [$01] 'on active le relais 1 au travail
endif
If RELAIS = $01 and B = $00 then 'si Relais 1 et OFF Alors
i2cwrite PortC.4, PortC.3, $42, $13, [$02] 'on active le relais 1 au repos
endif
IF relais = $02 and B != $00 then 'si Relais 2 et ON Alors
i2cwrite PortC.4, PortC.3, $42, $13, [$04] 'on active le relais 2 au travail
endif
if relais = $02 and B = $00 then 'si Relais 2 et OFF Alors
i2cwrite PortC.4, PortC.3, $42, $13, [$08] 'on active le relais 2 au repos
endif
if relais = $04 and B != $00 then 'si Relais 3 et ON Alors
i2cwrite PortC.4, PortC.3, $42, $13, [$10] 'on active le relais 3 au travail
endif
if relais = $04 and B = $00 then 'si Relais 3 et OFF Alors
i2cwrite PortC.4, PortC.3, $42, $13, [$20] 'on active le relais 3 au repos
endif
if relais = $08 and B != $00 then 'si Relais 4 et ON Alors
i2cwrite PortC.4, PortC.3, $42, $13, [$40] 'on active le relais 4 au travail
endif
if relais = $08 and b = $00 then 'si Relais 4 et OFF Alors
i2cwrite PortC.4, PortC.3, $42, $13, [$80] 'on active le relais 4 au repos
endif
pause 500 'On fait une pause de 50ms
i2cwrite PortC.4, PortC.3, $42, $13, [$00] 'On remet tout à Zero

wend
Avatar de l'utilisateur
Neptunes
PC-Infopraticien
PC-Infopraticien
 
Messages: 2074
Inscription: 27 Fév 2008 22:28
Localisation: Grenoble et c'est pour la vie !!
 

Message le 29 Mar 2008 17:18

Je ne connais pas le BASIC (malgré mon âge un peu avancé :) ) mais en algorythmique tout ça c'est super lourd
Neptunes a écrit:If Relais = $01 and B != $00 then 'si Relais 1 et ON Alors
i2cwrite PortC.4, PortC.3, $42, $13, [$01] 'on active le relais 1 au travail
endif
If RELAIS = $01 and B = $00 then 'si Relais 1 et OFF Alors
i2cwrite PortC.4, PortC.3, $42, $13, [$02] 'on active le relais 1 au repos
endif
IF relais = $02 and B != $00 then 'si Relais 2 et ON Alors
i2cwrite PortC.4, PortC.3, $42, $13, [$04] 'on active le relais 2 au travail
endif
if relais = $02 and B = $00 then 'si Relais 2 et OFF Alors
i2cwrite PortC.4, PortC.3, $42, $13, [$08] 'on active le relais 2 au repos
endif
if relais = $04 and B != $00 then 'si Relais 3 et ON Alors
i2cwrite PortC.4, PortC.3, $42, $13, [$10] 'on active le relais 3 au travail
endif
if relais = $04 and B = $00 then 'si Relais 3 et OFF Alors
i2cwrite PortC.4, PortC.3, $42, $13, [$20] 'on active le relais 3 au repos
endif
if relais = $08 and B != $00 then 'si Relais 4 et ON Alors
i2cwrite PortC.4, PortC.3, $42, $13, [$40] 'on active le relais 4 au travail
endif
if relais = $08 and b = $00 then 'si Relais 4 et OFF Alors
i2cwrite PortC.4, PortC.3, $42, $13, [$80] 'on active le relais 4 au repos
endif
pause 500 'On fait une pause de 50ms
i2cwrite PortC.4, PortC.3, $42, $13, [$00] 'On remet tout à Zero

Tu passes dans plein de tests inutilement.
Une première optimisation serait ce genre là (en espérant que la syntaxe est bonne)

Code: Tout sélectionner
If Relais = $01 then
   if B != $00    then          'si Relais 1 et ON Alors
       i2cwrite PortC.4, PortC.3, $42, $13, [$01]   'on active le relais 1 au travail
   else
       i2cwrite PortC.4, PortC.3, $42, $13, [$02]   'on active le relais 1 au repos
    endif
else
    IF relais = $02 then
       if B != $00    then          'si Relais 2 et ON Alors
           i2cwrite PortC.4, PortC.3, $42, $13, [$04]   'on active le relais 2 au travail
       else
           i2cwrite PortC.4, PortC.3, $42, $13, [$08]   'on active le relais 2 au repos 
       endif
    else
       if relais = $04 then
         if B != $00    then          'si Relais 3 et ON Alors
            i2cwrite PortC.4, PortC.3, $42, $13, [$10]   'on active le relais 3 au travail
         else
            i2cwrite PortC.4, PortC.3, $42, $13, [$20]   'on active le relais 3 au repos
         endif
       else
         if relais = $08 then
            if B != $00    then          'si Relais 4 et ON Alors
               i2cwrite PortC.4, PortC.3, $42, $13, [$40]   'on active le relais 4 au travail
            else
               i2cwrite PortC.4, PortC.3, $42, $13, [$80]   'on active le relais 4 au repos
            endif
       endif
    endif
endif

... et s'il existe un "elsif" en BASIC c'est encore mieux.
Avatar de l'utilisateur
CaSa
PC-Infopraticien
PC-Infopraticien
 
Messages: 9041
Inscription: 13 Mai 2003 16:32
Localisation: Sisteron... et jamais loin d'une Debian
 

Message le 29 Mar 2008 18:03

et si dans ta version de basic, tu as la possibiltié de faire des fonctions (ou sub-routines), tu devrais penser a faire quelque chose du genre:

(à traduire en syntaxe basic)

fonction actionRelais ( Relais, action ) {
addresse <-- 0
si (relais = 01 ) alors adresse <-- 01
si (relais = 02 ) alors adresse <-- 04
si (relais = 04 ) alors adresse <-- 10
si (relais = 08 ) alors adresse <-- 40
si ( action != 0 ) alors adresse <-- adresse * 2
i2cwrite portc.4, portc.3, 42, 13, adresse
pause 500
i2cwrite portc.4, portc.3, 42, 13, 0
}


et dans ton code

while(true){
actionRelais( B & %00001111, B & %1111000 )
}
Avatar de l'utilisateur
glenux
PC-Infopraticien
PC-Infopraticien
 
Messages: 2759
Inscription: 01 Mar 2003 16:22
Localisation: Entre deux BarCamps
 

Message le 29 Mar 2008 18:19

Salut !!

Et merci de prendre du temps pour moi :)

Casa je sais que je peux faire un truc de ce genre, et qui est beaucoup mieux que le mien qui est une programmation de bourrin :roll: Mais je sais rien faire d'autre et j'ai pas la logic mentale de la programmation.
Merci à toi ;)

Mais la solution de Glenux est en gros ce que je cherche, un programme moins lourd et tout aussi compréhensible :)

Seulement un truc me chagrine :
si ( B != 0 ) alors adresse <-- adresse * 2

J'ai vraiment le droit de faire ça ?? Multiplier un code Hexa par 2 ?
Avatar de l'utilisateur
Neptunes
PC-Infopraticien
PC-Infopraticien
 
Messages: 2074
Inscription: 27 Fév 2008 22:28
Localisation: Grenoble et c'est pour la vie !!
 

Message le 30 Mar 2008 00:10

Neptunes a écrit:Salut !!
J'ai vraiment le droit de faire ça ?? Multiplier un code Hexa par 2 ?


Et pourquoi pas ?
Avatar de l'utilisateur
glenux
PC-Infopraticien
PC-Infopraticien
 
Messages: 2759
Inscription: 01 Mar 2003 16:22
Localisation: Entre deux BarCamps
 

Message le 30 Mar 2008 00:25

Ben je sais pas moi, ça me serais pas venu à l'idée :D


Merci beaucoup Glenux, je testerais ça mardi quand j'aurais ma carte :)
Avatar de l'utilisateur
Neptunes
PC-Infopraticien
PC-Infopraticien
 
Messages: 2074
Inscription: 27 Fév 2008 22:28
Localisation: Grenoble et c'est pour la vie !!
 



Sujets similaires

Message Basic à l'ancienne
Bonjour !Je vais en faire sourire quelques uns .....Dans les années 80 Eh oui .....Je programmais en basic. J'évoque le basic "basique" (sur disquette bien sûr) et je me débrouillais pas mal pour faire des calculs de machines tournantes.J'en ai la nostalgie. J'ai acquis Visual Basic mais ç ...
Réponses: 5

Message Bac Project 2015 Convertir C++ vers Basic (Cubloc)
Bonjour,Je suis élève de terminale et j'ai un projet par rapport à la gestion du stockage de l'énergie électrique embarquée sur le karting.Voila mon sujet: A partir de mesures adaptées calculer et afficher en temps réel la puissance fournie par la batterie d'accumulateur lors des phases de fonctionn ...
Réponses: 0

Message Problème avec logiciel Visual Basic Express 2010
Bonjour,J'ai un petit problème quand je veux publier mon projet, j'ai des erreurs et je ne comprend pas forcément la raison. (J'ai essayer de mettre a jour mon pc, installer dernière version de Net.Framework, etc... rien a faire).Sur la photo c'est juste un test, ce n'est pas mon projet mais étant d ...
Réponses: 0

Message probleme visual basic
Bonjour,Il est possible de tester une conversion à même la conversion pour éviter les erreurs.Code: Tout sélectionnerDim Chaine As String = "9999H9999"Dim Nombre As Double = 0If (Double.TryParse(Chaine, Nombre)) Then   MsgBox(Nombre.ToString)Else   MsgBox("la chain ...
Réponses: 2

Message Virtual Basic (code(s))
Bonjour, j'ai créé mon navigateur web avec VB et j'aimerais savoir quel est le code pour que quand on appuie sur un bouton, sa emmène au site web que j'aurais assigné. Merci
Réponses: 1

Message Problème de réinstallation windows vista basic
Bonjour, J'ai voulu réinstaller windows vista basic après un soucis de mise a jour . J'ai alors inséré le disque puis redémarré l'ordinateur , et j'ai choisit de démarrer avec le disque . Ensuite j'ai suivi les indications et j'ai cliqué sur installer windows vista basic . Tout se déroulait bien jus ...
Réponses: 5

Message cd vista basic
Bonjour à tous, M' a question est celle d'un débutant sur pc et vista basic. J'ai achetté un pc dejà équipé ,mais livré sans cd. J'aimerai savoir comment je peut obtenir une copie de vista home basic,pour éventuellement réparer le systeme en cas de coup dur sachant qu'évidement je possede la licenc ...
Réponses: 3


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités


.: Nous contacter :: Flux RSS :: Données personnelles :.