Utilizzo Timer0.
Ciao a tutti, cercando di fare un poco di pratica con l' utilizzo dei microcontrollori, mi sono dedicato all' uso dei timer e degli interrupt.
L' idea iniziale era: vediamo di capire come far lampeggiare due led a diversa velocità, anzi, vediamo se riesco a generare due onde quadre con frequenze diverse (e prestabilite
).
Ho cominciato usando un solo timer e tutto sembrava funzionare, alchè ho scritto il codice pari pari cambiando sol il numero del timer da 0 a 2, e qui mi sono accorto che qualcosa non quadra.
Il codice che ho scritto è il seguente:
Ho utilizzato i due timer a 8 bit, settando i prescaler a clock/256 ed i registri di comparazione OCRnA allo stesso valore, ma cio che viasualizzo all' oscilloscopio è questo:
Mi aspettavo di avere due forme d' onda identiche, al massimo leggermente sfasate ma con identica frequenza.
Ho fatto un po di prove ma nulla.
Non capisco cosa sbaglio.
L' idea iniziale era: vediamo di capire come far lampeggiare due led a diversa velocità, anzi, vediamo se riesco a generare due onde quadre con frequenze diverse (e prestabilite
Ho cominciato usando un solo timer e tutto sembrava funzionare, alchè ho scritto il codice pari pari cambiando sol il numero del timer da 0 a 2, e qui mi sono accorto che qualcosa non quadra.
Il codice che ho scritto è il seguente:
- Codice: Seleziona tutto
const int led1 = 3;
const int led2 = 5;
void setup() {
DDRD = B11111111;
noInterrupts(); // disable all interrupts
TCCR0A = 0;
TCCR0B = 0;
TCNT0 = 0;
TIMSK0 = 0;
TIFR0 = 0;
OCR0A = 30; // compare match register
// TCCR0A |= (1 << WGM01); // CTC mode
TCCR0A = B00000010;
// TCCR0B |= (1 << CS00); // prescaler
// TCCR0B |= (1 << CS02); // prescaler 256
TCCR0B = B00000100;
// TIMSK0 |= (1 << OCIE0A); // enable timer compare interrupt
TIMSK0 = B00000010;
TCCR2A = 0;
TCCR2B = 0;
TCNT2 = 0;
TIMSK2 = 0;
TIFR2 = 0;
OCR2A = 30;
// TCCR2A |= (1 << WGM21); // CTC mode
TCCR2A = B00000010;
// TCCR2B |= (1 << CS20); // prescaler
// TCCR2B |= (1 << CS22); // prescale 256
TCCR2B = B00000100;
// TIMSK2 |= (1 << OCIE2A); // enable timer compare interrupt
TIMSK2 = B00000010;
interrupts(); // enable all interrupts
}
ISR(TIMER0_COMPA_vect){ // timer compare interrupt service routin
PORTD ^= _BV(led1); //macro _BV setta il bit relativo al valore (bit to val)
} // al posto di fare (1 << val)
ISR(TIMER2_COMPA_vect){
PORTD ^= _BV(led2);
}
void loop() {
}
Ho utilizzato i due timer a 8 bit, settando i prescaler a clock/256 ed i registri di comparazione OCRnA allo stesso valore, ma cio che viasualizzo all' oscilloscopio è questo:
Mi aspettavo di avere due forme d' onda identiche, al massimo leggermente sfasate ma con identica frequenza.
Ho fatto un po di prove ma nulla.
Non capisco cosa sbaglio.