PIC 16F684 van knipperlicht naar... (pagina 3)

(Don't) interrupt me!

Schema      JAL code      HEX file


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
;-------------------------------------------------------------------------------
 

 


 


Bij dit projectje toch een zijsprong gemaakt en voor de liefhebbers direct een tweede timer en ook een tweede interrupt bijgevoegd.
Tijdens de 'aan' tijd van het ledje gaat dat nu hevig knipperen (interrupt via Timer2).

Schema      JAL code      HEX file     Filmpje




(pagina 2) ...PIC 16F684 van knipperlicht naar... (pagina 4)


Links

JALEdit de editor om JAL code te schrijven
JALlib de bibliotheken (en voorbeelden) en de compiler
MPLab IDE de ontwikkel- en PicProgrammeromgeving
Microchip de site van de PIC's
JalList Hulp en hopen voorbeelden