Paso 9: Codificación - la disposición y el bucle de ejecución
Ahora el código la configuración inicial del sistema y entonces puesto le en un bucle de ejecución simple.La configuración consiste en permitir que todos los dispositivos para accionar interrupciones e inicialmente los motores en OFF.
Debo señalar que este código está precedido por la sección. Data y las funciones de controlador. Además, ya se hicieron las siguientes declaraciones:
.equ temporizador, 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, 0x10000000
Por lo tanto, vamos a empezar.
.Section .text
.global pokemonmaster # lol. Cuando se escribe el código para tu robot, llamar a sus funciones lo que quieras.
pokemonmaster:
movia r27, 0x800000 / * inicializar la pila (alineada a 4) * /
movia r8, temporizador
movia r9, 0x6500 / * de conjunto tiempo de cuenta regresiva de 10 segundos 500000000 = 1DCD6500 * /
stwio r9,8(r8)
movia r9, 0x1DCD
stwio r9,12(r8)
movia r9, 0 x 0 / * Asegúrese de que el temporizador esté limpio * /
stwio r9,0(r8)
ldwio r9,0(r8) / * sólo para ver lo que está sucediendo aquí * /
movia r11, LEGO / * la dirección base de la GPIO está ahora en r11 * /
movia r9, 0x07f557ff / * inicialización de la Junta de control de Lego en r9 * /
stwio r9, 4(r11) / * tiendas en el registro de la dirección * /
r9 de movia, 0xFFFFFFFF
stwio r9, 0(r11)
# E:load:value
movia r9, 0xff3ffbff / * Sensor 0, umbral es hexagonal 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 / * Sensor 1, umbral es hexagonal 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 / * deshabilitar sensores de carga * /
stwio r9,0(r11)
movia r9, 0xffdfffff / * se pone en modo de estado * /
stwio r9,0(r11)
movia r9,0x18000000 /******************************************************************/
stwio r9,8(r11)
movia r8, JTAG_UART / * r8 ahora contiene la dirección base JTAG_UART * /
/ * Dile el UART para solicitar interrupciones cuando se reciben caracteres * /
Addi r9, r0, 0 x 1 / * set bit 0 (REI) del registro RSC a 1 * /
stwio r9, 4(r8)
Addi r9, r0, 0x900 / * bits 11 y 8 de ctl3 el valor 1 * /
wrctl ctl3, r9
movia r9, 1
wrctl ctl0, r9
movia r9, LEGO_Edge / * borrar el disparador de borde del sensor de lego * /
stwio r0,0(r9)
run_loop:
r9 de movia, LEDG
movia r20, LEGO
ldwio r19,0(r20)
SRLI r19, r19, 26
stwio r19,0(r9)
movia r9, LEGO_Edge
stwio r0,0(r9)
run_loop br
.global wall_escape_left
wall_escape_left: / * vueltas a cierta distancia para evitar una pared a la izquierda * /
movia r8, temporizador
STW r0,0(r8)
movia r9, 0x4 / * inicia el temporizador pero no continuo (necesita reinicio intencional) * /
STW r9,4(r8) / * iniciar el temporizador para un funcionamiento periodo 1 * /
r4 de movia, LEGO / * mueve la dirección del controlador motor en r4 para la función * /
Addi sp, sp, -16
STW r11,12(sp)
STW r9,8(sp)
STW r8,4(sp)
STW ra,0(sp)
llamar al 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:
r9,0(r8) LDW / * averiguar si la bandera se ha ido para arriba (ha pasado un período) * /
r10 de movia, 0 x 00000001
y r9, r9, r10
BEQ r9, r10, LEFT_CLEAR / * si el temporizador de tiempo... * /
br LEFT_LOOP
LEFT_CLEAR:
STW r0,0(r8) / * borrar la bandera * /
Addi sp, sp, -16
STW r11,12(sp)
STW r9,8(sp)
STW r8,4(sp)
STW ra,0(sp)
r4 de movia, LEGO
llamar al motors_forward / * empezar a caminar hacia adelante otra vez * /
ra,0(sp) LDW / * devolver la dirección de retorno * /
LDW r8,4(sp)
LDW r9,8(sp)
LDW r11,12(sp)
Addi sp, sp, 16 / * reducir la pila hacia abajo * /
RET
.global wall_escape_right
wall_escape_right:
movia r8, temporizador
STW r0,0(r8)
movia r9, 0x4
STW r9,4(r8)
r4 de movia, LEGO / * mueve la dirección del controlador motor en r4 para la función * /
Addi sp, sp, -16
STW r11,12(sp)
STW r9,8(sp)
STW r8,4(sp)
STW ra,0(sp)
llamar al 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)
r10 de movia, 0 x 00000001
y 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)
r4 de movia, LEGO
llamar al motors_forward
LDW ra,0(sp)
LDW r8,4(sp)
LDW r9,8(sp)
LDW r11,12(sp)
Addi sp, sp, 16
RET
Si era demasiado confuso, estoy totalmente feliz de responder la pregunta. Sólo les pedimos a continuación.