Timers en tellers zijn zo integraal dat ziet u de talrijke voorbeelden hen te betrekken in deze serie. Zoals de naam al zegt, worden timers gebruikt voor de tijd en tellen. Counting en timing kunt u sommige zeer nette dingen zoals controlerende LED brights, graden van de hoek van de servo-assen, ontvangen van sensorgegevens die zenden in PWM, maken van een timer of simpelweg een variabele tijd toe te voegen aan uw microcontroller project.
Eerst is het belangrijk te begrijpen dat er een klok in (of buiten) de AVR-microcontrollers. Alle microcontrollers hebben klokken in hen of een externe klok gebruikt. Microcontrollers vereisen klokken, zodat de programma's kunnen worden uitgevoerd in het ritme met de klok. Net als de programma's die we schrijven, zoals elke kloktik passeert, worden instructies verwerkt in de tijd met het teken van de klok.
De timer en teller functies in de microcontroller telling in sync met de klok van de microcontroller. Echter, telt de teller slechts maximaal 256 (8 bit counter) of 65535 (16-bits counter). Dat is een veel huilen uit de 1.000.000 teken per seconde dat de standaard AVR microcontroller voorziet. De microcontroller biedt een heel handig feature, genaamd prescaling. Prescaling is een simplistische manier als de teller een aantal klok teken overslaan. De AVR-microcontrollers toestaan prescaling aantal: 8, 64, 256 en 1024. Bijvoorbeeld, als ingesteld op 64 op de prescaler, de teller alleen elke keer tellen zal teken de klok 64 keer. Dit betekent dat in één seconde (waar de microcontroller 1.000.000 keer klikken) de teller zou alleen tellen tot 15,625. Als de teller omhoog naar dat nummer telt, dan zou je kunnen laten knipperen van een LED elke één seconde.
Timers zijn vooral bedoeld, een register voor controle, en een register die in het bezit van de graaf-nummer. Het besturingselement register bevat sommige schakelopties voor het inschakelen en uitschakelen functies. En je raadt dat hetâ €¦ een van de kenmerken is die prescaling om te selecteren. Het besturingselement register heet TCCR0 of TCCR1 (Timer/teller besturingselement registreren). De TCCR0 is het register van de 8-bits besturingselement en heeft alleen een 8-bits besturingselement registreren, dus er is slechts 8 schakelaars op en uitschakelen. TCCR1 is een 16-bits, dus het heeft 16 schakelopties voor het inschakelen en uitschakelen, maar het komt in twee 8-bit registers label A en B (TCCR1A en TCCR1B). De schakelaars zijn als volgt: FOC (kracht Output vergelijken), WGM (Waveform generatie modus), COM (vergelijk Match Output Mode) en CS (klok selecteren).
Het register die in het bezit van de graaf heet het TCNT-register. En er is een 8-bits-versie (TCNT0) en een 16-bits versie (TCNT1). De TCNT1 register daadwerkelijk krijgt het nummer uit twee andere 8-bit registers maken een volledige 16-bits getal, maar dat is alles wat gedaan achter de schermen (geabstraheerd), zodat u niet hoeft te maken over hoe de TCNT1 deze mogelijkheid krijgt om 16-bits, denk het is magie.
In de video, twee programma's werden getoond: dat toont alleen maar een enkele LED knipperend op ongeveer 1 seconde, en een ander programma dat heeft één rij met 7 LEDs achter elke seconde, en een andere rij van 7 LEDs achter elk op 1 seconde. Het laatste programma wordt hier weergegeven, omdat het heeft de meeste functies gebruikt in combinatie met de 16-bits timer.
Zonder repetitieve van vorige posten, het programma initialiseert de poorten voor de LEDs en de timer/teller #1 (de 16-bits timer) ingesteld. Het TCCR1B control register wordt gebruikt voor het instellen van de prescaling factor van 64 met de CS10 en CS11-switches.
Omdat we willen dat één van de 7 LED's te jagen 1/7e van een seconde elke, we nemen het nummer 15,625 (1000000/64 - Vergeet niet de 1000000 is de klok 1 mhz van de micrcontroller) en het wordt gedeeld door 7 om ~ 2,232.143. Nu, je zegt, maar kunt u alleen 2232 in de pogram!! dat komt omdat TCNT1 accepteert alleen geheel getal (geen decimalen). Nu je zegt, zal de timing af met het bedrag van het decimaalteken worden!! Klopt, maar de interne klok van AVR is toch +/-10% onjuist. Als een externe kristal wordt gebruikt, gebruikt u kon een perfect getal waarmee het juiste aantal.
U zult opmerken dat de TCNT1 ook op nul wordt teruggesteld handmatig. Dit is nodig anders de TCNT1 zal houden tellen verleden de 2232 dat voorwaarde was ingesteld. Er zijn andere controle-functies die heeft een automatische zeroing van dit nummer, maar we krijgen die in een andere tutorial. De overige delen van het programma is het gebruik van dingen die we geleerd hebben in de vorige tutorials (LED draaien in- en uitschakelen en arrays).