Quadroped Robot - (NIOSII församlingen) (10 / 13 steg)
Steg 10: Vara som Kanye - avbrott!
Så nu ska vi skriva vad är utan tvekan den viktigaste delen i kodexen. avbrotten.Avbrottshanterare hand tar om "reaktion" externa ingångarna. I detta fall, är externa ingångarna tangentkommandon (forward, tur, etc.) och touch sensorer. Vi vill roboten att flytta framåt när den upptäcker en viss nyckel, bakåt för en annan, och så vidare.
Så, utan vidare, avbrottshanterare:
.data
thechar: .byte ' ' # tecknet som kommer att skickas. Det är läst av vårt program och skrivs över av avbrottshanterare.
/ * Detta är den huvudsakliga funktionen av Walker robot. */
.section .exceptions, "ax"
.align 2
Handler:
Addi sp, sp, -12 #save ea, et, ctl1 på stacken
STW et, 0(sp)
rdctl et, ctl1
STW et, 4(sp)
STW ea, 8(sp)
Addi sp, sp, -32
STW r15,28(sp)
STW r14,24(sp)
STW r13,20(sp)
STW r12,16(sp)
STW r11,12(sp)
STW r10,8(sp)
STW r9,4(sp)
STW r8,0(sp)
rdctl et, ctl4 / * kolla på avbryta väntande register (ctl4) * /
Andi et, et, LEGO_IRQ11 / * kontrollera om det väntande avbrottet är från GPIO JP1 * /
BNE et, r0, handle_sensor
rdctl et, ctl4 / * kolla på avbryta väntande register (ctl4) * /
Andi et, et, LEGO_IRQ8 / * kontrollera om det väntande avbrottet är från JTAG UART * /
BNE et, r0, handle_JTAG
br exit_handler
handle_sensor:
/ * Kontrollera för falska avbrott * /
Movia r2, LEGO #_IRQ11 / * ladda GPIO JP1 i r2 * /
ldwio r4, 0(r2)
Srli r4, r4, 27
Andi r4, r4, 0x01f
cmpeqi r5, r4, 0x01f
BNE r5, r0, exit_handler / * falska avbrott * /
cmpeqi r5, r4, 0x01e / * kontrollera sensor 0 * /
BNE r5, r0, handle_sensor_left
cmpeqi r5, r4, 0x01d / * kontrollera sensor 1 * /
BNE r5, r0, handle_sensor_right
br exit_handler
handle_JTAG:
Movia r7, JTAG_UART
ldwio r2, 0(r7)
Andi r13, r2, 0x8000 # check om bit 15 är 1 (Läs giltig)
BEQ r13, r0, exit_handler
Andi r2, r2, 0xff #mask lägre byte
/ * När på 'w' * /
Movia r12, "w" # "w"
BEQ r2, r12, handle_forward
/ * När på ' * /
Movia r12, 's' # 's'
BEQ r2, r12, handle_stop
/ * När på 'x' * /
Movia r12, 'x' #' x'
BEQ r2, r12, handle_reverse
/ * När på "a" * /
Movia r12, "a" # "a"
BEQ r2, r12, handle_left
/ * Kontrollera för hade ' * /
Movia r12, 'd' # hade "
BEQ r2, r12, handle_right
br exit_handler
handle_sensor_left:
Addi sp, sp, -32
STW r15,28(sp)
STW r14,24(sp)
STW r13,20(sp)
STW r12,16(sp)
STW r11,12(sp)
STW r10,8(sp)
STW r9,4(sp)
STW r8,0(sp)
Movia r4, LEDR
Ring lightup
Movia r4, LEGO / * flytta LEGO till r4 så att motoriska funktioner kan referera * /
kalla wall_escape_right
Movia r4, LEDR
kalla lightdown
LDW r8,0(sp)
LDW r9,4(sp)
LDW r10,8(sp)
LDW r11,12(sp)
LDW r12,16(sp)
LDW r13,20(sp)
LDW r14,24(sp)
LDW r15,30(sp)
Addi sp, sp, 32
movi et, 0x1 / * återaktivera avbryter * /
wrctl ctl0, et / * anger paj bit pack till 1 (aktivera inerrupts) * /
br exit_handler
handle_sensor_right:
Addi sp, sp, -32
STW r15,28(sp)
STW r14,24(sp)
STW r13,20(sp)
STW r12,16(sp)
STW r11,12(sp)
STW r10,8(sp)
STW r9,4(sp)
STW r8,0(sp)
Movia r4, LEDR
Ring lightup
Movia r4, LEGO / * flytta LEGO till r4 så att motoriska funktioner kan referera * /
kalla wall_escape_left
Movia r4, LEDR
kalla lightdown
LDW r8,0(sp)
LDW r9,4(sp)
LDW r10,8(sp)
LDW r11,12(sp)
LDW r12,16(sp)
LDW r13,20(sp)
LDW r14,24(sp)
LDW r15,30(sp)
Addi sp, sp, 32
movi et, 0x1 / * återaktivera avbryter * /
wrctl ctl0, et / * anger paj bit pack till 1 (aktivera inerrupts) * /
br exit_handler
handle_forward:
Movia r7, JTAG_UART
ldwio r7,0(r7)
movi et, 0x1 / * återaktivera avbryter * /
wrctl ctl0, et / * anger paj bit pack till 1 (aktivera inerrupts) * /
Addi sp, sp, -32
STW r15,28(sp)
STW r14,24(sp)
STW r13,20(sp)
STW r12,16(sp)
STW r11,12(sp)
STW r10,8(sp)
STW r9,4(sp)
STW r8,0(sp)
Movia r4, LEGO / * flytta LEGO till r4 så att motoriska funktioner kan referera * /
kalla motors_forward
LDW r8,0(sp)
LDW r9,4(sp)
LDW r10,8(sp)
LDW r11,12(sp)
LDW r12,16(sp)
LDW r13,20(sp)
LDW r14,24(sp)
LDW r15,30(sp)
Addi sp, sp, 32
br exit_handler
handle_reverse:
Movia r7, JTAG_UART
ldwio r7,0(r7)
movi et, 0x1
wrctl ctl0, et
Addi sp, sp, -32
STW r15,28(sp)
STW r14,24(sp)
STW r13,20(sp)
STW r12,16(sp)
STW r11,12(sp)
STW r10,8(sp)
STW r9,4(sp)
STW r8,0(sp)
Movia r4, LEGO
kalla motors_backward
LDW r8,0(sp)
LDW r9,4(sp)
LDW r10,8(sp)
LDW r11,12(sp)
LDW r12,16(sp)
LDW r13,20(sp)
LDW r14,24(sp)
LDW r15,30(sp)
Addi sp, sp, 32
br exit_handler
handle_left:
Movia r7, JTAG_UART
ldwio r7,0(r7)
movi et, 0x1
wrctl ctl0, et
Addi sp, sp, -32
STW r15,28(sp)
STW r14,24(sp)
STW r13,20(sp)
STW r12,16(sp)
STW r11,12(sp)
STW r10,8(sp)
STW r9,4(sp)
STW r8,0(sp)
Movia r4, LEGO
kalla motors_turn_left
LDW r8,0(sp)
LDW r9,4(sp)
LDW r10,8(sp)
LDW r11,12(sp)
LDW r12,16(sp)
LDW r13,20(sp)
LDW r14,24(sp)
LDW r15,30(sp)
Addi sp, sp, 32
br exit_handler
handle_right:
Movia r7, JTAG_UART
ldwio r7,0(r7)
movi et, 0x1
wrctl ctl0, et
Addi sp, sp, -32
STW r15,28(sp)
STW r14,24(sp)
STW r13,20(sp)
STW r12,16(sp)
STW r11,12(sp)
STW r10,8(sp)
STW r9,4(sp)
STW r8,0(sp)
Movia r4, LEGO
kalla motors_turn_right
LDW r8,0(sp)
LDW r9,4(sp)
LDW r10,8(sp)
LDW r11,12(sp)
LDW r12,16(sp)
LDW r13,20(sp)
LDW r14,24(sp)
LDW r15,30(sp)
Addi sp, sp, 32
br exit_handler
handle_stop:
Movia r7, JTAG_UART
ldwio r7,0(r7)
movi et, 0x1 / * återaktivera avbryter * /
wrctl ctl0, et / * anger paj bit pack till 1 (aktivera inerrupts) * /
Addi sp, sp, -32
STW r15,28(sp)
STW r14,24(sp)
STW r13,20(sp)
STW r12,16(sp)
STW r11,12(sp)
STW r10,8(sp)
STW r9,4(sp)
STW r8,0(sp)
Movia r4, LEGO
Ring motors_stop / * kvitta alla motorer och inaktivera alla sensorer * /
stwio r9, 0(r2)
LDW r8,0(sp)
LDW r9,4(sp)
LDW r10,8(sp)
LDW r11,12(sp)
LDW r12,16(sp)
LDW r13,20(sp)
LDW r14,24(sp)
LDW r15,30(sp)
Addi sp, sp, 32
br exit_handler
exit_handler:
Movia r9, LEGO_Edge / * klart lego sensor kanten avtryckaren * /
stwio r0,0(r9)
LDW r8,0(sp)
LDW r9,4(sp)
LDW r10,8(sp)
LDW r11,12(sp)
LDW r12,16(sp)
LDW r13,20(sp)
LDW r14,24(sp)
LDW r15,30(sp)
Addi sp, sp, 32
LDW et, 0(sp)
LDW et, 4(sp) # Återställ ctl1, ea, et
wrctl ctl1, et
LDW ea, 8(sp)
Addi sp, sp, 12 # återställa buntpekaren
Subi ea, ea, 4 # se till att vi kör instruktionen som avbröts. EA/r29 pekar på instruktionen efter det
eret # återkomst från avbrott (detta återställer ctl0 till det? s tidigare tillstånd som har sparats i ctl1 och inte pc = ea)
Bara för att vara tydlig, med denna kod i i main.s filen nedladdningsbara på föregående sida.
Nu när avbrottet har varit tagit hand om, låt oss lägga några blinkande lysdioder, och en top funktion i C-kod till sjal den upp allt!