qq635274216 发表于 2013-1-9 15:03:41

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:02

呵呵。。。。。。。。。。。。。

qq635274216 发表于 2013-1-9 16:38:50

yklstudent 发表于 2013-1-9 16:09 static/image/common/back.gif
呵呵。。。。。。。。。。。。。

高人还是指点一下啊

foxpro2005 发表于 2013-1-9 17:56:08

本帖最后由 foxpro2005 于 2013-1-9 18:00 编辑

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

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

qq635274216 发表于 2013-1-9 18:34:54

本帖最后由 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

yklstudent 发表于 2013-1-9 19:28:13

示波器啊 示波器

MicroPLC 发表于 2013-1-9 20:55:22

串口调试助手软件有bug。

foxpro2005 发表于 2013-1-9 20:56:13

嗯,可以用示波器看一下,M128实际发出来的波形

foxpro2005 发表于 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; 看看,数据应该正确了。

foxpro2005 发表于 2013-1-9 21:50:00

呵呵,刚才闲得蛋痛,写了一个演示代码,调试OK,上传代码。

qq635274216 发表于 2013-1-10 10:16:19

foxpro2005 发表于 2013-1-9 21:09 static/image/common/back.gif
奇校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为奇数,如:
10110,0101
00110,0001


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

qq635274216 发表于 2013-1-10 11:10:38

yklstudent 发表于 2013-1-9 19:28 static/image/common/back.gif
示波器啊 示波器

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

lhlmm 发表于 2013-1-10 11:21:25

波特率降低试一试

qq635274216 发表于 2013-1-10 12:34:54

lhlmm 发表于 2013-1-10 11:21 static/image/common/back.gif
波特率降低试一试

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

foxpro2005 发表于 2013-1-10 12:53:26

本帖最后由 foxpro2005 于 2013-1-10 12:55 编辑

qq635274216 发表于 2013-1-10 10:16 static/image/common/back.gif
按你说的改成0x34还是不行,怎么它的结果都和8N1一样,
按理说大厂的单片机应该没问题,试过几个串口助手 ...

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

benfenshusheng 发表于 2013-1-10 15:08:24

对新人,用排除法,首先相信示波器看到的,然后不厌其烦的调各个参数对比结果,这样才能对基础知识有个直观的了解,有遇到更细节无法理解的问题再问。不然都是浅尝辙止,

yklstudent 发表于 2013-1-10 17:00:45

qq635274216 发表于 2013-1-10 11:10 static/image/common/back.gif
用示波器看过了,单片机发出的数据没有加上校验位,如下图红色波形,单片机发出0x02,加上校验后是0x82,但 ...

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

foxpro2005 发表于 2013-1-10 19:24:49

本帖最后由 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;仿真图:

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

yklstudent 发表于 2013-1-10 19:35:08

foxpro2005 发表于 2013-1-10 19:24 static/image/common/back.gif
今天特意找了一个M16的片子试了一下(前面给你回复的关于UCSR0C配置描述可能有点不正确), AVR单片机中的 ...

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

foxpro2005 发表于 2013-1-10 20:02:58

yklstudent 发表于 2013-1-10 19:35 static/image/common/back.gif
问下 奇校验和偶检验的区别?
怎么出来的波形和网上说的不一样
感觉是相反的 不知道为什么 ...

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

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

yklstudent 发表于 2013-1-10 20:17:33

foxpro2005 发表于 2013-1-10 20:02 static/image/common/back.gif
你的动作好快哦,都还没改好,就顶了....
跟AVR手册描述 以及 网上的资料是一样的。
奇校验: 数据位 + ...

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

qq635274216 发表于 2013-1-11 09:53:47

本帖最后由 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:39:39

本帖最后由 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的不错虽然没有连续发送功能。

fish198868 发表于 2013-4-8 19:49:04

都回答的太牛了,没有用过奇偶校验,学习了。

lu976046395 发表于 2013-4-28 11:06:52

请问你下载的时候是用ISP 还是用JTAG ?

qq635274216 发表于 2013-4-28 13:45:11

lu976046395 发表于 2013-4-28 11:06 static/image/common/back.gif
请问你下载的时候是用ISP 还是用JTAG ?

用的是ISP

kevinhh 发表于 2013-4-28 18:58:30

是不是编译器有问题啊?你用AVR STUDIO6去编译代码试一下

zhanglang660 发表于 2013-8-2 22:14:51

楼主问题解决了吗!我今天也遇到一个类似问题!M128设置为偶校验,无奇偶位发送时 连续发送接收数据时有错误,单个无问题!改为奇校验,串口发送(丁丁)一串字符接收错误!从设备(无校验位)发送接收错误!

qq635274216 发表于 2013-8-5 16:05:15

zhanglang660 发表于 2013-8-2 22:14 static/image/common/back.gif
楼主问题解决了吗!我今天也遇到一个类似问题!M128设置为偶校验,无奇偶位发送时 连续发送接收数据时有错 ...

没解决,后来改用M169就没问题了,一样的程序
页: [1]
查看完整版本: ATMEGA128串口,7数据位,偶校验,1停止位,9600工作异常