En LED Tärning med en PIC 16F84 (eller 16F88) (6 / 12 steg)
Steg 6: Avbryter för att spara energi
Som tidigare nämnts, kommer mikroprocessor att spendera större delen av sin tid i viloläge. (Speciellt när det sitter majestätiskt på spiselkransen!). En intern oscillator stoppas i viloläge, och enheten förbrukar i princip ingen ström.
För att vakna upp från sova sätt, måste vi ha ett avbrott inträffar. Avbrott kan orsakas från olika källor, men de signalera alltid några yttre förändring.
LED Tärning projektet som vi bygger har tryckknapp ansluten till stycke 1 av Port B (PB0). Detta stift är också funktioner som "avbryta" indata. När spänningsnivån på detta stift ändras, skapas ett avbrott, orsakar PIC att stoppa vad det gjorde, och göra något annat. Det är detta avbrott som orsakar PIC att vakna upp från sova sätt.
Avbrott i PIC kan vara "globala" i naturen (Global Interrupt Enable [GIE] lite set) eller lokal. I vårt exempel vill vi fortsätta köra instruktioner direkt efter kommandot "sleep", så vi måste se till att GIE lite är tydlig. Globala avbryter orsaka programkörningen till gren till plats 4, som är användbart för en mer traditionell vektoriserade avbrott strategi som vi kommer att täcka i senare artiklar.
Kod för att implementera funktionen avbrott skulle se ut;
MAINLOOP |
MOVFW PortB; göra en dummy läsa på port B
MOVLW B '0010000'; Lämna den GIE lite off, och aktiverar den
; PB0 avbryta bit
MOVWF INTCON; och ladda upp registret avbryta kontroll
SÖMN; vänta lugnt för ett avbrott...
MOVLW B '00000000'; Inaktivera avbrott.
MOVWF INTCON
; Fortsätta kodkörningen (där vi vänta på knappen att släppas...
;
;
;
; eventualy, vi goto MAINLOOP, där vi gör det igen...
En sak att notera är att när vi har fått ett avbrott, vi vakna, och omedelbart inaktivera eventuella ytterligare avbrott. Bara med oss människor finns det inget mer irriterande att avbryts medan du har avbrutits. Flera nivåer av avbrott kan orsaka oväntade programfel, så vi stannar någon ytterligare avbrott inträffar.
Nu när vi har undersökt hur man genomför input, output, Slumptalsgenerering och avbrott, kan vi knyta allt detta tillsammans, och producera den kod som faktiskt kör tärningarna.
Det finns en liten mängd "lim" runt dessa funktioner för att producera faktiska kör kod. Jag rekommenderar att du skaffar programtablåer, och studera dem för mer information.
Om du studera listor, kan du finna att det finns snabbare, mer elegant sätt att göra det som har gjorts. Kom ihåg att det finns kommersiella realiteter om den tid på att producera en särskild lösning, och att några gånger, gör något "ingen hjärnan", långt är faktiskt snabbare att utveckla. Detta är ett inbyggt system, och i ett enkelt system som detta, är betoningen på att producera ett resultat, inte på att producera de mest eleganta koden tillgänglig. (Har du faktiskt tittat på koden i din mikrovågsugn controller...)