搜索
bottom↓
回复: 19

定时器0定时不准的问题

[复制链接]

出0入0汤圆

发表于 2007-8-14 15:18:46 | 显示全部楼层 |阅读模式
初学avr,碰到一问题困惑了好久,请大家指教。

用icc写的程序,使用atmega16的定时器0定时0.1ms,(7.7328M晶振,8分频,TCNT0 = 0xa4),用于产生频率5k的方波,用万用表测频率为4.9k(可能是万用表的测量精度问题),但在中断子程序中加了一段代码(这一段代码是个if语句,里面用到两个浮点数求和,但因为if条件不满足,这段代码根本就执行不到),再测频率就降到4.6k了,把if语句注释掉,频率恢复正常,真是奇怪。(没有开放其他中断)

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2007-8-14 15:25:31 | 显示全部楼层
中断子程序如下,其中变量error和ratio2均为float型,其他为整型。CHGBIT为改变某引脚值(用于产生方波)的宏定义。

#pragma interrupt_handler timer0_ovf_isr:10  //17 for atmega128

void timer0_ovf_isr(void)

{

         TCNT0 = 0xa4;//reload counter value  

         

        //7.3728M  (A4,0x02)for 10Khz   (D2,0x02)for 20Khz

        //8M       (9C,0x02)for 10Khz   (CE,0x02)for 20Khz

        if(lianji==1)

        {

           if(m1flag==0)

           {

              error+=ratio2;

              error_int=(int)error;

              error-=error_int;

           }

           if(m1flag < (ratio1+ratio1+error_int+error_int))

           {

                    m1flag++;

                        CHGBIT(PORTA,0);

                        m1_total++;

            }

        }

        else CHGBIT(PORTA,0);}

出0入0汤圆

 楼主| 发表于 2007-8-14 15:30:53 | 显示全部楼层
忘了说,变量liangji始终为0,所以满足if条件的语句根本就执行不到,这种情况下定时周期为什么会变长呢。即便是能执行到,if条件下也没几条语句啊,不应该影响定时啊

出0入0汤圆

 楼主| 发表于 2007-8-14 16:28:32 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2007-8-14 16:51:47 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2007-8-14 18:51:50 | 显示全部楼层
怎么没人理啊,是这个问题提得太没水准了吗?

出0入0汤圆

发表于 2007-8-14 19:08:47 | 显示全部楼层
我现在也遇到M32的定时器0不准的问题,我是用外部8M晶振8分频,产生1us的溢出中断,发现定时时间比1us大,我中断程序里就执行给定时器赋初值,应该不会超过8个周期的。但还是不准,哪位来解答下啊。



楼主,你的应该是在中断里处理的事太多了,超过定时时间。



就是说程序还在执行中断程序就又到时间来中断。

出0入0汤圆

发表于 2007-8-14 19:16:50 | 显示全部楼层
请改用CTC方式中断试一下,如果时间准的话自己分析为什么。



或参考我讲义的第8章。

出0入0汤圆

 楼主| 发表于 2007-8-14 19:27:29 | 显示全部楼层
to 6楼的兄弟:



用8M晶振8分频,不可能产生1us的溢出中断的,进入中断子程序前系统要先做些准备工作的,这个时间就不止8个周期了。

我的程序定时周期是100us,中断里面就没干什么事啊

出0入0汤圆

 楼主| 发表于 2007-8-14 19:37:21 | 显示全部楼层
谢谢马老师,我试试看

出0入0汤圆

发表于 2007-8-14 20:29:04 | 显示全部楼层
使用atmega16的定时器0定时0.1ms,(7.7328M晶振,8分频,TCNT0 = 0xa4),用于产生频率5k的方波。



本身理论上就不是100us,而是99.826us。





你使用8M晶体、8分频、OCR0 = 0X63,采用CTC方式工作,比较中断,肯定可以得到精确的5K方波。



进了中断,马上将PA取反输出,然后再做你其它中断内的事情。只要你中断内的运行时间小于90us(大约700多条指令时间),保证你的5K方波非常精确。



而且使用AVR,只要初始化后,就可以得到5K方波,基本上属于硬件产生的,根本不用程序指令让输出反转。

