-
Notifications
You must be signed in to change notification settings - Fork 1
Interrupt interval 2X requested interval #1
Comments
Hi @wcwuttke Thanks for your interests in the library.
also megaAVR is a very slow MCU, doing to many things within
possibly distorts its timings.
The best way to know the timings is correct is to use a counter inside the ISR, then print it out using a timing loop outside ISR, using millis(). For example, you can see the timing is very accurate here
Good Luck, |
Hello,
I need a 1 millisecond timer. That can only be done with the 250 KHz clock.
According to the formula, the correct value gets stored in TCB1_CCMP
(250) for a 1 ms timer. However, the timer interval is 2 ms. I made a workaround
by changing TCB1_CCMP in my code. Now I have interrupts occurring at
precise 1 ms intervals (as measured with my oscilloscope). It behaves as if the
250 KHz clock has been divided by two somewhere.
Bill Wuttke
|
Good to know it's OK for you.
I actually haven't tested with 250KHz. Possibly a bug somewhere in this library, or the core??? I'll spend some time to investigate later whenever I have time. I'd appreciate it you could help here to locate the issue. Regards, |
Hello Khoi,
I'll be investigating further tomorrow. It's been a long time since I've played around with registers, etc.,
and then it was on 6800 & Z80s. Things have changed alot since then. Anyhow, I'll try to do
some register manipulation to get a basic timer going so I can do a comparison. I'll let
you know what I find.
Regards,
Bil Wuttke
On Sunday, September 5, 2021, 07:09:51 PM PDT, Khoi Hoang ***@***.***> wrote:
Good to know it's OK for you.
It behaves as if the 250 KHz clock has been divided by two somewhere.
I actually haven't tested with 250KHz. Possibly a bug somewhere in this library, or the core???
I'll spend some time to investigate later whenever I have time. I'd appreciate it you could help here to locate the issue.
Regards,
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or unsubscribe.
Triage notifications on the go with GitHub Mobile for iOS or Android.
|
Hello Khoi,
I wrote two test sketches today, one for TCA, and one for TCB, using direct register manipulation.
Both work correctly, delivering 1 millisecond interrupts using sys_clk/64. Both are attached.
(Although the TCB timing is a little "glitchy" on the oscilloscope.) The TCB code probably
has an error or two.
Regards,
Bill Wuttke
//**************************************************************************************************
//**************************************************************************************************
// TCA Timer Test Sketch. 1 millisecond timer.
// modified from Microchip TB3217 example 7-1
#define PERIOD_EXAMPLE_VALUE (249) /* 1 millisecond using sys_clk/64 */
void TCA0_init(void)
{
/* enable overflow interrupt */
TCA0.SINGLE.INTCTRL = TCA_SINGLE_OVF_bm;
/* set Normal mode */
TCA0.SINGLE.CTRLB = TCA_SINGLE_WGMODE_NORMAL_gc;
/* disable event counting */
TCA0.SINGLE.EVCTRL &= ~(TCA_SINGLE_CNTEI_bm);
/* set the period */
TCA0.SINGLE.PER = PERIOD_EXAMPLE_VALUE;
TCA0.SINGLE.CTRLA = TCA_SINGLE_CLKSEL_DIV64_gc /* set clock source (sys_clk/64) */
| TCA_SINGLE_ENABLE_bm; /* start timer */
}
void PORT_init(void)
{
/* set pin 0 of PORT A as output */
pinMode(A0, OUTPUT);
}
ISR(TCA0_OVF_vect)
{
static bool toggle1 = false;
/* Toggle PIN 0 of PORT A */
digitalWrite(A0, toggle1);
toggle1 = !toggle1;
/* The interrupt flag has to be cleared manually */
TCA0.SINGLE.INTFLAGS = TCA_SINGLE_OVF_bm;
}
void setup() {
PORT_init();
TCA0_init();
/* enable global interrupts */
sei();
}
void loop() {
}
//**************************************************************************************************
//**************************************************************************************************
// TCB Timer Test Sketch. 1 millisecond timer.
#define PERIOD_EXAMPLE_VALUE (250) /* 1 millisecond using sys_clk/64 */
void CLOCK_init (void)
{
/* Enable writing to protected register */
CPU_CCP = CCP_IOREG_gc;
/* Enable Prescaler and set Prescaler Division to 64 */
CLKCTRL.MCLKCTRLB = CLKCTRL_PDIV_64X_gc | CLKCTRL_PEN_bm;
/* Enable writing to protected register */
CPU_CCP = CCP_IOREG_gc;
/* Select OSC20M */
CLKCTRL.MCLKCTRLA = CLKCTRL_CLKSEL_OSC20M_gc;
/* Wait for system oscillator changing to finish */
while (CLKCTRL.MCLKSTATUS & CLKCTRL_SOSC_bm)
{
;
}
}
void TCB1_init(void)
{
/* Load the Compare or Capture register with the timeout value*/
TCB1.CCMPL = PERIOD_EXAMPLE_VALUE;
TCB1.CCMPH = 0;
/* Enable TCB and set CLK_PER divider to 1 (No Prescaling) */
TCB1.CTRLA = TCB_CLKSEL_CLKDIV1_gc | TCB_ENABLE_bm;
/* Configure TCB in Periodic Timeout mode */
TCB1.CTRLB = TCB_CCMPEN_bm;
/* Enable Capture or Timeout interrupt */
TCB1.INTCTRL = TCB_CAPT_bm;
}
void PORT_init (void)
{
/* set pin 0 of PORT A as output */
pinMode(A0, OUTPUT);
}
ISR(TCB1_INT_vect)
{
static bool toggle1 = false;
/* Toggle PIN 0 of PORT A */
digitalWrite(A0, toggle1);
toggle1 = !toggle1;
/* The interrupt flag has to be cleared manually */
TCB1.INTFLAGS = TCB_CAPT_bm; /* Clear the interrupt flag */
}
void setup() {
CLOCK_init();
PORT_init();
TCB1_init();
sei();
}
void loop() {
}
On Sunday, September 5, 2021, 07:09:51 PM PDT, Khoi Hoang ***@***.***> wrote:
Good to know it's OK for you.
It behaves as if the 250 KHz clock has been divided by two somewhere.
I actually haven't tested with 250KHz. Possibly a bug somewhere in this library, or the core???
I'll spend some time to investigate later whenever I have time. I'd appreciate it you could help here to locate the issue.
Regards,
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or unsubscribe.
Triage notifications on the go with GitHub Mobile for iOS or Android.
|
Thanks Bill,
Do you mean error in the library? I believe so.. Could you please help locate and make a PR ? I'm reopening the issue now Best Regards, Khoi |
Hello Khoi,
I've been trying to locate the problem - it looks like you set the timer registers correctly.
It looks like you are not using the interrupt directly, but do something with counts - that's
where I get lost.
I am totally unfamiliar with the workings of Github, except that it stores one of my projects.
Therefore, I'll leave the PR, etc, for you.
My immediate problem (need for 1 ms timer) has been solved by using a few lines of code to
set the timer registers.
Best Regards,
Bill Wuttke
On Monday, September 6, 2021, 01:51:10 PM PDT, Khoi Hoang ***@***.***> wrote:
Thanks Bill,
The TCB code probably has an error or two.
Do you mean error in the library? I believe so.. Could you please help locate and make a PR ?
If not possible due to time constraint, it's OK and I understand and will fix it later.
I'm reopening the issue now
Best Regards,
Khoi
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or unsubscribe.
Triage notifications on the go with GitHub Mobile for iOS or Android.
|
Hi Bill, Thanks. I'll spend some time later to investigate, locate and solve this issue. Regards, |
Hi @wcwuttke I'm sorry to wait too long to fix the bug, which is Your contribution is noted in Contributions and Thanks Regards, Release v1.4.0
|
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:
toggle1 code to observe the output on an oscilloscope connected to pin A0.
Works the same with any clock selected.
Am I doing something wrong?
The text was updated successfully, but these errors were encountered: