Zápisník experimentátora
Hierarchy: Časovač (timer)
V dnešnom článku sa zase pozrieme na časovač (timer) v CTC režime. Predvedieme si jednoduchú animáciu s ôsmimi LED diódami. Pretože všetku prácu s časovaním animácie nám vykoná timer, v kóde budeme musieť iba napísať vhodný kód pre samotnú animáciu.
Na vytvorenie animácie môžeme použiť:
Všetko je zapojené podľa nasledovného obrázka. LED diódy sú pripojené na piny 2-9 a na obrázku je ešte vidno pripojenie GND na mojej LED doske pomocou dvoch drôtených prepojok k Arduinu. Arduino Pro Mini má vyvedené GND aj na druhej strane, takže som mohol použiť aj jedinú prepojku, ale potom by sa to zle fotografovalo.
Na vytvorenie timera s frekvenciou 10 Hz som využil moju aplikáciu. V rozhraní som nastavil požadované parametre a nechal si vygenerovať kostru aplikácie. V programe som ponechal aj blikanie LED diódou na pine 13, aby bolo pekne vidno frekvenciu 10 Hz na jednej LED dióde.
Doplniť kód animácie už potom nebol žiaden vážnejší problém. Premenná counter
obsahuje aktuálnu pozíciu svietiacej LED. Nadobúda hodnoty 0-7. Obsah funkcie setupTimer
je v nezmenenej podobe z generátora. Vo funkcii setup
sa nastavujú piny 2-9 ako výstupné.
Obsluha prerušenia je vo funkcii ISR(TIMER1_COMPA_vect)
. V cykle zapnem diódu, ktorá zodpovedá obsahu premennej counter a ostatné diódy vypnem. Posledné dva riadky zabezpečia, že obsah premenne counter je vždy iba v rozsahu 0-7. Prerušenie nastáva 10 krát za sekundu a pretože máme diód len osem, máte optický dojem, že to ide trošku rýchlejšie.
#define ledPin 13
int counter = 0;
void setupTimer() {
noInterrupts();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 6249; // 10 Hz
TCCR1A |= 0;
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS12) | (0 << CS11) | (0 << CS10);
TIMSK1 |= (1 << OCIE1A);
interrupts();
}
void setup() {
pinMode(ledPin, OUTPUT);
for (int i = 2; i < 10; i++)
pinMode(i, OUTPUT);
setupTimer();
}
void loop() {
}
ISR(TIMER1_COMPA_vect) {
digitalWrite(ledPin, digitalRead(ledPin) ^ 1);
for (int i = 0; i < 8; i++)
digitalWrite(i + 2, i == counter ? true : false);
counter++;
counter %= 8;
}
Zdrojový kód sa nachádza na serveri GitHub.
24.01.2017