定时中断和串口中断嵌套问题求助
有一软件,需要非常精确的定时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();也试过,也不行。
请问我这么处理,错在哪?该如何改进,谢谢!!! 定时中断不准和串口中断没有必然的联系。是由于你定时中断采用了溢出模式,所以时间不准。
(1)、进入定时中断,首先会执行压栈操作(由编译器自动添加)
(2)、执行TCNT0=256-(8*F_CPU)/8/1000000;//定时8U
由于要执行上述两段代码,不管是否有串口中断存在,定时中断都不准。
解决:
使用CTC中断方式可以彻底解决定时中断准确问题。当使用CTC模式时,如果定时器溢出时,由硬件自动赋值。
你上面的代码是由于“人工”赋值,是造成定时中断不准的根本原因。
警告:AVR尽量不要使用中断嵌套。 "有一软件,需要非常精确的定时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,就凭这些东西,可以判断你的设计根本是有问题的。 回复【2楼】machao
-----------------------------------------------------------------------
马老师 我是葛智伟的学生 有急事找您
为确保隐私,请联系我。
我的邮箱:
zxttgg@126.com
15021933592 是哪个葛智伟?温州的?
页:
[1]