3

我正在研究与 Atmega16 连接的 GSM sim900D。最初我在面包板上使用 MAX232 制作了电路。然后我使用串行端口将它连接到我的电脑。我测试了 AT 命令,这些命令在超级终端上运行良好,我能够使用超级终端发送 SMS。然后我在 Proteus 上对其进行了测试,它也在那里完美地工作。

我使用 codevision avr 作为编译器。GSM 在 9600 波特上工作,但问题是在编译器中我必须保持波特率 4800(时钟 = 1MHz)和 proteus COMPIM(物理波特 = 9600 和虚拟波特 = 4800)只有当我在硬件上运行它时它才能工作(面包板) 它不起作用,因为我已将波特率设置为 4800。我不知道如何为硬件设置波特率。我在编译器中尝试了 9600baud 的硬件,但它根本不发送 SMS。请告诉我我应该怎么做?

4

2 回答 2

0

在 ATmega16(和其他 ATmegas)上,串行波特率通过UBRRHUBRRL寄存器加上UCSRA寄存器中的U2X位设置。ATmega16 数据表的第 146 页开始详细说明其工作原理。基本上,UBRR 是一个 16 位寄存器,因此必须通过 8 位部分UBRRH(高字节)和UBRRL(低字节)分别访问。您要放入这些寄存器的值(以及UCSRA寄存器中的U2X位)取决于

  • 时钟频率
  • 所需的波特率。

对于 1Mhz 时钟和 9600 波特,有两个选项(请参见数据表中第 168 页上的表 68):清除U2X位并将UBRR设置为 6 或将U2XUBRR设置为 12。后一个选项导致生成的波特率为更接近所需的波特率 (0.2%) 误差,因此,建议使用后一种选项。因此,您想要的代码是:

UBRRH = 0;
UBRRL = 12;
UCSRA |= 1<<(U2X);

这里潜伏着一个令人讨厌的问题:正如数据表所述,UBRRHUCSRC是同一个寄存器。UCSRC控制奇偶校验、停止位和其他重要设置。因此,如果您需要写入UCSRC,请确保同时设置URSEL位:

UCSRC = (1<<URSEL) | (...other bits...)

或者

UCSRC |= (1<<URSEL) | (...other bits...)

否则你会破坏你的UBRRH寄存器并且想知道为什么你的波特率不是你期望的。

但是您也可以使用 AVR Libc 代码,它提供了一种在 AVR 上设置波特率的只读方式,请参阅util/setbaud.html

于 2013-03-08T19:00:40.703 回答
0

你检查数据表错误率太高。当您在 1MHZ 上使用 9600 波特率时,这是主要问题。尽可能取 8,12,16 MHZ 并查看数据表。如果您没有正确地烧毁与无法正常工作的晶体相关的熔丝位,请不要忘记烧毁与 XTAL 频率相关的熔丝位。

如果你需要更多帮助问..

于 2016-09-11T05:07:58.193 回答