デバッグモニターの作成

〔マイコンのトップに戻る〕


PS. *6)
現在は、「I2C接続小型LCDモジュールに表示を行う」の記事の方法で実験を行っていますので、
下記記事の出番は殆どありませんが、I2Cモジュールを持たないPICの場合は有効でしょう。

デバッグモニターを作成します、作って置くとソフト開発時のデバッグに大いに活躍します。
回路はPIC16F819での「キャラクタLCDモジュールに表示を行う」と同じです。
PICのソフトのみ変更します。

Monitor1



Monitor2  上の図はArduinoとの接続例で、左は他のPICとの
 接続例です。
 デバッグモニター(16F819)はArduinoや他のPICから
 のデータを受信してLCDに表示する機能で、
 1本の線(1ピン)で接続します。

 デバッグモニター(16F819)側は1番ピン(RA2)を
 データの入力端子とします。

 また、データの通信はソフトシリアル通信で
 9600bpsで送受信を行います。


シリアル通信
*                  |--L--|-------H/L-------|--H--|       |--次のデータ           *
*               ___      ________________________________      ____            *
*  データのタイミング    |_____|                 |     |       |_____|               *
*                  |-str-|-8ビットデータ D0-D7-|-stp-|       |-str-|               *
*                                                                              *
*  ストローブ幅μs     |-104-|                       |--5ms--|←次データまでの待時間 *
*                   (スタート)     (データ)      (ストップ)                             *
(5msはLCDが表示完了するのを待つ為の遅延時間です)

注意)以前のソフトはデータの送受信を行う際にタイミングがズレて上手く送受信が出来ない場合が
    発生していました、なので今回そのタイミングをTimer2を使って送受信する様に変更しました、
    作成して上手く動作しない人は変更して見て下さい。m( __ __ )m

    それとPIC16F819は古い石なのでPIC16F1827を使うようにしましょう。

《デバッグモニター(PIC16F1827)受信側のプログラム》

↓ここからサンプルプログラムソースファイルをダウンロードして下さい。
DebugMonitor.lzh *5)

プログラムソースをダウンロードしたら、MPLAB X(v2.15)にてプロジェクトを作成します。
以下の3ファイルをプロジェクトディレクトリにコピーしてプロジェクトに取込んで下さい。
次にコンパイルPIC書き込みを実行して下さい。 *5)
MPLAB(R) XC8 C Compiler Version 1.32コンパイラを使用しています。

ダウンロードしたら解凍して下さい、以下のファイル構成です。
 DebugMonitor.c・・・・・・・・・本体のモニタープログラム *5)
 skSD1602LCD.c・・・・・・・・・SD1602のLCDに表示を行う為の関数群ソースファイル
 skSD1602LCD.h・・・・・・・・・SD1602のLCDに表示を行う関数のインクルードファイル

1番ピン(RA2)をHIGHT(VCC=5V)に接続して見て下さい。
(接続しないと変な表示になります、またモニター時は相手と接続します)
うまく動作すればこんな感じに表示されていると思います。
Monitor5


《データ送信側(PIC12F1822)のプログラム》

他のPICからデータを送信する例として12F1822を使ったプログラムを紹介します。

Monitor(use1)
出力するピンは5番(RA2)を使います。
デバックモニター(16F819)の1番ピン(RA2)に接続します。
1番ピンを5V電源、8番ピンをGNDにそれぞれ接続します。


 プログラムソースをダウンロードしたら、MPLAB X(v2.15)にてプロジェクトを作成します。
 以下の3ファイルをプロジェクトディレクトリにコピーしてプロジェクトに取込んで下さい。
 次にコンパイルPIC書き込みを実行して下さい。 *5)

 MonitorTest.c ・・・・・・本体のサンプルソースプログラム *5)
 skMonitorLCD.c ・・・・モニターに送信する部分の関数を記述したソースプログラム
 skMonitorLCD.h ・・・・ヘッダファイル

MonitorTest.c

このサンプルプログラムは1秒毎に数値をカウントアップするだけのプログラムです。

こんな感じに2行目に数値が表示されます。
Monitor3

skMonitorLCD.c

このソースプログラム(skMonitorLCD.c)は他のPICでも使用できます。
データの送信タイミングにTimer2を利用しているのでTimer2機能は他の処理では利用できません。
CCPモジュールの、PWMモード機能はTimer2を使うので注意しましょう。

skMonitorLCD.cの関数

