Sommaire  

 

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__

 

Sommaire