まえがき
「C言語によるPICプログラミング大全」(後閑 哲也著/技術評論社刊)を購入してからMPLABXのXC8とMCCを使うようにしています。それまではCCS社のCCS_Cを使っていましたので違いに戸惑っています。
でもMCCに関しては次々と新たらしく開発されるPICマイコン固有の仕様を事前に細かく調べなくても、マイコンを選択するだけで各パラメーターを用意してくれるのでとても楽に開発出来ると実感しています。
今回使用したPICマイコン
printf文はEUSARTの出力の際、よく使うのでEUSARTを2つ持つPIC16F15355とします。
その他の仕様
2つのEUSARTに加えて、秋月電子通商の3.3V動作20×4行LCD(SC2004CSWB-XA-LB-G)をパラレル接続し3つ目の出力としました。
開発環境はMPLABX、XC8でMCCを使用しています。ライターはPicKit4です
回路図
printf文の使い方。(ポイント)
main.c内の一部です。
#include "lcd_lib_from18F46K22.h"にてサブプログラムを取り込みます。
後ほど記述がありますが、使用するサブプログラムはlcd_lib_from18F46K22.cもありますがこれはincludeしなくても良いようです。
#include <stdio.h>はprintf文の実行に必要です。
main(void)の前に「void putch(unsigned char Data)」を記述します。
putchの中でif文等を使い、分岐させます。
main(void)内では分岐させる為のフラグ(flg_printf)にデータをセットしてからprintf文を実行します。
テストボードと実行結果
【テストボートの様子】
【実行後のLCD】
【実行後のEUSART1ターミナルソフトの画面】
【実行後のEUSART2ターミナルソフトの画面】
プロジェクトのダウンロード
プロジェクトはMCC迄生成したものとなっています。バージョンの違いにより、ダウンロードしたプロジェクトでは動作しない可能性もあります。
その場合は、下記のようにプロジェクトを作り(main.cには何も追記はしない)MCCの設定をしMCCで生成し、最後にmain.cだけをコピー&ペーストする(勿論コンパイルも)、といった手順で試してみてください。
PIC16F15355_HP.X.zip(プロジェクトのダウンロード)
掲載してあるプロジェクトのMCCの設定方法。MPLABXでプロジェクトが出来た後からの画面のハードコピーです。
上部中央のMCCボタンを押します。
MCCの設定画面が表示された直後、MCCデータの保存を求めてきますので「保存」します。
本回路では外部クリスタルを使用してかつPLLで4倍のクロックとしています。
ProgramingのLow−voltage・・・はチェック外します。
左側のEUSART1(PIC10/・・・をクリックします。
EUSART1の設定をします。ここではSoftware Setting内のRedirect STDIO to USARTにチェックはしません。なお、printf文を1つのEUSARTで使用する場合はチェックをするだけでEUSARTでprintf文が使えます。
左側のEUSART2(PIC10/・・・をクリックします。EUSART1と同様にEUSART2の設定をします。(画面略)
左側のタイマー0をクリックします。
動作確認用にLEDを点滅したいので約500msになるよう右側で設定しました。
Pin Moduleの設定はこの通りです。RB2と3が入力なのはこちらのテスト基板を使い回してしていてプルアップ抵抗が入っているためです。
Pin Moduleの設定でポートの名称を変更します。「RA4」を「stb」、「RA5」を「rs」、「RB5」を「O_RB5」にそれぞれ変更します。(この3つの名称はmian.cやサブプログラム内で使用しています)
その他は入力ピンは「I_ポート名」、出力ピンは「O_ポート名」としました。
設定が終わりましたので、左上の「Generate」をクリックし関数を生成します。
左上の「Project」のタブをクリックすると、画面の様になります。
「Header Files」内の「MCC Generated Files」内に各種ヘッダーが生成されました。
「Source Files」内の「MCC Generated Files」内に各種ソースが生成されました。
この後、2つのサブプログラムをプロジェクトに取り込みます。その事前準備としてサブプログラム「lcd_lib_from18F46K22.h」と「lcd_lib_from18F46K22.c」をプロジェクト内のフォルダにコピーします。
左上の「Project」のタブをクリックし、展開された中から「Header Files」を選択し右クリックすると再度展開されるので「Add Existing
Item」をクリックします。
「Select Item」のウインドが開きますので、「lcd_lib_from18F46K22.h」を選択します。もしプロジェクト内フォルダが表示されなければ「ファィルの場所」の行にあるボタンを利用してファイルを探してください。
「lcd_lib_from18F46K22.h」がインポートされると左上の様に表示されます。
左上の「Project」のタブをクリックし、展開された中から「Source Files」を選択し右クリックすると再度展開されるので「Add Existing
Item」をクリックします。
「Select Item」のウインドが開きますので、「lcd_lib_from18F46K22.c」を選択します。もしプロジェクト内フォルダが表示されなければ「ファィルの場所」の行にあるボタンを利用してファイルを探してください。
「lcd_lib_from18F46K22.c」がインポートされると左上の様に表示されます。
この後、このタイミングでコンパイルしてエラーがないことを確認したら、「main.c」の内容を実際のプロジェクトの「main.c」へコピー&ペーストして再度コンパイルすれば完成です。
追記 プログラムのループを止めずに、EUSARTの受信を待つ方法
下記の様にEUSART1_is_rx_ready()を使います。上記で紹介した「大全」には記載がありませんでした。
下記はRX1で受信したものをTX2へ送信する、またのその反対の動作をするものです。
while (1)
{
if ( EUSART1_is_rx_ready() )//RX1を受信したときTrueとなる
{
data = EUSART1_Read();//RX1のデータを読み出し
EUSART2_Write(data);//TX2へ送信する
}
if ( EUSART2_is_rx_ready() )//RX2を受信したときTrueとなる
{
data = EUSART2_Read();//RX2のデータを読み出し
EUSART1_Write(data);//TX1へ送信する
}
// Add your application code
}