I try to use the Timer0 of an Arduino Leonardo (ATmega32u) to trigger an interrupt at regular intervals, using plain avr-gcc (not the arduino library). I try to blink the built-in LED as test, but it does not light up.
If I place a PINC=0x80;
in the main function, the LED turns up, but not if I do it from the interrupt.
What am I doing wrong?
EDIT : The LED turns on with TCCR0B = (1 << CS00);
, (no prescaler) or TCCR0B = (1 << CS01)
(prescaler /8), but it does not with TCCR0B = (1 << CS00) | (1 << CS02);
(prescaler /1024, what I want). At 16MHz CPU frequency the resulting frequency should be more than 15kHz, so I should see it instantly.
Here is my code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdbool.h>
ISR(TIMER0_OVF_vect)
{
PINC = 0x80;
}
int main()
{
DDRC = 0b10000000;
//Start Timer 0 @ 15625 Hz
TCCR0A = 0;
TCCR0B = (0b101 << CS00);
TIMSK0 = (1 << TOIE0);
sei();
while(true); // Avoid return from main
}
0b101 << CS00
looks like bad code. Personally; I’d use(1 << CS00) | (1 << CS02)