Annexe 3 :
;*******************************************************
;*
Projet: commande d'un moteur CC par LMD18200 *
;*
Conception: Frederic LUROIS (IUT de Cergy-Pontoise) *
;*
Date: 16 juin 1999 *
;*
revision: 1.0 *
;* Copyright 1999 College Shawinigan
*
;*
Tous droits reserves *
;*******************************************************
;*******************************************************************
;*
ATTENTION !! Certaines adresses dans le programme sont valables *
;*
uniquements pour l'evaluation board M68hc11evb de Motorola. *
;*
Les adresses pour le uC 68hc11 sont notees en commentaires. *
;*******************************************************************
;*******************************************************************
;* les commentaires suivis de "*****"
étaient utilisés pour les *
;* essais du programme sur le terminal de windows
*
;*******************************************************************
;*******************
;*
Registres du uC *
;*******************
porta:
equ $1000 ;***
portb:
equ $1004 ;* location des ports d'entrees/sorties
portc:
equ $1003 ;*
portd:
equ $1008 ;***
iniportc:
equ $1007 ;* reg (DDRC) d'init de
direction du port C
toc2: equ $1018
;* reg de def du timer de OC2 (16bits)
tctl1:
equ $1020 ;* reg de controle des timers
oc2i: equ $1022
;* reg (tmsk1) d'init des interrupt des timers
tflg1:
equ $1023 ;* reg des drapeaux des interrupt des timers
baud: equ $102b
;* reg d'init du debit du port serie (RS232)
sccr1:
equ $102c ;* reg d'init du mode de communication (RS232)
sccr2:
equ $102d ;* reg d'init de transmition/reception (RS232)
scsr: equ $102e
;* reg d'eta du RS232
scdr: equ $102f
;* reg d'emition/reception
option:
equ $1039 ;* reg d'init du CAN
adctl:
equ $1030 ;* reg d'etat/controle
du CAN
adr2: equ $1032 ;* reg de resultat du CAN
pactl1:
equ $1026 ;* reg d'init du pulse
accumulator
tmsk2:
equ $1024 ;* reg d'init des interrupt
d'overflow des timers
tflg2:
equ $1025 ;* reg drapeaux des
interrupt d'overflow des timers
pacnt:
equ $1027 ;* reg de resultat
du pulse accumulator
;******************************
;*
location des interruptions *
;******************************
org $00ca ;* location de l'interrupt du pulse accumulator
jmp $c800 ;* aller en $c700 qd interruption
org $00dc ;* location de l'interrupt du timer OC2
jmp $c600 ;* aller en $c700 qd interruption
;*****************************
;*
Definition des constantes *
;*****************************
org $c000 ;* origine du programme principal
time:
dw 650 ;* frequence de base
pour interrupt de OC2
;***
subdiv:
db 15 ;* determine la subdivision
de t
;* il faut alors vitesse=15
pour avoir
;* un rapport cyclique=100%
;* si Vmax=5 alors rapport
cyclique max=33%
;***
vinit:
db 2 ;* determine la vitesse
d'initialisation
vbas:
db 2 ;* determine la vitesse
pour un impat < 5 degres
degconv:
dw 120 ;* valeur de conversion
degres/nombre d'impulsions
pulseh2:
db 150 ;* correction du signal
du capteur1 en vitesse 2
pulsel2:
db 82 ;* idem
pulseh3:
db 10 ;* correction du signal
du capteur1 en vitesse 3
pulsel3:
db 4 ;* idem
pulseh4:
db 10 ;* correction du signal
du capteur1 en vitesse 4
pulsel4:
db 4 ;* idem
pulseh5:
db 10 ;* correction du signal
du capteur1 en vitesse 5
pulsel5:
db 4 ;* idem
Imax2:
db 175 ;* valeur pour Imax
en vitesse 2
Imax3:
db 245 ;* valeur pour Imax
en vitesse 3
Imax4:
db 245 ;* valeur pour Imax
en vitesse 4
Imax5:
db 200 ;* valeur pour Imax
en vitesse 5
tptemp:
db 100 ;* tempo de boucle de
test de temperature
tpimax:
db 50 ;* tempo de boucle de
test de Imax
tpinit:
db 200 ;* valeur de tempo de boucle
d'attente pour l'init
first:
db 5 ;* valeur indiquant
d'attendre les 5 premieres impulsions
;* avant test de patinage du moteur
;*****************************
;*
Definition des variables *
;*****************************
mr_ar:
db 0 ;* var pour indiquer
marche/arret du moteur
sensr:
db 0 ;* var indiquant sens
de rotation
rpcycl:
db 0 ;* var pour rapport
cyclique de PWM
Imax:
db 0 ;* var pour test de
Imax
svsensr:
db 0 ;* var de sauvegarde
de sensr
svsubdiv:
db 0 ;* var de sauvegarde de
subdiv
svrpcycl:
db 0 ;* var de sauvegarde de
rpcycl
svtptemp:
db 100 ;* var de sauvegarde de
tptemp
svtpimax:
db 50 ;* var de sauvegarde de
tpimax
vsav:
db 0 ;* var de sauvegarde
de la vitesse
pulseh:
db 0 ;* var de correction
du signal du capteur1
pulsel:
db 0 ;* idem
svpulseh:
db 0 ;* var de sauvegarde de
pulseh
svpulsel:
db 0 ;* var de sauvegarde de
pulsel
nbchiffr:
db 3 ;* var du nombre de chiffres
de l'angle
cvangle:
db 0 ;* var utilisee pour
conversion en hexa de l'angle
impat:
dw 00 ;* var du nbre d'impulsions
atteintes
svimpat:
dw 00 ;* var de sauvegarde
de impat
deg:
dw 00 ;* nombre de degres
atteints
svdeg:
dw 00 ;* var de sauvegarde
de deg
impdeg:
dw 00 ;* resultat de convertion de deg en nbre d'impulsions
pos:
dw 00 ;* var determinant
la position a atteindre
svposdeg:
dw 00 ;* var de sauvegarde de
pos en degres
svposimp:
dw 00 ;* var de sauvegarde de
pos en nbre d'impulsions
intl: db 0
detect: db 0
timing: dw 0
timing1: dw 0
timing2: dw 0
initm: db 0
;***************************************
;* Definition des messages a afficher
*
;***************************************
comm: db 0
db $0d,$0a
db 04
comm2: db 0
db 04
db 0
db 04
db 0
db $0d,$0a
db 04
text: db $0d,$0a
db 'Entrer une commande (m,a,s,v,p,i)'
db $0d,$0a
db 04
text2:
db 'd ou g ?'
db $0d,$0a
db 04
text3: db 'e' ;* 'erreur !!' *****
;* db $0d,$0a *****
db '4' ;* db 'Entrer une commande valide'
*****
;* db $0d,$0a *****
db 04
text4: db $0d,$0a
db 'Entrer une vitesse (1-5)'
db $0d,$0a
db 04
text5: db 'e' ;* db 'temperature trop elevee !!'
*****
db '1' ;*
db $0d,$0a *****
db 04
text6:
db 'e' ;* db 'courant ds
moteur trop eleve !!' *****
db '2' ;*
db $0d,$0a *****
db 04
text7:
db 'p' ;* 'position atteinte
!!' *****
;* db $0d,$0a *****
db 04
text8:
db 'entrer un angle (0-360)'
db $0d,$0a
db 04
text9:
db 'e' ;* db 'moteur patine'
*****
db '3' ;* db $0d,$0a
*****
db 04
textinit:
db 'i'
db 04
;*********************************
;***** 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'1 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)
;************************
;********
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
;************************
;********
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
;************************
;********
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
;************************
;*******
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
;************************
;*******
position *******
;************************
positio:
ldaa svrpcycl ;* sav de la vitesse
staa vsav ;*
ldd impat ;* sav du nombre d'impulsions
std svimpat ;* atteintes
;ldx #text2 ;* affiche message
;jsr transmit ;* "d ou g"
jsr receive ;* attend 1 caract
pos_bcl1:
;ldx #text8 ;* affiche message
;jsr transmit ;* "entrer un angle"
jsr receive2 ;* attend 3 chiffres
ldaa #$00 ;* met le pulse accumulator
staa pacnt ;* a 00
jsr conv ;* conversion de comm2
ldd pos ;* sav de la position a atteindre
std svposdeg ;*
ldd pos ;* si l'angle est inferieur
cpd #$05 ;* a 5 degres
bgt pos_bcl2 ;* oblige une certaine vitesse
ldaa vbas ;* init de la vitesse
staa
svrpcycl ;* enregistre la new
vitesse
staa rpcycl ;* idem
pos_bcl2:
ldd pos ;* conversion des degres en nombre
asld ;* d'impulsions
asld
asld
asld
asld
asld
asld
std pos
ldx degconv
ldd pos
idiv
stx pos
stx svposimp
ldd deg
;* sav de deg
std svdeg
;*
ldaa comm ;*
cmpa #'g' ;* branche en pos_bc4 si sens = gauche
beq pos_bcl4 ;*
ldd deg
addd svposdeg
std deg
ldaa #$00 ;* init sens = droite
staa portb ;*
pos_bcl3:
ldd deg ;* conversion des degres en nombre
asld ;* d'impulsions
asld
asld
asld
asld
asld
asld
std impdeg
ldx degconv
ldd impdeg
idiv
stx impdeg
ldd impdeg
subd svimpat
std pos
ldd impat
std svimpat
ldd impat
addd pos
std impat
bra pos_bcl5
pos_bcl4:
ldd deg
subd svposdeg
std deg
ldaa #$01 ;* init sens = gauche
staa portb ;*
ldd deg ;* conversion de degres en
asld ;* nombre d'impulsions
asld
asld
asld
asld
asld
asld
std impdeg
ldx degconv
ldd impdeg
idiv
stx impdeg
ldd svimpat
subd impdeg
std pos
ldd impat
std svimpat
ldd impat
subd pos
std impat
pos_bcl5:
ldd impat ;* test si la position a atteindre
cpd #$180 ;* ne depasse pas 360 degres
bge pos_bcl6
cpd #$00 ;* test si la position a atteindre
bgt pos_bcl7 ;* n'est pas inférieur a 0 degres
pos_bcl6:
ldd #$00
std pos
ldd svdeg
std deg
ldd svimpat
std impat
ldx #text3 ;affiche message
jsr transmit
jmp menu ;affiche message d'invite
pos_bcl7:
ldaa #$50 ;init PACTL pour pulse accu enable
staa pactl1 ;et detection sur front montant
ldaa #$10 ;init TMSK2 pour interrupt enable
staa tmsk2 ;(interrupt qd un front
montant sur pulse accu)
ldaa #$05
staa first
ldaa #$00
staa detect
ldaa #$01 ;met 01 ds MR_AR pour indiquer
staa mr_ar ;que le moteur doit etre en marche
jmp menu ;affiche message
d'invite
;********************************
;******
conv dec ascii/hexa *****
;********************************
conv:
ldx #comm2 ;pointe sur le premier chiffre
ldd #$00 ;init pos
std pos ;a 0000
cv1:
ldaa 0,x ;load le 1er chiffre
suba #$30 ;conv ascii/dec
cmpa #$00 ;si =0
beq cv2 ;branche en cv2
staa cvangle ;charge le 1er chiffre ds cvangle
b1:
ldd #$64 ;ajoute 100 a pos
addd pos ;tant que cvangle <> 0
std pos
dec cvangle
bne b1 ;branche en b1 tant que cvangle <> 0
cv2:
ldaa 2,x ;load le 2eme chiffre
suba #$30 ;conv ascii/dec
cmpa #$00 ;si =0
beq cv3 ;branche en cv3
staa cvangle ;charge le 2eme chiffre ds cvangle
b2:
ldd #$0A ;ajoute 10 a pos
addd pos ;tant que cvangle <> 0
std pos
dec cvangle
bne b2 ;branche en b2 tant que cvangle <> 0
cv3:
ldaa 4,x ;load le 3eme chiffre
suba #$30 ;conv ascii/dec
cmpa #$00 ;si =0
beq fin_conv ;branche en fin_conv
staa cvangle ;charge le 3eme chiffre ds cvangle
b3:
ldd #$01 ;ajoute 1 a pos
addd pos ;tant que cvangle <> 0
std pos
dec cvangle
bne b3 ;branche en b3 tant que cvangle <> 0
fin_conv:
rts ;retour au prog
;**** Subroutine de transmition ****
;**** de caracteres sur RS232 ****
transmit:
test:
ldab scsr ;*
test TDRE=empty
andb #$80 ;* masque pour voir que TDRE
cmpb #$80 ;* test TDRE=1 (=vide)
bne test ;* boucle si non vide
trans:
ldaa 0,x ;* charge caractere
cmpa #$04 ;* test si fin du message
beq end ;* branche en end si fin
staa scdr ;* envoi caractere sur RS232
inx ;* pointe sur caractere suivant
test2:
ldab scsr ;*
test fin transmition
andb #$40 ;* masque de test
cmpb #$40 ;* boucle si transmition
bne test2 ;* non terminee
bra trans
end:
rts ;* retour au prog
;**** Subroutine de reception ****
;**** de caractere sur RS232 ****
receive:
rec_bcl1:
ldab scsr ;test
RDRF
andb #$24 ;pour savoir qd
cmpb #$24 ;un caract arrive sans parasites
beq rec_bcl4 ;branche en rec_bcl4 si parasites
cmpb #$20 ;test aucun caract
bne rec_bcl1 ;branche rec_bcl1 tant que aucun caracteres
ldaa scdr ;copy le caractere
cmpa #$30 ;test si >30
blo rec_bcl1 ;branche en rec_bcl1 si <30
cmpa #$7a ;test si <7a
bhi rec_bcl1 ;branche en rec_bcl1 si >7a
rec_bcl2:
staa comm ;stock a l'addr pointee par comm
rec_bcl3:
;ldx #comm ;indiq quoi afficher
*****
;jsr transmit
;envoi sur RS232 *****
rec_bcl4:
ldaa scdr ;lit caractere qd bruit pour reinitialisation
rts ;retour au prog
;**** Subroutine de reception ****
;********* de l'angle
***********
receive2:
ldx #comm2 ;pointe a l'addr de stockage du 1er chiffre
rc2_bcl1:
ldab scsr ;test
RDRF
andb #$24 ;pour savoir qd
cmpb #$24 ;un caract arrive sans parasites
beq rc2_bcl4 ;branche en rc2_bcl4 si parasites
cmpb #$20 ;test aucun caract
bne rc2_bcl1 ;branche rc2_bcl1 tant que aucun caracteres
ldaa scdr ;copy le caractere
cmpa #$30 ;test si >30
blo rc2_bcl1 ;branche en rc2_bcl1 si <30
cmpa #$39 ;test si <39
bhi rc2_bcl1 ;branche en rc2_bcl1 si >39
rc2_bcl2:
staa 0,x ;stock a l'addr pointee par x
rc2_bcl3:
;jsr transmit ;envoi sur RS232
inx
inx ;incremente x (apres jsr on a deja x=x+1) ca c'est
pu vrai !!!!
dec nbchiffr ;decremente nbchiffr
bne rc2_bcl1 ;branche en rc2_bcl1 tant que nbchiffr <>0
rc2_bcl4:
ldaa scdr ;lit caractere qd bruit pour reinit
ldaa #$03 ;reinit nbchiffr = 3
staa nbchiffr
rts ;retour au prog
;****************************************
;******
init de position du moteur ******
;****************************************
initia:
ldaa #$01
staa initm
ldaa #$00 ;init TMSK2 pour interrupt disable
staa tmsk2 ;(interrupt qd un front montant sur pulse accu)
ldaa svrpcycl ;sav de la vitesse
staa vsav
ldaa sensr ;sav sens de rotation
staa svsensr
ldaa #$01
;met portb a 01
staa sensr
staa portb ;pour sens=gauche
ldaa vinit ;init de la vitesse
staa svrpcycl ;enregistre la new vitesse
staa rpcycl ;idem
ldd impat
cpd #$0000
bne ini_bcl2
ini_bcl1:
ldaa portc
anda #$02
cmpa #$00 ;branche en ini_bcl4 qd capteur
beq ini_bcl4 ;de position active (=00)
ldaa #$05
staa first
ldaa #$00
staa detect
ldaa #$01 ;* met 01 ds MR_AR pour indiquer
staa mr_ar ;* que le moteur doit etre en marche
bra ini_bcl1
ini_bcl2:
ldaa #$05 ;* init pour demarrage du moteur
staa first ;*
ldaa #$00 ;*
idem
staa detect ;*
ldaa #$01 ;* met 01 ds MR_AR pour indiquer
staa mr_ar ;* que le moteur doit etre en marche
ldaa portc
anda #$02
cmpa #$00 ;* branche en ini_bcl2 qd capteur
beq ini_bcl2 ;* de position active (=00)
ini_bcl3:
dec tpinit
beq ini_bcl1
bra ini_bcl3
ini_bcl4:
ldaa #$C8
staa tpinit
ldaa vsav ;* restitution de la vitesse initiale
staa rpcycl
staa svrpcycl
ldaa svsensr ;* restitution du sens de rotation
staa sensr
staa portb
ldx #$00
stx impat
stx deg
ldaa #$00
staa initm
ldx #textinit
jsr transmit
jmp arret
;****************************
;*****
interruption *********
;****************************
org $c600 ;*
program qd interrupt
ldaa #$40 ;* desactive l'execut
staa tflg1 ;* de l'interrupt
;* pour pouvoir sortir
ldaa mr_ar
cmpa #$00 ;* branche en int_bcl1
bne int_bcl1 ;* quand moteur arrete
ldaa #$00
staa porta
jmp finrti ;retour au program
;********
******** ********** *********
int_bcl1:
ldd deg
cpd #350
blt int_bcl2
ldaa portc
anda #$02
cmpa #$00 ;branche en ini_bcl4 qd capteur
bne int_bcl2 ;de position active (=00)
ldd #$00
std pos
int_bcl2:
ldaa initm
beq int_bcl3
jmp int_b2
int_bcl3:
ldaa detect
beq int_bcl7
ldaa #$00
staa detect
ldaa intl
bne int_bcl4
ldd #$00
std timing
bra int_bcl7
int_bcl4: ;* partie detection de patinage
du moteur
ldaa first
beq int_bcl5
dec first
ldd timing
std timing1
;ldaa #$00
;staa first
bra int_bcl7
int_bcl5:
ldd timing1
std timing2
ldd timing
std timing1
ldd timing2
asld
asld
asld
asld
asld
asld
asld
std timing2
ldx #$1a
ldd timing2
idiv
stx timing2
ldd timing1
cpd timing2
bgt
int_bcl6
ldx #$280
ldd timing2
idiv
stx timing2
ldd timing1
cpd timing2
blt int_bcl6
ldd #$00
std timing
bra int_bcl7
int_bcl6:
ldx #text9
jsr transmit
ldaa #$00 ;met 00 ds MR_AR pour indiquer
staa mr_ar ;que le moteur doit etre a l'arret
int_bcl7:
ldx timing
inx
stx timing
;**************** ***** ************* ********** *************
int_bcl8:
ldaa intl
cmpa #$00
beq int_bcl9
ldaa pulsel
beq int_b2
dec pulsel
bne int_b2
ldaa #$50 ;init PACTL pour pulse accu enable
staa pactl1 ;et detection sur front montant
bra int_b1
int_bcl9:
ldaa pulseh
beq int_b2
dec pulseh
bne int_b2
ldaa #$40 ;init PACTL pour pulse accu enable
staa pactl1 ;et detection sur front descendant
int_b1:
ldaa #$10
staa tflg2
ldaa #$10 ;init TMSK2 pour interrupt enable
staa tmsk2 ;(interrupt qd un front montant sur pulse accu)
int_b2:
ldaa svrpcycl ;* init des courants max en fonction
cmpa #$5 ;* de la vitesse de fonctionnement
beq IV5
cmpa #$4
beq IV4
cmpa #$3
beq IV3
cmpa #$2
ldaa Imax2
staa Imax
bra int_b3
IV5:
ldaa Imax5
staa Imax
bra int_b3
IV4:
ldaa Imax4
staa Imax
bra int_b3
IV3:
ldaa Imax3
staa Imax
int_b3:
ldaa #$01
staa adctl
courant:
ldaa adctl
anda #$80
cmpa #$80
bne courant
ldaa adr2
cmpa Imax
blo int_b4
dec tpimax
beq int_b8
bra int_b5
int_b4:
ldaa svtpimax
staa tpimax
;debut du pwm ****************************
int_b5:
ldd toc2 ;*
addd time ;*
ajoute OC2 = OC2 + time
std toc2 ;* enregistre la nouvelle valeur
de OC2
ldaa rpcycl ;* test
cmpa #$00 ;* si rpcycl = 0
beq retour ;* branche en retour
dec subdiv ;* decremente subdiv
beq haut ;* branche en haut si subdiv = 0
dec rpcycl ;* decremente rpcycl
beq bas ;* branche en bas si rpcycl = 0
retour:
ldaa portc ;* verifie temperature flag
anda #$01 ;*
cmpa #$00 ;*
beq int_b6 ;* branche en in_b6 si flag actif
ldaa svtptemp ;* reinit tptemp = svtptemp
staa tptemp ;*
bra finrti ;* retour au program
haut:
ldaa #$40 ;* init pwm = 1
staa porta ;*
ldaa svsubdiv ;* reinit subdiv = svsubdiv
staa subdiv ;*
ldaa svrpcycl ;* reinit rpcycl = svrpcycl
staa rpcycl ;*
bra retour ;* branche en retour
bas:
ldaa #$00 ;* init pwm = 0
staa porta ;*
ldaa svrpcycl ;* reinit rpcycl = svrpcycl
staa rpcycl ;*
bra retour ;* branche en retour
int_b6:
dec tptemp
bne finrti
int_b7:
ldaa svtptemp
staa tptemp
ldx #text5
jsr transmit
jmp int_b9
int_b8:
ldx #text6
jsr transmit
int_b9:
ldaa #$00
staa mr_ar
ldaa #$00
staa porta ;met pwm
a 0
finrti:
>
jmp int_b9
int_b8:
ldx #text6
jsr transmit
int_b9:
ldaa #$00
staa mr_ar
ldaa #$00
staa porta ;met pwm
a 0
finrti:
rti
;***************************************************
;**
interruption qd front detecte sur le capteur
**
;***************************************************
org $c800
ldaa #$10
staa tflg2
ldaa pactl1
anda #$10
cmpa #$10
bne int2_b2
ldaa #$04 ;****************
staa portc ;****************
ldaa #$00 ;init TMSK2 pour interrupt disable
staa tmsk2 ;(interrupt qd un front montant sur pulse accu)
ldaa #$00
staa intl
ldaa #$01
staa detect
ldx pos
dex
stx pos
cpx #$0000
ble int2_b1
bra int2_b3
;bne int2_b3
;bgt int2_b3
int2_b1:
ldaa vsav ;restitution
de la vitesse initiale
staa rpcycl
staa svrpcycl
ldaa #$00
staa porta ;met pwm a 0
ldaa #$00
staa pacnt
ldaa #$00
staa mr_ar
ldx #text7
jsr transmit
bra int2_b3
int2_b2:
ldaa #$00 ;****************
staa portc ;****************
ldaa #$01
staa intl
staa detect
int2_b3:
ldaa svpulseh
staa pulseh
ldaa
svpulsel
staa pulsel
ldaa #$00 ;init
TMSK2 pour interrupt disable
staa tmsk2 ;(interrupt qd un front montant sur pulse accu)
rti ;fin interruption__