51单片机中一个定时计数中断如何使用多个中断程序(C语言)

nihs2008 2010-09-30 02:21:05
51单片机中有二个定时/计数中断,其中一个已使用.另一个我想定义多个中断例程,如:
void timer_0() interrupt 1 using 3
void timer_1() interrupt 1 using 2
void timer_2() interrupt 1 usring 1
其中中断程序的中断时间及程序内容是不同的.

在主程序中,想要根据不同情况,使用不同的中断程序.应如何处理.请大师们指教
使用的是C语言编程.
...全文
2651 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
nihongsheng 2011-03-20
  • 打赏
  • 举报
回复 1
在中断服务程序中设置不同的case,在主程序中设置不同状况的变量,开然后开中断,在中断服务程序中根据不同情况调用不同case,很简单
远上寒杉 2010-10-01
  • 打赏
  • 举报
回复
实现这个最好仿照μC/OS的做法,用闲置的定时器设定一个TimeTick()函数,每一个比较小的时间t调用一次;另外设置一个链表存放定时数和调用函数地址,设定Delay()函数用来给这个链表添加项目。每调用一次TimeTick则遍历一次链表,将所有定时值减1,减到0的调用返回函数。

这样做的缺点是定时值不能足够精确。

另外,C51也有实时操作系统,如果系统比较复杂使用操作系统也是个不错的选择。
Corepy 2010-09-30
  • 打赏
  • 举报
回复
【参考】http://www.eefocus.com/article/10-06/1623741276165827.html?sort=1111_1125_1480_0


多中断处理注意的问题

1)要处理多路中断问题,中断处理程序的算法大体上可以分为两类:弱中断优先级(使用CALL和RETURN方式)和强中断优先级(使用GOTO方式)。

2)如果同时发生多个中断请求,则中断处理的顺序取决于中断程序中的检查中断源的顺序。

3)若要防止中断请求被丢失,则要注意下面两种情况:如果同一中断源的中断发生间隔时间小于该中断服务的处理时间,则可能出现中断事件被忽略(体现在中断服务的过程中,标志位被连续发生了两次置位),例如:中断事件发生的时间间隔为30ms,中断服务处理加上跳转判断的时间为50ms,则情况将会如下所示:

[中断次数______1][中断次数______2][中断次数_____3][中断次数_____4]

[处理次数______1][处理次数______2][处理次数_____4]

如果在中断处理一开始就清除IF,那么如上图所示,中断事件3、4在处理次数2的过程中发生了两次,那么即使IF清除发生在中断次数3发生之前,也将丢失第三次中断。

另外,即使中断出现的时间间隔大于中断服务的时间间隔,如果清除中断标志位的指令安排在中断服务子程序的尾部,就有可能造成丢失该中断请求(即两次中断标志置位的事件只对应一条清除指令和一次中断处理),也就是如果清除中断标志位的指令安排在中断服务程序的尾部,就有可能丢失响应在处理中断期间该中断源第2次中断请求的机会。

4)为了能够编写好一个简洁的中断程序,应抓住中断的特点是具有实时性,针对实时中断数据采集系统,也就是中断的特点在于数据的采集。因此在中断程序中只应该处理数据采集和标志位的设置,而将数据的处理放在中断之外,由主程序通过循环检测执行数据处理工作,具体做法:先开辟一个“储存缓冲区”,作为采集来的数据的传递媒体,即存储采集数据,等待主程序的处理;中断程序负责数据的采集,并且将采集来的数据值赋给“存储缓冲区”;主程序通过条件循环语句反复检测“存储缓冲区”情况,及时处理采集信息。这样在处理方法既能有效的实现中断的功能,又可以极大的缩减每个中断的时间,提高整个程序的反应速度。

5)对于中断响应和处理时间有严格要求的应用,保护现场的指令安排也应考虑延时问题。

6)在进行查表操作时必须禁止CPU响应中断。以避免中断返回时跳转到不希望的地址上去。
Corepy 2010-09-30
  • 打赏
  • 举报
回复
中断嵌套?

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