打印

再来,定时中断处理

[复制链接]
1468|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
箫笑|  楼主 | 2008-12-2 18:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//timer2中断处理
void TimerHandle() interrupt 5 using 1
{
    TF2 = 0;

    if (check != 0)
        check --;
}

//串口发送
void _TRS(unsigned char *DataSend)
{
    while(!TI0);
    TI0=0;
    SBUF0 = *DataSend;
}

//---------------------------
void main() 
{
    unsigned char ok = 0xAA;
    check =50;

    while(1){    

    //_TRS(&check);
   
     if (check == 0)
    {
        check =50;
        _TRS(&ok);
    }
   }
}
将代码简化成这个样子,初始化串口跟定时器的就省了,

昨天出问题的原因竟然是在TimerHandle()函数里放进了串口调试程序_TRS().

不过,这还不是根本的原因,真正的原因是打开了串口中断(我用中断接收),

出现了以下的现象:
按照上面的代码根本就没有反应,等多长时间都无法把ok的值给我打出来,不过要是在主函数里跟踪着check,就是打开注释掉那句,似乎程序又能正常运行,随着不断减少的check,然后有一个ok的值.

真正解决了问题的方法是关掉ES,那么一切都是正常的.

非常的好奇,到底串口中断跟timer2中断有什么瓜葛呢?串口优先级比timer2要高,没有发送接收,按理说timer2应该乖乖的工作啊,怎么解释让串口"引导"一下,又能顺利产生timer2中断呢?糊涂极了.......

相关帖子

沙发
ayb_ice| | 2008-12-2 21:09 | 只看该作者

串口发送还是在中断自动处理好

使用特权

评论回复
板凳
刘前辈| | 2008-12-3 13:45 | 只看该作者

初始化程序好像写错了?

//串口发送
void _TRS(unsigned char *DataSend)
{
    while(!TI0);
    TI0=0;
    SBUF0 = *DataSend;
}

上述发送程序的先决条件是TI0=1,这时打开中断ES显然不对。这意味第一次发送时,还没发送任何数据,串口中断就发生了!(TI0=1 表示“发送完毕”,同时触发串口中断。)

如果是初始化TI0=0,更不对了,第一次发送死循环永远发不出去。

如果中断发送,应该写为:

void _TRS(unsigned char *DataSend)
{
    TI0=0;
    SBUF0 = *DataSend;

    //while(!TI0);

}


如果非中断发送,加上while(!TI0);


使用特权

评论回复
地板
箫笑|  楼主 | 2008-12-4 13:23 | 只看该作者

re

串口我是用非中断发送,中断接收.

初始化串口的时候TI=1的.

没错,就是上电工作就产生一次串口中断,中断处理程序是这样的
if (RI)

}
TI引起的中断会立即出去,

自己写到这里突然明白了,觉得不调用TRS是有问题,因为它会一直产生串口中断,虽然什么都不做,但一直跑进去又跑出来,而且他的优先级又比较高.

把等待发送的while放到后面,初始化的时候清TI.

使用特权

评论回复
5
刘前辈| | 2008-12-4 20:43 | 只看该作者

也不谢谢我。

还是旁观者清。

使用特权

评论回复
6
箫笑|  楼主 | 2008-12-5 12:35 | 只看该作者

还是刘前辈~多谢

上次也是刘前辈理清了俺滴疑问,一起多谢,哈哈

还是上次说的前人写的程序,他的串口程序复杂一点,我是理解一下他的意思然后简化成那个样子.要改他的程序还是有点麻烦.看别人的程序真辛苦.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

368

帖子

0

粉丝