gpt4 book ai didi

GSM 接口(interface)与 atmega16

转载 作者:行者123 更新时间:2023-12-04 18:21:16 25 4
gpt4 key购买 nike

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

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

最佳答案

在 ATmega16(和其他 ATmegas)上,串行波特率通过 UBRRHUBRRL 寄存器加上 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);

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

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

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

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

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

关于GSM 接口(interface)与 atmega16,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12356599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com