-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRK_PriseEnMain_Moteurs.s
627 lines (509 loc) · 13.7 KB
/
RK_PriseEnMain_Moteurs.s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
;; RK - Evalbot (Cortex M3 de Texas Instrument)
; programme - Pilotage 2 Moteurs Evalbot par PWM tout en ASM (Evalbot tourne sur lui meme)
AREA |.text|, CODE, READONLY
;;; ----- START DEFINE CONSTANTS -----
; This register controls the clock gating logic in normal Run mode
SYSCTL_PERIPH_GPIO EQU 0x400FE108 ; SYSCTL_RCGC2_R (p291 datasheet de lm3s9b92.pdf)
; The GPIODATA register is the data register
GPIO_PORTF_BASE EQU 0x40025000 ; GPIO Port F (APB) base: 0x4002.5000 (p416 datasheet de lm3s9B92.pdf)
GPIO_PORTD_BASE EQU 0x40007000 ; GPIO Port D (APB) base: 0x4000.7000 (p416 datasheet de lm3s9B92.pdf)
GPIO_PORTE_BASE EQU 0x40024000 ; GPIO Port E (APB) base: 0x4002.4000 (p416 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)
; Pul_up
GPIO_I_PUR EQU 0x00000510 ; GPIO Pull-Up (p432 datasheet de lm3s9B92.pdf)
; Broches select
BROCHE4_5 EQU 0x30 ; led1 & led2 sur broche 4 et 5
LED_1 EQU 0x10 ; LED droite
LED_2 EQU 0x20 ; LED gauche
BROCHE6_7 EQU 0xC0 ; bouton poussoir 1 et 2 sur broche 6 et 7
SWITCH_1 EQU 0x80 ; switch du haut
SWITCH_2 EQU 0x40 ; switch du bas
BROCHE0_1 EQU 0x03 ; bumpers 1 et 2 sur broche 0 et 1
BUMPER_G EQU 0x01
BUMPER_D EQU 0x02
; blinking frequency
DUREE EQU 0x17FFFF ;0x002FFFFF
;;; ----- END DEFINE CONSTANTS -----
ENTRY
EXPORT __main
;; The IMPORT command specifies that a symbol is defined in a shared object at runtime.
IMPORT MOTEUR_INIT ; initialise les moteurs (configure les pwms + GPIO)
IMPORT MOTEUR_DROIT_ON ; activer le moteur droit
IMPORT MOTEUR_DROIT_OFF ; desactiver le moteur droit
IMPORT MOTEUR_DROIT_AVANT ; moteur droit tourne vers l'avant
IMPORT MOTEUR_DROIT_ARRIERE ; moteur droit tourne vers l'arri�re
IMPORT MOTEUR_DROIT_INVERSE ; inverse le sens de rotation du moteur droit
IMPORT MOTEUR_GAUCHE_ON ; activer le moteur gauche
IMPORT MOTEUR_GAUCHE_OFF ; desactiver le moteur gauche
IMPORT MOTEUR_GAUCHE_AVANT ; moteur gauche tourne vers l'avant
IMPORT MOTEUR_GAUCHE_ARRIERE ; moteur gauche tourne vers l'arri�re
IMPORT MOTEUR_GAUCHE_INVERSE ; inverse le sens de rotation du moteur gauche
;;; ----- START MAIN -----
__main
;; Configurer les moteurs à la toute fin car le code fourni conserve les config précédentes
;; BL Branchement vers un lien (sous programme)
; Configure les LEDs, SWITCHs et les BUMPERs
BL LED_SWITCH_BUMPER_INIT
; Configure les PWM + GPIO
BL MOTEUR_INIT
; Indique les deux moteurs d'avancer lorsqu'ils seront activés
BL MOTEURS_AVANCER
; r12 est dédié pour connaitre l'état des bumbers
LDR r12, = GPIO_PORTE_BASE + (BROCHE0_1<<2)
; Attendre qu'un bouton switch soit actionne
LDR r11, = GPIO_PORTD_BASE + (BROCHE6_7<<2)
checkSwitchState
LDR r2,[r11]
CMP r2,#SWITCH_1
BEQ go_mode_1
CMP r2,#SWITCH_2
BEQ go_mode_2
B checkSwitchState
; _________ MODE 1 _________
go_mode_1
loop_mode_1
BL MOTEURS_ON
; ecoute si les bumper sont actives
LDR r2,[r12]
BL WAIT_BLINK_INTERVALLE
LDR r3,[r12]
CMP r2, r3
BNE loop_mode_1
BL MOTEURS_OFF
CMP r2,#BUMPER_G
BEQ go_bumper_g
CMP r2,#BUMPER_D
BEQ go_bumper_d
CMP r2,#0x0
BEQ go_bumper_both
B loop_mode_1
go_bumper_g
BL BUMPER_G_ACTIVE_LED_G
BL MOTEURS_PIVOT_BUMPER_G
B loop_mode_1
go_bumper_d
BL BUMPER_D_ACTIVE_LED_D
BL MOTEURS_PIVOT_BUMPER_D
B loop_mode_1
go_bumper_both
BL BUMPER_BOTH_ACTIVE_LEDS
BL MOTEURS_MUR_EVENT
B loop_mode_1
; _________ MODE 2 _________
go_mode_2
MOV r2, #BROCHE6_7
MOV r5, #0x01
MOV r4, #0xFFFFFFFE
generate_random_integer
ADD r5, #0x01
CMP r5, r4 ; si superieur ou egal
BHI go_mode_2
LDR r2,[r11]
CMP r2,#0x0 ; appuie sur les 2 switch
BNE generate_random_integer
; --------------------
; inititalisation des compteurs
MOV r4, #0x00 ; num de tour
new_tour
BL MOTEURS_ON
BL WAIT_BLINK_INTERVALLE
BL MOTEURS_OFF
MOV r8, r5 ; copie de r5 dans r8
ADD r4, #0x01 ; increment tour
MOV r7, #0x00 ; le compteur de bit
MOV r9, #0x00 ; seq du tour valide
loop_tour_demo
LSL r9, r9, #1
ANDS r3, r8, #0x01
ADD r9, r3
BEQ active_led_d ; r5 correspond à la sequence entier
BL LED_ACTIVE_G
B jump_here
active_led_d
BL LED_ACTIVE_D
jump_here
LSR r8, r8, #1 ; LOGICAL SHIFT RIGHT (décalage vers la droite de 1 bit)
ADD r7, #0x01 ; increment le compteur r7
CMP r7, r4 ; si r7 a atteint le max iteration de ce tour
BEQ loop_tour_joueur
B loop_tour_demo
go_tour_joueur
BL MOTEURS_ON
BL WAIT_BLINK_INTERVALLE
BL MOTEURS_OFF
MOV r0, #0x00 ; init seq du joueur
loop_tour_joueur
LDR r2,[r12] ; pour la detection des bumper
CMP r2,#BUMPER_G
BEQ simon_touch_g
CMP r2,#BUMPER_D
BEQ simon_touch_d
LDR r2,[r11] ; pour la detection des switchs
CMP r2, #0x00 ; detection appuies sur les 2 switchs
BEQ verif_seq
B loop_tour_joueur
simon_touch_g
LSL r0, r0, #1
ADD r0, #0x01
BL LED_ACTIVE_G
B loop_tour_joueur
simon_touch_d
LSL r0, r0, #1
;ADD r0, #0x00
BL LED_ACTIVE_D
B loop_tour_joueur
verif_seq
CMP r0, r9 ; compare seq du joueur et seq du tour
BEQ new_tour
BL MOTEURS_ON
BL WAIT_MOTEURS
BL MOTEURS_OFF
B go_end
;;; ----- END MAIN -----
;;; ----- START LINK BRANCHEMENT -----
;; Initialise les LEDs, SWITCHs et BUMPERs
LED_SWITCH_BUMPER_INIT
; Enable Port E, F & D peripheral clock (p291 datasheet de lm3s9B96.pdf)
LDR r5, = SYSCTL_PERIPH_GPIO ;; RCGC2
mov r2, #0x00000038 ;; Enable clock sur GPIO E, D et F (0x38 == 0b00111000)
STR r2, [r5]
; "There must be a delay of 3 system clocks before any GPIO reg. access (p413 datasheet de lm3s9B92.pdf)
NOP ;; tres tres important....
NOP
NOP ;; pas necessaire en simu ou en debbug step by step...
; ----- CONFIGURATION LED -----
LDR r10, = GPIO_PORTF_BASE+GPIO_O_DIR ;; 2 Pin du portF en sortie (broche 4&5 : 00110000)
LDR r2, = BROCHE4_5
STR r2, [r10]
LDR r10, = GPIO_PORTF_BASE+GPIO_O_DEN ;; Enable Digital Function
LDR r2, = BROCHE4_5
STR r2, [r10]
LDR r10, = GPIO_PORTF_BASE+GPIO_O_DR2R ;; Choix de l'intensit? de sortie (2mA)
LDR r2, = BROCHE4_5
STR r2, [r10]
; ----- Fin configuration LED -----
; ----- CONFIGURATION Switcher -----
LDR r11, = GPIO_PORTD_BASE+GPIO_I_PUR ;; Pul_up
LDR r2, = BROCHE6_7
STR r2, [r11]
LDR r11, = GPIO_PORTD_BASE+GPIO_O_DEN ;; Enable Digital Function
LDR r2, = BROCHE6_7
STR r2, [r11]
LDR r11, = GPIO_PORTD_BASE + (BROCHE6_7<<2) ;; @data Register = @base + (mask<<2) ==> Switcher
; ----- Fin configuration Switcher -----
; ----- CONFIGURATION Bumper -----
LDR r12, = GPIO_PORTE_BASE+GPIO_I_PUR ;; Pul_up
LDR r2, = BROCHE0_1
STR r2, [r12]
LDR r12, = GPIO_PORTE_BASE+GPIO_O_DEN ;; Enable Digital Function
LDR r2, = BROCHE0_1
STR r2, [r12]
LDR r12, = GPIO_PORTE_BASE + (BROCHE0_1<<2) ;; @data Register = @base + (mask<<2) ==> Bumper
;----- Fin configuration Bumper -----
BX LR
;; ----- START FUNCTION LED -----
; allumer la led broche 4&5 (BROCHE4_5)
LED_ACTIVE
;MOV r2, #BROCHE4_5 ;; Allume LED1&2 portF broche 4&5 : 00110000
LDR r10, = GPIO_PORTF_BASE + (BROCHE4_5<<2) ;; @data Register = @base + (mask<<2) ==> LED1&2
STR r3, [r10]
BX LR
LED_DESACTIVE
MOV r2, #0x000 ;; Eteint LED1&2
LDR r10, = GPIO_PORTF_BASE + (BROCHE4_5<<2)
STR r2, [r10]
BX LR
LED_ACTIVE_G
PUSH {LR}
MOV r3, #LED_2
BL LED_BLINK_ONCE
POP {LR}
BX LR
LED_ACTIVE_D
PUSH {LR}
MOV r3, #LED_1
BL LED_BLINK_ONCE
POP {LR}
BX LR
;; Boucle d'attente
WAIT_BLINK_INTERVALLE
LDR r1, = DUREE
wait1 SUBS r1, #1
BNE wait1
; retour a la suite du lien de branchement
BX LR
; le clignotement de cette fonction est plus lente que celles en morse
LED_BLINK_ONCE
; Warning, ne pas oublier de push dans le stack le link registre
; utilisation d'une autre fonction (à part dans le main)
PUSH {LR}
BL LED_ACTIVE ; Allume LED 1 & 2 Port F broche 4&5 : 00110000
BL WAIT_BLINK_INTERVALLE ; pour la duree de WAIT_BLINK_INTERVALLE
BL WAIT_BLINK_INTERVALLE
BL LED_DESACTIVE ;; Eteint LED 1 & 2 car r2 = 0x00
BL WAIT_BLINK_INTERVALLE ; pour la duree de WAIT_BLINK_INTERVALLE
BL WAIT_BLINK_INTERVALLE
; Puis ne pas oublier de le pop l'@ de retour qu'on avait push
POP {LR}
BX LR
BUMPER_G_ACTIVE_LED_G
MOV r3, #LED_2
PUSH {LR}
BL G_EN_MORSE
POP {LR}
BX LR
BUMPER_D_ACTIVE_LED_D
MOV r3, #LED_1
PUSH {LR}
BL D_EN_MORSE
POP {LR}
BX LR
BUMPER_BOTH_ACTIVE_LEDS
MOV r3, #BROCHE4_5
PUSH {LR}
BL MUR_EN_MORSE
POP {LR}
BX LR
;; ----- END FUNCTION LED -----
;; ----- START MORSE -----
LED_ACTIVE_LONG
PUSH {LR}
BL LED_ACTIVE
BL WAIT_BLINK_INTERVALLE
BL WAIT_BLINK_INTERVALLE
BL LED_DESACTIVE
BL WAIT_BLINK_INTERVALLE
POP {LR}
BX LR
LED_ACTIVE_COURT
PUSH {LR}
BL LED_ACTIVE
BL WAIT_BLINK_INTERVALLE
BL LED_DESACTIVE
BL WAIT_BLINK_INTERVALLE
POP {LR}
BX LR
D_EN_MORSE
PUSH {LR}
BL LED_ACTIVE_LONG
BL LED_ACTIVE_COURT
BL LED_ACTIVE_COURT
POP {LR}
BX LR
G_EN_MORSE
PUSH {LR}
BL LED_ACTIVE_LONG
BL LED_ACTIVE_LONG
BL LED_ACTIVE_COURT
POP {LR}
BX LR
MUR_EN_MORSE
PUSH {LR}
;M
BL LED_ACTIVE_LONG
BL LED_ACTIVE_LONG
;U
;BL LED_ACTIVE_COURT
;BL LED_ACTIVE_COURT
;BL LED_ACTIVE_LONG
;R
;BL LED_ACTIVE_COURT
;BL LED_ACTIVE_LONG
;BL LED_ACTIVE_COURT
POP {LR}
BX LR
ANGLE_EN_MORSE
PUSH {LR}
;A
BL LED_ACTIVE_COURT
BL LED_ACTIVE_LONG
BL WAIT_BLINK_INTERVALLE
;N
BL LED_ACTIVE_LONG
BL LED_ACTIVE_COURT
BL WAIT_BLINK_INTERVALLE
;G
BL LED_ACTIVE_LONG
BL LED_ACTIVE_LONG
BL LED_ACTIVE_COURT
BL WAIT_BLINK_INTERVALLE
;L
BL LED_ACTIVE_COURT
BL LED_ACTIVE_LONG
BL LED_ACTIVE_COURT
BL LED_ACTIVE_COURT
BL WAIT_BLINK_INTERVALLE
;E
BL LED_ACTIVE_COURT
POP {LR}
BX LR
;; ----- END MORSE -----
;; ----- START FUNCTION SCENARIO DEPLACEMENT -----
MOTEURS_PIVOT_BUMPER_G
PUSH {LR}
BL MOTEURS_ON
;; Reculer
BL MOTEURS_RECULER
BL WAIT_MOTEURS
;; Pivot vers la droite 90 degres
BL MOTEURS_PIVOT_D
BL WAIT_MOTEURS
;; Avancer
BL MOTEURS_AVANCER
BL WAIT_MOTEURS
BL WAIT_MOTEURS
;; Pivot vers la gauche 90 degres
BL MOTEURS_PIVOT_G
BL WAIT_MOTEURS
;; Avancer
BL MOTEURS_AVANCER
POP {LR}
BX LR
MOTEURS_PIVOT_BUMPER_D
PUSH {LR}
BL MOTEURS_ON
BL MOTEURS_RECULER
BL WAIT_MOTEURS
BL MOTEURS_PIVOT_G
BL WAIT_MOTEURS
BL MOTEURS_AVANCER
BL WAIT_MOTEURS
BL WAIT_MOTEURS
BL MOTEURS_PIVOT_D
BL WAIT_MOTEURS
BL MOTEURS_AVANCER
POP {LR}
BX LR
MOTEURS_MUR_EVENT
PUSH {LR}
BL MOTEURS_PIVOT_BUMPER_G
;; -------------------------
;;; Detection // r12 c les broches bumpers
BL WAIT_MOTEURS
BL WAIT_MOTEURS
LDR r2,[r12]
BL MOTEURS_OFF
CMP r2,#BUMPER_G ; detection bumper G
BEQ go_bumper_g
CMP r2,#BROCHE0_1 ; pas de detection
BEQ loop_mode_1
;; -------------------------
; c'est soit bumer D soit un mur
CMP r2,#0x0
; si c'est un mur, on branche vers led_mur_2
BEQ led_mur_2
; sinon c'est le bumper D
BL BUMPER_D_ACTIVE_LED_D
B mur_event_go_gauche_2_fois
led_mur_2
BL BUMPER_BOTH_ACTIVE_LEDS
;; -------------------------
mur_event_go_gauche_2_fois
BL MOTEURS_ON
BL MOTEURS_RECULER
BL WAIT_MOTEURS
BL MOTEURS_PIVOT_G
BL WAIT_MOTEURS
BL MOTEURS_AVANCER
BL WAIT_MOTEURS ;; parcours 2 longueurs vers la gauche
BL WAIT_MOTEURS
BL WAIT_MOTEURS
BL WAIT_MOTEURS
BL MOTEURS_PIVOT_D
BL WAIT_MOTEURS
BL MOTEURS_AVANCER
;; ----------Detection---------------
BL WAIT_MOTEURS
BL WAIT_MOTEURS
LDR r2,[r12]
BL MOTEURS_OFF
CMP r2,#BUMPER_D ; detection bumper D
BEQ go_bumper_d
CMP r2,#BROCHE0_1 ; pas de detection
BEQ loop_mode_1
;; ---------- Soit bumer D soit un mur ---------------
CMP r2,#0x0
; si c'est un mur, on branche vers led_mur_2
BEQ led_mur_3
; sinon c'est le bumper G
BL BUMPER_G_ACTIVE_LED_G
B mur_event_go_demi_tour
led_mur_3
BL BUMPER_BOTH_ACTIVE_LEDS
;; -------------------------
mur_event_go_demi_tour
BL MOTEURS_ON
BL MOTEURS_DEMI_TOUR
POP {LR}
BX LR
;; ----- END FUNCTION SCENARIO DEPLACEMENT -----
;; ----- START MOTEURS DEPLACEMENT -----
;; 1 WAIT_MOTEURS = environ 90° lors d'un pivot
WAIT_MOTEURS
PUSH {LR}
BL WAIT_BLINK_INTERVALLE
BL WAIT_BLINK_INTERVALLE
BL WAIT_BLINK_INTERVALLE
BL WAIT_BLINK_INTERVALLE
POP {LR}
BX LR
MOTEURS_ON
PUSH {LR}
BL MOTEUR_DROIT_ON
BL MOTEUR_GAUCHE_ON
POP {LR}
BX LR
MOTEURS_OFF
PUSH {LR}
BL MOTEUR_DROIT_OFF
BL MOTEUR_GAUCHE_OFF
POP {LR}
BX LR
MOTEURS_AVANCER
PUSH {LR}
BL MOTEUR_GAUCHE_AVANT
BL MOTEUR_DROIT_AVANT
POP {LR}
BX LR
MOTEURS_RECULER
PUSH {LR}
BL MOTEUR_GAUCHE_ARRIERE
BL MOTEUR_DROIT_ARRIERE
POP {LR}
BX LR
MOTEURS_PIVOT_G
PUSH {LR}
BL MOTEUR_GAUCHE_ARRIERE
BL MOTEUR_DROIT_AVANT
POP {LR}
BX LR
MOTEURS_PIVOT_D
PUSH {LR}
BL MOTEUR_GAUCHE_AVANT
BL MOTEUR_DROIT_ARRIERE
POP {LR}
BX LR
MOTEURS_DEMI_TOUR
PUSH {LR}
BL MOTEURS_RECULER
BL WAIT_MOTEURS
BL MOTEURS_PIVOT_D
BL WAIT_MOTEURS ; un wait de moteurs = 90° environ
BL WAIT_MOTEURS
BL MOTEURS_AVANCER
POP {LR}
BX LR
;; ----- END MOTEURS DEPLACEMENT -----
;;; ----- END LINK BRANCHEMENT -----
go_end
NOP
NOP
END