Hi, as requested :
So, when i compile with timer1 from 65517 to 65520 (and more i guess), millis() return 0.
Below, it works correctly.
Is anyone can help me to understand this behavior ?
Patrick
//===============================================================================================================
// ARDUINO
//===============================================================================================================
//#define TIMER1_COUNTER 49536 // = 65536-16MHz/ 1/ 1kHz --> 16000 / 1000µs // works
//#define TIMER1_COUNTER 63936 // = 65536-16MHz/ 1/ 10kHz --> 1600 / 100µs // works
//#define TIMER1_COUNTER 65376 // = 65536-16MHz/ 1/ 100kHz --> 160 / 10µs // works
//#define TIMER1_COUNTER 65456 // = 65536-16MHz/ 1/ 200kHz --> 80 / 5µs // works
//#define TIMER1_COUNTER 65472 // = 65536-16MHz/ 1/ 250kHz --> 64 / 4µs // works
//#define TIMER1_COUNTER 65504 // = 65536-16MHz/ 1/ 500kHz --> 32 / 2µs // works
//#define TIMER1_COUNTER 65510 // = 65536-16MHz/ 1/ 615Hz --> 26 / 1.625µs // works
//#define TIMER1_COUNTER 65515 // = 65536-16MHz/ 1/ 762kHz --> 21 /1.3125µs // works
//#define TIMER1_COUNTER 65516 // = 65536-16MHz/ 1/ 800kHz --> 20 / 1.25µs // works
#define TIMER1_COUNTER 65517 // = 65536-16MHz/ 1/ 842kHz --> 19 /1.1875µs // ISSUE !!!
//#define TIMER1_COUNTER 65518 // = 65536-16MHz/ 1/ 889kHz --> 18 /1.1250µs // ISSUE !!!
//#define TIMER1_COUNTER 65519 // = 65536-16MHz/ 1/ 941kHz --> 17 /1.0625µs // ISSUE !!!
//#define TIMER1_COUNTER 65520 // = 65536-16MHz/ 1/ 1MHz --> 16 / 1µs // ISSUE !!! --> My target
volatile uint32_t tickms = 0;
//---------------------------------------------------------------------------------------------------------------
void myIRQTimer() {
noInterrupts(); // disable all interrupts
TCCR1A = 0; // initialize timer1
TCCR1B = (1 << CS10); // 1 prescaler
TCNT1 = TIMER1_COUNTER; // preload timer
TIMSK1 |= (1 << TOIE1); // enable timer overflow interrupt
interrupts(); // enable all interrupts
}
//---------------------------------------------------------------------------------------------------------------
ISR(TIMER1_OVF_vect) { // interrupt service routine
tickms++;
TCNT1 = TIMER1_COUNTER; // preload timer
}
//---------------------------------------------------------------------------------------------------------------
void setup() {
myIRQTimer(); // Configure Timer1
Serial.begin(115200);
Serial.print(F("Timer1 Bug ?\n"));
}
void loop() {
Serial.println(millis());
}
//---------------------------------------------------------------------------------------------------------------