首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Gsm与atmega16的接口

Gsm与atmega16的接口
EN

Stack Overflow用户
提问于 2012-09-11 01:24:42
回答 2查看 2.5K关注 0票数 3

我正在与Atmega16的GSM sim900D接口的工作。最初,我使用MAX232制作了电路。然后我用串口把它连接到我的电脑上。我测试了AT命令,这些命令在超级终端上工作得很好,而且我可以用超级终端发送短信。然后我在Proteus上测试了它,它在那里也工作得很好。

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

EN

回答 2

Stack Overflow用户

发布于 2013-03-09 03:00:41

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

  • 所需的波特率。

对于1 1Mhz时钟和9600波特率,有两个选项(参见数据手册第168页的表68 ):cleared U2X bit和UBRR设置为6或将U2XUBRR设置为12。后一个选项会产生更接近所需波特率(0.2%)误差的波特率,因此建议使用后一个选项。因此,您想要的代码是:

代码语言:javascript
运行
复制
UBRRH = 0;
UBRRL = 12;
UCSRA |= 1<<(U2X);

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

代码语言:javascript
运行
复制
UCSRC = (1<<URSEL) | (...other bits...)

代码语言:javascript
运行
复制
UCSRC |= (1<<URSEL) | (...other bits...)

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

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

票数 0
EN

Stack Overflow用户

发布于 2016-09-11 13:07:58

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

如果你需要更多的帮助,可以问..

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12356599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档