yyd0076 发表于 2012-10-28 18:30:53

想写个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 18:33:05

本帖最后由 yyd0076 于 2012-10-28 20:32 编辑

图不行啊= =

yklstudent 发表于 2012-10-28 18:41:06

本帖最后由 yklstudent 于 2012-10-29 13:06 编辑

...................

qwermhb 发表于 2012-10-28 20:04:21

uint16 Usart0_UBRR_Calculate(void)
{
        uint16 ubbr;
        if(_UCSRA&0X02)
        {
                ubbr=CLK/(8*BAUD)-1;
        }
        else
        {
                ubbr=CLK/(16*BAUD)-1;
        }
        return ubbr;
}

yyd0076 发表于 2012-10-28 20:31:13

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-28 21:38:22

本帖最后由 yklstudent 于 2012-10-29 13:07 编辑

.............................

qwermhb 发表于 2012-10-29 00:04:29

yyd0076 发表于 2012-10-28 20:31 static/image/common/back.gif
也不对啊,uint16最大就65536,CLK=8000000,超值了啊……我把整个程序贴上来,再帮看下
#include
#defin ...

那个CLK是宏定义啊!我的通信程序就是这样做的,在头文件定义时钟和波特率,这样修改方便,也不用管变量类型,

jimmy_xt 发表于 2012-10-29 08:02:50

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

yyd0076 发表于 2012-10-29 12:50:29

qwermhb 发表于 2012-10-29 00:04:29 static/image/common/back.gif

那个CLK是宏定义啊!我的通信程序就是这样做的,在头文件定义时钟和波特率,这样修改方便,也不用管变量类型,

我知道啊,总之都要替换过来的。就算这样也不行啊

yyd0076 发表于 2012-10-29 12:51:14

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

yyd0076 发表于 2012-10-29 12:51:37

jimmy_xt 发表于 2012-10-29 08:02:50 static/image/common/back.gif
本帖最后由 jimmy_xt 于 2012-10-29 08:05 编辑

看到#include复制代码你用的AVR studio 5以上的版本吧。

是的话,这么用就可以了。

先是宏定

我试试吧

yyd0076 发表于 2012-10-29 13:30:45

yklstudent 发表于 2012-10-28 18:41 static/image/common/back.gif
...................

= =…………
页: [1]
查看完整版本: 想写个USART通用驱动,但是算UBRR总是不行,帮忙看看