打印
[AVR单片机]

ATMega128串口问题,感觉是晶振不对!帮忙看看呗?

[复制链接]
3702|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Mars.CN|  楼主 | 2013-6-11 16:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
用的是最小系统版,ATMega128的芯片,今天做串口试验的时候发现接收发送数据都有问题
板子晶振是11.0592MHz的

程序奉上

usart.c

#include <avr/io.h>

#define    CPU_CLK_FREQ    11059200
#define    BAUD            9600

void Usart_Init()
{
   UCSR0B = 0X00;            //关闭串口0所有使用,包括中断
   UCSR0B = 0X00;            //不适用倍率发送
   UCSR0C = 0X06;            //奇偶模式无,八位数据位,一位停止位
   
   UBRR0H    =    (CPU_CLK_FREQ / BAUD / 16 - 1) / 256;        //设置波特率高位
   UBRR0L    =    (CPU_CLK_FREQ / BAUD / 16 - 1) % 256;        //设置波特率地位
   UCSR0B    |=    (1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0);        //是能串口接收中断及串口接收发送
}


void Usart_Putchar(unsigned char c)
{
   while(!(UCSR0A&(1<< UDRE0)));        //等待串口空闲并发送
   UDR0 = c;                            //发送字符
}

unsigned char Usart_Getchar()
{
   while(!(UCSR0A& (1<<RXC0)));        //等待串口接收完成
   return UDR0;   
}





test.c

#include <avr/io.h>
#include <avr/interrupt.h>
#include "usart.h"

int main(void)
{
   unsigned char g = 0xF0;
   DDRB = 0XF0;
   PORTB = 0XF0;
   Usart_Init();
   PORTB = 0X70;

   Usart_Putchar('a');
   PORTB = 0XB0;
   
   g = Usart_Getchar();
   PORTB = g;
}

感觉没有问题,但是接收发送都是错的,有的干脆就收不到数据

相关帖子

沙发
dqyubsh| | 2013-6-11 20:44 | 只看该作者
1,先看熔丝对不对,要设成外部晶振,速度最大的。缺省是内部8M晶振。
2,单片机发送接收都可以用示波器观察……
3,检查232转换芯片能否正常工作,现在市场上好多垃圾232,不小心就买到假的。

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
qin552011373 + 6 很给力!
板凳
ningling_21| | 2013-6-11 20:56 | 只看该作者
看资料,你的UBR寄存器是不是71或143呢?

未命名.jpg (36.36 KB )

未命名.jpg

使用特权

评论回复
地板
Mars.CN|  楼主 | 2013-6-11 22:40 | 只看该作者
dqyubsh 发表于 2013-6-11 20:44
1,先看熔丝对不对,要设成外部晶振,速度最大的。缺省是内部8M晶振。
2,单片机发送接收都可以用示波器观 ...

我觉得也是和熔丝位有关,但是avr单片机刚刚接触,不知道如何设置,请问新的单片机需要设置熔丝位吗?
为何我装上ucos后貌似晶振正常呢?(仅仅是貌似,也有一些细微差距)

使用特权

评论回复
5
Mars.CN|  楼主 | 2013-6-11 22:46 | 只看该作者
ningling_21 发表于 2013-6-11 20:56
看资料,你的UBR寄存器是不是71或143呢?

UBRR0H    =    (CPU_CLK_FREQ / BAUD / 16 - 1) / 256;        //设置波特率高位
UBRR0L    =    (CPU_CLK_FREQ / BAUD / 16 - 1) % 256;        //设置波特率地位
得到的结果应该是71

串口芯片是板子上自带的,按理说是没什么问题的
串口转usb数据线是ARM上用过的,应该也没问题

使用特权

评论回复
6
dqyubsh| | 2013-6-12 00:42 | 只看该作者
Mars.CN 发表于 2013-6-11 22:40
我觉得也是和熔丝位有关,但是avr单片机刚刚接触,不知道如何设置,请问新的单片机需要设置熔丝位吗?
为 ...

新的单片机一定要设置熔丝的。包括去掉103兼容,晶振,BOD等等。

使用特权

评论回复
7
qin552011373| | 2013-6-12 10:05 | 只看该作者
芯片如果有外部晶振  一定要先设置熔丝位

使用特权

评论回复
8
Mars.CN|  楼主 | 2013-6-12 10:20 | 只看该作者
问题已解决!果然是熔丝位问题
不乏我这样的菜鸟,把方法分享给大家
先读入熔丝位,然后按照下图设置,再写入即可。

使用特权

评论回复
9
liang5319| | 2013-6-12 15:49 | 只看该作者
新单片机时内部1M晶振,使用外部需先配置。

使用特权

评论回复
10
j542325878| | 2018-3-11 16:53 | 只看该作者
请教下,我win10的出现同串口助手乱码

使用特权

评论回复
11
Lbsonggz| | 2018-3-11 21:02 | 只看该作者
波特率公式有问题,main 函数中加while (1)死循环,允许接收中断怎么没有接收中断函数

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

43

帖子

0

粉丝