搜索
bottom↓
回复: 11

想写个USART通用驱动,但是算UBRR总是不行,帮忙看看

[复制链接]

出0入0汤圆

发表于 2012-10-28 18:30:53 | 显示全部楼层 |阅读模式
就像这样其中计算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;
新手不喜勿喷……

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2012-10-28 18:33:05 | 显示全部楼层
本帖最后由 yyd0076 于 2012-10-28 20:32 编辑

图不行啊= =

出0入0汤圆

发表于 2012-10-28 18:41:06 | 显示全部楼层
本帖最后由 yklstudent 于 2012-10-29 13:06 编辑

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

出0入0汤圆

发表于 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;
}

出0入0汤圆

 楼主| 发表于 2012-10-28 20:31:13 | 显示全部楼层
qwermhb 发表于 2012-10-28 20:04
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();
        }
}

出0入0汤圆

发表于 2012-10-28 21:38:22 | 显示全部楼层
本帖最后由 yklstudent 于 2012-10-29 13:07 编辑

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

出0入0汤圆

发表于 2012-10-29 00:04:29 | 显示全部楼层
yyd0076 发表于 2012-10-28 20:31
也不对啊,uint16最大就65536,CLK=8000000,超值了啊……我把整个程序贴上来,再帮看下
#include
#defin ...

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

出0入42汤圆

发表于 2012-10-29 08:02:50 | 显示全部楼层
本帖最后由 jimmy_xt 于 2012-10-29 08:05 编辑

看到
  1. #include<avr/io.h>
复制代码
你用的AVR studio 5以上的版本吧。

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

先是宏定义,CPU时钟速度和波特率。
  1. #ifndef F_CPU

  2. #define F_CPU 25000000UL
  3. #endif

  4. #define BAUD 57600UL
复制代码
然后包含这个文件
  1. #include "util/setbaud.h"
复制代码
初始化函数如下(停止位2,even校验,8bit数据)
  1. void USART_init(void)
  2. {
  3.         UBRRH = UBRRH_VALUE;
  4.         UBRRL = UBRRL_VALUE;
  5.         UCSRB = (1<<RXEN)|(1<<TXEN);
  6.         UCSRC = (1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0)|(1<<UPM1)|(1<<UPM0);
  7.         #if USE_2X
  8.         UCSRA |= (1 << U2X0);
  9.         #else
  10.         UCSRA &= ~(1 << U2X0);
  11.         #endif
  12. }
复制代码

出0入0汤圆

 楼主| 发表于 2012-10-29 12:50:29 来自手机 | 显示全部楼层
qwermhb 发表于 2012-10-29 00:04:29

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

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

出0入0汤圆

 楼主| 发表于 2012-10-29 12:51:14 来自手机 | 显示全部楼层
jimmy_xt 发表于 2012-10-29 08:02:50
本帖最后由 jimmy_xt 于 2012-10-29 08:05 编辑

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

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

先是宏定

唔……GCC

出0入0汤圆

 楼主| 发表于 2012-10-29 12:51:37 来自手机 | 显示全部楼层
jimmy_xt 发表于 2012-10-29 08:02:50
本帖最后由 jimmy_xt 于 2012-10-29 08:05 编辑

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

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

先是宏定

我试试吧

出0入0汤圆

 楼主| 发表于 2012-10-29 13:30:45 | 显示全部楼层
yklstudent 发表于 2012-10-28 18:41
...................

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

本版积分规则

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

GMT+8, 2024-6-10 06:55

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

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