搜索
bottom↓
回复: 13

atmega8 串口收发错误请教

[复制链接]

出0入0汤圆

发表于 2013-1-10 21:40:34 | 显示全部楼层 |阅读模式
本帖最后由 liweiyuangangan 于 2013-1-11 14:17 编辑

#include <iom8v.h>
#include <macros.h>

void port_init(void)
{
PORTB = 0x00;
DDRB  = 0x00;
PORTC = 0x00; //m103 output only
DDRC  = 0x00;
PORTD = 0x00;
DDRD  = 0x00;
}

//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();

MCUCR = 0x00;
GICR  = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}

/************************************
Name         :小延时程序
Target       :atmega8
Crystal(晶振):8M
************************************/
void delay()
{
unsigned int i;//最大值65536
for (i=0;i<40000;i++)
{;}
}

/***********************************************************
用    途:串口发送接收程序
Taget   :mega8
crystal :8M
介    绍:
**********************************************************/
//晶振和波特率
#define fosc 8000000
#define baud 9600
//UART初始化函数
void init_uart()
{
UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);//允许收发,打开接收中断
UBRRL=(fosc/16/(baud+1))%256;//设置波特率寄存器
UBRRH=(fosc/16/(baud+1))/256;
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP
}
//字符输出
void uart_putchar(unsigned char c)
{
while(!(UCSRA&(1<<UDRE)));//上次发送有没有完成
UDR=c;
}
//字符输入
unsigned char uart_getchar()
{
while(!(UCSRA&(1<<RXC))){;}//有没有接收到数据
return UDR;
}
//带回车的字符串输出
int uart_print(char *s)
{
while(*s)
{
  uart_putchar(*s);
  s++;
}
uart_putchar(0x0a);//回车换行
uart_putchar(0x0d);
return 1;
}
//不带回车换行的字符串输出
void uart_prints(char *s)
{
while(*s)
{
  uart_putchar(*s);
  s++;
}
}
//接收中断
#pragma interrupt_handler uart_rec_int:iv_USART_RX
void uart_rec_int()
{
uart_putchar(UDR);
uart_putchar(0x0a);//回车换行
uart_putchar(0x0d);
}
//**************************************************************************

void main()
{
port_init();
init_devices();

init_uart();
uart_print("xiaozhiyong");
while(1)
{
  uart_print("aaa");
  //delay();
}
}

上面的程序,但是设置的是9600波特率,连电脑后,看以9600波特率看数据不行,都是一个乱码,换成1200就可以看出数据而且正确,好奇怪,是不是程序有问题,求教育,忘说了,用的是8m外部晶振



UBRRL=(fosc/16/(baud+1))%256;//设置波特率寄存器
UBRRH=(fosc/16/(baud+1))/256;
改为
  UBRRH=0;
     UBRRL=51;         //9600
也是不行,参考帖子http://www.amobbs.com/forum.php? ... light=mega8%2BUSART

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

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

出0入0汤圆

 楼主| 发表于 2013-1-11 08:54:12 | 显示全部楼层
请问程序有没有错啊?当发送就电脑显示跟设置的不一样,各位大牛,求指教啊

出0入0汤圆

发表于 2013-1-11 08:57:40 | 显示全部楼层
这个应该是你的错,注意阅读数据手册。你可以发个0b10101010数据在示波器上求证一下数据波特率

出0入0汤圆

发表于 2013-1-11 12:09:37 | 显示全部楼层
不用看了 就是波特率设置的问题 误差太大 通信当然错误的

出0入0汤圆

 楼主| 发表于 2013-1-11 12:13:28 | 显示全部楼层
shjw 发表于 2013-1-11 08:57
这个应该是你的错,注意阅读数据手册。你可以发个0b10101010数据在示波器上求证一下数据波特率 ...

已经查阅过资料啦,改波特率有10多次了,你说UBRR = 51也改过,UBRR =37也改过,有可能是熔丝设置错了么?还是电路有问题啊?

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2013-1-11 12:16:05 | 显示全部楼层
yklstudent 发表于 2013-1-11 12:09
不用看了 就是波特率设置的问题 误差太大 通信当然错误的

但是按照atmega8后面的数据fosc = 8.0000Mhz时,对应9600波特率,并且U2X=0时,UBRR = 51 ,误差是0。2%,这个也试过了

出0入0汤圆

发表于 2013-1-11 13:13:21 | 显示全部楼层
UBRRL=(fosc/16/(baud+1))%256;//设置波特率寄存器
UBRRH=(fosc/16/(baud+1))/256;
???????
你这个计算结果值是多少?????

出0入0汤圆

 楼主| 发表于 2013-1-11 14:14:08 | 显示全部楼层
yklstudent 发表于 2013-1-11 13:13
UBRRL=(fosc/16/(baud+1))%256;//设置波特率寄存器
UBRRH=(fosc/16/(baud+1))/256;
???????

这只是其中一个版本,后来我也按芯片资料改过了,但是还是不行,你是想说改为UBRRL = ((fosc/16/baud)-1)%256;UBRRH = ((fosc/16/baud)-1)/256;或者UBRR = fosc/16/baud- 1 ;//就是UBRR = 51;9600波特率,这个我也改过了,已经改过不下10种程序
头像被屏蔽

出0入0汤圆

发表于 2013-1-11 14:18:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2013-1-11 14:46:44 | 显示全部楼层
proteus仿真 没什么问题 估计多半硬件有点问题吧 或者芯片坏了 自己不凡找找硬件的问题看看 软件是没什么问题的
波特率设置可以
UBRR = (fosc/16/(baud))-1;
这样就可以了

出0入0汤圆

 楼主| 发表于 2013-1-11 15:13:04 | 显示全部楼层
yklstudent 发表于 2013-1-11 14:46
proteus仿真 没什么问题 估计多半硬件有点问题吧 或者芯片坏了 自己不凡找找硬件的问题看看 软件是没什么问 ...


非常感谢你,耽误左你一日的时间,多谢, 我再去查查电路,毕竟电路不是我做的

出0入0汤圆

发表于 2013-1-11 16:58:42 | 显示全部楼层
liweiyuangangan 发表于 2013-1-11 15:13
非常感谢你,耽误左你一日的时间,多谢, 我再去查查电路,毕竟电路不是我做的 ...

自己去查查吧 小心说硬件有问题 人家跟你拼命
头像被屏蔽

出0入0汤圆

发表于 2013-1-11 17:30:07 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-24 05:21

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

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