想写个USART通用驱动,但是算UBRR总是不行,帮忙看看
就像这样其中计算UBRRH,UBRRL的地方。在PC上验证能通过(Microsoft Visual C++),但是一到AVR上就不行了,我认为是超值了,来帮忙看下。unsigned int baud=9600;//这个在实例化对象的时候赋的值,这里测试先代替下
long Nubrr;
Nubrr=8000000/(8*baud)-1;
UBRRH = (unsigned char)(Nubrr>>8);
UBRRL = (unsigned char)Nubrr;
新手不喜勿喷…… 本帖最后由 yyd0076 于 2012-10-28 20:32 编辑
图不行啊= = 本帖最后由 yklstudent 于 2012-10-29 13:06 编辑
................... uint16 Usart0_UBRR_Calculate(void)
{
uint16 ubbr;
if(_UCSRA&0X02)
{
ubbr=CLK/(8*BAUD)-1;
}
else
{
ubbr=CLK/(16*BAUD)-1;
}
return ubbr;
} qwermhb 发表于 2012-10-28 20:04 static/image/common/back.gif
uint16 Usart0_UBRR_Calculate(void)
{
uint16 ubbr;
也不对啊,uint16最大就65536,CLK=8000000,超值了啊……我把整个程序贴上来,再帮看下
#include<avr/io.h>
#define uint unsigned int
#define uchar unsigned char
typedef unsigned short uint16;
void Port_init(void)
{
PORTD=0xFF;
DDRD=0x02;
PORTA=0xFF;
DDRA=0xFF;
}
void UART_init(void)
{
uint baud=9600;
uint16 Nubrr;
UCSRB=0x00;
UCSRA=0x02;
UCSRC=0x06;
/*计算baud*/
Nubrr=8000000/(8*baud)-1; //测试的
UBRRH = (unsigned char)(Nubrr>>8);
UBRRL = (unsigned char)Nubrr;
//UBRRL=0x67; //当使用这个时全都正常,所以就是上面的事
//UBRRH=0x00;
UCSRB=0x18;
}
void init(void)
{
Port_init();
UART_init();
}
void UART_Send(uchar i)
{
while(!(UCSRA&(1<<UDRE)));
UDR=i;
}
uchar UART_Receive(void)
{
while(!(UCSRA&(1<<RXC)));
return UDR;
}
int main(void)
{
uchar temp=0;
init();
while(1)
{
PORTA=UART_Receive();
}
} 本帖最后由 yklstudent 于 2012-10-29 13:07 编辑
............................. yyd0076 发表于 2012-10-28 20:31 static/image/common/back.gif
也不对啊,uint16最大就65536,CLK=8000000,超值了啊……我把整个程序贴上来,再帮看下
#include
#defin ...
那个CLK是宏定义啊!我的通信程序就是这样做的,在头文件定义时钟和波特率,这样修改方便,也不用管变量类型, 本帖最后由 jimmy_xt 于 2012-10-29 08:05 编辑
看到#include<avr/io.h>你用的AVR studio 5以上的版本吧。
是的话,这么用就可以了。
先是宏定义,CPU时钟速度和波特率。#ifndef F_CPU
#define F_CPU 25000000UL
#endif
#define BAUD 57600UL
然后包含这个文件#include "util/setbaud.h"初始化函数如下(停止位2,even校验,8bit数据)void USART_init(void)
{
UBRRH = UBRRH_VALUE;
UBRRL = UBRRL_VALUE;
UCSRB = (1<<RXEN)|(1<<TXEN);
UCSRC = (1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0)|(1<<UPM1)|(1<<UPM0);
#if USE_2X
UCSRA |= (1 << U2X0);
#else
UCSRA &= ~(1 << U2X0);
#endif
} qwermhb 发表于 2012-10-29 00:04:29 static/image/common/back.gif
那个CLK是宏定义啊!我的通信程序就是这样做的,在头文件定义时钟和波特率,这样修改方便,也不用管变量类型,
我知道啊,总之都要替换过来的。就算这样也不行啊 jimmy_xt 发表于 2012-10-29 08:02:50 static/image/common/back.gif
本帖最后由 jimmy_xt 于 2012-10-29 08:05 编辑
看到#include复制代码你用的AVR studio 5以上的版本吧。
是的话,这么用就可以了。
先是宏定
唔……GCC jimmy_xt 发表于 2012-10-29 08:02:50 static/image/common/back.gif
本帖最后由 jimmy_xt 于 2012-10-29 08:05 编辑
看到#include复制代码你用的AVR studio 5以上的版本吧。
是的话,这么用就可以了。
先是宏定
我试试吧 yklstudent 发表于 2012-10-28 18:41 static/image/common/back.gif
...................
= =…………
页:
[1]