This repository was archived by the owner on Jan 29, 2023. It is now read-only.
-
Couldn't load subscription status.
- Fork 1
This repository was archived by the owner on Jan 29, 2023. It is now read-only.
Interrupt interval 2X requested interval #1
Copy link
Copy link
Closed
Labels
Description
Arduino IDE version 1.8.13
Adruino WiFI Rev 2
OS: Win 10
Context:
Actual interrupt delay is 2 times the programmed value. e.g., programmed value = 10 ms., actual value = 20 ms.
Steps to reproduce:
- Compile and run the Argument_None example with: #define TIMER1_INTERVAL_MS 11L, adding pin A0 to the
toggle1 code to observe the output on an oscilloscope connected to pin A0. - Observe that the waveform toggles at twice the programmed value (22 ms).
Works the same with any clock selected.
Am I doing something wrong?
/**************************************************************************************************************************** Argument_None.ino For Arduino megaAVR ATMEGA4809-based boards (UNO WiFi Rev2, NANO_EVERY, etc. ) Written by Khoi Hoang Built by Khoi Hoang https://github.com/khoih-prog/megaAVR_TimerInterrupt Licensed under MIT license Now with we can use these new 16 ISR-based timers, while consuming only 1 hwarware Timer. Their independently-selected, maximum interval is practically unlimited (limited only by unsigned long miliseconds) The accuracy is nearly perfect compared to software timers. The most important feature is they're ISR-based timers Therefore, their executions are not blocked by bad-behaving functions / tasks. This important feature is absolutely necessary for mission-critical tasks. Version: 1.3.0 Version Modified By Date Comments ------- ----------- ---------- ----------- 1.0.0 K.Hoang 01/04/2021 Initial coding to support Arduino megaAVR ATmega4809-based boards (UNO WiFi Rev2, etc.) 1.1.0 K.Hoang 14/04/2021 Fix bug. Don't use v1.0.0 1.2.0 K.Hoang 17/04/2021 Selectable TCB Clock 16MHz, 8MHz or 250KHz depending on necessary accuracy 1.3.0 K.Hoang 17/04/2021 Fix TCB Clock bug. Don't use v1.2.0 *****************************************************************************************************************************/ // These define's must be placed at the beginning before #include "megaAVR_TimerInterrupt.h" // _TIMERINTERRUPT_LOGLEVEL_ from 0 to 4 // Don't define _TIMERINTERRUPT_LOGLEVEL_ > 0. Only for special ISR debugging only. Can hang the system. #define TIMER_INTERRUPT_DEBUG 0 #define _TIMERINTERRUPT_LOGLEVEL_ 0 // Select USING_16MHZ == true for 16MHz to Timer TCBx => shorter timer, but better accuracy // Select USING_8MHZ == true for 8MHz to Timer TCBx => shorter timer, but better accuracy // Select USING_250KHZ == true for 250KHz to Timer TCBx => shorter timer, but better accuracy // Not select for default 250KHz to Timer TCBx => longer timer, but worse accuracy #define USING_16MHZ false #define USING_8MHZ false #define USING_250KHZ true #define USE_TIMER_0 false #define USE_TIMER_1 true #define USE_TIMER_2 false #define USE_TIMER_3 false #include "megaAVR_TimerInterrupt.h" #define TIMER1_INTERVAL_MS 11L #ifndef LED_BUILTIN #define LED_BUILTIN 13 #endif void TimerHandler1(void) { static bool toggle1 = false; static bool started = false; if (!started) { started = true; pinMode(LED_BUILTIN, OUTPUT); pinMode(A0, OUTPUT); } //timer interrupt toggles pin LED_BUILTIN digitalWrite(LED_BUILTIN, toggle1); digitalWrite(A0, toggle1); toggle1 = !toggle1; } #if USE_TIMER_2 #define TIMER2_INTERVAL_MS 2 void TimerHandler2(void) { static bool toggle2 = false; static bool started = false; if (!started) { started = true; pinMode(A0, OUTPUT); } //timer interrupt toggles outputPin digitalWrite(A0, toggle2); toggle2 = !toggle2; } #endif void setup() { Serial.begin(115200); while (!Serial); Serial.print(F("\nStarting Argument_None on ")); Serial.println(BOARD_NAME); Serial.println(MEGA_AVR_TIMER_INTERRUPT_VERSION); Serial.print(F("CPU Frequency = ")); Serial.print(F_CPU / 1000000); Serial.println(F(" MHz")); Serial.print(F("TCB Clock Frequency = ")); #if USING_16MHZ Serial.println(F("16MHz for highest accuracy")); #elif USING_8MHZ Serial.println(F("8MHz for very high accuracy")); #else Serial.println(F("250KHz for lower accuracy but longer time")); #endif // Select Timer 1-2 for UNO, 0-5 for MEGA // Timer 2 is 8-bit timer, only for higher frequency ITimer1.init(); // Using ATmega328 used in UNO => 16MHz CPU clock , // For 16-bit timer 1, 3, 4 and 5, set frequency from 0.2385 to some KHz // For 8-bit timer 2 (prescaler up to 1024, set frequency from 61.5Hz to some KHz if (ITimer1.attachInterruptInterval(TIMER1_INTERVAL_MS, TimerHandler1)) { Serial.print(F("Starting ITimer1 OK, millis() = ")); Serial.println(millis()); } else Serial.println(F("Can't set ITimer1. Select another freq. or timer")); #if USE_TIMER_2 // Select Timer 1-2 for UNO, 0-5 for MEGA // Timer 2 is 8-bit timer, only for higher frequency ITimer2.init(); if (ITimer2.attachInterruptInterval(TIMER2_INTERVAL_MS, TimerHandler2)) { Serial.print(F("Starting ITimer2 OK, millis() = ")); Serial.println(millis()); } else Serial.println(F("Can't set ITimer2. Select another freq. or timer")); #endif } void loop() { }