英文:
is it possible to get a 24 hour timer interrupt using timer5 in dspic30f4011?
问题
我正在尝试使用dspic30f4011的timer5,在1:256的预分频率下,在24小时后触发警报。
使用计时器的最大值(0xFFFF),我尝试了计数器值为125和250,对于这些值,它可以正常工作,但如果我输入250之后的任何值,我的计时器似乎会卡住,不会触发警报。
英文:
I am trying to trigger an alarm after 24 hours using timer5 of dspic30f4011 using 1:256 as prescale.
using maximum value of timer (0xFFFF) i tried iterating for counter of 125 and 250, for this values it works but if i enter any value after 250 my timer seems to be stuck and it doesnot trigger alarm.
答案1
得分: 1
根据我顶部的评论提到,我们需要一个MRE。
但是,24小时对于间隔计时器来说是一个_很长_的时间。因此,我认为纯粹使用计时器硬件可能无法完成,因为计时器比较寄存器据我所知仅限于16位。即使以每秒一个中断,这也是86400(0x15180)个中断,超出了16位。
我们将不得不在S/W中执行此操作[使用“tick”计数器]。这是大多数系统的做法。
以下是一个示例。它假设计时器ISR每毫秒调用一次[根据需要进行调整]:
#define TICKS_PER_SECOND 1000LL
uint64_t tick_count = 0; // 单调的滴答计数器
uint64_t tick_interval = TICKS_PER_SECOND * 24 * 60 * 60; // 1天的滴答数
uint64_t tick_fire = tick_interval; // 下一次回调的时间
void
timer_ISR(void)
{
// 推进滴答计数器
tick_count += 1;
// 我们是否达到所需的间隔?
if (tick_count >= tick_fire) {
// 推进到下一个间隔
tick_fire = tick_count + tick_interval;
// 注意:首先执行此操作允许回调函数调整下一个事件的触发时间
// 每24小时调用一次...
timer_24_hours();
}
}
希望这有所帮助。
英文:
As mentioned in my top comments, we want an MRE.
But, 24 hours is a long time for an interval timer. So, I don't think this can be done purely with the timer hardware as the timer compare registers are [AFAICT] limited to 16 bits. Even at one interrupt / second, this is 86400 (0x15180) interrupts which is beyond 16 bits
We'll have to do this in S/W [with a "tick" counter]. This is how most systems do it.
Here is an example. It assumes that the timer ISR is called once per millisecond [adjust to suit]:
#define TICKS_PER_SECOND 1000LL
uint64_t tick_count = 0; // monotonic tick counter
uint64_t tick_interval = TICKS_PER_SECOND * 24 * 60 * 60; // ticks for 1 day
uint64_t tick_fire = tick_interval; // time of next callback
void
timer_ISR(void)
{
// advance tick counter
tick_count += 1;
// have we hit the required interval?
if (tick_count >= tick_fire) {
// advance to next interval
tick_fire = tick_count + tick_interval;
// NOTE: doing that first allows the callback function to adjust the
// firing time of the next event
// called once every 24 hours ...
timer_24_hours();
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论