Réalisation de la partie mise en marche du moteur :
Afin de derterminer si le moteur doit être en marche ou à l'arrêt, j'ai utilisé une variable mr_ar qui si elle est à 1, indique que le moteur doit fonctionner et à 0, indique que le moteur doit être à l'arrêt.
La mise en marche du moteur se fera donc selon l’organigramme
suivant :
Le code source en assembleur est alors le suivant :
;************************
;******** marche ********
;************************
marche:
ldaa #$01 ;* met 01 ds MR_AR pour indiquer
staa mr_ar ;* que le moteur doit etre en marche
ldaa #$05 ;* met first = 5 pour indiquer attente de
staa first ;* 5 impulsions du capteur avant test de patinage
ldaa #$00 ;* init detect= 0 pour indique
staa detect ;* non detection d'un front sur le capteur
jmp menu ;affiche message d'invite
*********************************************************
*********************************************************
Ce programme n'a en fait était utilisé que pour la partie de tests et peut être utilisé par la suite pour d'autres commandes de moteurs CC.
Les commandes qui le constitue seront utilisées dans les autres sous programmes ayant à démarrer le moteur, comme le programme de position.
Réalisation de la partie mise à l'arrêt du moteur :
La mise à l'arrêt du moteur se fera donc selon l’organigramme suivant :
Le code source en assembleur est alors le suivant :
;************************
;******** arret *********
;************************
arret:
ldaa #$00 ;* met MR_AR = 00 pour indiquer
staa mr_ar ;* que le moteur doit etre a l'arret
ldaa #$00
staa porta ;* met pwm a 0
jmp menu ;* affiche message d'invite
*******************************************************
*******************************************************
Réalisation du programme d'initialisation du sens de rotation :
Le circuit lmd18200 permet de changer le sens de rotation en changeant l'état logique de sa broche 3. C'est cette fonction qu'on va exploiter dans le programme suivant :
Le code source en assembleur est alors le suivant :
;************************
;******** sens **********
;************************
sens:
;ldx #text2 ;* affiche message *****
;jsr transmit ;* "d ou g" *****
jsr receive ;* attent un caractere
ldab comm ;* test
cmpb #'g' ;* si comm = 'g'
beq gauche ;* branche en 'gauche'
ldaa #$00 ;* init sens = droite
staa sensr ;*
staa portb ;* met portb a 00
jmp menu ;* affiche message d'invite
gauche:
ldaa #$01 ;* init sens = gauche
staa sensr ;*
staa portb ;* met portb a 01
jmp menu ;affiche message d'invite
********************************************************
********************************************************
Réalisation programme d'initialisation de la vitesse de rotation :
Ce programme permet de saisir la vitesse de rotation du moteur, en changeant tout simplement la valeur de rpcycl.
L'organigramme du programme est le suivant
:
La conversion ascii/vitesse se fait tout simplement en retirant 30 (hexa) à la valeur ascii du caractère recu. C'est à dire que si on rentre 4 au clavier, sa valeur ascii va être 34 (hexa), alors pour retrouver sa valeur en decimal, on fait 34 - 30 cela nous donne alors la valeur 4 de départ. Cette valeur est sauvegardé dans la variable rpcycl, faisant alors changer le rapport cyclique du signal PWM et donc la vitesse de rotation du moteur.
En fonction de la vitesse qui est entrée, les variables pulseh et pulsel sont initialisées avec les valeurs spécifiques à la vitesse.
( L'utilité de ces variables va être expliquer dans le prochain programme.)
Le code source en assembleur est alors le suivant :
;************************
;******* vitesse ********
;************************
vitesse:
;ldx #text4 ;* affiche message *****
;jsr transmit ;* "entrer une vitesse" *****
jsr receive ;* attend un caractere
ldab comm ;* test
cmpb #$31 ;* si caract < 31 ASCII
blo erreur ;* branche en ERREUR
cmpb #$35 ;* si caract > 35 ASCII
bhi erreur ;* branche en ERREUR1
ldaa #$05 ;* met first = 5 pour indiquer attente de
staa first ;* 5 impulsions du capteur avant test de patinage
ldaa #$00 ;* init detect= 0 pour indique
staa detect ;* non detection d'un front sur le capteur
ldaa comm ;* prend la comm (30 a 35 en ASCII)
suba #$30 ;* retire 30 pour avoir 1 a 5
staa svrpcycl ;* enregistre la new vitesse
staa rpcycl ;* idem
ldaa svrpcycl ;* test si vitesse = 2
cmpa #$02 ;*
beq v2 ;* branche en v2 si vitesse = 2
cmpa #$03 ;*
beq v3 ;* branche en v3 si vitesse = 3
cmpa #$04 ;*
beq v4 ;* branche en v4 si vitesse = 4
ldaa pulseh5 ;*
staa pulseh ;* init le pulseh avec la valeur
staa svpulseh ;* pour la vitesse 5
ldaa pulsel5 ;*
staa pulsel ;* init le pulsel avec la valeur
staa svpulsel ;* pour la vitesse 5
jmp menu ;* affiche message d'invite
v2: ldaa pulseh2 ;*
staa pulseh ;* init le pulseh avec la valeur
staa svpulseh ;* pour la vitesse 2
ldaa pulsel2 ;* init le pulsel avec la valeur
staa pulsel ;* pour la vitesse 2
staa svpulsel ;*
jmp menu ;* affiche message d'invite
v3: ldaa pulseh3 ;*
staa pulseh ;* init le pulseh avec la valeur
staa svpulseh ;* pour la vitesse 3
ldaa pulsel3 ;*
staa pulsel ;* init le pulsel avec la valeur
staa svpulsel ;* pour la vitesse 3
jmp menu ;* affiche message d'invite
v4: ldaa pulseh4 ;*
staa pulseh ;* init le pulseh avec la valeur
staa svpulseh ;* pour la vitesse 4
ldaa pulsel4 ;*
staa pulsel ;* init le pulsel avec la valeur
staa svpulsel ;* pour la vitesse 4
jmp menu ;* affiche message d'invite
erreur:
ldx #text3 ;* affiche message d'erreur
jsr transmit ;* (e4)
jmp menu ;* affiche message d'invite