搜索
bottom↓
回复: 28

ATMEGA128串口,7数据位,偶校验,1停止位,9600工作异常

[复制链接]

出0入0汤圆

发表于 2013-1-9 15:03:41 | 显示全部楼层 |阅读模式
本帖最后由 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位数据格式结果也一样,首次使用请高手指点。

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-1-9 16:09:02 | 显示全部楼层
呵呵。。。。。。。。。。。。。

出0入0汤圆

 楼主| 发表于 2013-1-9 16:38:50 | 显示全部楼层
yklstudent 发表于 2013-1-9 16:09
呵呵。。。。。。。。。。。。。

高人还是指点一下啊

出0入76汤圆

发表于 2013-1-9 17:56:08 | 显示全部楼层
本帖最后由 foxpro2005 于 2013-1-9 18:00 编辑

ATMEGA128 7数据位,偶校验,1停止位
“我把串口调试助手设置成8 N 1,9600”......

你这个配置都与M128对不上,会正确么??

出0入0汤圆

 楼主| 发表于 2013-1-9 18:34:54 | 显示全部楼层
本帖最后由 qq635274216 于 2013-1-9 18:40 编辑
foxpro2005 发表于 2013-1-9 17:56
ATMEGA128  7数据位,偶校验,1停止位
“我把串口调试助手设置成8 N 1,9600”......


这样配置就能查看单片机真正发出的数据了,设置成一样的就看不到单片机偶校验的数据了
比如单片机设置成7E1时发出0x02,经偶校验后就是0x82.如果接收端设置成8N1,就能看到收到的数据时0x82

出0入0汤圆

发表于 2013-1-9 19:28:13 | 显示全部楼层
示波器啊 示波器

出0入0汤圆

发表于 2013-1-9 20:55:22 | 显示全部楼层
串口调试助手软件有bug。

出0入76汤圆

发表于 2013-1-9 20:56:13 | 显示全部楼层
嗯,可以用示波器看一下,M128实际发出来的波形

出0入76汤圆

发表于 2013-1-9 21:09:20 | 显示全部楼层
本帖最后由 foxpro2005 于 2013-1-9 21:13 编辑

奇校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为奇数,如:
10110,0101
00110,0001

偶校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为偶数,如:
10100,0101
00100,0001

你把UCSR0C = 0x24; 改为 UCSR0C = 0x34; 看看,数据应该正确了。

出0入76汤圆

发表于 2013-1-9 21:50:00 | 显示全部楼层
呵呵,刚才闲得蛋痛,写了一个演示代码,调试OK,上传代码。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-1-10 10:16:19 | 显示全部楼层
foxpro2005 发表于 2013-1-9 21:09
奇校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为奇数,如:
10110,0101
00110,0001

按你说的改成0x34还是不行,怎么它的结果都和8N1一样,
按理说大厂的单片机应该没问题,试过几个串口助手结果一样。
是不是我的单片机坏了,还有你的那个工程是用什么软件编译的啊?

出0入0汤圆

 楼主| 发表于 2013-1-10 11:10:38 | 显示全部楼层
yklstudent 发表于 2013-1-9 19:28
示波器啊 示波器


用示波器看过了,单片机发出的数据没有加上校验位,如下图红色波形,单片机发出0x02,加上校验后是0x82,但是从示波器上看还是0x02,
并没有在停止位和数据位后面加上校验位。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-1-10 11:21:25 | 显示全部楼层
波特率降低试一试

出0入0汤圆

 楼主| 发表于 2013-1-10 12:34:54 | 显示全部楼层
lhlmm 发表于 2013-1-10 11:21
波特率降低试一试

不能降低哦,产品要求波特率9600

出0入76汤圆

发表于 2013-1-10 12:53:26 | 显示全部楼层
本帖最后由 foxpro2005 于 2013-1-10 12:55 编辑
qq635274216 发表于 2013-1-10 10:16
按你说的改成0x34还是不行,怎么它的结果都和8N1一样,
按理说大厂的单片机应该没问题,试过几个串口助手 ...


那个是用CodeVisionAVR写的,里面有Proteus的仿真文件,有使用虚拟串口仿真过的。
另外,你再发别的数据看看,比如:0x03等...

出0入0汤圆

发表于 2013-1-10 15:08:24 来自手机 | 显示全部楼层
对新人,用排除法,首先相信示波器看到的,然后不厌其烦的调各个参数对比结果,这样才能对基础知识有个直观的了解,有遇到更细节无法理解的问题再问。不然都是浅尝辙止,

出0入0汤圆

发表于 2013-1-10 17:00:45 | 显示全部楼层
qq635274216 发表于 2013-1-10 11:10
用示波器看过了,单片机发出的数据没有加上校验位,如下图红色波形,单片机发出0x02,加上校验后是0x82,但 ...

UCSR0C = 0x34;
试试9楼的建议吧 可以行的
不过我也好奇偶校验偶校验出来的不对
非要设置成奇校验的

出0入76汤圆

发表于 2013-1-10 19:24:49 | 显示全部楼层
本帖最后由 foxpro2005 于 2013-1-10 19:50 编辑

那个波形图,你仔细看一下,那个校验位应该是附加在里的,只不过它是1(是高电平,它与停止位靠在一块儿,可能你是把误以为直接是停止位了,其实停止在后面一位),(偶校验时0x02, P=1, 则数据看到是0x82,你看一下波形周期就知道了), 或者你发别的数据,让校验位为0 (比如0x55之类)数据,应该就很容易看出来了。

