Quadroped Robot - (NIOSII församlingen) (9 / 13 steg)
Steg 9: Coding - Setup & springa slingan
Vi kommer nu koden installationen av systemet, och sedan lägga den i en enkel springa slinga.Inställningen innebär att tillåta alla enheter att utlösa avbrott, och konfigurera motorerna på OFF.
Jag bör notera att denna kod föregås av avsnittet .data och handler funktioner. Följande påståenden har dessutom redan gjorts:
.EQU TIMER, 0x10002000
.EQU LEGO, 0x10000060
.EQU LEGO_IRQ11, 0x800
.EQU LEGO_IRQ8, 0x100
.EQU LEGO_Edge, 0x1000006C
.EQU JTAG_UART, 0x10001000
.EQU RESK.trans.buff, 0x10000010
.EQU LEDR, 0x10000000
Så, låt oss komma igång.
.section .text
.global pokemonmaster # lol. När du skriver koden för din robot, kalla dina funktioner vad du vill.
pokemonmaster:
Movia r27, 0x800000 / * initiera stacken (linje 4) * /
Movia r8, TIMER
Movia r9, 0x6500 / * ange s tid Countdown 10 andra 500000000 = 1DCD6500 * /
stwio r9,8(r8)
Movia r9, 0x1DCD
stwio r9,12(r8)
Movia r9, 0x0 / * se till att timern är ren * /
stwio r9,0(r8)
ldwio r9,0(r8) / * bara för att se vad som händer här * /
Movia r11, LEGO / * basadress för GPIO är nu i r11 * /
Movia r9, 0x07f557ff / * Lego kontroll styrelsens initiering i r9 * /
stwio r9, 4(r11) / * butiker i riktning registrera * /
Movia r9, 0xFFFFFFFF
stwio r9, 0(r11)
# E:load:value
Movia r9, 0xff3ffbff / * Sensor 0, tröskeln är 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 / * Sensor 1, ingång är 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 / * inaktivera sensorer för lastning * /
stwio r9,0(r11)
Movia r9, 0xffdfffff / * anger till driftläge * /
stwio r9,0(r11)
movia r9,0x18000000 /******************************************************************/
stwio r9,8(r11)
Movia r8, JTAG_UART / * r8 innehåller nu JTAG_UART basadressen * /
/ * Berätta UART begära avbrott när tecken tas emot * /
Addi r9, r0, 0x1 / * set bit 0 (REI) av CSR registret till 1 * /
stwio r9, 4(r8)
Addi r9, r0, 0x900 / * anger bitar 11 och 8 i ctl3 till 1 * /
wrctl ctl3, r9
Movia r9, 1
wrctl ctl0, r9
Movia r9, LEGO_Edge / * klart lego sensor kanten avtryckaren * /
stwio r0,0(r9)
run_loop:
Movia r9, RESK.trans.buff
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: / * visade kvar ett visst avstånd för att undvika en vägg * /
Movia r8, TIMER
STW r0,0(r8)
Movia r9, 0x4 / * startar timern men inte kontinuerlig (måste avsiktligt omstart) * /
STW r9,4(r8) / * starta timern för en 1 period springa * /
Movia r4, LEGO / * flyttar adressen till motor controller till r4 för funktionen * /
Addi sp, sp, -16
STW r11,12(sp)
STW r9,8(sp)
STW r8,4(sp)
STW ra,0(sp)
kalla 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) / * ta reda på om flaggan har gått upp (en period har passerat) * /
Movia r10, 0x00000001
och r9, r9, r10
BEQ r9, r10, LEFT_CLEAR / * om timern är timeout... * /
br LEFT_LOOP
LEFT_CLEAR:
STW r0,0(r8) / * Avmarkera flaggan * /
Addi sp, sp, -16
STW r11,12(sp)
STW r9,8(sp)
STW r8,4(sp)
STW ra,0(sp)
Movia r4, LEGO
Ring motors_forward / * börja gå framåt igen * /
LDW ra,0(sp) / * föra tillbaka avsändaradressen * /
LDW r8,4(sp)
LDW r9,8(sp)
LDW r11,12(sp)
Addi sp, sp, 16 / * krympa stacken tillbaka ner * /
ret
.global wall_escape_right
wall_escape_right:
Movia r8, TIMER
STW r0,0(r8)
Movia r9, 0x4
STW r9,4(r8)
Movia r4, LEGO / * flyttar adressen till motor controller till r4 för funktionen * /
Addi sp, sp, -16
STW r11,12(sp)
STW r9,8(sp)
STW r8,4(sp)
STW ra,0(sp)
kalla 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, 0x00000001
och 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
kalla motors_forward
LDW ra,0(sp)
LDW r8,4(sp)
LDW r9,8(sp)
LDW r11,12(sp)
Addi sp, sp, 16
ret
Om det var alldeles för förvirrande, är jag helt glad att besvara frågan. Bara be dem nedan.