Skip to content

Instantly share code, notes, and snippets.

@arnoclr
Created January 9, 2024 15:06
Show Gist options
  • Save arnoclr/35c00e83af89900523a815a1b0a79905 to your computer and use it in GitHub Desktop.
Save arnoclr/35c00e83af89900523a815a1b0a79905 to your computer and use it in GitHub Desktop.
Evalbot périmétrique
; Eval BOT
; Programme de suivi des murs d'une pièce
AREA |.text|, CODE, READONLY
; This register controls the clock gating logic in normal Run mode
SYSCTL_PERIPH_GPIOF EQU 0x400FE108 ;; SYSCTL_RCGC2_R (p291 datasheet de lm3s9b92.pdf)
; Configure the corresponding pin to be an output
; All GPIO pins are inputs by default
GPIO_O_DIR EQU 0x00000400 ;; GPIO Direction (p417 datasheet de lm3s9B92.pdf)
; The GPIODR2R register is the 2-mA drive control register
; By default, all GPIO pins have 2-mA drive.
GPIO_O_DR2R EQU 0x00000500 ;; GPIO 2-mA Drive Select (p428 datasheet de lm3s9B92.pdf)
; Digital enable register
; To use the pin as a digital input or output, the corresponding GPIODEN bit must be set.
GPIO_O_DEN EQU 0x0000051C ;; GPIO Digital Enable (p437 datasheet de lm3s9B92.pdf)
; The GPIOPUR register is the pull-up control register
GPIO_O_PUR EQU 0x00000510 ;; GPIO Pull-Up Control
; The GPIODATA register is the data register
GPIO_PORTD_BASE EQU 0x40007000 ;; GPIO Port D (APB) base: 0x4000.7000
GPIO_PORTE_BASE EQU 0x40024000 ;; GPIO Port E (APB) base: 0x4002.4000
GPIO_PORTF_BASE EQU 0x40025000 ;; GPIO Port F (APB) base: 0x4002.5000 (p416 datasheet de lm3s9B92.pdf)
; PINS Port Input
PINSD_6_7 EQU 0xC0 ;; Switchs 1 & 2 on Pins 6 & 7 (1100 0000)
PINSE_1_2 EQU 0x03 ;; Bumpers 1 & 2 on Pins 1 & 2 (0000 0011)
PINSF_4_5 EQU 0x30 ;; Leds 1 & 2 on Pins 4 & 5 (0011 0000)
; CONSTANTS
WAIT_ITERATIONS EQU 0x00FFFFF ;; Number of iterations to complete a wait
ROTATION_ITERATIONS EQU 0x0D ;; Number of iterations to complete a rotation
DISTANCE_ITERATIONS EQU 0x19 ;; Number of iterations to complete a distance
ENTRY
EXPORT __main
;; The IMPORT command specifies that a symbol is defined in a shared object at runtime.
IMPORT MOTEUR_INIT ;; init motors (setup PWMS + GPIO)
IMPORT MOTEUR_DROIT_ON ;; enable right motor
IMPORT MOTEUR_DROIT_OFF ;; disable right motor
IMPORT MOTEUR_DROIT_AVANT ;; right motor turns forward
IMPORT MOTEUR_DROIT_ARRIERE ;; right motor turns backwards
IMPORT MOTEUR_DROIT_INVERSE ;; reverses the right motor's rotation direction
IMPORT MOTEUR_GAUCHE_ON ;; enable left motor
IMPORT MOTEUR_GAUCHE_OFF ;; disable left motor
IMPORT MOTEUR_GAUCHE_AVANT ;; left motor turns forward
IMPORT MOTEUR_GAUCHE_ARRIERE ;; left motor turns backwards
IMPORT MOTEUR_GAUCHE_INVERSE ;; reverses the left motor's rotation direction
__main
;; Enable the Port F peripheral clock by setting bit 5 (0x20 == 0b100000) (p291 datasheet de lm3s9B96.pdf)
;; (GPIO::FEDCBA)
LDR R5, =SYSCTL_PERIPH_GPIOF ;; RCGC2
MOV R9, #0x00000038 ;; Store value to Enable clock on GPIO F, E and D (0011 1000)
;; (GPIO::FEDCBA)
STR R9, [R5] ;; Enable clock on GPIO F, E and D
;; "There must be a delay of 3 system clocks before any GPIO reg. access (p413 datasheet de lm3s9B92.pdf)
NOP ;; very important...
NOP
NOP ;; not necessary in simulation or in debbug step by step...
; Config Boutons
LDR R9, =PINSD_6_7 ;; Get the value to enable PINS 6 & 7 on PORTD
LDR R7, =GPIO_PORTD_BASE+GPIO_O_DEN ;;
STR R9, [R7] ;; Enable PINS 6 & 7 on PORTD with GPIO_O_DEN
LDR R7, =GPIO_PORTD_BASE+GPIO_O_PUR ;;
STR R9, [R7] ;; Enable PINS 6 & 7 on PORTD with GPIO_O_PUR
LDR R7, =GPIO_PORTD_BASE+(PINSD_6_7<<2)
; Config Bumpers
LDR R9, =PINSE_1_2 ;; Get the value to enable PINS 1 & 2 on PORTE
LDR R8, =GPIO_PORTE_BASE+GPIO_O_DEN ;;
STR R9, [R8] ;; Enable PINS 1 & 2 on PORTE with GPIO_O_DEN
LDR R8, =GPIO_PORTE_BASE+GPIO_O_PUR ;;
STR R9, [R8] ;; Enable PINS 1 & 2 on PORTE with GPIO_O_PUR
LDR R8, =GPIO_PORTE_BASE+(PINSE_1_2<<2)
; Config LEDs
LDR R9, =PINSF_4_5 ;; Get the value to enable PINS 4 & 5 on PORTF
LDR R5, =GPIO_PORTF_BASE+GPIO_O_DIR ;;
STR R9, [R5] ;; Enable PINS 4 & 5 on PORTF with GPIO_O_DIR
LDR R5, =GPIO_PORTF_BASE+GPIO_O_DEN ;;
STR R9, [R5] ;; Enable PINS 4 & 5 on PORTF with GPIO_O_DEN
LDR R5, =GPIO_PORTF_BASE+GPIO_O_DR2R ;;
STR R9, [R5] ;; Enable PINS 4 & 5 on PORTF with GPIO_O_DR2R
LDR R5, =GPIO_PORTF_BASE+(PINSF_4_5<<2)
; Config moteur
BL MOTEUR_INIT ;; Setup PWM + GPIO
WaitUserSelection
LDR R3, [R7] ;; Get Switchs Entries Values
LDR R4, [R8] ;; Get Bumper Entries Values
; CMP R4, #0x03 ;; Bumpers Status == Bumpers not pressed
; BNE OnBumpersPressed ;; If not equal go to actives_bumpers branch
CMP R4, #0x01
BEQ HasChoosedToFollowLeftWall
CMP R4, #0x02
BEQ HasChoosedToFollowRightWall
BL WaitUserSelection
HasChoosedToFollowLeftWall
MOV R2, #0x20 ; Activate left LED
BL TurnOnMotors
HasChoosedToFollowRightWall
MOV R2, #0x10 ; Activate right LED
BL TurnOnMotors
TurnOnMotors
BL MOTEUR_DROIT_ON
BL MOTEUR_GAUCHE_ON
STR R2, [R5] ; Allumer la LED choisie
BL MainLoop
MainLoopForRightWall
; on avance de 2 cases
BL MOTEUR_GAUCHE_AVANT
BL MOTEUR_DROIT_AVANT
BL WAIT
BL WAIT
BL BLINK_LED
; si on colisionne pas
LDR R4, [R8]
CMP R4, #0x03 ; aucun bumper actif
BEQ MainLoopForRightWall2
; on a avancé et touché le mur devant nous, on tourne à gauche
BL MOTEUR_GAUCHE_ARRIERE
BL WAIT
; on relance la boucle
BL MainLoop
MainLoopForRightWall2
; on rotationne de 90 degrés à droite
BL MOTEUR_DROIT_ARRIERE
BL WAIT
; on avance un peu pour voir si il y a toujours un mur à notre droite
BL MOTEUR_DROIT_AVANT
BL MEDIUM_WAIT
BL BLINK_LED
; si on colisionne pas
LDR R4, [R8]
CMP R4, #0x03 ; aucun bumper actif
BEQ MainLoop
; On a touché le mur qui était à notre droite
; On recule légèrement et on se remet droit
BL MOTEUR_DROIT_ARRIERE
BL MOTEUR_GAUCHE_ARRIERE
BL SMALL_WAIT
; On se retourne de 90 degrés vers la gauche
BL MOTEUR_DROIT_AVANT
BL WAIT
BL MainLoop
MainLoop
BL MainLoopForRightWall
BLINK_LED
LDR R10, =0xFFFFF; Durée de l'attente
MOV R9, #0x00 ; On fait clignoter les LEDs qu'on a activées
STR R9, [R5] ; Eteindre les LEDs
wait_loop_led
SUBS R10, #0x01
BNE wait_loop_led
STR R2, [R5] ; Les rallumer
BX LR
WAIT
; Durée de l'attente pour un quart de tour avec une boucle sans detection d'appui sur le bouton
; LDR R9, =0x12FFFFF ; Durée de l'attente
LDR R9, =0x755554 ; Durée de l'attente
wait_loop
; Cette boucle est la partie la plus souvent appellée dans le programme
; On va donc rajouter le detection sur l'appuie du bouton dans cette partie
; Afin de quitter le programme
LDR R3, [R7] ; Load Switchs Entries Values
CMP R3, #0xC0 ; If one or more switches are pressed
BNE Last ; Terminate program
SUBS R9, #0x01
BNE wait_loop
BX LR
SMALL_WAIT
LDR R9, =0x2FFFFF ; Durée de l'attente
wait_loop_small
SUBS R9, #0x01
BNE wait_loop_small
BX LR
MEDIUM_WAIT
LDR R9, =0x4FFFFF ; Durée de l'attente
wait_loop_med
SUBS R9, #0x01
BNE wait_loop_med
BX LR
Last
BL MOTEUR_GAUCHE_OFF
BL MOTEUR_DROIT_OFF
STR R9, [R5] ; Eteindre les LEDs
NOP
END
;; RK - Evalbot (Cortex M3 de Texas Instrument);
; programme - Pilotage 2 Moteurs Evalbot par PWM tout en ASM (configure les pwms + GPIO)
;Les pages se réfèrent au datasheet lm3s9b92.pdf
;Cablage :
;pin 10/PD0/PWM0 => input PWM du pont en H DRV8801RT
;pin 11/PD1/PWM1 => input Phase_R du pont en H DRV8801RT
;pin 12/PD2 => input SlowDecay commune aux 2 ponts en H
;pin 98/PD5 => input Enable 12v du conv DC/DC
;pin 86/PH0/PWM2 => input PWM du 2nd pont en H
;pin 85/PH1/PWM3 => input Phase du 2nd pont en H
;; Hexa corresponding values to pin numbers
GPIO_0 EQU 0x1
GPIO_1 EQU 0x2
GPIO_2 EQU 0x4
GPIO_5 EQU 0x20
;; pour enable clock 0x400FE000
SYSCTL_RCGC0 EQU 0x400FE100 ;SYSCTL_RCGC0: offset 0x100 (p271 datasheet de lm3s9b92.pdf)
SYSCTL_RCGC2 EQU 0x400FE108 ;SYSCTL_RCGC2: offset 0x108 (p291 datasheet de lm3s9b92.pdf)
;; General-Purpose Input/Outputs (GPIO) configuration
PORTD_BASE EQU 0x40007000
GPIODATA_D EQU PORTD_BASE
GPIODIR_D EQU PORTD_BASE+0x00000400
GPIODR2R_D EQU PORTD_BASE+0x00000500
GPIODEN_D EQU PORTD_BASE+0x0000051C
GPIOPCTL_D EQU PORTD_BASE+0x0000052C ; GPIO Port Control (GPIOPCTL), offset 0x52C; p444
GPIOAFSEL_D EQU PORTD_BASE+0x00000420 ; GPIO Alternate Function Select (GPIOAFSEL), offset 0x420; p426
PORTH_BASE EQU 0x40027000
GPIODATA_H EQU PORTH_BASE
GPIODIR_H EQU PORTH_BASE+0x00000400
GPIODR2R_H EQU PORTH_BASE+0x00000500
GPIODEN_H EQU PORTH_BASE+0x0000051C
GPIOPCTL_H EQU PORTH_BASE+0x0000052C ; GPIO Port Control (GPIOPCTL), offset 0x52C; p444
GPIOAFSEL_H EQU PORTH_BASE+0x00000420 ; GPIO Alternate Function Select (GPIOAFSEL), offset 0x420; p426
;; Pulse Width Modulator (PWM) configuration
PWM_BASE EQU 0x040028000 ;BASE des Block PWM p.1138
PWMENABLE EQU PWM_BASE+0x008 ; p1145
;Block PWM0 pour sorties PWM0 et PWM1 (moteur 1)
PWM0CTL EQU PWM_BASE+0x040 ;p1167
PWM0LOAD EQU PWM_BASE+0x050
PWM0CMPA EQU PWM_BASE+0x058
PWM0CMPB EQU PWM_BASE+0x05C
PWM0GENA EQU PWM_BASE+0x060
PWM0GENB EQU PWM_BASE+0x064
;Block PWM1 pour sorties PWM1 et PWM2 (moteur 2)
PWM1CTL EQU PWM_BASE+0x080
PWM1LOAD EQU PWM_BASE+0x090
PWM1CMPA EQU PWM_BASE+0x098
PWM1CMPB EQU PWM_BASE+0x09C
PWM1GENA EQU PWM_BASE+0x0A0
PWM1GENB EQU PWM_BASE+0x0A4
VITESSE EQU 0x1A2 ; Valeures plus petites => Vitesse plus rapide exemple 0x192
; Valeures plus grandes => Vitesse moins rapide exemple 0x1B2
AREA |.text|, CODE, READONLY
ENTRY
;; The EXPORT command specifies that a symbol can be accessed by other shared objects or executables.
EXPORT MOTEUR_INIT
EXPORT MOTEUR_DROIT_ON
EXPORT MOTEUR_DROIT_OFF
EXPORT MOTEUR_DROIT_AVANT
EXPORT MOTEUR_DROIT_ARRIERE
EXPORT MOTEUR_DROIT_INVERSE
EXPORT MOTEUR_GAUCHE_ON
EXPORT MOTEUR_GAUCHE_OFF
EXPORT MOTEUR_GAUCHE_AVANT
EXPORT MOTEUR_GAUCHE_ARRIERE
EXPORT MOTEUR_GAUCHE_INVERSE
MOTEUR_INIT
ldr r6, = SYSCTL_RCGC0
ldr r0, [R6]
ORR r0, r0, #0x00100000 ;;bit 20 = PWM recoit clock: ON (p271)
str r0, [r6]
;ROM_SysCtlPWMClockSet(SYSCTL_PWMDIV_1);PWM clock is processor clock /1
;Je ne fais rien car par defaut = OK!!
;*(int *) (0x400FE060)= *(int *)(0x400FE060)...;
;RCGC2 : Enable port D GPIO(p291 ) car Moteur Droit sur port D
ldr r6, = SYSCTL_RCGC2
ldr r0, [R6]
ORR r0, r0, #0x08 ;; Enable port D GPIO
str r0, [r6]
;MOT2 : RCGC2 : Enable port H GPIO (2eme moteurs)
ldr r6, = SYSCTL_RCGC2
ldr r0, [R6]
ORR r0, r0, #0x80 ;; Enable port H GPIO
str r0, [r6]
nop
nop
nop
;;Pin muxing pour PWM, port D, reg. GPIOPCTL(p444), 4bits de PCM0=0001<=>PWM (voir p1261)
;;il faut mettre 1 pour avoir PD0=PWM0 et PD1=PWM1
ldr r6, = GPIOPCTL_D
;ldr r0, [R6] ;; *(int *)(0x40007000+0x0000052C)=1;
;ORR r0, r0, #0x01 ;; Port D, pin 1 = PWM
mov r0, #0x01
str r0, [r6]
;;MOT2 : Pin muxing pour PWM, port H, reg. GPIOPCTL(p444), 4bits de PCM0=0001<=>PWM (voir p1261)
;;il faut mettre mux = 2 pour avoir PH0=PWM2 et PH1=PWM3
ldr r6, = GPIOPCTL_H
mov r0, #0x02
str r0, [r6]
;;Alternate Function Select (p 426), PD0 utilise alernate fonction (PWM au dessus)
;;donc PD0 = 1
ldr r6, = GPIOAFSEL_D
ldr r0, [R6] ;*(int *)(0x40007000+0x00000420)= *(int *)(0x40007000+0x00000420) | 0x00000001;
ORR r0, r0, #0x01 ;
str r0, [r6]
;;MOT2 : Alternate Function Select (p 426), PH0 utilise PWM donc Alternate funct
;;donc PH0 = 1
ldr r6, = GPIOAFSEL_H
ldr r0, [R6] ;*(int *)(0x40007000+0x00000420)= *(int *)(0x40007000+0x00000420) | 0x00000001;
ORR r0, r0, #0x01 ;
str r0, [r6]
;;-----------PWM0 pour moteur 1 connecté à PD0
;;PWM0 produit PWM0 et PWM1 output
;;Config Modes PWM0 + mode GenA + mode GenB
ldr r6, = PWM0CTL
mov r0, #2 ;Mode up-down-up-down, pas synchro
str r0, [r6]
ldr r6, =PWM0GENA ;en decomptage, qd comparateurA = compteur => sortie pwmA=0
;en comptage croissant, qd comparateurA = compteur => sortie pwmA=1
mov r0, #0x0B0 ;0B0=10110000 => ACTCMPBD=00 (B down:rien), ACTCMPBU=00(B up rien)
str r0, [r6] ;ACTCMPAD=10 (A down:pwmA low), ACTCMPAU=11 (A up:pwmA high) , ACTLOAD=00,ACTZERO=00
ldr r6, =PWM0GENB;en comptage croissant, qd comparateurB = compteur => sortie pwmA=1
mov r0, #0x0B00 ;en decomptage, qd comparateurB = compteur => sortie pwmB=0
str r0, [r6]
;Config Compteur, comparateur A et comparateur B
;;#define PWM_PERIOD (ROM_SysCtlClockGet() / 16000),
;;en mesure : SysCtlClockGet=0F42400h, /16=0x3E8,
;;on divise par 2 car moteur 6v sur alim 12v
ldr r6, =PWM0LOAD ;PWM0LOAD=periode/2 =0x1F4
mov r0, #0x1F4
str r0,[r6]
ldr r6, =PWM0CMPA ;Valeur rapport cyclique : pour 10% => 1C2h si clock = 0F42400
mov r0, #VITESSE
str r0, [r6]
ldr r6, =PWM0CMPB ;PWM0CMPB recoit meme valeur. (rapport cyclique depend de CMPA)
mov r0, #0x1F4
str r0, [r6]
;Control PWM : active PWM Generator 0 (p1167): Enable+up/down + Enable counter debug mod
ldr r6, =PWM0CTL
ldr r0, [r6]
ORR r0, r0, #0x07
str r0, [r6]
;;-----------PWM2 pour moteur 2 connecté à PH0
;;PWM1block produit PWM2 et PWM3 output
;;Config Modes PWM2 + mode GenA + mode GenB
ldr r6, = PWM1CTL
mov r0, #2 ;Mode up-down-up-down, pas synchro
str r0, [r6] ;*(int *)(0x40028000+0x040)=2;
ldr r6, =PWM1GENA ;en decomptage, qd comparateurA = compteur => sortie pwmA=0
;en comptage croissant, qd comparateurA = compteur => sortie pwmA=1
mov r0, #0x0B0 ;0B0=10110000 => ACTCMPBD=00 (B down:rien), ACTCMPBU=00(B up rien)
str r0, [r6] ;ACTCMPAD=10 (A down:pwmA low), ACTCMPAU=11 (A up:pwmA high) , ACTLOAD=00,ACTZERO=00
;*(int *)(0x40028000+0x060)=0x0B0; //
ldr r6, =PWM1GENB ;*(int *)(0x40028000+0x064)=0x0B00;
mov r0, #0x0B00 ;en decomptage, qd comparateurB = compteur => sortie pwmB=0
str r0, [r6] ;en comptage croissant, qd comparateurB = compteur => sortie pwmA=1
;Config Compteur, comparateur A et comparateur B
;;#define PWM_PERIOD (ROM_SysCtlClockGet() / 16000),
;;en mesure : SysCtlClockGet=0F42400h, /16=0x3E8,
;;on divise par 2 car moteur 6v sur alim 12v
;*(int *)(0x40028000+0x050)=0x1F4; //PWM0LOAD=periode/2 =0x1F4
ldr r6, =PWM1LOAD
mov r0, #0x1F4
str r0,[r6]
ldr r6, =PWM1CMPA ;Valeur rapport cyclique : pour 10% => 1C2h si clock = 0F42400
mov r0, #VITESSE
str r0, [r6] ;*(int *)(0x40028000+0x058)=0x01C2;
ldr r6, =PWM1CMPB ;PWM0CMPB recoit meme valeur. (CMPA depend du rapport cyclique)
mov r0, #0x1F4 ; *(int *)(0x40028000+0x05C)=0x1F4;
str r0, [r6]
;Control PWM : active PWM Generator 0 (p1167): Enable+up/down + Enable counter debug mod
ldr r6, =PWM1CTL
ldr r0, [r6] ;*(int *) (0x40028000+0x40)= *(int *)(0x40028000+0x40) | 0x07;
ORR r0, r0, #0x07
str r0, [r6]
;;-----Fin config des PWMs
;PORT D OUTPUT pin0 (pwm)=pin1(direction)=pin2(slow decay)=pin5(12v enable)
ldr r6, =GPIODIR_D
ldr r0, [r6]
ORR r0, #(GPIO_0+GPIO_1+GPIO_2+GPIO_5)
str r0,[r6]
;Port D, 2mA les meme
ldr r6, =GPIODR2R_D ;
ldr r0, [r6]
ORR r0, #(GPIO_0+GPIO_1+GPIO_2+GPIO_5)
str r0,[r6]
;Port D, Digital Enable
ldr r6, =GPIODEN_D ;
ldr r0, [r6]
ORR r0, #(GPIO_0+GPIO_1+GPIO_2+GPIO_5)
str r0,[r6]
;Port D : mise à 1 de slow Decay et 12V et mise à 0 pour dir et pwm
ldr r6, =(GPIODATA_D+((GPIO_0+GPIO_1+GPIO_2+GPIO_5)<<2))
mov r0, #(GPIO_2+GPIO_5) ; #0x24
str r0,[r6]
;MOT2, PH1 pour sens moteur ouput
ldr r6, =GPIODIR_H
mov r0, #0x03 ;
str r0,[r6]
;Port H, 2mA les meme
ldr r6, =GPIODR2R_H
mov r0, #0x03
str r0,[r6]
;Port H, Digital Enable
ldr r6, =GPIODEN_H
mov r0, #0x03
str r0,[r6]
;Port H : mise à 1 pour dir
ldr r6, =(GPIODATA_H +(GPIO_1<<2))
mov r0, #0x02
str r0,[r6]
BX LR ; FIN du sous programme d'init.
;Enable PWM0 (bit 0) et PWM2 (bit 2) p1145
;Attention ici c'est les sorties PWM0 et PWM2
;qu'on controle, pas les blocks PWM0 et PWM1!!!
MOTEUR_DROIT_ON
;Enable sortie PWM0 (bit 0), p1145
ldr r6, =PWMENABLE
ldr r0, [r6]
orr r0, #0x01 ;bit 0 à 1
str r0, [r6]
BX LR
MOTEUR_DROIT_OFF
ldr r6, =PWMENABLE
ldr r0, [r6]
and r0, #0x0E ;bit 0 à 0
str r0, [r6]
BX LR
MOTEUR_GAUCHE_ON
ldr r6, =PWMENABLE
ldr r0, [r6]
orr r0, #0x04 ;bit 2 à 1
str r0, [r6]
BX LR
MOTEUR_GAUCHE_OFF
ldr r6, =PWMENABLE
ldr r0, [r6]
and r0, #0x0B ;bit 2 à 0
str r0, [r6]
BX LR
MOTEUR_DROIT_ARRIERE
;Inverse Direction (GPIO_D1)
ldr r6, =(GPIODATA_D+(GPIO_1<<2))
mov r0, #0
str r0,[r6]
BX LR
MOTEUR_DROIT_AVANT
;Inverse Direction (GPIO_D1)
ldr r6, =(GPIODATA_D+(GPIO_1<<2))
mov r0, #2
str r0,[r6]
BX LR
MOTEUR_GAUCHE_ARRIERE
;Inverse Direction (GPIO_D1)
ldr r6, =(GPIODATA_H+(GPIO_1<<2))
mov r0, #2 ; contraire du moteur Droit
str r0,[r6]
BX LR
MOTEUR_GAUCHE_AVANT
;Inverse Direction (GPIO_D1)
ldr r6, =(GPIODATA_H+(GPIO_1<<2))
mov r0, #0
str r0,[r6]
BX LR
MOTEUR_DROIT_INVERSE
;Inverse Direction (GPIO_D1)
ldr r6, =(GPIODATA_D+(GPIO_1<<2))
ldr r1, [r6]
EOR r0, r1, #GPIO_1
str r0,[r6]
BX LR
MOTEUR_GAUCHE_INVERSE
;Inverse Direction (GPIO_D1)
ldr r6, =(GPIODATA_H+(GPIO_1<<2))
ldr r1, [r6]
EOR r0, r1, #GPIO_1
str r0,[r6]
BX LR
END
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment