我正在与Atmega16的GSM sim900D接口的工作。最初,我使用MAX232制作了电路。然后我用串口把它连接到我的电脑上。我测试了AT命令,这些命令在超级终端上工作得很好,而且我可以用超级终端发送短信。然后我在Proteus上测试了它,它在那里也工作得很好。
我使用codevision avr作为编译器。GSM在9600波特率下工作,但问题是,在编译器中,我必须保持波特率rate4800(时钟=1 1MHz)和proteus COMPIM(物理baud=9600和虚拟baud=4800),然后它才能工作,当我在硬件上运行它(面包板),它不能工作,因为我已经设置波特率为4800。我不知道如何设置硬件的波特率。我在编译器中尝试了9600波特率的硬件,但它根本不发送短信。请告诉我我该怎么做?
发布于 2013-03-09 03:00:41
在ATmega16 (和其它ATmegas)上,串行波特率通过UBRRH和UBRRL寄存器加上U2X寄存器中的UCSRA位来设置。有关其工作原理的详细说明,请参阅ATmega16 datasheet的第146页。基本上,UBRR是一个16位寄存器,因此必须通过8位部分UBRRH (高位字节)和UBRRL (低位字节)分别访问。要放入这些寄存器(以及UCSRA寄存器中的U2X位)的值取决于
对于1 1Mhz时钟和9600波特率,有两个选项(参见数据手册第168页的表68 ):cleared U2X bit和UBRR设置为6或将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代码,它提供了一种可读取的方式来设置AVR的波特率,请参阅util/setbaud.html
发布于 2016-09-11 13:07:58
你看数据表的错误率太高了。当你在1 1MHZ上使用9600波特率时,这是主要的问题。尽可能采用8,12,16 MHZ,并查看数据表。如果你没有正确地烧掉与晶体相关的熔断器,不要忘记烧掉与XTAL频率相关的熔断器。
如果你需要更多的帮助,可以问..
https://stackoverflow.com/questions/12356599
复制相似问题