UART发生意外的Atmega16响应
问题摘要
我已经用代码刷新了Atmega16,这应该导致Atmega16通过终端发送回我发送给它的任何字符。我得到了答复,但是我发送的角色很少。通过更改波特率,我可以看到正确的输出,但是我不明白为什么正确的波特率有效。
更多详情
我正在尝试自己学习更多有关固件编程的信息,因为我很喜欢。到目前为止,在uni上进行的固件编程中,我们已经获得了框架代码文件,这些文件可以完成许多外围设备接口并为我们设置了文件,但是我想自己学习一下。在整个帖子中,我对我在这里所做的事情有一些疑问,但我将在最后逐条列出。如果您对我的知识有任何误解或潜在的空白,我将不胜感激您可能会提供的任何意见。
编码
我纷纷亮出到我Atmega16的代码“在AVR-GCC使用USART”取几乎行线从教程发现此页面上。我只添加了F_CPU的#define。原始代码没有针对F_CPU的#define,因此我的代码无法在AtmelStudio 7中进行编译。有人可以解释为什么作者未在原始文件中定义F_CPU吗?我猜他们可能正在使用Atmel Studio 7以外的其他工具或编译器,但我不能肯定地说。
#include <avr/io.h>
#define F_CPU 7372800 //this was chosen because the tutorial states this is the frequency we want to operate at
#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((( F_CPU / 16) + ( USART_BAUDRATE / 2)) / ( USART_BAUDRATE )) - 1)
int main ( void )
{
char ReceivedByte ;
UCSRB = (1 << RXEN ) | (1 << TXEN ); // Turn on the transmission and reception circuitry
UCSRC = (1 << URSEL ) | (1 << UCSZ0 ) | (1 << UCSZ1 ); // Use 8- bit character sizes
UBRRH = ( BAUD_PRESCALE >> 8); // Load upper 8- bits of the baud rate value into the high byte of the UBRR register
UBRRL = BAUD_PRESCALE ; // Load lower 8- bits of the baud rate value into the low byte of theUBRR register
for (;;) // Loop forever
{
while (( UCSRA & (1 << RXC )) == 0) {}; // Do nothing until data have been received and is ready to be read from UDR
ReceivedByte = UDR ; // Fetch the received byte value into the variable " ByteReceived "
while (( UCSRA & (1 << UDRE )) == 0) {}; // Do nothing until UDR is ready for more data to be written to it
UDR = ReceivedByte ; // Echo back the received byte back to the computer
}
}
硬件设置
- MCU:Atmega16;
- 工具链:Atmel Studio 7,与AVR Dragon一起闪烁;
- 电源:从大学提供的开发板获得的5V电压轨(从计算机USB获得)。100nF陶瓷圆盘电容器,用于面包板电源线上的旁路
- USB转串口转换器:这个。USB到串行转换器上的TXD连接到RXD Atmega(引脚15)。转换器上的RXD连接到Atmega(引脚14)上的RXD。
终端软件:PuTTY(波特率为9600)。
错误回答的证据
重申一下,Atmega 应该返回发送给它的内容,即OUTPUT应该与INPUT完全相同。
腻子输出
示波器捕获
我已将Picoscope与串行解码一起使用,以检查Atmega是否接收到正确的输入(看来是正确的)。例如,当我按“ f”键时,它就可以正确接收。输出仍然是“ 6”(有时是“&”号)。
我偶然发现的修复程序,我不明白
如果我将波特率更改为2500in PuTTY,则所有显示均正确。我随机选择了此值,但我不知道它为什么起作用(这使我相信我在与波特率有关的地方犯了一个错误,但是我看不到我在哪里完全复制了本教程……我思想)。
问题
- 我做错了什么/这是怎么回事?
- 为什么原始教程没有#define F_CPU?
- 为什么将波特率设置为2500可以解决此问题?(我怀疑如果回答了问题1,就会回答这个问题)