CTC timer v mikrokontroléri ATmega2560

Zápisník experimentátora

Hierarchy: Časovač (timer)

Mikrokontrolér ATmega2560 je súčasťou dosky Arduino Mega 2560. Obsahuje viac vývodov a jeho autori pridali aj viac timerov. Obsahuje dva 8-bitové a štyri 16-bitové timery. V tomto článku sa pozrieme na časovače z hľadiska CTC režimu. Na generovanie programov budeme používať online kalkulátor.

Časovače

Prvé tri časovače sú identické s ATmega328P.

  • Timer0 - 8-bitový.
  • Timer1 - 16-bitový.
  • Timer2 - 8-bitový.

Okrem nich sú doplnené tri ďalšie časovače, ktoré sú presnou kópiou časovača timer1.

  • Timer3 - 16-bitový.
  • Timer4 - 16-bitový.
  • Timer5 - 16-bitový.

Príklady

Pre každý časovač som napísal vzorový program, ktorý bliká internou LED diódou na frekvencii 1 Hz. V príkladoch uvidíte, že 8-bitový timer sa musí nastaviť na vyššiu frekvenciu a následne je treba doplniť internú deličku, aby sme sa dostali na požadovanú frekvenciu. Pri 16-bitovom časovači to nie je potrebné a požadovanú frekvenciu možno nastaviť priamo.

Príklad Timer0 - 8-bitový

#define ledPin 13
volatile int divider=0;

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

  // 100.16025641025641 Hz (16000000/((155+1)*1024))
  OCR0A = 155;
  // CTC
  TCCR0A |= (1 << WGM01);
  // Prescaler 1024
  TCCR0B |= (1 << CS02) | (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;
}

Príklad Timer1 - 16-bitový

#define ledPin 13

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

  // 1 Hz (16000000/((15624+1)*1024))
  OCR1A = 15624;
  // CTC
  TCCR1B |= (1 << WGM12);
  // Prescaler 1024
  TCCR1B |= (1 << CS12) | (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é texty

Zdrojové texty sa nachádzajú na serveri GitHub.


14.09.2017


Menu