トップページ > dsPIC入門 > 送受信のプログラム
今回はdsPICへデータを送信してみます。つまり、dsPIC側のプログラムは“データを受信するプログラム”
となります。これが、いろいろ予備知識が必要でめんどくさい…。(少なくとも、自分は最初にやった時ハマり
ました)非常に単純な動作しかできないハイパーターミナルですが、それを逆に活用して、ハイパーターミナルで
いろいろ試して遊びながら、シリアル通信を理解してみようとおもいます。
データ送信は、ハイパーターミナルにキーボードから入力するだけで可能です。
ただし、自分が入力した文字は表示されません。これだと自分で何をやっているか分からなくて不便なので、
設定を変えて自分が送信した文字も表示されるようにしておきます。“エコーバック”という機能です。
適当にハイパーターミナルの画面上で文字を打ってみてください。押したキーの文字が出るはずです。
最初は、とにかく単純に「dsPICでデータを受信する」ことだけを確認してみます。 受信した文字と同じ文字をそのまま送信するプログラムです。
//********************************************************************
//UARTを使って文字を受信 @dsPIC30F4012
//********************************************************************
//********************************************************************
//ヘッダファイル
#include "p30f4012.h"
#include "uart.h"
//********************************************************************
//コンフィギュレーション
_FOSC(CSW_FSCM_OFF & XT_PLL8); //10MHzセラロックを使っているのでクロックは80MHz。
_FWDT(WDT_OFF);
_FBORPOR(PBOR_ON & BORV_20 & PWRT_64 & MCLR_EN);
_FGS(CODE_PROT_OFF);
//********************************************************************
//UARTの設定パラメータ
unsigned int config1 = UART_EN & UART_IDLE_CON & UART_ALTRX_ALTTX & UART_NO_PAR_8BIT & UART_1STOPBIT
& UART_DIS_WAKE & UART_DIS_LOOPBACK & UART_DIS_ABAUD;
unsigned int config2 = UART_INT_TX_BUF_EMPTY & UART_TX_PIN_NORMAL & UART_TX_ENABLE & UART_INT_RX_CHAR
& UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR;
//********************************************************************
//メイン関数
int main(void)
{
char temp;
//==================================================================
//UART初期設定
//速度は115kbpsとします(80MHzクロックでは実用的に最も速い設定)
OpenUART1(config1,config2,10);
//==================================================================
//メインループ
while(1)
{
//1文字受信を待つ
while(!DataRdyUART1());
//受信文字をtempへ保存
temp = ReadUART1();
//tempを送信
WriteUART1(temp);
}
}
//********************************************************************
では、例のごとく上から順に新出の関数を解説していきます。
UARTモジュール内の受信バッファにデータ無い場合は“0”を、入っている場合は“1”を返す関数です。 データが来るまで待機させるために、
while(DataRdyUART1());と、直接while文の条件の中で呼び出す感じになっています。
受信バッファにある1文字を返す関数です。UARTの受信バッファは4バイト分ありますが、 今回は単純に考えるために、1バイトのみだと考えておきます。DataRdyUART1()で 受信を検出したら、この関数で受信内容を呼び出し、char型変数のtempに保存…。
送信バッファに1文字書き込む関数です。送信バッファに内容が書き込まれると、自動で送信されるため、 “1文字送信関数”だと考えておきます。今回のようにchar型変数内の文字を送信する時は
WriteUART1(temp);
…となります。また、直接文字を引数にとることもできて、
WriteUART1('a')
のような使い方もできます。文字1つのデータは、シングルコーテーション「’」でくくる約束でした。 (たぶん)
では、さっそく上記のソースコードをコンパイルして、ハイパーターミナルで実験してみましょう。
ハイパーターミナルで送信された文字がそのまま返ってくるので、同じ文字が2つずつ続くように 表示されます。今回で、基本的な操作と関数の解説は全て終わりです。 結局、UARTがらみの関数は
こうして並べてみると少なくはありませんが、1つ1つの関数の機能は単純でわかりやすいものばかりなので、 すぐ覚えて使いこなせるとおもいます。これらを組み合わせて、次回はちょっと実用的なプログラムを 組んでみようと思います…。