ARM-Baugruppe - Basic-Interrupt-Handling

Ich bin derzeit Herumspielen mit einigen ARM-Assembler auf dem lpc2378, ich habe geschrieben eine Schleife zu Steuern, ein Ofen die Temperatur hat, aber ich glaube, ich brauche, um zu implementieren eine Art von interrupt-handling, um meine komplette Projekt.

Wenn die Anwendung ausgeführt wird, tritt es in eine Schleife, die wartet, bis Button_1 Eingang, die Schleife führt dann auf und geht durch verschiedene Phasen, aber es nicht erreichen können, warten Sie, bis Button_2 input für die Funktion der Anwendung.

So ein paar Fragen hier, wie genau funktioniert der interrupt-handler arbeiten? und wie könnte ich es umsetzen in meine Anwendung.

Hier ist mein Button_1 code:

;=========================================================================
; Wait for BUT1 to be pressed
;=========================================================================
WaitBUT1
  STMFD r13!,{r0,r5,r14}   ; Push r0, r5 and LR

WaitForBUT1Pressed
    ldr r0, = IO0PIN            ; Address of FIO0PIN register 
    ldr r1, [r0]                ; Read FIO0PIN in to r1
    ands r1, r1, # B1_MASK      ; Mask out BUT1
    beq BUT1Pressed             ; Exit LED toggle loop if button is pressed
    B WaitForBUT1Pressed
BUT1Pressed

  LDMFD r13!,{r0,r5,r14}   ; Pop r0, r5 and LR
  mov pc, r14              ; Put link register back into PC

und meine Button_2 code:

;=========================================================================
; Wait for BUT2 to be pressed
;=========================================================================
WaitBUT2
  STMFD r13!,{r0,r5,r14}   ; Push r0, r5 and LR

WaitForBUT2Pressed
    ldr r0, = IO0PIN            ; Address of FIO0PIN register 
    ldr r1, [r0]                ; Read FIO0PIN in to r1
    ands r1, r1, # B2_MASK      ; Mask out BUT1
    beq BUT2Pressed             ; Exit LED toggle loop if button is pressed
    B WaitForBUT2Pressed
BUT2Pressed

  LDMFD r13!,{r0,r5,r14}   ; Pop r0, r5 and LR
  mov pc, r14              ; Put link register back into PC

und auch mein Ofen Regelkreis:

LoopStart

   BL WaitBUT1 ; wait until button 1 is pressed
   BL heaterOn ; turn heater on
   BL systemLedOn ; turn system LED on
   BL readTemp ; Check ADC for temp
   BL checkTemp ; Count down, check ADC for temp
   CMP r3, #5 ; Compare timer with delay
   BGT errorVal
   SUBS r4, r2, r7  ;Performs r7 = r4 - r2 and sets condition register
   BEQ LoopStart ; if equal nothing to do
   BGT overTemp ; r7 < 0 case
   BL errorLedOn
   BL heaterOn
   BL FanOff
   B LoopStart

overTemp
   BL errorLedOn
   BL heaterOff
   BL FanOn
   B LoopStart


   BL WaitBUT2
   BL FanOff
   BL errorLedOff
   BL systemLedOff
   BL heaterOff

       B LoopStart

Vielen Dank im Voraus.

InformationsquelleAutor user1080390 | 2012-05-18
Schreibe einen Kommentar