Zápisník experimentátora
Hierarchy: Časovač (timer)
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.
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 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 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 sa nachádza na serveri GitHub.
09.03.2018