ATMEGA128串口,7数据位,偶校验,1停止位,9600工作异常
本帖最后由 qq635274216 于 2013-1-9 15:08 编辑首次使用avr单片机,需要用到串口通信,通信格式7位数据位,偶校验,1停止位,波特率9600.我是用的是atmega128的串口0,刚学会使用ICC,
用它做了如下配置:
//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9600 (0.0%)
// char size: 7 bit
// parity: Even
void uart0_init(void)
{
//UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0B = 0xD8;
UCSR0C = 0x24;
UBRR0L = 0x2F; //set baud rate lo
UBRR0H = 0x00; //set baud rate hi
}
查看datasheet配置没有错误,但是奇怪的问题就发生了,我把串口调试助手设置成8N1,9600,然后我发送0X82(1000 0010)给单片机
按理说单片机收到UDR0的数据应该是0x02(0000 0010)但是实际上UDR0的数据却是0X82。同样我用单片机发送0X02给串口助手,串口助手应该收到0X82,而实际上收到的却是0x02,
也就是说我的单片机设置和8N1,9600一样,而不是7位数据位,偶校验,1停止位,波特率9600。
后来试过用5,6位数据格式结果也一样,首次使用请高手指点。
呵呵。。。。。。。。。。。。。 yklstudent 发表于 2013-1-9 16:09 static/image/common/back.gif
呵呵。。。。。。。。。。。。。
高人还是指点一下啊 本帖最后由 foxpro2005 于 2013-1-9 18:00 编辑
ATMEGA128 7数据位,偶校验,1停止位
“我把串口调试助手设置成8 N 1,9600”......
你这个配置都与M128对不上,会正确么?? 本帖最后由 qq635274216 于 2013-1-9 18:40 编辑
foxpro2005 发表于 2013-1-9 17:56 static/image/common/back.gif
ATMEGA1287数据位,偶校验,1停止位
“我把串口调试助手设置成8 N 1,9600”......
这样配置就能查看单片机真正发出的数据了,设置成一样的就看不到单片机偶校验的数据了
比如单片机设置成7E1时发出0x02,经偶校验后就是0x82.如果接收端设置成8N1,就能看到收到的数据时0x82 示波器啊 示波器 串口调试助手软件有bug。 嗯,可以用示波器看一下,M128实际发出来的波形 本帖最后由 foxpro2005 于 2013-1-9 21:13 编辑
奇校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为奇数,如:
10110,0101
00110,0001
偶校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为偶数,如:
10100,0101
00100,0001
你把UCSR0C = 0x24; 改为 UCSR0C = 0x34; 看看,数据应该正确了。 呵呵,刚才闲得蛋痛,写了一个演示代码,调试OK,上传代码。
foxpro2005 发表于 2013-1-9 21:09 static/image/common/back.gif
奇校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为奇数,如:
10110,0101
00110,0001
按你说的改成0x34还是不行,怎么它的结果都和8N1一样,
按理说大厂的单片机应该没问题,试过几个串口助手结果一样。
是不是我的单片机坏了,还有你的那个工程是用什么软件编译的啊?
yklstudent 发表于 2013-1-9 19:28 static/image/common/back.gif
示波器啊 示波器
用示波器看过了,单片机发出的数据没有加上校验位,如下图红色波形,单片机发出0x02,加上校验后是0x82,但是从示波器上看还是0x02,
并没有在停止位和数据位后面加上校验位。 波特率降低试一试 lhlmm 发表于 2013-1-10 11:21 static/image/common/back.gif
波特率降低试一试
不能降低哦,产品要求波特率9600 本帖最后由 foxpro2005 于 2013-1-10 12:55 编辑
qq635274216 发表于 2013-1-10 10:16 static/image/common/back.gif
按你说的改成0x34还是不行,怎么它的结果都和8N1一样,
按理说大厂的单片机应该没问题,试过几个串口助手 ...
那个是用CodeVisionAVR写的,里面有Proteus的仿真文件,有使用虚拟串口仿真过的。
另外,你再发别的数据看看,比如:0x03等... 对新人,用排除法,首先相信示波器看到的,然后不厌其烦的调各个参数对比结果,这样才能对基础知识有个直观的了解,有遇到更细节无法理解的问题再问。不然都是浅尝辙止, qq635274216 发表于 2013-1-10 11:10 static/image/common/back.gif
用示波器看过了,单片机发出的数据没有加上校验位,如下图红色波形,单片机发出0x02,加上校验后是0x82,但 ...
UCSR0C = 0x34;
试试9楼的建议吧 可以行的
不过我也好奇偶校验偶校验出来的不对
非要设置成奇校验的 本帖最后由 foxpro2005 于 2013-1-10 19:50 编辑
那个波形图,你仔细看一下,那个校验位应该是附加在里的,只不过它是1(是高电平,它与停止位靠在一块儿,可能你是把误以为直接是停止位了,其实停止在后面一位),(偶校验时0x02, P=1, 则数据看到是0x82,你看一下波形周期就知道了), 或者你发别的数据,让校验位为0 (比如0x55之类)数据,应该就很容易看出来了。
好像Protues仿真中,奇和偶校验正好是反的!
今天特意找了一个M16的片子试了一下(前面给你回复的关于UCSR0C配置描述可能有点不正确), AVR单片机中的那个奇偶校验方式是正确的,且用示波器看过数据波形的(所以不要轻易怀疑AVR单片机,呵呵.....)。 // USART 初始化
UCSRA=0x00;
UCSRB=0xD8;
//UCSRB = 0xD8 | (1<<UCSZ2) | (1<<TXB8); // 9位模式,将第9位置1
UCSRC=0xA4; // 7位,偶校验
//UCSRC=0xB4; // 7位,奇校验
//UCSRC=0xA6; // 8位,偶校验
//UCSRC=0xB6; // 8位,奇校验
UBRRH=0x00; // 波特率9600
UBRRL=0x33;仿真图:
有上实际硬件测试过的代码:
foxpro2005 发表于 2013-1-10 19:24 static/image/common/back.gif
今天特意找了一个M16的片子试了一下(前面给你回复的关于UCSR0C配置描述可能有点不正确), AVR单片机中的 ...
问下 奇校验和偶检验的区别?
怎么出来的波形和网上说的不一样
感觉是相反的 不知道为什么 yklstudent 发表于 2013-1-10 19:35 static/image/common/back.gif
问下 奇校验和偶检验的区别?
怎么出来的波形和网上说的不一样
感觉是相反的 不知道为什么 ...
你的动作好快哦,都还没改好,就顶了....
跟AVR手册描述 以及 网上的资料是一样的。
奇校验: 数据位 + 校验位 , 1的个数始终为奇数个。奇校验位 = 数据的各位相异或后再取反, 所以在传送序列中,1的个数始终为奇数个。
偶校验: 数据位 + 校验位 , 1的个数始终为偶数个。偶校验位 = 数据的各位相异, 所以在传送序列中,1的个数始终为偶数个。
只是Proteus仿真中, AVR单片机的奇偶校验好像正好是反着的。今天我有用实际的M16芯片做过测试的,昨天晚上的回复可能的小错误(不能完全相应Proteus! 我就是觉得有点奇怪,今天才特意找一个M16的芯片测试了下)。 foxpro2005 发表于 2013-1-10 20:02 static/image/common/back.gif
你的动作好快哦,都还没改好,就顶了....
跟AVR手册描述 以及 网上的资料是一样的。
奇校验: 数据位 + ...
哦难怪呢 我还以为手册错误呢
没有实物的苦逼 羡慕了 本帖最后由 qq635274216 于 2013-1-11 10:09 编辑
foxpro2005 发表于 2013-1-10 19:24 static/image/common/back.gif
那个波形图,你仔细看一下,那个校验位应该是附加在里的,只不过它是1(是高电平,它与停止位靠在一块儿, ...
谢谢各位,其实我贴上来的只是典型值,我也试过其他值,也都用示波器看过,结果一样,
刚刚换了块M169p,相同的程序我在M169p上测试成功,就用的晶振不一样。
M169成功,M128还悬而未决啊!如图发送 0X02,0X45,0X36,0X03,0X41,0X46,收到0x82,0xc5,0x36,0xb1,0x03,0x41,0xc6 本帖最后由 qq635274216 于 2013-1-11 11:41 编辑
foxpro2005 发表于 2013-1-10 19:24 static/image/common/back.gif
那个波形图,你仔细看一下,那个校验位应该是附加在里的,只不过它是1(是高电平,它与停止位靠在一块儿, ...
还有你的那个串口(丁丁)问题一大堆,只要是7位模式时(不管奇校验还是偶校验),那个助手发出的第8位都是1,
我用它发0x01,0x02,0X03...会收到0x82,0x83,0x84...
我试过好几遍了,劝你别用了。commix 1.4的不错虽然没有连续发送功能。 都回答的太牛了,没有用过奇偶校验,学习了。 请问你下载的时候是用ISP 还是用JTAG ? lu976046395 发表于 2013-4-28 11:06 static/image/common/back.gif
请问你下载的时候是用ISP 还是用JTAG ?
用的是ISP 是不是编译器有问题啊?你用AVR STUDIO6去编译代码试一下 楼主问题解决了吗!我今天也遇到一个类似问题!M128设置为偶校验,无奇偶位发送时 连续发送接收数据时有错误,单个无问题!改为奇校验,串口发送(丁丁)一串字符接收错误!从设备(无校验位)发送接收错误! zhanglang660 发表于 2013-8-2 22:14 static/image/common/back.gif
楼主问题解决了吗!我今天也遇到一个类似问题!M128设置为偶校验,无奇偶位发送时 连续发送接收数据时有错 ...
没解决,后来改用M169就没问题了,一样的程序
页:
[1]