En komplett starter guide till AVRs (6 / 10 steg)
Steg 6: Timers
En timer är en enkel räknande enhet i din micro, det är också känt som en counter därför.
På varje fästing öka de själva.
Du kan kontrollera värdet när du behöver en uppfattning om hur mycket tid har gått, eller du kan få dem att utlösa ett avbrott så att du vet när ett visst värde har nåtts.
Timers är inte särskilt exakt, om du behöver noggrannhet kommer du en realtidsklocka (RTC).
De är dock bra nog för de flesta uppgifter
Så innan vi går in det, låter utforska hur en timer fungerar.
Varje klocka kryssa av mikro matas in i modulen timer.
Här kan det delas av olika belopp att producera en långsammare fästing (vi kommer att få till det senare).
På fästingen kommer från prescaler, lägger timern 1 värdet av sina register.
Som registren vi har redan täckande, kan den här läses eller skrivs.
Du kan se vad tick räkningen är på, och baserat på klockhastighet och avdelare, du kan fastställa ungefär hur mycket tid har gått.
När timern når sin gräns (255 för en 8-bitars timer, 65535 för en 16-bitars timer) återställs till 0 och börjar räkna igen.
Om du aktiverar avbryter varnar det koden som detta har hänt.
Du kan också ange en jämför värdet som utlöser ett avbrott om du vill bli informerad om en tid den är kortare då overflow.
Om du behöver för att mäta en längre tid, kan du använda en klocka prescaler (Tänk på det som en avdelare).
Till exempel skickar en prescaler 8 bara en fästing till disken efter det har fått 8 fästingar från systemklockan.
Du förlorar noggrannhet men du kan mäta en längre tid.
Om du vill mäta en riktigt lång tidsperiod (säg 10 minuter, vilket är en lång tid för din snabba mikro!), kan du räkna hur många gånger över flow avbrott utlöses och agera utifrån som.
Ett enkelt sätt att träna klockinställningar är att använda en miniräknare som den här:
http://Frank.circleofcurrent.com/cache/avrtimercalc.htm
Så, nog förklaring, låt oss gå in lite kod!
Exemplet här kommer att visa hur man använder overflow avbrottet till tid längre tid, för att se hur mindre tidsperioder (mikrosekunder & millisekunder till exempel), ta en titt på IR-mottagaren koden, som gör omfattande användning av dem då inkommande fjärrkontroll signaler.
Ställ in din skärbräda som på bilden och ladda ner den bifogade uppförandekoden. (Värdet Mikros klocka 1MHz)
När du trycker på knappen, kommer lysdioden tänds och bo 30 sekunder.
Om du trycker på knappen igen, återställs timern.
Så låt oss granska koden.
Huvudloop är ganska standard, ställa in LED och knappen Aktivera avbrott (inte Glöm det!).
När du trycker på knappen anropa funktionen "start_timer".
start_timer anger prescaler till 1024, aktiverar overflow avbrottet för timer0, rensa våra overflow_count och rensa timern.
Varje gång klockan går över 255, kallas nu, avbrottet.
Avbrottet är funktionen speciellt namngivna ISR(TIMER0_OVF_vect)
Här kolla vi om vi har flödat över tillräckligt många gånger (beräknat med kalkylatorn hemsida ovan), och om vi har vi inaktivera avbrottet för timern och stänga av lampan.
Annars vi bara öka våra räkna och låt timern startar igen.
Ganska enkel rätt?
Fina med det är dock att man kan ha annan kod körs medan timern räknar.
När det flödar över det blir en liten omväg att avbryta tjänsten rutin (ISR), och när det är gjort den kommer tillbaka till din tidigare kör kod som om ingenting hänt!
Bättre då en enkel försening, som du kan göra mer arbete eller för att somna för att spara energi!