このチュートリアルでは、PICマイクロコントローラーとのUART通信を有効にする方法と、コンピューターとの間でデータを転送する方法について学習します。これまで、ADC、タイマー、PWMなどのすべての基本モジュールをカバーし、LCDと7セグメントディスプレイのインターフェース方法も学びました。ここで、ほとんどのマイクロコントローラープロジェクトで広く使用されているUARTと呼ばれる新しい通信ツールを身に付けます。MPLABとXC8を使用した完全なPICマイクロコントローラチュートリアルをここで確認してください。
ここではPIC16F877AMCUを使用しました。これには、略してUSARTと呼ばれる「アドレス可能ユニバーサル同期非同期受信機および送信機」と呼ばれるモジュールがあります。USARTは、データがシリアルに流れる2線式通信システムです。USARTは全二重通信でもあります。つまり、CRT端末やパーソナルコンピュータなどの周辺機器との通信に使用できるデータを同時に送受信できます。
USARTは次のモードで設定できます。
- 非同期(全二重)
- 同期–マスター(半二重)
- 同期–スレーブ(半二重)
また、8ビットモードと9ビットモードの2つの異なるモードがあります。このチュートリアルでは、USARTモジュールが最も使用されるタイプの通信であるため、8ビット通信システムで非同期モードで動作するように構成します。非同期であるため、データ信号と一緒にクロック信号を送信する必要はありません。 UARTは、データの送信(Tx)と受信(Rx)に2本のデータラインを使用します。両方のデバイスのアースも共通にする必要があります。このタイプの通信は共通のクロックを共有しないため、システムが機能するためには共通のグラウンドが非常に重要です。
このチュートリアルの最後に、コンピューターとPICマイクロコントローラー間の通信(UART)を確立し、ラップトップからPICボードのLEDを切り替えることができます。LEDのステータスは、PICMCUからラップトップに送信されます。コンピューターのハイパーターミナルを使用して出力をテストします。詳細なビデオもこのチュートリアルの最後にあります。
要件:
ハードウェア:
- PIC16F877Aパフォーマンスボード
- RS232からUSBへのコンバータモジュール
- コンピューター
- PICkit3プログラマー
ソフトウェア:
- MPLABX
- ハイパーターミナル
USBコンバータRS232は、コンピュータで読み取り可能な形式にシリアルデータを変換する必要があります。独自のモジュールを購入する代わりに独自の回路を設計する方法はありますが、ノイズにさらされるため信頼性がありません。私たちが使用しているものを以下に示します
注: 各RS232からUSBへのコンバーターには、特別なドライバーをインストールする必要があります。それらのほとんどは、デバイスを接続するとすぐに自動的にインストールされます。しかし、それがリラックスしない場合!!! コメントセクションを使用してください。私がお手伝いします。
UART通信用のPICマイクロコントローラーのプログラミング:
すべてのモジュール(ADC、タイマー、PWM)と同様に、PIC16F877A MCUのUSARTモジュールも初期化し、UART8ビット通信モードで動作するように指示する必要があります。構成ビットを定義して、UART初期化関数から始めましょう。
PICマイクロコントローラーのUARTモジュールの初期化:
TxピンとRxピンは、ピンRC6とRC7に物理的に存在します。データシートによると、TXを出力として、RXを入力として宣言しましょう。
// **** UARTのI / Oピンの設定**** // TRISC6 = 0; //出力として設定されたTXピンTRISC7 = 1; // RXピンを入力として設定// ________ I / Oピンを設定__________ //
次に、ボーレートを設定する必要があります。ボーレートは、通信チャネルで情報が転送されるレートです。これは多くのデフォルト値の1つですが、このプログラムでは、最も使用されるボーレートから9600を使用しています。
/ **必要なボーレートに対してSPBRGレジスタを初期化し、高速ボーレートに対してBRGHを設定します** / SPBRG =((_ XTAL_FREQ / 16)/ Baud_rate)-1; BRGH = 1; //高いbaud_rateの場合// _________ baud_rate設定の終了_________ //
ボーレートの値は、レジスタSPBRGを使用して設定する必要があります。値は、外部水晶周波数の値によって異なります。ボーレートの計算式を以下に示します。
SPBRG =((_ XTAL_FREQ / 16)/ Baud_rate)– 1;
高速ビットレートを有効にするには、ビットBRGHをハイにする必要があります。データシート(13ページ)によると、通信中のエラーを排除できるため、有効にすることは常に有利です。
前に述べたように、非同期モードで作業するため、シリアルピン(TRISC6およびTRICSC5)を有効にするには、ビット SYNCをゼロにし、ビットSPEMをハイにする必要があります。
// ****非同期シリアルポートを有効にする******* // SYNC = 0; //非同期SPEN = 1; //シリアルポートピンを有効にする// _____非同期シリアルポートを有効にする_______ //
このチュートリアルでは、MCUとコンピューターの間でデータを送受信するため、TXENビットとCRENビットの両方を有効にする必要があります。
// **送信と受信の準備をしましょう** // TXEN = 1; //送信を有効にするCREN = 1; //受信を有効にします// __ UARTモジュールを起動し、送信と受信の準備をします__ //
ビットTX9とRX9はゼロにしなければならないので、8ビットモードで動作します。高い信頼性を確立する必要がある場合は、9ビットモードを選択できます。
// ** 8ビットモードを選択** // TX9 = 0; //選択された8ビット受信RX9 = 0; // 8ビット受信モードが選択されました// __ 8ビットモードが選択されました__ //
これで初期化の設定が完了しました。そして、操作の準備ができています。
UARTを使用したデータの送信:
以下の関数を使用して、UARTモジュールを介してデータを送信できます。
// ** 1バイトの日付をUARTに送信する関数** // void UART_send_char(char bt){while(!TXIF); // TXバッファが解放されるまでプログラムを保持しますTXREG = bt; //受信した値をトランスミッタバッファにロードします} // _____________関数の終了________________ //
モジュールが初期化されると、レジスタTXREGにロードされた値はすべてUARTを介して送信されますが、送信がオーバーラップする可能性があります。したがって、送信割り込みフラグTXIFを常にチェックする必要があります。このビットがローの場合にのみ、送信のために次のビットに進むことができます。それ以外の場合は、このフラグがローになるのを待つ必要があります。
ただし、上記の関数は1バイトのデータのみを送信するためにのみ使用できます。完全な文字列を送信するには、以下の関数を使用する必要があります。
// **文字列をバイトに変換する関数** // void UART_send_string(char * st_pt){while(* st_pt)//文字がある場合UART_send_char(* st_pt ++); //バイトデータとして処理します} // ___________関数の終了______________ //
この関数はポインターを持っているので理解するのが少し難しいかもしれませんが、私を信じてくださいポインターは素晴らしく、プログラミングをより簡単にします。これは同じ良い例の1つです。
お気づきの ように、再び UART_send_char()を 呼び出しましたが、whileループ内にあります。文字列を個々の文字に分割しました。この関数が呼び出されるたびに、1つの文字がTXREGに送信され、送信されます。
UARTを使用したデータの受信:
次の関数を使用して、UARTモジュールからデータを受信できます。
// ** UARTから1バイトの日付を取得する関数** // char UART_get_char(){if(OERR)//エラーをチェック{CREN = 0; //エラーの場合-> CREN = 1をリセット; //エラーの場合->リセット} while(!RCIF); // RXバッファが解放されるまでプログラムを保持しますreturnRCREG; //値を受け取り、それをメイン関数に送信します} // _____________関数の終了________________ //
UARTモジュールがデータを受信すると、データを取得してRCREGレジスタに格納します。値を任意の変数に転送して使用するだけです。ただし、オーバーラップエラーがあるか、ユーザーがデータを継続的に送信していて、まだ変数に転送していない可能性があります。
その場合、受信フラグビットRCIFが救助に来ます。このビットは、データが受信され、まだ処理されていない場合は常にローになります。したがって、whileループでそれを使用して、その値を処理するまでプログラムを保持するための遅延を作成します。
PICマイクロコントローラーのUARTモジュールを使用したLEDの切り替え:
ここで、プログラムの最後の部分である void main(void) 関数に進みましょう。ここでは、PICとコンピューター間のUART通信を使用してコンピューターを介してLEDを切り替えます。
(コンピュータから)文字「1」を送信すると、LEDがオンになり、ステータスメッセージ 「REDLED-> ON」 が(PIC MCUから)コンピュータに返送されます。
同様に、文字「0」を(コンピューターから)送信すると、LEDがオフになり、ステータスメッセージ 「REDLED-> OFF」 が(PIC MCUから)コンピューターに返送されます。
while(1)//無限ループ{get_value = UART_get_char(); if(get_value == '1')//ユーザーが「1」を送信した場合{RB3 = 1; // LEDをオンにしますUART_send_string( "RED LED-> ON"); //コンピュータに通知を送信UART_send_char(10); // ASCII値10はキャリッジリターンに使用されます(改行で印刷するため)} if(get_value == '0')//ユーザーが「0」を送信した場合{RB3 = 0; // LEDをオフにしますUART_send_string( "RED-> OFF"); //コンピュータに通知を送信しますUART_send_char(10); // ASCII値10はキャリッジリターンに使用されます(改行で出力するため)}}
プログラムのシミュレーション:
いつものように、proteusを使用してプログラムをシミュレートし、期待どおりに機能するかどうかを確認しましょう。
上の画像は、ウェルカムメッセージとLEDのステータスを表示する仮想端末を示しています。赤色LEDがピンRB3に接続されていることがわかります。シミュレーションの詳細な動作は、最後のビデオにあります。
ハードウェアのセットアップと出力のテスト:
この回路の接続は非常に簡単です。PICPerfボードを使用し、3本のワイヤーをRS232-USBコンバーターに接続し、以下に示すようにUSBデータケーブルを使用してモジュールをコンピューターに接続します。
次に、ハイパーターミナルアプリケーションをインストールし(ここからダウンロード)、開きます。このようなものが表示されるはずです
次に、コンピューターでデバイスマネージャーを開き、モジュールが接続されているCOMポートを確認します。以下に示すように、私のものはCOMポート17に接続されています。
注:モジュールのCOMポート名は、ベンダーによって変更される場合がありますが、問題はありません。
次に、ハイパーターミナルアプリケーションに戻り、 [セットアップ]-> [ポート構成]に 移動するか、Alt + Cを押して、次のポップアップボックスを表示し、ポップアップウィンドウで目的のポート(私の場合はCOM17)を選択して、[接続]をクリックします。 。
接続が確立されたら、PICパフォーマンスボードをオンにすると、次のようなものが表示されます。
コマンドウィンドウにカーソルを置き、1を入力して、Enterキーを押します。LEDが点灯し、以下のような状態で表示されます。
同様に、コマンドウィンドウにカーソルを置き、0を入力して、Enterキーを押します。LEDが消灯し、以下のような状態で表示されます。
以下に、完全なコードと詳細なビデオを示します。これは、LEDが「1」と「0」に対してリアルタイムでどのように応答するかを示しています。
それはみんなです、私たちはPIC UARTをコンピュータとインターフェースし、ハイパーターミナルを使用してLEDを切り替えるためにデータを転送しました。理解していない場合は、コメントセクションを使用してクエリを実行してください。次のチュートリアルでは、再びUARTを使用しますが、Bluetoothモジュールを使用してデータをブロードキャストすることで、UARTをさらに面白くします。
また、2台のATmega8マイクロコントローラー間のUART通信とATmega8とArduinoUno間のUART通信も確認してください。