出0入0汤圆

 楼主| 发表于 2007-8-14 20:32:19 | 显示全部楼层
用CTC方式中断定时很准确,谢谢马老师。不过还是想不明白前面提出的问题,那个奇怪的症状不知道怎么解释.......

出0入0汤圆

发表于 2007-8-14 21:12:42 | 显示全部楼层
这不是奇怪的症状,是你还没有彻底和透彻的了解定时器到底是如何工作的。



所有的这些问题,在我的讲义中都讲到了,要求深入思考,而不是简单的表面的会“定时”中断。我的讨论组里也谈到这个问题的。你可以找一下。



回答你一个最基本的问题,其它你自己深入。



假定你算的很准(其实你第一次理论计算就不准),100us中断一次。它表示从TCNO的初值(0xa4)加到0XFF正好100us,申请中断。



OK!CPU响应中断需要时间的,这时TCNO又增加了计过好几个数了!!那么正确在中断中给TCNT0赋初值应该是“0xa4 + 中断响应时间 + 到设置TCNTO代码执行完的时间” ,你只是简单的再赋了0xa4,那么你实际的中断间隔就大于100us了,所以你的频率绝对是低于5K。



你说的第2钟情况,如果你的中断代码如同LZ位贴上的,也就是进中断后,马上就设置TCNT0的初值,应该是不会产生的。如果你将IF语句什么的放在了设置TCNT0初值的语句前面了,那么语句的多少就会影响到输出频率的变化了。



使用溢出中断的话,中断中初值设置语句的位置如果不正确,也会影响定时中断的精度和准确性的。

出0入0汤圆

发表于 2007-8-14 21:50:16 | 显示全部楼层
请问下,M32的定时器0用作CTC模式的时候,TCNT0的值为0xff就中断还是加1之后才中断,手册上是写溢出中断,是不是到0xff后加1才中断?

出0入0汤圆

发表于 2007-8-14 22:09:58 | 显示全部楼层
到底是CTC方式,还是溢出方式?手册真的仔细看过了,还是看不懂?



下面的图就是手册上的,明白了吗:



出0入0汤圆

发表于 2007-8-14 23:29:48 | 显示全部楼层
补充12楼的说明:



上面忘记说明了,还有中断的现场保护时间。当你中断中有IF语句,尽管你说不用,但程序还是要把你可能要用的寄存器保护起来,时间长了,频率就低了。当你把IF等去掉,中断保护的内容就少了,频率就高一点了,中断现场保护部分,肯定在你给TCNT0重设初值前的。



不知道我是否解释清楚了。



LZ在5楼问到:“怎么没人理啊,是这个问题提得太没水准了吗?”



不是这个问题提得太没水准了,而是这个问题太有水准了,水平太高了,所以很少有人能正确、全面的回答,包括很多的现在在大学中“教”这门课的教师,也包括很多的“认为”自己有经验,能设计出产品的人。



LZ能问到和观察到这个现象还算脑筋认真学的,应该发扬。在我课堂教的学生中,决大部分的人根本连这个问题都提都提不出的。因为他们不会真正像LZ那样认真的动手实验,观察现象的,然后加深理解的。

出0入0汤圆

发表于 2007-8-15 02:32:27 | 显示全部楼层
再补充:



在我新书中第8章中,有个作业思考题如下,是与你提出的问题相同的:



5.当定时计数器工作在普通模式和CTC模式时,都可以产生一个固定的定时中断。如果要求精确的定时中断,采用那种模式比较好?为什么?



到现在没有一个学生给出完整、正确的回答。很多人连题目都看不懂啦。



我现在回答了题目的一半了。

出0入0汤圆

 楼主| 发表于 2007-8-15 15:58:44 | 显示全部楼层
马老师晚上两点多还在回贴啊,让人敬仰!

非常感谢您的指导!问题大致弄清楚了。

btw:您的讨论组在哪儿,怎么加入啊

出0入0汤圆

发表于 2011-9-11 10:00:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2014-12-4 13:55:15 | 显示全部楼层
machao 发表于 2007-8-14 22:09
到底是CTC方式,还是溢出方式?手册真的仔细看过了,还是看不懂?



下面的图就是手册上的,明白了吗:

这种图,看起来很费劲
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 06:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表