我有一个ATMega16,并且循环了Rx Tx (刚刚将Rx连接到Tx),在一个循环中发送和接收一个字符。但我似乎只收到0x00,而不是我发送的char。我将CPU配置为1 1MHz。但我的想法是,既然Rx和Tx只是循环,我设置的速度应该没有关系,因为两者是相同的?
所以基本上,我正在尝试让LED在收到正确的字符时在PORTC闪烁。
代码如下:
#ifndef F_CPU
#define F_CPU 10000000
#endif
#define BAUD 9600
#define BAUDRATE ((F_CPU)/(BAUD*16)-1)
#include <avr/io.h>
#include <util/delay.h>
void uart_init(void){
UBRRH = (BAUDRATE>>8);
UBRRL = BAUDRATE;
UCSRB = (1<<TXEN) | (1<<RXEN);
UCSRC = (1<<URSEL) | (1<<UCSZ0) | (1<<UCSZ1);
}
void uart_transmit (unsigned char data){
while (!(UCSRA & (1<<UDRE)));
UDR = data;
}
unsigned char uart_recive(void){
while(!(UCSRA) & (1<<RXC));
return UDR;
}
int main(void)
{
uart_init();
unsigned char c;
PORTC = 0xff;
DDRC = 0xff;
while(1)
{
_delay_ms(200);
uart_transmit(0x2B);
c = uart_recive();
if(c==0x2B){
PORTC = PORTC ^ 0xff;
}
}
}有没有想到我做错了什么?
发布于 2014-03-08 17:31:58
代码看起来是正确的。
你可能需要检查的东西:
'p'的字符;现在您正在向'+'匹配
我认为最后一个是问题所在。
您可以从ATMega手册中尝试以下代码:
/* Set frame format: 8data, 2stop bit */
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);在构建你的程序之后,进入你的端口配置,并确保它设置为8位数据格式和2个停止位。然后在你的微控制器上测试它,看看会发生什么。请带着结果回来。
发布于 2014-03-09 21:08:16
考虑实际波特率精度。例如参见http://www.wormfood.net/avrbaudcalc.php?postbitrate=9600&postclock=1,AVR对9600波特@1 1MHz时钟提供7.5%的误差,这是相当高的误差。取决于您发送和接收的内容。“通常”你会看到一个垃圾,如果你永久收到0x00s,这看起来是另一个问题。
发布于 2014-03-14 21:51:09
您的F_CPU设置为10 set 。你会说它被配置为1 1Mhz。
如果你真的激活了水晶,也要检查你的保险丝。如果你只是使用内部振荡器:它有一个相对较大的错误,所以你的UART计时可能会被破坏(我使用内部振荡器进行调试从来没有遇到过问题)。
另一个错误来源可能是您的F_CPU定义。大多数情况下,这个预处理器常量已经在Makefile (或集成开发环境项目设置)中定义了(可能也是错误的),因此代码中的#define不会受到#ifndef的影响
https://stackoverflow.com/questions/22267430
复制相似问题