最近我一直在拔头发,试图在STK200上安装ATmega162以通过RS232与我的计算机通信。我检查并确保STK200包含MAX202CPE芯片。

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

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

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

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

谢谢! 通用标签

有帮助吗?

解决方案 4

更彻底地阅读了数据手册之后,我错误地设置了波特率。ATmega162数据表上有一个时钟频率图表,显示了波特率和相应的误差。

对于4800波特率和1 MHz时钟频率,误差为0.2%,这对我来说是可以接受的。诀窍是将12传递给USART_Init()函数,而不是4800。

希望这可以帮助其他人!

其他提示

我已评论了格雷格的答案,但想补充一件事。对于此类问题,调试的黄金标准方法是首先了解异步串行通信,然后购买示波器并查看在线情况。如果要交换字符,而这仅仅是个波特率问题,这将特别有用,因为您可以计算出所看到的波特率,然后相应地调整除数。

这是一本超级快速的入门书,毫无疑问,您可以在Wikipedia或其他地方找到更全面的内容。

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

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

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

S是开始位。

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

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

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

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

我没有参考资料,但是波特率寄存器UBRR通常包含一个除数值,而不是所需的波特率本身。快速进行Google搜索表示4800波特率的正确除数可能是239。因此尝试: 通用标签

如果这不起作用,请与您的特定芯片的参考文档联系,以获取正确的除数计算公式。

要调试UART通信,需要做两件事:

1)在连接器上进行环回,并确保您可以读回所写内容。如果您发送一个字符并将其正确取回,则说明硬件连接正确,并且至少基本的UART寄存器配置集是正确的。

2)重复发送字符0x55(“ U”)-二进制位模式01010101将使您快速查看示波器上的位宽,从而可以验证速度设置是否正确。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top