打印
[AVR单片机]

avr atmega162串口发送 必须加延时

[复制链接]
2642|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shandao2006|  楼主 | 2013-3-4 13:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
之前为 89c4051单片机与单片机B相连。  有两个线相连,一个是SBUSY,若SBUSY=1,表示单片机B忙,拒绝接受数据。反之,可以接受。另一个是SDATA,4051用来向单片机B发送数据。
void SCISend(INT8U Data)
{   
        SBUSY = 1;
        while(SBUSY);
        SBUFF=Data;
        while(!TI);
        TI=0;
}

现在换成atmeag162,
                            //PORTC.0相当于SBUSY线。
void SCISend(unsigned char send_data)
{
    while(PINC&0x01);
    delay_us(500);
    while(PINC&0x01);                    //检测PINC.0为高还是地电平。
    delay_us(500);
    while(PINC&0x01);
    delay_us(500);
    while(PINC&0x01);

    while(!(UCSR1A&DATA_REGISTER_EMPTY));
    UDR1=send_data;
}



单片机B接受几个字符后,将会置SBUSY为1,处理这几个字符,所需时间在0.5s—3s范围内。
若不加延时,单片机B处理结果错误,说明收到的数据有丢失。但加了延时1.5ms(时间再小的话,如果mega162发送频繁,也会出错)正确。
为什么51不用延时,而avr需要?

相关帖子

沙发
airwill| | 2013-3-5 12:48 | 只看该作者
我用 AVR 串口, 从来没有用过延时嘛, 没有遇到过问题. 当然, 我都是用中断处理的.
要说, 51 与 AVR 在串口上的最大区别是:
AVR 的串口数据寄存器使用了双缓冲. 这点可以留意一下.

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
qin552011373 + 6 很给力!
板凳
shandao2006|  楼主 | 2013-3-11 11:11 | 只看该作者
airwill 发表于 2013-3-5 12:48
我用 AVR 串口, 从来没有用过延时嘛, 没有遇到过问题. 当然, 我都是用中断处理的.
要说, 51 与 AVR 在串口 ...

我明白了。是双缓冲的原因。因为我是用的485,发送完之后会改变485的方向。而只判断了UDRE,没有判断TXC(即二级缓存也发送完毕)。DATA_Register把数据发到缓存的时候, 我就把485关了,所以失败。
谢谢你的回答。

使用特权

评论回复
地板
qin552011373| | 2013-3-11 21:34 | 只看该作者
shandao2006 发表于 2013-3-11 11:11
我明白了。是双缓冲的原因。因为我是用的485,发送完之后会改变485的方向。而只判断了UDRE,没有判断TXC ...

欢迎常来提问

使用特权

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

本版积分规则

1

主题

2

帖子

0

粉丝