使用ATmega16实现GSM接口

3
我正在处理GSM sim900D和Atmega16的接口问题。最初我使用MAX232在面包板上制作了电路,然后通过串口将其连接到我的PC上。我测试了AT命令,在超级终端上命令完美地工作,我可以使用超级终端发送短信。然后我在Proteus上测试它,那里也完美地工作。
我使用codevision avr作为编译器。GSM的波特率为9600,但问题是在编译器中我必须保持波特率为4800(时钟=1MHz),在Proteus COMPIM(物理波特率=9600和虚拟波特率=4800)上设置,只有这样才能在我运行它在硬件(面包板)上时正常工作。但是当我将波特率设置为4800时,它在硬件上不起作用。我不知道如何为硬件设置波特率。我尝试在编译器中将波特率设置为9600,但它根本不发送短信。请告诉我该怎么做?
2个回答

0

你查看数据表发现误差率太高。当你在1MHZ上使用9600波特率时,这是主要问题。尽可能选择8、12、16 MHZ并检查数据表。不要忘记烧录与XTAL频率相关的保险丝位,如果你没有正确地烧录这些位,那么与晶体有关的部分将无法正常工作。

如果需要更多帮助,请提出问题。


0
在ATmega16(和其他ATmegas)上,串行波特率是通过UBRRHUBRRL寄存器以及UCSRA寄存器中的U2X位设置的。有关此操作方式的详细说明从ATmega16数据手册的第146页开始。基本上,UBRR是一个16位寄存器,因此必须通过8位部分UBRRH(高字节)和UBRRL(低字节)分别访问。您要放入这些寄存器(以及UCSRA寄存器中的U2X位)的值取决于:
  • 时钟速率
  • 所需的波特率。

对于1Mhz时钟和9600波特率,有两个选项(请参见数据表第168页的第68项):清除 U2X 位并将 UBRR 设置为6或设置 U2X 并将 UBRR 设置为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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接