● 実験テーマ93
「PIC16F_心電計の、QVGA化実験」
(モノクロ液晶を、カラーQVGA液晶に置換えてみました。PIC16F1983(8bit
CPU/16MHz)で、QVGAに心電波形を表示する実験です。)
以下、この実験の顛末記です。
■ 2017.6.21〜 2017.6.22
・前テーマ92の末尾にも書いたが、液晶をもう少し、X方向の分解能の高い(今128dotだが、256dotのモノクロがあればよいのだが・・)
ものにと、探していたが、どうもモノクロで、x=
256dotは特殊らしく、流通に難がありそうなので断念した。
モノクロ+バックライト無しで動作させているのは、バッテリー駆動前提に考えていたためだが、
今回は、多少消費電流が増えても良しとした。(主にACアダプターでの使用)
カラーQVGAなら、x= 320dotあるので、サンプル周期も、現在の半分でOKである。
つまり、Tsamp=20mS→ 1000mS/Dが、Tsamp=10mS→ 500mS/Dになり、
Tsamp=10mS→ 500mS/Dが、Tsamp=5mS→ 250mS/Dに、波形再現性も向上する。
・将来、P板化する際も、ざっと見では、2.4inchQVGAにしても、100
x 80mmサイズの、P板に、全て部品は収まりそうである。
QVGAと、P板間が、11mmあるので、その下の空スペースに十分部品を乗せられる。
とりあえず、PIC16F1983で、カラーQVGA液晶の表示テストをやってみる。(このPICでは初)
実験には、モノクロのECGの実験時に作った、ユニバーサル基板を流用することにした。
前に作った、モノクロ→ QVGA接続変換基板を使えば、そのまま差し替えでスマートに実験出来る。
・PIC16F_QVGA_TESTプロ作成済み。
コンパイルで、Error= 0, Waming= 8件ほど出た。
どうも、XC8では、ストリング出力関数で、例えば、lcd_str("123");と書くと、ワーニングになるようである。
これを回避するには、冒頭で、str123[]= "123";
と宣言してから、lcd_str("123");とやるか、
sprintf(str123, "123");
lcd_str("123");
とやればよいようであるが、ワーニングなので、実際に動かして動いたら、そのままにすることに。
(直接的でなく、面倒なので・・)
・余り深く考えず、進めて行った結果か、最初の動作チェックは、上手く行かなかった。
P_ONで、バックライトがONするだけで、ダンマリ。
最初に気が付いたのは、QVGAのロジック電源は、3.3Vということ。(気付くのが遅かった・・・)
モノクロは、5Vだが。
なので、まずQVGAへの、5Vを、3.3V供給に修正した。
むろん、3.3Vレギュレータが必要になる。
手持ちが無かったので、前作で使わなくなった、実験テーマ21の、PIC24F
MP3(I2C LCD)の基板からの
部品取り(TA78033)で何とかした。
これでやってみたが未だ駄目。
冷静に考えてみると。今、PICは、5V動作なので、QVGAとのロジック・インターフェースのレベルが合わない。
5Vに対して、3.3Vロジック。これでは駄目なのも当然である。(これも気付くのが遅かった・・・)
QVGAを装着しない時は、3.3V供給ピンの、2pinに、3.3Vが出ているが、装着して測ると、4.98V位に
上がってしまう。
I/Fの電位差で、5V電流が、3.3V I/Fに流れ込むからだと思われる。
これの対策だが、PIC16F1983は、3.3Vでも動くので、まずは、PICを、5V→
3.3V電源に変更する。
アンプ系の電源も、3.3Vにしないといけない。
ヘッドアンプ部は、±5Vで動かしているが、出力は、約1Vp-pなので、レベル的に問題ない。
ユニバーサル実験基板の方の電源は、Vcc=
3.3Vと、5Vを選択出来るように、ピンを立てた。
これで、モノクロ/QVGAともに切替えて実験出来る。
■ 2017.6.23
・昨日の修正を行った。
液晶コネクタの、2pinは、QVGAを装着した状態でも、3.3Vを確認。
だが症状は変わらず。ソフトがおかしい?
<試行・調査>
@ ここで、液晶をモノクロに戻し、PICを3.3V電源にして、PIC16F_GLCD_TEST.hexを書込み
動くか確認。(大型のSG12864Aは、スペック上は、5V電源だが、3.3Vでも動く。)
これは動いた。
なので、PIC16F1983の、3.3V動作は問題なし。(デバイス認識もOK)
A 一箇所誤り発見
QVGAライブラリ・ソースの出力関数で、16bitデータを上位、下位8bitに振分け処理している
ところが、LATBのまま。
データポートは、PORT Aにしたので、LATAに修正。しかしこれでも駄目。
B プログラムが、RUNしているか確認。
LCD初期化・画面クリア後に、LED ONして止めてみた。
これは、OK。RUNしている。
C XC8の場合、ポート出力は、LATと書かないで、PORTを使う。(実際には、ラッチ出力をアクセス)
ヘッダーで定義されている、LCD_DB PORTA
を使えばよい。
LATA→ LCD_DEBに修正。これでも未だ駄目。
D XC8のポートレジスタ(R**)は、8bitしか無い。
なので、今元にしている、C30で書かれているライブラリソースの、LCD_DB
& 0X00FF
というマスク処理をしても意味がない。
LCD_DB = (index & 0xFF00) | (LCD_DB & 0x00FF);→ LCD_DB = (unsigned char)((index & 0xFF00)>>8);
に修正。これでも未だ駄目。
E 判らなくなったので、ここで液晶のコントロール信号(RCポート)の単体チェックをしてみた。(現在Fcy=32MHz動作)
RC1: RESET/→ × Hiぱなし。
RC3: CS/ → 〇
RC6: RS → × Hiぱなし。
RC7: WR/ → 〇
何故か、CCP機能とのマルチ機能ピンになっている、RC1/CCP2と、RC6/CCP3がおかしい?
■ 2017.6.24
・どうも、32M動作だと、RCポート出力の一部が正しく動作しないようである?(PICを壊したか?差替えチェックはしてない)
パタパタ変化せず、レベル固定になる。
PLL未使用の、8M, 16M動作は、OKを確認。
そこで、16M動作に修正することにした。(消費電流的には有利)
これで表示テストは大方OKになったが、表示テストの最初で、VRAMのゴミが残ってそれが、Lcd
Clearする間、見えて
しまうのが気になった。
これは、PIC24Hの40M動作では気にならなかったが、現在は16Mと遅い。そのせいと思われる。
また液晶をUL024TFにすると、これは殆ど気にならなかった。今は、S95417である。
いろいろ調べている内に、問題は解決した。
lcd_Init関数の最後、いきなり、lcd_out(0x0007, 0x0133); // 262K color and display ON
とやっているが、その前に、メインでやっていた、lcd_Clear(BLACK);を追加。
つまり、FFFFでVRAMを埋めてから、DISPLAY ON。(メインのlcd_Clear(BLACK);は削除)
これで良くなる。
■ 2017.6.25
・本番ソフトの検討を始めた。
モノクロの時と異なるのは、主に以下の、5点
@ Fcy= 8M→ 16Mになったので、T2設定(PR2設定)変更
PR2= 124→ 249に変更
A sample_cnt= 16;→ sample_cnt= 8;
// 250mS/D時:0.625*8=5mS周期:波形BUFへの格納処理
sample_cnt=
32;→ sample_cnt= 16; // 500mS/D時:0.625*16=10mS周期:波形BUFへの格納処理
B 遅延関数の為の、クロック定義の変更
#define _XTAL_FREQ 8000000→ #define _XTAL_FREQ 16000000
C QVGAの全画面クリアは時間が掛かるので、そのチラツキ対策が必要
D HOLDタイミングの変更
これ位が変更点と思って、ソフトを作成した。
ところが、コンパイルすると、WAVbufferサイズの、512ワード(1024バイト)は確保出来ない旨のエラー発生。
最初に気が付くべきだったが、 PIC16F1938の、SRAMエリアは、最大1024バイトなので、当然である。
QVGAは、x方向分解能= 320dotなので、トリガ点からの表示用に、321ワード+トリガ検知トライ回数190回の、
比較用のデータ数:190ワードで、511ワードなので、切りの良いところで、WAVbufferサイズを、512としていると解釈している。(オリジナルは後閑さん作)
SRAM容量の多い、PIC24H等に変えるのが良いのだろうが、せっかく、8bitのPIC16F1983で、QVGAを動かせたので、
トリガの掛かり具合が、サンプル周期の遅いレンジで多少悪くなるのは妥協して、トリガ検知トライ回数190回を
96回までに減らし、WAVbufferサイズを、512ワード(1024バイト)から、416ワード(832バイト)に減らした。
これでコンパイルしたら、エラーは無くなった。
しかし、SRAMの使用量を見ると、約98%でギリギリOKである。(もうこれ以上機能追加は出来ない)
これで動かしたら、シングル・トリガ・モード以外は、OKになる。
■ 2017.6.26
・シングル・トリガ・モードでの症状例であるが、以下である。
@ まず、AUTOで、1Hz入力する。
A SINGLEに切替えて、READY SWをON→ LED ONで、トリガ待ち
B トリガすると、1Hzの波形表示で止まる。
C ここで、F.Gを、2Hz出力にする。
D READY SWをON→ LED ONで、トリガ待ち
E トリガすると、前に、ホールドした波形がクリアされず残ったまま、2Hz波形が多重に表示。
これは、なんということなかった。
シングル・トリガ・モードでは、冒頭に全画面クリアが必要だが、それが抜けていただけである。
ただ、Fcy= 16MHzでは、全画面クリアに数秒(約3〜4秒位)かかるが、これは妥協した。
これで大方OKになる。
ちょっと気になることと言えば、500mS/Dの時、観測出来る、R波が、5波に増えるが、そのピークレベルの
バラツキがやや目立つ。これも妥協した。
WEB検索で、他の工作例を見ても、完全に、レベルは一致してなく変動するようだ。
また、変動の度合いも、電極が皮膚に馴染んでくると少なくなってくる。
<回路図>
・こちらから、どうぞ→ 「心電計制御部実験(QVGA液晶版)」
<最終ソース及びヘッダファイル>
・こちらから、どうぞ→ 「PIC16F_ECG_Scope_V3.c」
/// GLCDライブラリ
colorlcd_libPIC16FVH.c
colorlcd_libPIC16FVH.h
///
アスキーフォント
ASCII12dot.h