liweiyuangangan 发表于 2013-1-10 21:40:34

atmega8 串口收发错误请教

本帖最后由 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?mod=viewthread&tid=3544768&highlight=mega8%2BUSART

liweiyuangangan 发表于 2013-1-11 08:54:12

请问程序有没有错啊?当发送就电脑显示跟设置的不一样,各位大牛,求指教啊

shjw 发表于 2013-1-11 08:57:40

这个应该是你的错,注意阅读数据手册。你可以发个0b10101010数据在示波器上求证一下数据波特率

yklstudent 发表于 2013-1-11 12:09:37

不用看了 就是波特率设置的问题 误差太大 通信当然错误的

liweiyuangangan 发表于 2013-1-11 12:13:28

shjw 发表于 2013-1-11 08:57 static/image/common/back.gif
这个应该是你的错,注意阅读数据手册。你可以发个0b10101010数据在示波器上求证一下数据波特率 ...

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

liweiyuangangan 发表于 2013-1-11 12:16:05

yklstudent 发表于 2013-1-11 12:09 static/image/common/back.gif
不用看了 就是波特率设置的问题 误差太大 通信当然错误的

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

yklstudent 发表于 2013-1-11 13:13:21

UBRRL=(fosc/16/(baud+1))%256;//设置波特率寄存器
UBRRH=(fosc/16/(baud+1))/256;
???????
你这个计算结果值是多少?????

liweiyuangangan 发表于 2013-1-11 14:14:08

yklstudent 发表于 2013-1-11 13:13 static/image/common/back.gif
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种程序

5768340 发表于 2013-1-11 14:18:00

yklstudent 发表于 2013-1-11 14:46:44

proteus仿真 没什么问题 估计多半硬件有点问题吧 或者芯片坏了 自己不凡找找硬件的问题看看 软件是没什么问题的
波特率设置可以
UBRR = (fosc/16/(baud))-1;
这样就可以了

liweiyuangangan 发表于 2013-1-11 15:13:04

yklstudent 发表于 2013-1-11 14:46 static/image/common/back.gif
proteus仿真 没什么问题 估计多半硬件有点问题吧 或者芯片坏了 自己不凡找找硬件的问题看看 软件是没什么问 ...

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

yklstudent 发表于 2013-1-11 16:58:42

liweiyuangangan 发表于 2013-1-11 15:13 static/image/common/back.gif
非常感谢你,耽误左你一日的时间,多谢, 我再去查查电路,毕竟电路不是我做的 ...

自己去查查吧 小心说硬件有问题 人家跟你拼命

信元苍穹 发表于 2013-1-11 17:30:07

信元苍穹 发表于 2013-1-11 17:30:32

页: [1]
查看完整版本: atmega8 串口收发错误请教