まえがき

C言語によるPICプログラミング大全「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です

回路図

PICマインコンで複数の出力にprintf文を使用する方法を試す際に使った回路図


スイッチはPicKitでプログラムを書き込む際、周辺回路から切断して保護するためのものです。
EUSART1と2はパソコンとRS232Cで接続しています。パソコンではRS232Cターミナルソフトを使います。

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文等を使い、分岐させます。

プロジェクトPIC16F15355_HP.X内のmain.cのソースです。

main(void)内では分岐させる為のフラグ(flg_printf)にデータをセットしてからprintf文を実行します。

プロジェクトPIC16F15355_HP.X内のmain.cのソースです。

  

テストボードと実行結果

【テストボートの様子】

テストボードの写真

【実行後のLCD】

実行後LCDの写真

【実行後のEUSART1ターミナルソフトの画面】

実行後のPCのEUSART1のターミナルソフトの画面の写真

【実行後のEUSART2ターミナルソフトの画面】

実行後のPCのEUSART2のターミナルソフトの画面の写真

プロジェクトのダウンロード

プロジェクトはMCC迄生成したものとなっています。バージョンの違いにより、ダウンロードしたプロジェクトでは動作しない可能性もあります。
その場合は、下記のようにプロジェクトを作り(main.cには何も追記はしない)MCCの設定をしMCCで生成し、最後にmain.cだけをコピー&ペーストする(勿論コンパイルも)、といった手順で試してみてください。

PIC16F15355_HP.X.zip(プロジェクトのダウンロード)

     

掲載してあるプロジェクトのMCCの設定方法。MPLABXでプロジェクトが出来た後からの画面のハードコピーです。

上部中央のMCCボタンを押します。
  MCCの説明のためのMPLABX画面のハードコピー


MCCの設定画面が表示された直後、MCCデータの保存を求めてきますので「保存」します。
  MCCの説明のためのMPLABX画面のハードコピー



本回路では外部クリスタルを使用してかつPLLで4倍のクロックとしています。
ProgramingのLow−voltage・・・はチェック外します。
  MCCの説明のためのMPLABX画面のハードコピー



左側のEUSART1(PIC10/・・・をクリックします。
  MCCの説明のためのMPLABX画面のハードコピー



EUSART1の設定をします。ここではSoftware Setting内のRedirect STDIO to USARTにチェックはしません。なお、printf文を1つのEUSARTで使用する場合はチェックをするだけでEUSARTでprintf文が使えます。
  MCCの説明のためのMPLABX画面のハードコピー



左側のEUSART2(PIC10/・・・をクリックします。EUSART1と同様にEUSART2の設定をします。(画面略)
  MCCの説明のためのMPLABX画面のハードコピー



左側のタイマー0をクリックします。
  MCCの説明のためのMPLABX画面のハードコピー



動作確認用にLEDを点滅したいので約500msになるよう右側で設定しました。
  MCCの説明のためのMPLABX画面のハードコピー



Pin Moduleの設定はこの通りです。RB2と3が入力なのはこちらのテスト基板を使い回してしていてプルアップ抵抗が入っているためです。
  MCCの説明のためのMPLABX画面のハードコピー



Pin Moduleの設定でポートの名称を変更します。「RA4」を「stb」、「RA5」を「rs」、「RB5」を「O_RB5」にそれぞれ変更します。(この3つの名称はmian.cやサブプログラム内で使用しています)
その他は入力ピンは「I_ポート名」、出力ピンは「O_ポート名」としました。
  MCCの説明のためのMPLABX画面のハードコピー



設定が終わりましたので、左上の「Generate」をクリックし関数を生成します。
  MCCの説明のためのMPLABX画面のハードコピー



左上の「Project」のタブをクリックすると、画面の様になります。
  MCCの説明のためのMPLABX画面のハードコピー



「Header Files」内の「MCC Generated Files」内に各種ヘッダーが生成されました。
「Source Files」内の「MCC Generated Files」内に各種ソースが生成されました。
  MCCの説明のためのMPLABX画面のハードコピー



この後、2つのサブプログラムをプロジェクトに取り込みます。その事前準備としてサブプログラム「lcd_lib_from18F46K22.h」と「lcd_lib_from18F46K22.c」をプロジェクト内のフォルダにコピーします。
  MCCの説明のためのMPLABX画面のハードコピー



左上の「Project」のタブをクリックし、展開された中から「Header Files」を選択し右クリックすると再度展開されるので「Add Existing Item」をクリックします。
  MCCの説明のためのMPLABX画面のハードコピー



「Select Item」のウインドが開きますので、「lcd_lib_from18F46K22.h」を選択します。もしプロジェクト内フォルダが表示されなければ「ファィルの場所」の行にあるボタンを利用してファイルを探してください。
  MCCの説明のためのMPLABX画面のハードコピー



「lcd_lib_from18F46K22.h」がインポートされると左上の様に表示されます。
  MCCの説明のためのMPLABX画面のハードコピー



左上の「Project」のタブをクリックし、展開された中から「Source Files」を選択し右クリックすると再度展開されるので「Add Existing Item」をクリックします。
  MCCの説明のためのMPLABX画面のハードコピー



「Select Item」のウインドが開きますので、「lcd_lib_from18F46K22.c」を選択します。もしプロジェクト内フォルダが表示されなければ「ファィルの場所」の行にあるボタンを利用してファイルを探してください。
  MCCの説明のためのMPLABX画面のハードコピー



「lcd_lib_from18F46K22.c」がインポートされると左上の様に表示されます。
  MCCの説明のためのMPLABX画面のハードコピー


この後、このタイミングでコンパイルしてエラーがないことを確認したら、「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
}