打印
[AVR单片机]

ATMEGA16L的USART在不同工作电压下的问题

[复制链接]
3464|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
eleclike|  楼主 | 2008-5-27 11:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ATMEGA16L的串口问题
======================
在使用ATMEGA16L的过程中遇到了一个比较奇怪的问题,让ATMEGA16L分别工作在3.3v和5.0v,发送数据0x00-0xff,在串口调试终端接收的数据出现了不同,在3.3v时工作正常,而在5.5v时则出错。不知道各位在使用过程中是否也遇到了类似的情况?它的USART的工作跟电压是否有关系?但是在datasheet上却没有看到相关的内容。

---------------------------------------------------------------------
下面是试验记录:

晶振:内部4M
波特率:2400,根据数据手册设置初值:U2X=1,UBBR=207
调试终端:sscom32
发送数据:0-255
电平转换芯片:max232 电容:10uf

在sscom32接收窗口显示数据
当工作电压为3.3v  接收数据正常为0x00--0xff;

当工作电压为5.0v  接收数据不正常,接收数据如下:
80 40 A0 20 50 90 D0 10 28 48 68 88 A8 C8 E8 08 14 24 34 44 54 64 74 84 94 A4 B4 C4 D4 E4 F4 04 0A 12 1A 22 2A 32 3A 42 4A 52 5A 62 6A 72 7A 82 8A 92 9A A2 AA B2 BA C2 CA D2 DA E2 EA F2 FA 02 05 09 0D 11 15 19 1D 21 25 29 2D 31 35 39 3D 41 45 49 4D 51 55 59 5D 61 65 69 6D 71 75 79 7D 81 85 89 8D 91 95 99 9D A1 A5 A9 AD B1 B5 B9 BD C1 C5 C9 CD D1 D5 D9 DD E1 E5 E9 ED F1 F5 F9 FD 01 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE 

1.修改波特率为4800,9600,依然得到上述结果。
2.更换串口调试终端:使用龚建伟的“串口调试助手V2.2”也依然是上述相同结果
3.电平转换芯片:max232,电容更换为4700pf ,依然得到上述结果
--------------------------------------------------------------------
附源程序:
#include "iom16v.h"

void InitialUsart(unsigned int );
void SendUsartData(unsigned char);

void main(void)
{    unsigned int i;
    InitialUsart(2400);

    for(i=0;i<256;i++)//发送0-255,观察终端接收结果
    {
        SendUsartData(i);
    }
    while(1);
}


void InitialUsart(unsigned int baud)
{
     switch(baud)
    {
        case 2400      : baud=207;break;
        case 4800   : baud=103;break;
        case 9600    : baud=51;break;
        case 19200    : baud=25;break;
        default        : break;
    }

     UCSRB=0x00;
     UBRRH=(unsigned char)(baud>>8)&0x7f;
     UBRRL=(unsigned char) baud;
     UCSRA|=(1<<U2X);
     UCSRB|=(1<<RXEN)|(1<<TXEN);
     UCSRC|=(1<<URSEL)|(3<<UCSZ0);//设置为8位数据操作,1位停止位
}

void SendUsartData(unsigned char temp)

    while( !(UCSRA & (1<<UDRE)) );
    UDR=temp;
}
-------------------------------------------------------

相关帖子

沙发
jt4117| | 2008-5-27 11:03 | 只看该作者

换外部晶振啊?

使用特权

评论回复
板凳
dai_weis| | 2008-5-27 12:20 | 只看该作者

用中断方式发送看看

你的程序除了这个功能还有其他的内容么?

使用特权

评论回复
地板
eleclike|  楼主 | 2008-5-27 13:02 | 只看该作者

回复dai_weis

回复dai_weis :
没有了,原本是一个复杂的程序,为了简化问题,将其中一部分抽出来了,但上述情况依然存在

使用特权

评论回复
5
笑苍天| | 2008-5-27 13:34 | 只看该作者

同意2楼,内部晶振稳定性不够

在通讯时无法保证在宽电压和宽温度范围正常稳定工作。

如下图(数据手册上的截图),两个圆点处,当3.3V时频率大概3.85MHz,当5V时频率大概4MHz,当你的串口在3.3V时正常工作,那么在5V时,偏差大概是 4/3.85=1.0389,偏了3.89%,一般波特率偏差大于2%串口就无法正常接收。所以你碰到的现象是必然的。

使用特权

评论回复
6
eleclike|  楼主 | 2008-5-28 00:35 | 只看该作者

谢谢LS

谢谢LS解释

使用特权

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

本版积分规则

9

主题

201

帖子

0

粉丝