PIC 16F684 van knipperlicht naar... (pagina 3)
(Don't) interrupt me!
De eeuwige discussie: Waarom (geen) interrupts???.
Interrupts nemen veel werkt uit de handen van het hoofdprogramma. Je krijgt wel extra kopzorgen bij het juist programmeren en je creëert twee asynchrone processen (je 'mainloop' en je
'interruptprocedure') en op één of andere manier moeten beiden met elkaar communiceren (met de nodige valkuilen!).
In ons voorbeeldje neemt een interuptprocedure heel veel werk uit handen van de 'main-loop'.
... var bit TimePassed = low ... ;------------------------------------------------------------------------------- ;INTERRUPT PROCEDURE ;------------------------------------------------------------------------------- procedure Timer0Interrupt is pragma interrupt if(INTCON_T0IF)then ;T0IF is geset, 4 ms zijn verlopen TMR0 = Timer0Reload ;herlaad Timer0 INTCON_T0IF = low ;reset Timer0 interrupt vlag ;laat dit 250 keer gebeuren voor 1 seconde TimerCounter = TimerCounter - 1 if(TimerCounter == 0)then TimerCounter = TimerCounterReload ;herlaad de teller TimePassed = high ;Meldt dat de tijd verstreken is end if end if end procedure ;------------------------------------------------------------------------------- |
De interruptprocedure is opgebouwd als elke andere procedure met één uitzondering
pragma interrupt
Dit laat de compiler weten dat de procedure als interruptprocedure (routine) geldt.
Als eerste wordt een controle gedaan wie de interrupt veroorzaakt heeft. In ons geval hebben we enkel oog voor de Timer0 en controleren dan ook alleen maar of Timer0 de interrupt heeft
veroorzaakt (INTCON_T0IF is dan 1).
De rest van de interruptprocedure is dezelfde code als in vorig voorbeeld. De interruptprocedure wordt 250 keer doorlopen (elke 4 ms) om tot 1 seconde te komen. Na 1 seconde wordt de
vlag TimePassed gezet om aan het hoofdprogramma te kennen te geven dat er één seconde verstreken is (communicatie tussen de asynchrone processen). De main-loop reageert daarop en
reset de vlag.
Eén zaak mogen we niet vergeten: interrupts moeten ge-enabled worden. We moeten de processor laten weten dat we gebruik willen maken van zijn interrupts.
Dat gebeurt op 2 niveau's: we moeten aangeven dat we de interrupt van Timer0 willen gebruiken (INTCON_T0IE moet 1 zijn) en de globale interrupt-enable moet ook aangezet
worden (INTCON_GIE)
... INTCON_T0IE = high ;interrupt! ... INTCON_GIE = high ;enable interrupts ... |
De mainloop wordt er alleen maar eenvoudiger op en heeft nu heel veel resterende tijd om andere zaken te doen.
;------------------------------------------------------------------------------- forever loop if(TimePassed)then ;1 seconde is verstreken TimePassed = low ;wis de vlag Led = !Led ;zet de led aan of uit end if ;hier tijd om andere zaken uit te voeren ;... end loop ;------------------------------------------------------------------------------- |
Schema JAL code HEX file Filmpje
(pagina 2) ...PIC 16F684 van knipperlicht naar... (pagina 4)
Links