Början Microcontrollers del 11: Timers, räknare och mikrokontroller klockan
Timers och räknare är så integrerad att du kommer att se många exempel på dem i hela denna serie. Som namnet säger, används timers för tid och räkna. Inventering och timing kan du göra några mycket fina saker som kontrollerande LED brights, vinkel grader av servo axlar, tar emot sensordata som sänder i PWM, skapa en timer eller helt enkelt lägga till en tid variabel i projektet mikrokontroller.
Först är det viktigt att förstå att det finns en klocka i (eller utanför) AVR microcontrollers. Alla mikrokontroller har klockor i dem eller använda en extern klocka. Mikrokontroller kräver klockor så att programmen kan köras i takt med klockan. Som de program vi skriver, som varje clock tick passerar, behandlas anvisningar i tid med fästingar på klockan.
Timer och counter funktionerna i mikrokontroller räkna i synk med mikrokontroller klockan. Dock räknar räknaren endast upp till 256 (8 bitars räknare) eller 65535 (16 bitars räknare). Det är långt ifrån den 1.000.000 fästingen per sekund som standard AVR mikrokontroller ger. Mikrokontroller erbjuder en användbar funktion som kallas prescaling. Prescaling är ett förenklat sätt för räknaren ska hoppa över ett vissa antal Klockan tickar. AVR microcontrollers tillåta prescaling antal: 8, 64, 256 och 1024. Till exempel om att 64 på prescaler, räknaren räknas bara varje gång fästingar klockan 64 gånger. Detta innebär i en sekund (där mikrokontroller klickar 1.000.000 gånger) disk skulle räknas upp till 15,625. Om räknaren räknar till detta nummer, skulle då du kunna blinka en LED varje en sekund.
Främst, har timers ett register för kontroll, och ett register som innehåller räkna antalet. Kontrollera registret innehåller vissa växlar till aktivera och inaktivera funktioner. Och du gissat den... en av funktionerna är vilken prescaling du väljer. Kontrollera registret kallas TCCR0 eller TCCR1 (Timer/Counter kontroll Register). TCCR0 är 8-bitars kontroll registret och bara har en 8-bitars avstämningsregister, så det är bara 8 växlar att slå på och av. TCCR1 är 16-bitars, så den har 16 växlar att slå på och av, men den kommer i två 8-bitars register märkt A och B (TCCR1A och TCCR1B). Växlarna är följande: FOC (force utdata jämföra), WGM (vågform Generation läge), COM (jämför Match produktionen läge) och CS (klockan Välj).
Registret som håller räkningen kallas TCNT registret. Och det finns en 8-bitars version (TCNT0) och en 16-bitars version (TCNT1). TCNT1 register faktiskt får sitt nummer från två andra 8-bitars register att skapa en komplett 16-bitars nummer, men det är allt gjort bakom kulisserna (frånvarande) så inte behöver du oroa dig för hur TCNT1 får här möjlighet att ha 16-bitars, tycker bara det är magiska.
I videon, två program visades: en som bara visar en enda LED blinkar med ca 1 sekund och ett annat program som har en rad 7 lysdioder jagar varje sekund, och en annan rad 7 lysdioder jagar varje på 1 sekund. Det sistnämnda programmet visas här eftersom det har de flesta funktionerna som används med 16-bitars timer.
Utan att vara återkommande från tidigare inlägg, programmet initierar portarna för lysdioderna och ställer in timer/counter #1 (16-bitars timer). TCCR1B kontroll registret används för att ange den prescaling faktorn av 64 med CS10 och CS11 växlar.
Eftersom vi vill ha en av de 7 lysdioderna att jaga 1/7: e sekund varje, vi tar numret 15,625 (1000000/64 - kom ihåg 1000000 är micrcontroller 1 mhz klocka) och dela det med 7 att få ~ 2,232.143. Nu du säger, men du använder endast 2232 i programguider! Det beror på att TCNT1 accepterar endast heltal (inga decimaler). Nu du säger, kommer att tidpunkten vara avstängd till mängden decimaltecknet! Sant, men den AVR inre klockan är +/-10% felaktiga ändå. Om du använder en extern crystal du kan använda ett perfekt tal som representerar antalet lämpliga.
Du kommer att märka att TCNT1 också återställs till noll manuellt. Detta är behövs annars TCNT1 kommer hålla räkna tidigare 2232 förutsättning att sattes. Det finns andra kontrollfunktioner som har en automatisk Nollställning av detta antal, men vi kommer att få till det i en annan tutorial. Övriga delar av programmet med saker vi lärt oss i tidigare tutorials (LED slå på och av och matriser).