Animace LED diod pomocí časovače v CTC režimu

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.

Použité součástky

K vytvoření animace můžeme použít:

  • Arduino Pro Mini {linkArduino} - Použil jsem ho proto, že se vejde i na nejmenší zkušební pole.
  • Mini Breadboard {linkBreadboard} - Nejmenší prodávané zkušební pole.
  • Převodník CP2102 USB to Serial {linkUSBSerial} - Převodník slouží k naprogramování Arduina.
  • Desku s rezistory a LED diodami (link) - Protože mám vyrobených několik takových desek, použil jsem ji, abych nemusel komplikovaně připojit 8 LED a 8 rezistorů k pinem Arduino. Ale stejně můžete použít i přímo rezistory a LED, jen si dejte pozor, abyste nepřekročili maximální proud na pinu. Proto používejte rezistory od 330 do 1000 ohmů.

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.

Programování

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ě.

CTC Timer kalkulačka

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

Zdrojový kód se nachází na serveru GitHub.


04.07.2019


Menu