Étape 9: Codage - Setup & la boucle d’exécution
Nous maintenant coder la configuration initiale du système et puis le mettre dans une simple boucle d’exécution.La configuration implique permettant à tous les périphériques pour déclencher les interruptions et en affectant au départ les moteurs OFF.
Je dois souligner que ce code est précédé de la section .data et les fonctions du gestionnaire. En outre, les instructions suivantes ont déjà été faites :
.EQU minuterie, 0x10002000
.EQU LEGO, 0x10000060
.EQU LEGO_IRQ11, 0 x 800
.EQU LEGO_IRQ8, 0 x 100
.EQU LEGO_Edge, 0x1000006C
.EQU JTAG_UART, 0x10001000
.EQU LEDG, 0x10000010
.EQU LEDR, 0 x 10000000
Alors, commençons.
.section .text
.global pokemonmaster # lol. Lorsque vous écrivez du code pour votre robot, appelez vos fonctions comme vous voulez.
pokemonmaster :
MOVIA r27, 0x800000 / * initialiser la pile (alignée sur la 4) * /
MOVIA r8, minuterie
MOVIA r9, 0x6500 / * du ensemble temps de compte à rebours de 10 secondes 500000000 = 1DCD6500 * /
stwio r9,8(r8)
MOVIA r9, 0x1DCD
stwio r9,12(r8)
MOVIA r9, 0 x 0 / * veiller à ce que la minuterie est propre * /
stwio r9,0(r8)
ldwio r9,0(r8) / * juste pour voir ce qui se passe ici * /
MOVIA r11, LEGO / * l’adresse de base de la GPIO est maintenant en r11 * /
MOVIA r9, 0x07f557ff / * initialisation de Lego de contrôle des stupéfiants dans r9 * /
stwio r9, 4(r11) / * magasins dans le registre de Direction * /
MOVIA r9, 0xFFFFFFFF
stwio r9, 0(r11)
# E:load:value
MOVIA r9, 0xff3ffbff / * capteur 0, le seuil est HEX E 1111|1-111|0-0-1-1-11-11-11-11-10-11-11-11-11-11 * /
stwio r9,0(r11)
# E:load:value
MOVIA r9, 0xff3fefff / * capteur 1, le seuil est HEX E 1111|1-111|0-0-1-1-11-11-11-10-11-11-11-11-11-11 * /
stwio r9,0(r11)
MOVIA r9, 0xffbfffff / * désactiver les capteurs pour le chargement * /
stwio r9,0(r11)
MOVIA r9, 0xffdfffff / * en mode état * /
stwio r9,0(r11)
movia r9,0x18000000 /******************************************************************/
stwio r9,8(r11)
MOVIA r8, JTAG_UART / * r8 contient maintenant l’adresse de base de JTAG_UART * /
/ * Dire l’UART pour demander des interruptions lors de la réception des caractères * /
addi r9, r0, 0 x 1 / * set bit 0 (REI) du Registre RSE pour 1 * /
stwio r9, 4(r8)
addi r9, r0, 0x900 / * valeur bits 11 et 8 de ctl3 1 * /
wrctl ctl3, r9
MOVIA r9, 1
wrctl ctl0, r9
MOVIA r9, LEGO_Edge / * effacer la gâchette de bord capteur lego * /
stwio r0,0(r9)
run_loop :
MOVIA r9, LEDG
MOVIA r20, LEGO
ldwio r19,0(r20)
SRLI r19, r19, 26
stwio r19,0(r9)
MOVIA r9, LEGO_Edge
stwio r0,0(r9)
BR run_loop
.global wall_escape_left
wall_escape_left: / * tours a laissé une certaine distance pour éviter un mur * /
MOVIA r8, minuterie
STW r0,0(r8)
MOVIA r9, 0 x 4 / * démarre la minuterie mais non continue (nécessite le redémarrage intentionnelle) * /
STW r9,4(r8) / * démarrer la minuterie pour un run de période 1 * /
MOVIA r4, LEGO / * déplace l’adresse du contrôleur de moteur dans la r4 pour la fonction * /
addi sp, sp, -16
STW r11,12(sp)
STW r9,8(sp)
STW r8,4(sp)
STW ra,0(sp)
appel motors_turn_left
LDW ra,0(sp)
LDW r8,4(sp)
LDW r9,8(sp)
LDW r11,12(sp)
addi sp, sp, 16
LEFT_LOOP :
LDW r9,0(r8) / * savoir si le drapeau est allé vers le haut (une période passée) * /
MOVIA r10, 0 x 00000001
et r9, r9, r10
BEQ r9, r10, LEFT_CLEAR / * si la minuterie est expirée... * /
BR LEFT_LOOP
LEFT_CLEAR :
STW r0,0(r8) / * effacer l’indicateur * /
addi sp, sp, -16
STW r11,12(sp)
STW r9,8(sp)
STW r8,4(sp)
STW ra,0(sp)
MOVIA r4, LEGO
appelez le motors_forward / * commencer à marcher vers l’avant à nouveau * /
LDW ra,0(sp) / * ramener l’adresse de retour * /
LDW r8,4(sp)
LDW r9,8(sp)
LDW r11,12(sp)
addi sp, sp, 16 / * rétrécir la pile vers le bas * /
RET
.global wall_escape_right
wall_escape_right :
MOVIA r8, minuterie
STW r0,0(r8)
MOVIA r9, 0 x 4
STW r9,4(r8)
MOVIA r4, LEGO / * déplace l’adresse du contrôleur de moteur dans la r4 pour la fonction * /
addi sp, sp, -16
STW r11,12(sp)
STW r9,8(sp)
STW r8,4(sp)
STW ra,0(sp)
appel motors_turn_right
LDW ra,0(sp)
LDW r8,4(sp)
LDW r9,8(sp)
LDW r11,12(sp)
addi sp, sp, 16
RIGHT_LOOP :
LDW r9,0(r8)
MOVIA r10, 0 x 00000001
et r9, r9, r10
BEQ r9, r10, RIGHT_CLEAR
BR RIGHT_LOOP
RIGHT_CLEAR :
STW r0,0(r8)
addi sp, sp, -16
STW r11,12(sp)
STW r9,8(sp)
STW r8,4(sp)
STW ra,0(sp)
MOVIA r4, LEGO
appel motors_forward
LDW ra,0(sp)
LDW r8,4(sp)
LDW r9,8(sp)
LDW r11,12(sp)
addi sp, sp, 16
RET
Si c’était beaucoup trop confus, je suis totalement heureux de répondre question. Il suffit de leur demander ci-dessous.