Stap 10: Worden als Kanye - INTERRUPT!
Dus nu schrijven we wat is misschien wel het belangrijkste onderdeel van het Wetboek; de interrupts.De interrupt handler zorgt voor de 'reactie' op de externe ingangen. In dit geval zijn de externe ingangen toetsopdrachten (vooruit, beurt, enz.) en de touch sensoren. Wij willen de robot om te verplaatsen naar voren wanneer het detecteert een bepaalde sleutel, achteruit voor een ander, enzovoort.
Dus, zonder verdere omhaal, de interrupt handler:
.data
TheChar: .byte ' ' # het teken dat wordt verzonden. Het is gelezen door ons programma en wordt overschreven door de interrupt handler.
/ * Dit is de belangrijkste functie van de Walker robot. */
.section .exceptions, "ax"
.align 2
handler:
Addi sp, sp-12 #save ea, et, ctl1 op stapel
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 / * controleren de interrupt in afwachting van register (ctl4) * /
Andi et, et, LEGO_IRQ11 / * controleren of de wachtende interrupt van GPIO JP1 is * /
BNE et, r0, handle_sensor
rdctl et, ctl4 / * controleren de interrupt in afwachting van register (ctl4) * /
Andi et, et, LEGO_IRQ8 / * controleren of de wachtende interrupt van JTAG UART is * /
BNE et, r0, handle_JTAG
BR exit_handler
handle_sensor:
/ * Controleren voor valse interrupt * /
movia r2, LEGO #_IRQ11 / * GPIO JP1 in r2 laden * /
ldwio r4, 0(r2)
srli r4, r4, 27
Andi r4, r4, 0x01f
cmpeqi r5, r4, 0x01f
BNE r5, r0, exit_handler / * valse interrupt * /
cmpeqi r5, r4, 0x01e / * controleren sensor 0 * /
BNE r5, r0, handle_sensor_left
cmpeqi r5, r4, 0x01d / * controleren 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 # Controleer of bit 15 1 (Lees geldig)
dustybear r13, r0, exit_handler
Andi r2, r2, 0xff #mask lagere byte
/ * controleren voor 'w' * /
movia r12, 'w' #' w'
dustybear r2, r12, handle_forward
/ * controleren voor de ' * /
movia r12, de ' # 's'
dustybear r2, r12, handle_stop
/ * controleren voor 'x' * /
movia r12, 'x' #' x'
dustybear r2, r12, handle_reverse
/ * controleren voor 'a' * /
movia r12, 'a' #' a'
dustybear r2, r12, handle_left
/ * controleren want had' * /
movia r12, 'd' #had '
dustybear 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
oproep lichtgevend
movia r4, LEGO / * LEGO gaan met r4, zodat motorische functies kunnen verwijzing * /
oproep wall_escape_right
movia r4, LEDR
oproep 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 / * opnieuw inschakelen interrupts * /
wrctl ctl0, et / * PIE bits pack ingesteld op 1 (inschakelen 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
oproep lichtgevend
movia r4, LEGO / * LEGO gaan met r4, zodat motorische functies kunnen verwijzing * /
oproep wall_escape_left
movia r4, LEDR
oproep 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 / * opnieuw inschakelen interrupts * /
wrctl ctl0, et / * PIE bits pack ingesteld op 1 (inschakelen inerrupts) * /
BR exit_handler
handle_forward:
movia r7, JTAG_UART
ldwio r7,0(r7)
movi et, 0x1 / * opnieuw inschakelen interrupts * /
wrctl ctl0, et / * PIE bits pack ingesteld op 1 (inschakelen 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 / * LEGO gaan met r4, zodat motorische functies kunnen verwijzing * /
oproep 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
oproep 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
oproep 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
oproep 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 / * opnieuw inschakelen interrupts * /
wrctl ctl0, et / * PIE bits pack ingesteld op 1 (inschakelen 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
Bel motors_stop / * alle motoren verrekening in- en uitschakelen van alle sensoren * /
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 / * duidelijk de lego sensor rand trigger * /
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) # herstellen ctl1, ea, et
wrctl ctl1, et
LDW ea, 8(sp)
Addi sp, sp, 12 # herstellen stack pointer
Subi ea, ea, 4 # Controleer of we uitvoeren van de instructie die werd onderbroken. EA/r29 verwijst naar de instructie na het
eret # terugkeer uit interrupt (dit herstelt u ctl0 het? s vorige staat, dat is opgeslagen in ctl1 en doet pc = ea)
Gewoon om duidelijk te zijn, deze code in opgenomen in het main.s bestand downloadbaar op de vorige pagina.
Nu de interrupt heeft zijn verzorgd, laten we toevoegen sommige knipperende LED's, en een top functie in C-code om het te verpakken alle up!