gpt4 book ai didi

embedded - 如何修复此代码以允许我的 AVR 通过串行端口进行通信?

转载 作者:行者123 更新时间:2023-12-03 18:24:56 27 4
gpt4 key购买 nike

我最近一直在努力在我的 STK200 上安装一个 ATmega162,以便通过 RS232 与我的电脑通话。我检查并确保 STK200 包含 MAX202CPE 芯片。

我已将芯片配置为使用其内部 8MHz 时钟并将其除以 8。

我试图从数据表中复制代码(并在编译器提示的地方进行了更改),但无济于事。

我的代码在下面,有人可以帮我解决我遇到的问题吗?

我已经确认我的串口可以在其他设备上工作并且没有故障。

谢谢!

#include <avr/io.h>
#include <avr/iom162.h>

#define BAUDRATE 4800

void USART_Init(unsigned int baud)
{
UBRR0H = (unsigned char)(baud >> 8);
UBRR0L = (unsigned char)baud;

UCSR0B = (1 << RXEN0) | (1 << TXEN0);

UCSR0C = (1 << URSEL0) | (1 << USBS0) | (3 << UCSZ00);
}

void USART_Transmit(unsigned char data)
{
while(!(UCSR0A & (1 << UDRE0)));

UDR0 = data;
}

unsigned char USART_Receive()
{
while(!(UCSR0A & (1 << RXC0)));

return UDR0;
}

int main()
{

USART_Init(BAUDRATE);

unsigned char data;

// all are 1, all as output
DDRB = 0xFF;

while(1)
{
data = USART_Receive();

PORTB = data;

USART_Transmit(data);


}
}

最佳答案

我对 Greg 的回答发表了评论,但还想补充一点。对于这类问题,调试它的黄金标准方法是首先了解异步串行通信,然后拿到示波器并查看线路上发生了什么。如果正在交换字符并且这只是一个波特率问题,这将特别有用,因为您可以计算您看到的波特率,然后相应地调整除数。

这是一个 super 快速入门,毫无疑问,您可以在维基百科或其他地方找到更全面的内容。

让我们假设 8 位,无奇偶校验,1 个停止位(最常见的设置)。然后,如果要传输的字符是 0x3f (= ascii '?'),则该行看起来像这样;

...--+   +---+---+---+---+---+---+       +---+--...
| S | 1 1 1 1 1 1 | 0 0 | E
+---+ +---+---+

高(1)电平在芯片处为+5V,转换为RS232电平后为-12V。

低(0)电平在芯片处为0V,转换为RS232电平后为+12V。

S 是起始位。

然后我们有 8 个数据位,最低有效位在前,所以这里 00111111 = 0x3f = '?'。

E 是停止(e 表示结束)位。

时间从左到右前进,就像示波器显示一样,如果波特率为4800,那么每一位跨度(1/4800)秒=0.21毫秒(约)。

接收器通过对线路进行采样并寻找下降沿来工作(静态线路始终只是逻辑“1”)。接收器知道波特率和起始位数(1),因此它从下降沿开始测量半位时间,找到起始位的中间,然后连续采样8位线以收集数据位。然后接收器再等待一个位时间(直到停止位的一半)并开始寻找另一个起始位(即下降沿)。同时,读取的字符可供系统的其余部分使用。发送器保证在停止位完成之前下一个下降沿不会开始。发送器可以被编程为总是等待更长时间(使用额外的停止位),但这是一个遗留问题,只有在非常慢的硬件和/或软件设置下才需要额外的停止位。

关于embedded - 如何修复此代码以允许我的 AVR 通过串行端口进行通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/846206/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com