CTC timer v mikrokontroléri ATtiny84

Zápisník experimentátora

ATtiny84 obsahuje dva timery. Jeden je 8-bitový a druhý timer je 16-bitový. V tomto článku sa pozrieme na časovače z hľadiska CTC režimu. Na generovanie programov budeme využívať online kalkulátor. Ja som použil mikrokontrolér ATtiny84 vo verzii SMD a preto som ho mal na adaptéri, ktorý sa dá zasunúť do breadboardu. Použil som rovnaké zapojenie ako v článku o programovaní ATtiny84 pomocou Arduina.

Použité súčiastky

Pri práci s ATtiny84 používam na programovanie Arduino. Možno to bola náhoda, ale cez USBasp sa mi raz pri programovaní poistiek ATtiny84 zaseklo. Pri použití Arduina som tento problém nemal.

Zdrojové kódy som písal pre frekvencie 1 MHz a 8 MHz. Používal som jadro https://github.com/SpenceKonde/ATTinyCore. Pre každý timer sú dva príklady. Všetky blikajú LED diódou, ktorá je pripojená na pin 10. Pin 10 je na mikrokontroléri umiestnený podľa obrázku. Treba si ale vybrať správnu orientáciu (counterclockwise) pri nastavovaní dosky.

Timer0

Timer0 je 8-bitový čítač. Ak ho chceme  použiť na vytvorenie nižšej frekvencie, musíme si pomôcť internou deličkou, ktorá je vytvorená pomocou premennej divider. V tomto prípade je frekvencia prerušenia 100 Hz a pomocou deličky je upravená na 1 Hz.

#define ledPin 10
volatile int divider=0;

void setupTimer0() {
  noInterrupts();
  // Clear registers
  TCCR0A = 0;
  TCCR0B = 0;
  TCNT0 = 0;

  // 100.16025641025641 Hz (1000000/((155+1)*64))
  OCR0A = 155;
  // CTC
  TCCR0A |= (1 << WGM01);
  // Prescaler 64
  TCCR0B |= (1 << CS01) | (1 << CS00);
  // Output Compare Match A Interrupt Enable
  TIMSK0 |= (1 << OCIE0A);
  interrupts();
}

void setup() {
  pinMode(ledPin, OUTPUT);
  setupTimer0();
}

void loop() {
}

ISR(TIMER0_COMPA_vect) {
  if(divider==0)
    digitalWrite(ledPin, digitalRead(ledPin) ^ 1);
  divider++;
  divider%=100;
}

Timer1

Timer1 je 16-bitový čítač. Vďaka tomu sa bez problémov nastavujú aj nízke frekvencie. V tomto prípade je frekvencia 1 Hz.

#define ledPin 10

void setupTimer1() {
  noInterrupts();
  // Clear registers
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;

  // 1 Hz (1000000/((15624+1)*64))
  OCR1A = 15624;
  // CTC
  TCCR1B |= (1 << WGM12);
  // Prescaler 64
  TCCR1B |= (1 << CS11) | (1 << CS10);
  // Output Compare Match A Interrupt Enable
  TIMSK1 |= (1 << OCIE1A);
  interrupts();
}

void setup() {
  pinMode(ledPin, OUTPUT);
  setupTimer1();
}

void loop() {
}

ISR(TIMER1_COMPA_vect) {
  digitalWrite(ledPin, digitalRead(ledPin) ^ 1);
}

Zdrojový kód

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


09.03.2018


Menu