搜索
bottom↓
回复: 4

定时中断和串口中断嵌套问题求助

[复制链接]

出0入0汤圆

发表于 2010-1-30 00:55:39 | 显示全部楼层 |阅读模式
有一软件,需要非常精确的定时8u的定时器0中断来进行处理,同时又有串口接收中断,由于串口接收中断的存在,发生串口中断时,定时器0的定时中断就不能保证精确,所以需要采用中断嵌套来进行处理。

F_CPU=24M

程序如下:

/******************************************************************************
功能说明:        定时器0中断处理程序
输入参数:        无
输出参数:        无
返回值:        无
******************************************************************************/
SIGNAL(SIG_OVERFLOW0)
{
        unsigned char statusA;
        unsigned char c_buf;

        TCNT0=256-(8*F_CPU)/8/1000000;//定时8U
           //以下为定时中断处理,不超10条简单的C语句,略



}

/******************************************************************************
功能说明:        串口0中断处理程序
输入参数:        无
输出参数:        无
返回值:        无
******************************************************************************/
SIGNAL(SIG_USART_RECV)
{
        unsigned char c_buf;
       
           sei();                //使能全局中断
        c_buf=UDR0;
          //以下为定时中断处理,运行起来不超15条简单的C语句,略

          //设置收到数据标志

}


原来没有采用中断嵌套时,定时不准,有时8u,有时可能9u,10u.
但采用中断嵌套后,也能接收到数据,但接收不正确。


原来没有采用中断嵌套,看了马老师的帖子说到

B中断的服务程序应这样设计:(1)B中断的现场保护;(2)屏蔽除A以外其它的中断允许标志;(3)用指令SEI开放允许全局中断;(4)B中断服务;(5)用指令CLI禁止全局中断(6)恢复在本中断程序被屏蔽的中断允许标志;(7)B中断现场恢复;(8)B中断返回。

由于我只有这两个中断,并且是采用C进行开发,所以也就觉得只能在串口中断服务程序中加上sei(),别的好象也没什么好处理了。

串口中断服务程序最后加上cli();也试过,也不行。

请问我这么处理,错在哪?该如何改进,谢谢!!!

出0入0汤圆

发表于 2010-8-20 16:50:07 | 显示全部楼层
定时中断不准和串口中断没有必然的联系。是由于你定时中断采用了溢出模式,所以时间不准。

  
     (1)、进入定时中断,首先会执行压栈操作(由编译器自动添加)
     (2)、执行TCNT0=256-(8*F_CPU)/8/1000000;//定时8U
     由于要执行上述两段代码,不管是否有串口中断存在,定时中断都不准。

   
   解决:
       使用CTC中断方式可以彻底解决定时中断准确问题。当使用CTC模式时,如果定时器溢出时,由硬件自动赋值。
       你上面的代码是由于“人工”赋值,是造成定时中断不准的根本原因。

   
   警告:AVR尽量不要使用中断嵌套。

出0入0汤圆

发表于 2010-8-22 13:32:17 | 显示全部楼层
"有一软件,需要非常精确的定时8u的定时器0中断来进行处理"

非常含糊的需求!什么是“非常精确”?什么标准?

首先T0应该使用CTC方式,这样可以产生理论上非常精确的中断申请事件。

如果就只有T0一个中断,那么考虑到进入中断的断点保护合现场保护,那么中断服务的执行已经比中断的发生拖后了至少7个CLK。当然在这样的情况下(只有一个中断),中断服务的执行间隔也能“非常精确”为8u。但可能还会有1-2个CLK的误差,因为AVR是在执行完当前指令后才响应中断的。如果中断的产生与当前指令的执行同时发生,中断就会拖后这条指令的执行时间,如果中断的发生恰好是指令完成前一刻,那么就基本没有延误,这个误差是随机的,但不会积累。

如果有2个中断,这个“非常精确”就打折扣了,使用中断嵌套,尽管能尽快的处理T0,但在精确上会受到更多的影响。

另外8u的中断将消耗到CPU的大量时间。如果你的系统时钟为1M,那么8u的时间只能执行8条指令,连进出中断的时间都不够,就不要谈执行中断服务了。

就是采用16M的时钟,最多是128个CLK,你的中断服务:

TCNT0=256-(8*F_CPU)/8/1000000;//定时8U
           //以下为定时中断处理,不超10条简单的C语句,略

第一句就有乘法、除法和减法,而且还是4个字节的处理,不要说后面的处理了,仅这条需要多少条指令?

什么是基础?这个就是基础!我不知道你具体做什么DD,就凭这些东西,可以判断你的设计根本是有问题的。

出0入0汤圆

发表于 2010-8-22 18:07:07 | 显示全部楼层
回复【2楼】machao  

-----------------------------------------------------------------------


马老师 我是葛智伟的学生 有急事找您
为确保隐私,请联系我。

我的邮箱:
zxttgg@126.com
15021933592

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-29 07:07

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

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