トップページ > dsPIC入門 > UARTを使うプログラム
今回の最終目標は“適当な文字列を送信 & PCから文字列を受信”です。 いきなりコレを実装してしまってもいいのですが、段階的に説明を進めていく都合で 簡単なことからやっていきます。最初は単に電源ONと同時に 文字列を送信するようなプログラムを書いてみます。
新しいprojectをつくって、名前を適当に定めてください。それに以下のソースコードを追加…。 ソースコードの名前も適当でよいです。 (とりあえずserial_test1.cとかにしました…)
//******************************************************************** //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) { //================================================================== //UART初期設定 //速度は115kbpsとします(80MHzクロックでは実用的に最も速い設定) OpenUART1(config1,config2,10); ConfigIntUART1(UART_RX_INT_DIS & UART_TX_INT_DIS); //================================================================== //文字列送信 putsUART1("Hello World!!"); while(BusyUART1()); while(1); } //********************************************************************
いまさらですが、“Hellow World!!”です。PCで表示させるための方法は 後述しますが、ソースコードをみれば「あ〜、なんかHello World送ってるよ」 となんとなく分かると思います。初期設定がやたらゴチャゴチャしていますね。 UARTに機能が追加された…と言いましたが、そのせいです。ほとんどの機能は 使っていないので、根本の設定だけ覚えておけば苦労なく応用範囲を 広げていけるとおもいます。
また、コンパイルの際にはデバイスライブラリをMPLABにて設定する必要があります。今回も使用デバイスは dsPIC30F4012ですから、
UARTモジュールを使ってシリアル通信する際には“OpenUART1()”関数を使います。UARTモジュールが 複数載っているdsPICであれば、それに対応したOpenUART2()とかOpenUART3()とかを使うことになります。今回は ハードウェア側でUART1を使用するように回路を作ったので、OpenUART1です。 以下にOpenUART1()の定義を示します。
引数にconfigが入ってます。何回も扱ってきた、マクロを“&”でつなげて記述するアレです。 しかも2つもあります。さらに面倒なことに豊富な機能の分だけ、設定が必要な パラメーターが非常に多くなっています。関数の引数のカッコの中に入れるとソースコードが見づらくなるので、 プログラムの上の方で変数として定義して、それを放り込むような感じにしてあります。変数名は分かりやすい(?) ようにconfig1、config2とそのまんまの名前にしました。 以下、各引数の設定内容です。
config1に入る内容は、dsPIC内のU1MODEレジスタ(UART1MODE…の略)の設定事項のようです。ここの設定内容を しっかり理解しておかないと、後からPCと接続する際にPC側の通信設定ができなくなります。
UART有効、アイドル中も継続動作、代替ピン使用、パリティなし&8ビットデータ長、1ストップビット 、ウェイクアップ無効、ループバック無効、自動アドレス検出無効…という感じです。
config2は、dsPIC内のU1STAレジスタ(UART1Statusレジスタ…の略?)の内容に関わる設定です。 主に割り込みやエラー時の処理について設定します。
送信割り込みのモード設定送信バッファが空のときに割り込み、送信ブレークなし(通常動作)、送信有効、1文字受信のたびに割り込み、 アドレス文字検出無効、オーバーランエラービットクリア…という感じになります。
ボーレート…通信速度のイメージという程度の知識しかありません(汗)bpsと違うのは bps(Bits Per Second)は純粋に1秒間に転送できるデータ量であるのに対し、通信に おける変調・復調の速度を示すのがぼー・レート(Bau Rate)らしいのですが…。 パラレルデータとして取り出せるデータ量はいくつか?という話だと思われます。。。
この値は、使用するクロックと目標とするボーレートによって算出されます。PCと通信する場合は 同じボーレートに設定しておく必要があります。計算方法は データシート 参照です。(Acrobat Reader必要)
クロック80MHzにおける値としては…送信・受信による割り込みの可否を設定する関数です。UART2について設定するならConfigIntUART2()、 UART3について設定するならConfigIntUART3()…等となります。これはいままで通りですね。 関数の定義は、
受信割り込み禁止、送信割り込み禁止…となっています。まずは単純な動作で基礎を確認します。
さて、やっとUARTらしい(?)関数です。いままでは初期設定ばかりでしたが、ここからは UARTを実際に使う感じの関数が続きます。…といっても今回のソースコードで使用されているのは この関数くらいしか無いのですが。まずは、関数の定義です。
引数がポインタになっていることから想像できますが、これは『文字列を送信する関数』です。 文字列はメモリに格納される際に連続したアドレスを持つから、一番最初の文字のアドレスを ポインタ変数に格納して渡せば…みたいなイメージの話は標準的なC言語の話と全く同じ。今回は、
putsUART1("Hello World!!");
と、直接文字列をダブルコーテーション(「“」とか「”」)でくくって入れました。 別のやり方として、
char str[] = "Hello World!!"; putsUART1(str);
こんな感じで、キャラクタ型の配列にあらかじめ文字を入れておいて、その配列ごと 渡す…という手もあります。これも普通のCで用いられる手法と全くおなじノリで。 変数として扱っておくと、プログラム中で文字列を変更したい時などに扱いやすくなります。
まず、関数の定義から。
引数なしです。int型を返してくれます。この関数は、送信中・受信中でUARTモジュールにアクセスできない場合は 1を、UARTモジュールにアクセスできる場合は0を返します。 今回のソースコードでは送信用の関数と組み合わせて使用しています。
putsUART1("Hello World"); while(BusyUART1());while文の条件として使用することで、文字列を送信完了するまで一時停止するようなプログラムになっています。 送信関数と、このBusyUART1()関数はセットで考えるのが一般的です。
初期設定の部分は、おそらく毎回同じ内容になると思います。若干コンフィグが異なったとしても、 形式は変わりませんから慣れの問題です。そして、初期設定の部分が分かってしまえば、 今回のソースコードは非常に単純に見えてきます。(そもそも短いし…)
ソースコードを書いてprojectに登録したら、コンパイルしておいてください。