トップページ > dsPIC入門 > UARTを使うプログラム

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に機能が追加された…と言いましたが、そのせいです。ほとんどの機能は 使っていないので、根本の設定だけ覚えておけば苦労なく応用範囲を 広げていけるとおもいます。

ヘッダファイルと、デバイスのライブラリファイル

#include "uart.h"

で、uart用のヘッダファイルをインクルードします。これを書かないと各種関数が使えません。

また、コンパイルの際にはデバイスライブラリをMPLABにて設定する必要があります。今回も使用デバイスは dsPIC30F4012ですから、

libp30F4012-coff.a

をprojectに追加します。MPLABでの操作はタイマーの使い方のところに書きました。

OpenUART1()関数について

UARTモジュールを使ってシリアル通信する際には“OpenUART1()”関数を使います。UARTモジュールが 複数載っているdsPICであれば、それに対応したOpenUART2()とかOpenUART3()とかを使うことになります。今回は ハードウェア側でUART1を使用するように回路を作ったので、OpenUART1です。 以下にOpenUART1()の定義を示します。

void OpenUART1(unsigned int config1 , unsigned int config2 , unsigned int ubrg)

引数にconfigが入ってます。何回も扱ってきた、マクロを“&”でつなげて記述するアレです。 しかも2つもあります。さらに面倒なことに豊富な機能の分だけ、設定が必要な パラメーターが非常に多くなっています。関数の引数のカッコの中に入れるとソースコードが見づらくなるので、 プログラムの上の方で変数として定義して、それを放り込むような感じにしてあります。変数名は分かりやすい(?) ようにconfig1、config2とそのまんまの名前にしました。 以下、各引数の設定内容です。


config1 : UARTの基本動作の設定

config1に入る内容は、dsPIC内のU1MODEレジスタ(UART1MODE…の略)の設定事項のようです。ここの設定内容を しっかり理解しておかないと、後からPCと接続する際にPC側の通信設定ができなくなります。


UARTモジュールのON・OFF
アイドル中の動作
シリアル通信に使用するピンの設定 (対応するピン番号はテストボードのピン配置図参照)
今回のPICkit2等を用いたICSP(In Circuit Serial Programming)使用の場合、Tx,Rxピンは既に 使用されているので、代替ピンを使用することになります。
SLEEP中にスタートビットが来た時の動作
ループバックモードの設定
(自分で送信したデータを自分で受信して、テストを行う機能?)
ボーレートを自動検出(Auto Baurate Detect…?)
パリティビットとデータ長の設定
ストップビット長の設定
では、今回の設定を見てみます。(長い)

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;

UART有効、アイドル中も継続動作、代替ピン使用、パリティなし&8ビットデータ長、1ストップビット 、ウェイクアップ無効、ループバック無効、自動アドレス検出無効…という感じです。


config2 : UARTの状態設定

config2は、dsPIC内のU1STAレジスタ(UART1Statusレジスタ…の略?)の内容に関わる設定です。 主に割り込みやエラー時の処理について設定します。

送信割り込みのモード設定
送信ブレークの設定(いまいち用途が分かりません…)
送信有効化
受信割り込みモード設定
アドレス文字(受信データの第8bitが1)の検出
オーバーランエラーの際のクリア設定
では、今回の設定を見てみます。

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;

送信バッファが空のときに割り込み、送信ブレークなし(通常動作)、送信有効、1文字受信のたびに割り込み、 アドレス文字検出無効、オーバーランエラービットクリア…という感じになります。


ubrg : ボーレートの設定

ボーレート…通信速度のイメージという程度の知識しかありません(汗)bpsと違うのは bps(Bits Per Second)は純粋に1秒間に転送できるデータ量であるのに対し、通信に おける変調・復調の速度を示すのがぼー・レート(Bau Rate)らしいのですが…。 パラレルデータとして取り出せるデータ量はいくつか?という話だと思われます。。。

この値は、使用するクロックと目標とするボーレートによって算出されます。PCと通信する場合は 同じボーレートに設定しておく必要があります。計算方法は データシート 参照です。(Acrobat Reader必要)

クロック80MHzにおける値としては… などなど。

ConfigIntUART1()関数

送信・受信による割り込みの可否を設定する関数です。UART2について設定するならConfigIntUART2()、 UART3について設定するならConfigIntUART3()…等となります。これはいままで通りですね。 関数の定義は、

void ConfigIntUART1(unsigned int config)

受信割り込み 受信割り込みレベル
(もちろん割り込みを禁止した場合は設定不要です) 送信割り込み 送信割り込みレベル
(割り込みを禁止した場合は設定不要) 今回の設定は…

ConfigIntUART1(UART_RX_INT_DIS & UART_TX_INT_DIS);

受信割り込み禁止、送信割り込み禁止…となっています。まずは単純な動作で基礎を確認します。

putsUART1()関数

さて、やっとUARTらしい(?)関数です。いままでは初期設定ばかりでしたが、ここからは UARTを実際に使う感じの関数が続きます。…といっても今回のソースコードで使用されているのは この関数くらいしか無いのですが。まずは、関数の定義です。

void putsUART1(unsigned int *string)

引数がポインタになっていることから想像できますが、これは『文字列を送信する関数』です。 文字列はメモリに格納される際に連続したアドレスを持つから、一番最初の文字のアドレスを ポインタ変数に格納して渡せば…みたいなイメージの話は標準的なC言語の話と全く同じ。今回は、

putsUART1("Hello World!!");

と、直接文字列をダブルコーテーション(「“」とか「”」)でくくって入れました。 別のやり方として、

char str[] = "Hello World!!";

putsUART1(str);

こんな感じで、キャラクタ型の配列にあらかじめ文字を入れておいて、その配列ごと 渡す…という手もあります。これも普通のCで用いられる手法と全くおなじノリで。 変数として扱っておくと、プログラム中で文字列を変更したい時などに扱いやすくなります。

BusyUART1()関数

まず、関数の定義から。

int BusyUART1(void)

引数なしです。int型を返してくれます。この関数は、送信中・受信中でUARTモジュールにアクセスできない場合は 1を、UARTモジュールにアクセスできる場合は0を返します。 今回のソースコードでは送信用の関数と組み合わせて使用しています。

putsUART1("Hello World");

while(BusyUART1());
while文の条件として使用することで、文字列を送信完了するまで一時停止するようなプログラムになっています。 送信関数と、このBusyUART1()関数はセットで考えるのが一般的です。

今回のまとめ

初期設定の部分は、おそらく毎回同じ内容になると思います。若干コンフィグが異なったとしても、 形式は変わりませんから慣れの問題です。そして、初期設定の部分が分かってしまえば、 今回のソースコードは非常に単純に見えてきます。(そもそも短いし…)

ソースコードを書いてprojectに登録したら、コンパイルしておいてください。




前へ   次へ