Stap 6: Onderbreekt om energie te besparen
Zoals eerder vermeld, zullen de microprocessor besteden het merendeel van zijn tijd in de slaapmodus staat. (Vooral wanneer het is zittend majestueus op de schoorsteenmantel!). In de slaapstand staat, de interne oscillator is gestopt, en het apparaat verbruikt in principe geen stroom.
Om te ontwaken uit de slaapstand, moeten we hebben een 'onderbreken' optreden. Interrupts kunnen uit allerlei bronnen worden veroorzaakt, maar ze altijd enkele externe verandering signaal.
De LED Dice-project dat we aan het opbouwen zijn heeft de drukknop verbonden met bit 1 van poort B (PB0). Deze pin is ook functies als input 'onderbreken'. Wanneer het spanningsniveau op deze pin verandert, wordt een interrupt gegenereerd, waardoor de PIC om te stoppen met wat het deed, en iets anders te doen. Het is deze interrupt die zorgt ervoor dat de PIC om uit zijn slaapstand wakker te worden.
Interrupts in de PIC kunnen 'globaal' in de natuur (Global Interrupt Enable [GIE] bit set), of plaatselijk zijn. In ons voorbeeld zouden we graag blijven uitvoeren van instructies onmiddellijk na de opdracht 'slaap', dus we moeten ervoor zorgen dat de GIE bit duidelijk is. Global interrupts veroorzaken de uitvoering van het programma naar tak naar locatie 4, die is handig voor een meer traditionele vectored interrupt-benadering die wij in later artikelen zullen behandelen.
Code om de interrupt-functionaliteit te implementeren zou uitzien;
MAINLOOP MOVFW PortB; doen van een dummy lezen op poort B MOVLW B '0010000'; Laat de GIE beetje off, en in staat stellen de ; PB0 onderbreken bits MOVWF INTCON; en laad-up van het register van de control Interrupt SLAAP; Wacht rustig op een interrupt... MOVLW B "00000000"; interrupts uitschakelen. MOVWF INTCON ; Blijven tot uitvoering van code (waar we wachten op de knop worden vrijgegeven... ; ; ; ; eventueel, we goto MAINLOOP, waar we het doen allemaal weer... |
Een ding om op te merken is dat zodra we een interrupt hebben ontvangen, we wakker en onmiddellijk verdere interrupts uitschakelen. Alleen met ons mensen is er niets meer irritant dat wordt onderbroken terwijl u hebben onderbroken. Meerdere niveaus van interrupts kunnen leiden tot onverwachte programmafouten, dus we verdere interrupts voorkomen stoppen.
Nu dat we hebben onderzocht hoe de uitvoering van de input-, output-, willekeurig nummer generatie- en interrupts, kunnen we dit alles samen te binden, en produceren van de code die de dobbelstenen daadwerkelijk wordt uitgevoerd.
Er is een kleine hoeveelheid 'lijm' rond deze functies om werkelijke lopende code te produceren. Ik adviseer dat u verkrijgen van de programma-aanbiedingen, en ze te voor meer informatie bestuderen.
Als je de aanbiedingen studie, kan je zijn er sneller, elegantere manieren om te doen wat er is gedaan. Vergeet niet dat er commerciële realiteit dat de tijd doorgebracht op het produceren van een bepaalde oplossing, en dat sommige tijden, iets doen de 'no brain", lange weg is eigenlijk sneller te ontwikkelen. Dit is een embedded systeem, en een eenvoudig systeem als dit, de nadruk ligt op het produceren van een resultaat, niet op het produceren van de meest elegante code beschikbaar. (Heb je eigenlijk gekeken de code in uw magnetron-controller...)