MonitorInit( )
 デバッグモニターを行う為の初期化処理
 Timer2機能を使う為の初期化を行っています、CPUクロック8MHzで9600bpsでの初期化です。

 注意としては以前のプログラム(2014年以前)にはこの処理は有りませんでしたが、
 今回Timer2を利用する様に変更したので必ずこの関数を記述しないとなりません。

 尚、本サイトの他の頁で利用しているこのモニタープログラムでは、以前のプログラム記述で
 行っている頁が有るかと思いますが、その場合でもこの関数を追記記述の必要が有ります。
 (記述等の方法などはMonitorTest.cのサンプルプログラムを参照下さい。)

MonitorPuts(const char * s)
 デバッグモニターに文字列を送信する処理
 s:表示する文字列を指定します(NULL'0x00'まで出力)
 例)MonitorPuts("START")

MonitorPutc(unsigned char c)
 デバッグモニターに1文字を送信する処理
 c:表示する1文字を指定します
 例)MonitorPutc(0x37) ; これは文字の"7"です    MonitorPutc('H') ;
 また、数値の0x01〜0x1fまでを送るとLCDのカーソル位置を変更できます。
 このカーソル位置はSD1602を想定しています、他のLCDはたぶんズレます。
  _______________________________________________________________________________ 
 |_01_|_02_|_03_|_04_|_05_|_06_|_07_|_08_|_09_|_0a_|_0b_|_0c_|_0d_|_0e_|_0f_|_10_|
 |_11_|_12_|_13_|_14_|_15_|_16_|_17_|_18_|_19_|_1a_|_1b_|_1c_|_1d_|_1e_|_1f_|____|
 例) MonitorPutc(0x11) ;
    MonitorPuts("LOVE") ;
    とするとLCDの2行目1列目から文字"LOVE"が表示されます。

MonitorCls(int num)  *1)
 デバッグモニター画面のクリアを行う処理
 スペース文字を1行当たり16文字モニターへ送信します。
 num:1で1行目をクリアし、2で2行目をクリアします。
     1,2以外で全画面を消去します。

MonitorPuth(unsigned char c)  *1)
 デバッグモニターに16進数で送信する処理
 1バイトの数値から16進数の文字に変換してモニターへ送信します。
 c:表示する1バイトの数値(0-255)を指定します
 例)MonitorPuth(123) ; とすると"7B"がLCDに表示されます

MonitorPutb(unsigned char c)  *1)
 デバッグモニターに2進数で送信する処理
 1バイトの数値から2進数の文字に変換してモニターへ送信します。
 c:表示する1バイトの数値(0-255)を指定します
 例)MonitorPutb(123) ; とすると"1111011"がLCDに表示されます

MonitorPutd(unsigned char c)  *1)
 デバッグモニターに10進数で送信する処理
 1バイトの数値から10進数の文字に変換してモニターへ送信します。
 c:表示する1バイトの数値(0-255)を指定します
 例)MonitorPutd(123) ; とすると"123"がLCDに表示されます
   MonitorPutd(0x7b) ; とすると"123"がLCDに表示されます

 255の数値以上表示したい場合はsprintf()関数(又はitoa()関数)を使用して下さい。
 例) char s[12] ;
   sprintf(s,"%d",12345) ; // sの変数に文字"12345"と変換されます
   moni.Puts(s) ;
 但し、sprintf()関数を使用するとプログラム容量が増えます。

skMonitorLCD.h

出力するピンの変更箇所は
#define MONITOR_PIN RA2 // モニタ出力するピンの番号を設定する
この1行です。

システムクロック周波数を8MHz以外に変える場合は、
#define _XTAL_FREQ 8000000 // 使用するPIC等により動作周波数値を設定する
#define BAUDRATE 51 // 9600bps(8MHz=51)(4MHz=25)(16MHz=103)(20MHz=129)
この2行です。
Timer2のカウントを104us毎に調整を行えばOKです。

《データ送信側(Arduino)のプログラム》

Arduinoではあんまり出番がないようです(IDEのシリアルモニターを利用する為)、
なので今回のTimer2変更にともない本記事を削除しました。
LCDモニターに出力したい場合は、Arduino標準関数のソフトウエアシリアルを利用して
9600bpsで送信すればOKと思います。(未実験)
但し1バイト送信毎に1ms〜5msの遅延(LCDが表示完了するのを待つ為)が必要です。




*LCDには基本的にキャラクタ文字を送らないと正常に表示はされません。
キャラクタ文字はこちらを参照して下さい。

PICとパソコン(PC)を接続してモニターしたいと言う人はこちらの
FT232RL使用によりUSBをシリアル変換してPICとパソコンを繋ぎます」の話を参考にして下さい。*2)



記事一部追記(*6) 2019/02/05
MPLAB X用に記事変更(*5) 2015/10/07
変更(送受信タイミングをTimer2にて行うように変更) 2014/01/29
変更(*3) 2013/05/23
追記(*2) 2013/02/09
追記(*1) 2012/01/21


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2019 Shigehiro Kimura All Rights Reserved.