我无法解决简单的USART发送/接收程序。问题是我过去使用它并且毫不费力地工作但是现在它在我的Linux机器问号和窗口中返回一些盒子和汉字。我不明白改变了什么。我已经尝试了很多不同的东西,比如改变代码和部分,但似乎没有什么能解决它。
我正在使用AVR atmega 328p和pololu usb程序员。我从windows中的atmel工作室和linux中的avrdude中刷过它。
以下是代码:
#define F_CPU 1000000
#define BAUD 9600
#include <avr/io.h>
#include <util/delay.h>
#include <util/setbaud.h>
void init_USART(void);
void transmit_Byte(char data);
char receive_Byte(void);
int main(void)
{
char TEST;
init_USART(); /* Initialize USART */
while (1)
{
TEST = receive_Byte();
transmit_Byte(TEST);
}
}
void init_USART(void)
{
UBRR0H = UBRRH_VALUE;
UBRR0L = UBRRL_VALUE;
#if USE_2x
UCSR0A |= (1 << U2X0);
#else
UCSR0A &= ~(1 << U2X0);
#endif
UCSR0B = (1 << TXEN0) | (1 << RXEN0); /* Enable USART
transmitt/receive */
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); /* 8 data bits, 1 stop
bit */
}
void transmit_Byte(char data)
{
loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait for empty
transmit buffer */
UDR0 = data;
}
char receive_Byte(void)
{
loop_until_bit_is_set(UCSR0A, RXC0);
return(UDR0);
}
这是我的第一个问题,所以如果我做错了,我会提前道歉。
非常感谢你的时间!
编辑:我尝试过ftdi232和mcp2221
编辑2:After addin UL仍未按预期进行,但未知的字符较少。
解决:但我不明白为什么。我将保险丝CKDIV8更改为1并开始工作。数据表显示出厂时的时钟频率为8 MHz,CKDIV8 = 0,因此设置为1 MHz。那它为什么反转呢?我之前也试过clock_prescale_set(clock_div_8);
,因为数据表建议进行预定标,但它也没有用。
设置CLDIV8和avr / power.h函数有什么区别?