搜索
bottom↓
回复: 17

请教马潮老师关于外部中断与UART接收中断冲突的问题

[复制链接]

出0入0汤圆

发表于 2009-5-22 14:35:10 | 显示全部楼层 |阅读模式
1.上位机程序扫描一周向下位机发送一次收据
2.下位机中断接收,收到数据后进行相应的处理
3.下位机用定时器1捕捉一频率固定的脉冲信号
问题是捕捉测得脉冲信号的频率很不稳定,在正确值上下较大幅度范围内波动
将通讯屏蔽掉时,捕捉测量很准确

通讯为什么会影响捕捉呢? 捕捉中断的优先级不是比UART中断优先级高吗?

请指导一下,非常感谢!

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2009-5-22 14:47:01 | 显示全部楼层
你UART中断中待的时间太长了,改进程序吧...

出0入0汤圆

发表于 2009-5-22 14:47:13 | 显示全部楼层
AVR确省情况下中断是不嵌套的,具体参考我编写教材的中断部分,或查看AVR器件手册。

出0入0汤圆

 楼主| 发表于 2009-5-22 15:39:47 | 显示全部楼层
谢谢!
UART中断等待时间也不长
我没有中断嵌套啊,两个中断就算并发,也该是响应优先级高的才对
还是很晕,我再看看

出0入0汤圆

发表于 2009-5-22 15:49:09 | 显示全部楼层
正是因为没有中断嵌套,所以才会不准,
一旦UART中断发生,你没有尽快出来,即时定时中断发生了也不会立即响应
只有等UART中断结束后才会响应....所以不准了,
解决方法
1. UART中断中不要超过三句话,判断,缓冲,标志
2. 如果这点误差也不能允许,就需要在进UART时,手动打开全局中断使能了,不过要小心UART语句太多而重入...

出0入0汤圆

 楼主| 发表于 2009-5-22 16:17:54 | 显示全部楼层
那怎样才能让中断可以嵌套呢?
让UART中断还没执行完时能够响应外部中断.
感谢史努比大侠的关注与支持!

出0入0汤圆

 楼主| 发表于 2009-5-22 16:24:25 | 显示全部楼层
snoopy大侠,能QQ指导一下吗? 我QQ:270356891 以前都是搞C51,AVR学习不久,多向你学习

出0入0汤圆

发表于 2009-5-22 16:25:27 | 显示全部楼层
在我编写教材中,对捕捉中断测周期有详细的解释,尽管捕捉中断能精确的记录(硬件方式)计数器的值,但在两次捕捉中断的间隔时间内,必须保证捕捉中断处理的完成,甚至包括频率周期的换算过程。就是采用中断嵌套方式,UART的中断非常短,只要这一点不能保证,你换算的周期就不对(主要是新的捕捉数据将老的数据冲掉了)。
    因此,捕捉方式测周期应该注意:

1。被测周期不能太短(频率不能太高)
2。尽量使用频率高的系统时钟(执行代码快)
3。仔细合理的设计整个系统软件,合理分配时间(这是比较难的,需要经验),比如周期测量是间断的(不是连续不断的测量),测量一次,换算一次,然后开始下一次的测量等。

出0入0汤圆

发表于 2009-5-22 17:13:56 | 显示全部楼层
总之,一名话:没有深刻掌握“中断”。

出0入0汤圆

 楼主| 发表于 2009-5-22 18:29:45 | 显示全部楼层
谢谢老师,谢谢各位朋友!
我想是因为我UART中断处理不是非常短所致

我的理解:
进入UART中断服务程序后,此时发生外部中断不会立即去执行,而是UART中断服务程序执行完成后才进入捕捉中断服务程序,这样就计时值就比实际的大了
不知道对不对?

看来在UART中断处理稍长一点的情况下,要用捕捉测准频率是不行的

出0入0汤圆

 楼主| 发表于 2009-5-22 18:37:20 | 显示全部楼层
interrupt [USART_RXC] void usart_rx_isr(void)
{
    uchar tmp;
    tmp=UDR;
    if(tmp==0x40)       //"@"
    {
        rx=0;
        uartStart=1;
    }
    else if(tmp==0x24)  //"$"
        uartStart=0;
    else
    {
        if(uartStart==1)
        {
            buffer[rx]=tmp-0x30;
            rx++;
        }
    }
}
这是我的中断接收程序,再压缩就实现不了功能了.

出0入0汤圆

发表于 2009-5-22 19:40:50 | 显示全部楼层
那只有在USART中断中开启全局中断了
把SEI();加在tmp=UDR;之前(iccavr)
或asm("sei");

出0入0汤圆

 楼主| 发表于 2009-5-22 20:26:01 | 显示全部楼层
嗯,谢谢.明白了,但是在UART开全局中断可能会出现中断重入等导致堆栈溢出,还是把通讯改成查询方式算了
谢谢大家!

出0入0汤圆

发表于 2009-5-22 20:29:08 | 显示全部楼层
将UART波特率降低....,9600或4800
该中断一般不会有重入的,如果你只有这两个中断的话...

出0入0汤圆

 楼主| 发表于 2009-5-22 20:39:53 | 显示全部楼层
哦,我的波特率是9600,不过还有一个定时器中断.
我去试验一下,谢谢!!!

出0入0汤圆

发表于 2009-5-31 13:57:08 | 显示全部楼层
编译器中,将堆栈设置大一些嘛!例如:设置到30

出0入0汤圆

发表于 2011-3-26 18:14:47 | 显示全部楼层
我觉得应该是进入中断程序后,关闭所有的中断,当中断程序执行完毕再打开中断
头像被屏蔽

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-26 03:02

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

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