打印
[技术讨论]

STC 单片机定时中断不稳定

[复制链接]
1066|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
情场探花|  楼主 | 2025-5-9 22:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STC8G1A,用 T0 工作模式为“不可屏蔽中断的16位自动重载模式”,按说这个模式的中断间隔最稳定了。
代码如下:
        TMOD = 0x03;   // 设定 T0的工作模式
        AUXR = 0;// 设定 T0 为12 分频
        g_Cnt10ms = 0;
        TL0 = 0;       
        TH0 = 0XDC;  
        TR0=1;   //启动T0
        ET0 = 1;    //允许T0 的中断
        EA = 1;    //允许总中断


中断服务程序如下:
void TM0_Isr() interrupt 1   
{
        if (g_Cnt10ms <= 10000UL)
                g_Cnt10ms++;        //stop timing when it has been longer than 100s
}


主程序中,每当 g_Cnt10ms 超过 1000 就做一次动作,并将 g_Cnt10ms 清零。
反复尝试后发现:大部分动作都是 10s 做一次,但每隔4、5次,就会有一次只等了 7、8s,有时甚至会连续两次只等 7、8s。
如果改成:每当 g_Cnt10ms 超过 1500 就做一次动作。那么刚才说的 10s 就变成 15s,7、8s就变成12s左右。因此能断定确实是 T0 中断自身不稳定。
整个程序很简单,没有其它代码。
也怀疑过是引脚受干扰,导致 T0 把干扰当成了计数信号,额外多触发了中断。但是,TMOD 里已经设定了 T0 是定时器,不是计数器。
求启发,谢谢!


使用特权

评论回复

相关帖子

沙发
情场探花|  楼主 | 2025-5-10 15:28 | 只看该作者
求助!

使用特权

评论回复
板凳
伏尔加的鱼| | 2025-5-10 16:30 | 只看该作者
程序不完整不好分析呢,检查是否在其它程序段误操作分频或T0相关寄存器

使用特权

评论回复
地板
coody| | 2025-5-10 18:56 | 只看该作者
STC定时器是自动重装的,一个纯数字外设,用来自主频的时钟驱动,不会出现不稳定的情况的,其定时的精度取决于时钟,比如我使用一个北斗模块驯服的有源时钟做MCU的主频时钟,年误差不超过0.3秒。
应该是你的程序问题,你可以直接下载STC官方的例子的HEX文件测试,以做比较。

使用特权

评论回复
5
情场探花|  楼主 | 2025-5-10 21:55 | 只看该作者
coody 发表于 2025-5-10 18:56
STC定时器是自动重装的,一个纯数字外设,用来自主频的时钟驱动,不会出现不稳定的情况的,其定时的精度取 ...

谢谢。已经解决了,但还是不知所以然。
原来的程序中有两种计时方法,一个是 T0 的中断,10ms 一次。一个是忙等待,等待时间有 1.2ms 和 400us 两档。
现在取消了忙等待,一律用 T0 中断,就稳定了。

使用特权

评论回复
6
zjsx8192| | 2025-5-11 09:20 | 只看该作者
用中断方便点,忙等待会导致程序阻塞

使用特权

评论回复
7
coody| | 2025-5-11 13:43 | 只看该作者
情场探花 发表于 2025-5-10 21:55
谢谢。已经解决了,但还是不知所以然。
原来的程序中有两种计时方法,一个是 T0 的中断,10ms 一次。一个 ...

那还是程序逻辑的问题。任何中断都不要做任何延时和等待。

使用特权

评论回复
8
情场探花|  楼主 | 2025-5-12 14:28 | 只看该作者
coody 发表于 2025-5-11 13:43
那还是程序逻辑的问题。任何中断都不要做任何延时和等待。

是主程序里忙等待,T0 中断里只有一个 ++。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

463

主题

1243

帖子

6

粉丝