好像Protues仿真中,奇和偶校验正好是反的!
今天特意找了一个M16的片子试了一下(前面给你回复的关于UCSR0C配置描述可能有点不正确), AVR单片机中的那个奇偶校验方式是正确的,且用示波器看过数据波形的(所以不要轻易怀疑AVR单片机,呵呵.....)。
  1.     // USART 初始化
  2.     UCSRA=0x00;
  3.     UCSRB=0xD8;
  4.     //UCSRB = 0xD8 | (1<<UCSZ2) | (1<<TXB8);    // 9位模式,将第9位置1
  5.    
  6.     UCSRC=0xA4;             // 7位,偶校验
  7.     //UCSRC=0xB4;           // 7位,奇校验  
  8.     //UCSRC=0xA6;           // 8位,偶校验
  9.     //UCSRC=0xB6;           // 8位,奇校验
  10.               
  11.     UBRRH=0x00;             // 波特率9600
  12.     UBRRL=0x33;
复制代码
仿真图:

有上实际硬件测试过的代码:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-1-10 19:35:08 | 显示全部楼层
foxpro2005 发表于 2013-1-10 19:24
今天特意找了一个M16的片子试了一下(前面给你回复的关于UCSR0C配置描述可能有点不正确), AVR单片机中的 ...

问下 奇校验和偶检验的区别?
怎么出来的波形和网上说的不一样
感觉是相反的 不知道为什么

出0入76汤圆

发表于 2013-1-10 20:02:58 | 显示全部楼层
yklstudent 发表于 2013-1-10 19:35
问下 奇校验和偶检验的区别?
怎么出来的波形和网上说的不一样
感觉是相反的 不知道为什么 ...

你的动作好快哦,都还没改好,  就顶了....
跟AVR手册描述 以及 网上的资料是一样的。
奇校验: 数据位 + 校验位 , 1的个数始终为奇数个。  奇校验位 = 数据的各位相异或后再取反, 所以在传送序列中,1的个数始终为奇数个。
偶校验: 数据位 + 校验位 , 1的个数始终为偶数个。  偶校验位 = 数据的各位相异, 所以在传送序列中,1的个数始终为偶数个。

只是Proteus仿真中, AVR单片机的奇偶校验好像正好是反着的。今天我有用实际的M16芯片做过测试的,昨天晚上的回复可能的小错误(不能完全相应Proteus! 我就是觉得有点奇怪,今天才特意找一个M16的芯片测试了下)。

出0入0汤圆

发表于 2013-1-10 20:17:33 | 显示全部楼层
foxpro2005 发表于 2013-1-10 20:02
你的动作好快哦,都还没改好,  就顶了....
跟AVR手册描述 以及 网上的资料是一样的。
奇校验: 数据位 + ...

哦  难怪呢 我还以为手册错误呢
没有实物的苦逼 羡慕了

出0入0汤圆

 楼主| 发表于 2013-1-11 09:53:47 | 显示全部楼层
本帖最后由 qq635274216 于 2013-1-11 10:09 编辑
foxpro2005 发表于 2013-1-10 19:24
那个波形图,你仔细看一下,那个校验位应该是附加在里的,只不过它是1(是高电平,它与停止位靠在一块儿, ...


谢谢各位,其实我贴上来的只是典型值,我也试过其他值,也都用示波器看过,结果一样,
刚刚换了块M169p,相同的程序我在M169p上测试成功,就用的晶振不一样。
M169成功,M128还悬而未决啊!如图发送 0X02,0X45,0X36,0X03,0X41,0X46,收到0x82,0xc5,0x36,0xb1,0x03,0x41,0xc6

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-1-11 11:39:39 | 显示全部楼层
本帖最后由 qq635274216 于 2013-1-11 11:41 编辑
foxpro2005 发表于 2013-1-10 19:24
那个波形图,你仔细看一下,那个校验位应该是附加在里的,只不过它是1(是高电平,它与停止位靠在一块儿, ...


  还有你的那个串口(丁丁)问题一大堆,只要是7位模式时(不管奇校验还是偶校验),那个助手发出的第8位都是1,
我用它发0x01,0x02,0X03...会收到0x82,0x83,0x84...
我试过好几遍了,劝你别用了。commix 1.4的不错虽然没有连续发送功能。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-4-8 19:49:04 | 显示全部楼层
都回答的太牛了,没有用过奇偶校验,学习了。

出0入0汤圆

发表于 2013-4-28 11:06:52 | 显示全部楼层
请问你下载的时候是用  ISP 还是用JTAG ?

出0入0汤圆

 楼主| 发表于 2013-4-28 13:45:11 | 显示全部楼层
lu976046395 发表于 2013-4-28 11:06
请问你下载的时候是用  ISP 还是用JTAG ?

用的是ISP

出0入0汤圆

发表于 2013-4-28 18:58:30 | 显示全部楼层
是不是编译器有问题啊?你用AVR STUDIO6去编译代码试一下

出0入0汤圆

发表于 2013-8-2 22:14:51 | 显示全部楼层
楼主问题解决了吗!我今天也遇到一个类似问题!M128设置为偶校验,无奇偶位发送时 连续发送接收数据时有错误,单个无问题!改为奇校验,串口发送(丁丁)一串字符接收错误!从设备(无校验位)发送接收错误!

出0入0汤圆

 楼主| 发表于 2013-8-5 16:05:15 | 显示全部楼层
zhanglang660 发表于 2013-8-2 22:14
楼主问题解决了吗!我今天也遇到一个类似问题!M128设置为偶校验,无奇偶位发送时 连续发送接收数据时有错 ...

没解决,后来改用M169就没问题了,一样的程序
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-23 23:41

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

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