Hi Guys. Using Timer 2, simple CTC at 5kHz.
This DOES NOT work, gives me 2kHz
TCCR2A = 0; // Set entire TCCR1A register to 0
TCCR2B = 0; // Same for TCCR1B
TCNT2 = 0; // Initialize counter value to 0
OCR2A = 99; // Set compare match register for 5000 Hz increments. = 16000000 / (32 * 5000) - 1 (must be <256)
TCCR2B |= (1 << WGM21); // turn on CTC mode
TCCR2B |= (0 << CS22) | (1 << CS21) | (1 << CS20); // Set CS22, CS21 and CS20 bits for 32 prescaler
TIMSK2 |= (1 << OCIE2A);
BUT This does work:
TCCR2A = 0;
TCCR2B = 0;
TCNT2 = 0;
// 5000 Hz (16000000/((24+1)*128))
OCR2A = 24;
TCCR2A |= (1 << WGM21);
// Prescaler 128
TCCR2B |= (1 << CS22) | (1 << CS20);
TIMSK2 |= (1 << OCIE2A);
Can someone please point out where I am going wrong?
Full code I am using (For testing). Yes I know I am using Serial.print in an ISR - for testing.
void setup()
{
Serial.begin(9600); // Start Serial
noInterrupts();
// Clear registers
TCCR2A = 0;
TCCR2B = 0;
TCNT2 = 0;
// 5000 Hz (16000000/((24+1)*128))
OCR2A = 24;
TCCR2A |= (1 << WGM21);
// Prescaler 128
TCCR2B |= (1 << CS22) | (1 << CS20);
TIMSK2 |= (1 << OCIE2A);
interrupts();
}
// End of Setup
// Start of ISR CTC Timer 2 at 5kHz
ISR(TIMER2_COMPA_vect)
{
static int Count = 0;
if (Count >= 5000)
{
Count = 0;
volatile static unsigned long prev;
Serial.print("\r\n");
Serial.print((millis() - prev));
prev = millis();
}
Count++;
}
// End of ISR CTC at 5kHz
void loop() {}