3

Atmega16 とインターフェイスする GSM sim900D に取り組んでいます。最初はブレッドボードでMAX232を使って回路を作りました。次に、シリアルポートを使用して PC に接続しました。AT コマンドをテストしたところ、コマンドはハイパー ターミナルで完全に機能し、ハイパーターミナルを使用して SMS を送信できました。次に、Proteus でテストしたところ、そこでも完全に機能していました。

コンパイラとして codevision avr を使用しています。GSM は 9600 ボーで動作しますが、問題は、コンパイラでボー レート 4800 (クロック = 1 MHz) を維持する必要があり、proteus COMPIM (物理ボー = 9600 & 仮想ボー = 4800) でのみ、ハードウェア (ブレッドボード) で実行したときにのみ機能することです。 ) ボーを 4800 に設定したため、機能しません。ハードウェアのボーを設定する方法がわかりません。コンパイラでハードウェアの 9600 ボーを試しましたが、SMS がまったく送信されません。何をすべきか教えてください。

4

2 に答える 2

0

ATmega16 (およびその他の ATmega) では、シリアル ボー レートはUBRRHおよびUBRRLレジスタと UCSRA レジスタのU2Xビットによって設定されます。これがどのように機能するかの詳細な説明は、ATmega16 データシートの 146 ページから始まります。基本的に、UBRR は 16 ビット レジスタであるため、8 ビット部分のUBRRH (上位バイト) とUBRRL (下位バイト) を介して個別にアクセスする必要があります。これらのレジスタ (およびUCSRAレジスタのU2Xビット)に入れる値は、

  • クロックレート
  • 必要なボーレート。

1Mhz クロックと 9600 ボーの場合、2 つのオプションがあります (データシートの 168 ページの表 68 を参照): U2XビットをクリアしてUBRRを 6 に設定するか、 U2XUBRRを 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 でボーレートを設定するための読み取り可能な方法を提供する AVR Libc コードを利用することもできます。util/setbaud.htmlを参照してください。

于 2013-03-08T19:00:40.703 に答える
0

データシートを確認すると、エラー率が高すぎます。1MHZ で 9600 ボーレートを使用している場合、これが主な問題です。8,12,16 MHZ を可能な限り取り、データシートを確認してください。また、適切に動作しないクリスタルに関連するこれらのビットを適切に焼き付けない場合は、XTAL 周波数に関連するヒューズ ビットを焼き付けることを忘れないでください。

さらにヘルプが必要な場合は..

于 2016-09-11T05:07:58.193 に答える