Stap 6: Timers
Een timer is een eenvoudig tellen apparaat in uw micro, het is ook bekend als een teller voor deze reden.
Op elke tick verhogen ze zelf.
U kunt de waarde te controleren wanneer u een idee van hoeveel tijd is verstreken, of kunt u ze activeren een interrupt als u wilt u laten weten wanneer een bepaalde waarde heeft bereikt.
Timers zijn niet erg nauwkeurig is, moet u van nauwkeurigheid wil je een real-time clock (RTC).
Ze zijn echter goed genoeg voor de meeste taken
Dus voordat we erin, laat onderzoeken hoe een timer daadwerkelijk werkt.
Iedere kloktik van de micro wordt ingevoerd in de module van de timer.
Het kan hier worden verdeeld door verschillende bedragen voor de productie van een langzamer teek (zullen we dat later).
Op de teek coming out van de prescaler, wordt de timer toegevoegd 1 aan de waarde van het register.
Zoals de registers hebben we al onder, kan deze worden gelezen of geschreven.
U kunt zien wat de teek telling is op, en op basis van de kloksnelheid en de scheidingslijn, kunt u bepalen dat ongeveer hoeveel tijd is verstreken.
Wanneer de timer het limiet (255 voor een 8-bits timer, 65535 voor een 16-bits timer raakt) wordt ingesteld op 0 en begint opnieuw te tellen.
Als u interrupts die het waarschuwt uw code dat dit is gebeurd inschakelen.
U kunt ook instellen dat een vergelijk waarde die leiden een interrupt tot zal als u wilt worden geïnformeerd over een tijd het is korter dan de overloop.
Als u nodig hebt voor het meten van een langere periode, kunt u een klok prescaler (denk aan het als een divider).
Bijvoorbeeld, wordt een prescaler van 8 alleen verzonden een teek naar de teller na het 8 teken van de systeemklok ontvangen heeft.
Verliest u nauwkeurigheid, maar je kunt het meten van een langere periode van tijd.
Als u wilt om te meten een erg lange periode (zeg 10 minuten, dat is een lange tijd voor uw snelle micro!), kunt u rekenen hoeveel keer de meer dan stroom onderbreken wordt geactiveerd en handelen op basis van die.
Een gemakkelijke manier om uit de klokinstellingen te werken is het gebruik van een rekenmachine zoals deze:
http://Frank.circleofcurrent.com/cache/avrtimercalc.htm
Zo, genoeg uitleg, let's get in sommige code!
In het voorbeeld hier zal laten zien hoe met de overflow interrupt langere periodes van tijd, om te zien hoe kleinere periodes (microseconden & milliseconden bijvoorbeeld), hebben een blik op de IR ontvanger code, die uitgebreid gebruik van hen maakt naar de tijd van de binnenkomende signalen van de afstandsbediening.
Stel uw breadboard zoals in de afbeelding en de bijgevoegde code downloaden. (Ingesteld van de micro klok op 1MHz)
Wanneer u op de knop drukt, zal de LED oplichten en blijf op 30 seconden.
Als u nogmaals op de knop drukt, zal de tijd op beginstand zetten.
Dus laten we de code te onderzoeken.
De hoofdlus is vrij standaard, instellen van de LED en de knop inschakelen interrupts (Vergeet niet dit!).
Wanneer de knop is ingedrukt wordt de "start_timer"-functie aanroepen.
start_timer stelt de prescaler tot 1024 inschakelen de overflow interrupt voor timer0, onze overflow_count uit en schakelt u de timer.
Nu, elke keer dat de klok gaat meer dan 255, de interrupt wordt genoemd.
De interrupt is de speciaal benoemde functie ISR(TIMER0_OVF_vect)
We controleren hier als we hebben vaak genoeg (berekend met de bovenstaande rekenmachine-website) overstroomd, en als we hebben we de interrupt voor de timer uitschakelen en uitschakelen van de LED.
Anders wij gewoon onze telling verhoogd en laat de timer start opnieuw.
Vrij simpel toch?
De schoonheid van het is wel dat u andere code die wordt uitgevoerd terwijl de timer telt kunt hebben.
Als het overloopt zal er een kleine omweg naar de Interrupt Service Routine (ISR), en zodra het wordt gedaan zal terugkeren naar uw eerder lopende code alsof er niets gebeurd!
Beter dan een eenvoudige vertraging, want u kunt meer werk doen of gaan slapen om energie te besparen!