Animácia LED diód pomocou časovača v CTC režime

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.

Použité súčiastky

Na vytvorenie animácie môžeme použiť:

  • Arduino Pro Mini {linkArduino} - Použil som ho preto, lebo sa zmestí aj na najmenšie skúšobné pole.
  • Mini Breadboard {linkBreadboard} - Najmenšie predávané skúšobné pole.
  • Prevodník CP2102 USB to Serial {linkUSBSerial} - Prevodník slúži na naprogramovanie Arduina.
  • Dosku s rezistormi a LED diódami (link) - Pretože mám vyrobených niekoľko takýchto dosiek, použil som ju, aby som nemusel komplikovane pripojiť 8 LED a 8 rezistorov k pinom Arduina. Ale rovnako môžete použiť aj priamo rezistory a LED, len si dajte pozor, aby ste neprekročili maximálny prúd na pine. Preto používajte rezistory od 330 do 1000 ohmov.

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.

Programovanie

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.

CTC Timer kalkulačka

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

Zdrojový kód sa nachádza na serveri GitHub.


24.01.2017


Menu