Gsm与atmega16连接

时间:2012-09-10 17:24:42

标签: gsm avr at-command

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

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

2 个答案:

答案 0 :(得分:0)

在ATmega16(和其他ATmegas)上,串行波特率通过 UBRRH UBRRL 寄存器以及 U2X 位设置strong> UCSRA 注册。有关其工作原理的详细说明,请参见ATmega16 datasheet的第146页。基本上,UBRR是一个16位寄存器,因此必须通过8位部分 UBRRH (高字节)和 UBRRL (低字节)单独访问。您要放入这些寄存器的值(以及 UCSRA 寄存器中的 U2X 位)取决于

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

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

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

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

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

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

否则你会破坏 UBRRH 注册,并想知道为什么你的波特率不符合你的预期。

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

答案 1 :(得分:0)

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

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