zh313212 发表于 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();也试过,也不行。

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

ba_wang_mao 发表于 2010-8-20 16:50:07

定时中断不准和串口中断没有必然的联系。是由于你定时中断采用了溢出模式,所以时间不准。


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

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

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

machao 发表于 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,就凭这些东西,可以判断你的设计根本是有问题的。

zxttgg 发表于 2010-8-22 18:07:07

回复【2楼】machao

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


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

我的邮箱:
zxttgg@126.com
15021933592

machao 发表于 2010-8-22 18:19:24

是哪个葛智伟?温州的?
页: [1]
查看完整版本: 定时中断和串口中断嵌套问题求助