ここでは、ATmega8マイクロコントローラーとArduinoUnoの間の通信を確立します。ここで確立される通信はUART(Universal Asynchronous Receiver Transmitter)タイプです。シリアル通信です。これにより、さまざまな組み込みシステムアプリケーションで必要とされる2つのコントローラ間でデータを共有できます。
組み込みシステムでは、システム通信に関する基本的な知識が必要なので、このプロジェクトを行っています。このプロジェクトでは、基本的な通信システムについて説明し、送信機から受信機にシリアルでデータを送信します。
このプロジェクトでは、ATMEGA8が送信機として機能し、ARDUINOUNOが受信機として機能します。シリアル通信では、データのバイトが完全に転送されるまで、データをビットごとに送信します。データは10ビットサイズにすることができますが、今のところ8ビットのままにします。
必要なコンポーネント
ハードウェア: ATMEGA8、ARDUINO UNO、電源(5v)、AVR-ISPプログラマー、100uFコンデンサー(電源の両端に接続)、1KΩ抵抗(2個)、LED、ボタン。
ソフトウェア: Atmel studio 6.1、progispまたはflash magic、ARDUINONIGHTLY。
回路図と説明
送信機と受信機の回路図とプログラミングについて説明する前に、シリアル通信について理解する必要があります。ここでのATMEGAは、前述のようにデータをシリアルでUNOに送信します。
MASTER SLAVE通信、JTAG通信など、他の通信モードもありますが、通信を容易にするためにRS232を選択しています。ここでは、ATMEGA8のTXD(送信機)PINをARDUINO UNOのRXD(受信機)PINに接続します。
確立されたデータ通信は、次のようにプログラムされています。
- 8データビット
- 2つのストップビット
- パリティチェックビットなし
- 9600 BPS(ビット/秒)のボーレート
- 非同期通信(ATMEGA8とUNO間でクロック共有なし(両方ともクロック単位が異なります))
Arduino UnoとATMEGA8の間にUARTを確立するには、設定を正確にプログラムする必要があります。このために、上記のパラメータを両端で同じに保つ必要があります。これでは、1つは送信機として機能し、他は受信機として機能します。以下、それぞれのサイド設定について説明します。
ここで、RS232インターフェースの場合、送信機側(ATMEGA8)で次の機能を満たす必要があります。
1.最初のコントローラーのTXDピン(データ受信機能)でTRANSMITTERを有効にする必要があります。
2.通信はシリアルであるため、データバイが受信されるたびに知る必要があります。これにより、完全なバイトが受信されるまでプログラムを停止できます。これは、データ受信の完全な割り込みを有効にすることによって行われます。
3. DATAは、8ビットモードでコントローラーと送受信されます。したがって、一度に2文字がコントローラーに送信されます。
4.モジュールから送信されるデータにはパリティビットがなく、ストップビットが1つあります。
上記の機能はコントローラレジスタに設定されています。それらについて簡単に説明します。
DARK GRAY(UDRE):このビットは起動時に設定されませんが、送信機が送信する準備ができているかどうかを確認するために作業中に使用されます。詳細については、TRASMITTERSIDEのプログラムを参照してください。
VOILET(TXEN):このビットは、TRASMITTERSIDEのトランスミッタピンを有効にするために設定されます。
黄色(UCSZ0、UCSZ1、およびUCSZ2):これらの3ビットは、一度に受信または送信するデータビットの数を選択するために使用されます。
2つのSIDES間の通信は、8ビット通信として確立されます。通信をテーブルと照合することにより、UCSZ0、UCSZ1を1に、UCSZ2を0に設定します。
オレンジ(UMSEL):このビットは、システムが非同期(両方とも異なるクロックを使用)または同期(両方とも同じクロックを使用)で通信しているかどうかに基づいて設定されます。
両方のSYTEMSはクロックを共有しません。どちらも独自の内部時計を使用しているためです。したがって、両方のコントローラーでUMSELを0に設定する必要があります。
緑(UPM1、UPM0):これらの2つのビットは、通信で使用しているビットパリティに基づいて調整されます。
ここでのデータATMEGAは、パリティなしでデータを送信するようにプログラムされています。データ伝送長が短いため、データの損失やエラーがないことは明らかです。したがって、ここではパリティを設定していません。したがって、UPM1、UPM0の両方をゼロに設定するか、すべてのビットがデフォルトで0であるため、そのままにしておきます。
青(USBS):このビットは、通信中に使用するストップビットの数を選択するために使用されます。
彼女が確立した通信は非同期タイプであるため、より正確なデータ送受信を行うには、2つのストップビットを使用する必要があります。したがって、送信機側でUSBSを「1」に設定します。
ボーレートは、適切なUBRRHを選択することにより、コントローラーで設定されます。
UBRRH値は、ボーレートとCPU水晶周波数を相互参照することによって選択されます。
したがって、相互参照により、UBRR値は「6」と見なされ、ボーレートが設定されます。
これにより、送信機側の設定が確立されました。RECEIVINGSIDEについて説明します。
UNOで有効にするシリアル通信は、1つのコマンドを使用して実行できます。
|
私たちが確立すると推定した通信は、9600ビット/秒のボーレートで行われます。したがって、UNOがそのようなボーレートを確立し、シリアル通信を開始するには、コマンド「Serial.begin(9600);」を使用します。ここで9600はボーレートであり、変更可能です。
これで、データを受信する場合はすべて残りました。データがUNOによって受信されると、取得できるようになります。このデータは、コマンド「receiveddata = Serial.read();」によって取得されます。このコマンドにより、シリアルデータはintegerという名前の「receiveddata」に取り込まれます。
回路に示されているように、送信機側に接続されたボタンが押されると、8ビットのデータが送信機(ATMEGA8)によって送信され、このデータは受信機(ARDUINO UNO)によって受信されます。このデータを正常に受信すると、接続されているLEDのオンとオフを切り替えて、2つのコントローラー間のデータ転送が成功したことを示します。
これにより、ATMEGA8コントローラーとARDUINOUNO間のUART通信が正常に確立されます。