Zápisník experimentátora
Hierarchy: Časovač (timer)
V dnešním článku se zase podíváme na časovač (timer) v CTC režimu. Předvedeme si jednoduchou animaci s osmi LED diodami. Protože veškerou práci s časováním animace nám provede timer, v kódu budeme muset pouze napsat vhodný kód pro samotnou animaci.
K vytvoření animace můžeme použít:
Vše je zapojené podle následujícího obrázku. LED diody jsou připojeny na piny 2-9 a na obrázku je ještě vidět připojení GND na mé LED desce pomocí dvou drátěných propojek k Arduinu. Arduino Pro Mini má vyvedeny GND i na druhé straně, takže jsem mohl použít i jedinou propojku, ale pak by se to špatně fotografovalo.
Pro vytvoření timeru s frekvencí 10 Hz jsem využil mou aplikaci. V rozhraní jsem nastavil požadované parametry a nechal si vygenerovat kostru aplikace. V programu jsem ponechal i blikání LED diodou na pinu 13, aby bylo pěkně vidět frekvenci 10 Hz na jedné LED diodě.
Doplnit kód animace už pak nebyl žádný vážnější problém. Proměnná counter
obsahuje aktuální pozici svítící LED. Nabývá hodnoty 0-7. Obsah funkce setupTimer
je v nezměněné podobě z generátoru. Ve funkci setup
se nastavují piny 2-9 jako výstupní.
Obsluha přerušení je ve funkci ISR(TIMER1_COMPA_vect)
. V cyklu zapnu diodu, která odpovídá obsahu proměnné counter a ostatní diody vypnu. Poslední dva řádky zajistí, že obsahuje proměnné counter je vždy pouze v rozsahu 0-7. Přerušení nastává 10 krát za sekundu a protože máme diod jen osm, máte optický dojem, že to jde trošku rychleji.
#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 se nachází na serveru GitHub.
04.07.2019