5-3) Réalisation du programme de contrôle du moteur :
Comme je l’ai expliqué précédemment, pour la réalisation du programme de contrôle du moteur, j’utilise une carte d’émulation avec son compilateur correspondant.
Les commandes et la adresses ne seront donc vrais que pour ce compilateur.
Avant toute chose, il faut un programme principal, affichant un menu et renvoyant alors aux sous-programmes correspondants à notre choix.
Il faut ensuite générer un signal a rapport cyclique variable (PWM), afin des commander la vitesse du moteur. Il faut également générer les signaux afin de choisir le sens de rotation du moteur et ainsi que pour l’arrêter. Il faudra avoir la possibilité de choisir une position (un angle) à atteindre et détecter lorsque la position est atteinte, via le capteur de position et le capteur de début de course.
Réalisation du programme principal :
Le programme principal doit veiller à suivre les caractéristiques de l’organigramme suivant :
Le code source en assembleur est alors le suivant :
(pour les initialisations des variables, voir annexe 3)
;*********************************
;******* programme principal *******
;*********************************
org $c150
cli ;* autorise les interruptions
ldaa #$FC ;* init du portc
staa iniportc ;* avec b0-b1 in, le reste out
ldaa #$00 ;* init portb
staa portb ;* a 00
ldaa #$30 ;* init BAUD
staa baud ;* a 9600
ldaa #$00 ;* init SCCR1
staa sccr1 ;* pour 8bits de data
ldaa #$0c ;* init SCCR2 pour
staa sccr2 ;* transmit & receive enables
ldaa #$80 ;* init OPTION pour
staa option ;* conv A/D on et clock interne
ldaa #$01 ;* init ADCTL pour conv unique,
staa adctl ;* single channel et utilisation de PE1
ldaa #$00 ;* init TMSK2 pour interrupt disable
staa tmsk2 ;* (interrupt qd un front montant sur pulse accu)
ldaa #$00 ;* init a 00 le contenu du registre
staa pacnt ;* du pulse accu PACNT
ldaa #$40 ;* init interrupt
staa oc2i ;* pour OC2I actif
ldaa #$00 ;* init non changement
staa tctl1 ;* etat de OC2
ldaa subdiv ;* sav de subdiv
staa svsubdiv ;* ds svsubdiv
ldaa rpcycl ;* sav de rpcycl
staa svrpcycl ;* ds svrpcycl
;************************
;******** menu **********
;************************
menu:
;ldx #text ;* envoye le message *****
;jsr transmit ;* d'invite *****
jsr receive ;attend entre d'une commande
ldab comm ;test
cmpb #'m' ;si comm = 'm'
beq marche ;branche en 'marche'
cmpb #'a' ;si comm ='a'
beq arret ;branche en 'arret'
cmpb #'s' ;si comm = 's'
beq sens ;branche en 'sens'
cmpb #'v' ;si comm = 'v'
beq vitesse ;branche en 'vitesse'
cmpb #'p' ;si comm = 'p'
beq position ;branche en 'position'
cmpb #'i' ;si comm = 'i'
beq initial ;branche en 'initial'
ldx #text3 ;envoye le message
jsr transmit ;d'erreur (e4)
bra menu
initial: jmp initia ;rajoute ici parce qu'il n'existe pas
position: jmp positio ;de commande de branchement longs (>256)
**********************************************************************
**********************************************************************
J’ai dû mettre une résistance de pull down sur la broche du PWM, pour éviter que le moteur parte en vitesse maximum en cas de déconnection du fil.
Pour tous renseignements sur les fonctions des commandes (bra, jsr, beq, staa, ldaa…),
se réferer à la documentation du 68HC11.
Pour toutes les abréviations (init, ds, sav…) se réferer à l’index.