● 実験テーマ128
「PIC18F_aitendo特売7SEG液晶の試食」
(2種の特売品7セグ液晶:PCB0112-1Aと風変わりな6角外形の:TX10941-02の試食ですが後者は制御IC無しなので難易度大です)
■ 2020.11.27
・aitendoの特売品2種の表示テスト予定。
第1段:7桁7セグLCD:「PCB0112-1A0」
当該製品ページには、ハード的な詳細説明は、一切なし。
唯一の参考資料は、
コントローラIC:HT1621Bのデータシートと、GitHubの参考ライブラリがあるのみ。
・WEB検索したら既に先人が、ハード調査とテストプロを組んで表示させている人がおられた。
→ 「じじいの電子実験室」さん
ここが参考になりそうだが、マイコン変わっていて、サイプレスセミコンダクタ社の、CY8C39666-24を使われている。
これを、使い慣れている、PIC18F14K50で動かしてみる。
・まずは、LCDの回路図シンボルから作成する。
この液晶、AitendoHPでの製品名が「7桁7セグLCD」となっているが、実際は8桁で、さらに左上に小さな2桁が存在する。
バックライト電流制限用Rの値とかを変更しているようなので、その辺も考慮しながら作成。
またコントローラ側にはReadピンもあるが「、ヘッダ側には引き出されてない。表示テストだけなのでWriteのみで
いけそうなので引出し改造はやらないことにした。
■ 2020.11.28
・発注番号:213639(注文日:2020/11/27)の 商品2点が本日届いた。
開封したところ、
その内の1点:7seg液晶pcb112-1a0
の表示面(保護シートは無いように見える)に直に、
マジックのようなもので
チェックマークが入っていた。
アルコールで落とそうと思って表面を擦っていたら、何と保護シートの片隅が
剥がれ外すことが出来た。
かなり頑固に貼りついていたのでこうしないと
とれなかっと思う。
■ 2020.11.29
・LCD基板側のバックライト電流制限用Rの値は何故か、R1=
1Ωが実装されている。
また、VLCDピンのR2= 0Ωである。
参考サイトの方は、このチップ抵抗の値を変更(交換)しているが、LCD基板での改造は避けたいので、
外部取付けにしました。
→ R1= 47Ω(オリジナルは30Ω)でバックライト実験したところ、VDD=
5Vで、R1両端電圧=2.03Vになったので
単純計算で、約43mA流していることになります。
またR2= 15k外付けとしました。これは、データシートの指示通りです。
■ 2020.12.2
・一応ソース書き上げ、コンパイルOK
HEXまで準備出来た。
ただ、MPLAB X IDEをクローズしようとした時に、見慣れないメッセージが出た。
「Checking for external changes」→ 外部で加えられた変更を確認?ということだが思い当たらない?
この横の進捗バーに、青字で、Supended(一次停止)と表示され、この右側のボタンをクリックしたら、
「外部で加えられた変更を確認をやるか、キャンセルするか」聞いて来たので、キャンセルをクローズした。
こんな状態だったが、HEXは無事生成されていた。
何でこんなメッセージが出たか分からないが、様子見ということで先に進むことにした。
■ 2020.12.3
・動作チェック開始
治具作り済、HEX書込みOK
(1) 電源チェック(LCD負荷時)
VDD= 5.07V
VLCD= 3.85V→ スペックでは、4VなのでOK
BL-A= 3.16V→ バックライト電流制限対抗= 47Ωで、計算上VF約3VなのでOK
(2) 動作チェック
・まずは駄目。全セグメント点灯テストで、全て点灯してない。
<調査>
@ コントロールICの、RD/ピンは外部に出てないが、IC内部でプルアップされているはず?
→ 調べてみたら、Open時、4.75Vなのでプルアップされいてライトモードに影響は無い。
A 初期化の、lcd_clr();のところで止めてみたが全クリアされてない。
※ 結局、原因はイージーミスで、lcd_wr_dat関数の最後のステートのところがそっくり抜けていたのが原因だった。
以下が抜けていた。
/// 最後のbitは何でも良いので、low出力にする。
LCD_DAT_Lo;
LCD_WR_Lo;
__delay_us(4);
LCD_WR_Hi;
__delay_us(1);
LCD_CS_Hi; // csをノンアクティブにして終了
・これを追加したら一通り動いた。
全セグメント+全アイコン点灯→ 7セグ順次表示テスト→ アイコン表示テスト→ 「成功」文字表示
の順にテストし止まります。
■ 2020.12.4
・せっかくなので、SPIラインのタイミングを自作簡易ロジアナで確認してみました。
尚、ライトクロックの周波数は約100kHzになるようにソフトで調整しました。
このコントローラICのスペックでは、約300kHzが上限のようです。
・この液晶は、kWhの単位を有することから何かの電力コントローラに使われた物と察しますが、
時計表示も出来ます。
これにRTCを組合わせて時計でも作るかもです。
・今回参考にしたサイトの「じじいの電子実験室」さんには感謝です。
各セグメントのアドレスとデータ情報が明確になっていたので大変助かりました。
・第2段:「風変わりな6角外形の:TX10941-02の試食」(コントローラIC無し・難易度大)は予定中です。
■ 2020.12.8
・次は、「TX1094A-02」(コントローラ無しタイプ)の試食
とりあえずバックライトは点灯した。
色は青色だった。 R= 適当に、390Ω
■ 2020.12.9
・基板にヘッダ―をハンダ付けした。
15pinと、LED-A, LED-Kピンが、LCDのバックライトの底面に当たってしまうので、面一まで出っ張ってるピンを
カットしてハンダ付けした。
■ 2020.12.10
・セグメント液晶の駆動は直流では液晶を劣化させるため、交流駆動が必要になる。
交流と言っても、サイン波である必要はなく、矩形波で十分である。
トラ技2008年1月号「PICでLCDパネルを直接駆動」投稿:庄野和宏さんの記事が参考になった。
駆動の方法には2つある。
@ COMピンに、VCC/2= 1.65Vを印加して、SEGピンに駆動パルス(波高値:3.3V)を与える方法
→ パルスが入力されると当該セグメントが点灯し、SEGピンに、VCC/2を印加すると消灯
この方法だと、常にVCC/2分の電流を消費してしまうので時計用途には向かない。
A COMピンにもパルスを与える方法
→ COMピンと逆相のパルスをSEGピンに印加すると点灯し、同相のパルスを印加すると消灯する。
こちらの方が制御が複雑になるが時計用には向く。
・トラ技の製作例に使っているセグメント液晶は、COMピンが一つしかないので比較的容易にソフトを組めるが、
今回使うセグメント液晶には、COMピンが、7つもあるので、各COMのスキャンが必要になって来て、ソフトは複雑にならざるを得ない。
(また駆動パルスに中間レベルが必要になって来る)
・まずは、ソフトを組む前に、@の簡易な方法で目的のセグメントが点灯するか確認してみた。
具体的な簡易法は以下のようなもの。
→ COM1に、VCC/2= 3.3V/2= 1.65Vを印加しパルジェネ:中華のFG085によってSEG0ピンに、波高値=3.3V,
F=64Hzのパルスを直接印加
すると中央のセグメントに、℃"(COM1とSEG0の交点のセグメント)が表示されるか確認。
→ 他のCOMピン・SEGピンはオープンにしてあるので、液晶のピンを直接手で触れたり(触れなくても)すると余計なセグメントも点灯してしまうが、
それは今回は無視した。
暫くほっておくと次第に他のセグメントは消えて行ったので、その時に写真を取ったのが以下の写真である。
もくろみ通リ、℃"が点灯した。
■ 2020.12.16〜 2020.12.17
・aitendoの、6角外形の風変わりなセグメント液晶の簡易テストのステップ_1
STEP1:中央の7セグと"℃"セグメントを使って"3℃"と固定表示させる。
<実験の目的・目標>
・コントローラを持たないので、PICのみで制御することを目標にする。
COM1とSEG0ピンに、約32Hzの矩形波を加えて、タイミングを取りながらスキャンさせる方法を実験により確認する。
簡易的に、COM1のみで、COM0,COM2〜COM6は未接続にしてあるので、目的のセグメント以外も点灯してしまうが、
それは今回は無視する。(動作原理を実験によって理解するのが目的)
・今回は、2つの信号しか使わないが、将来7つのCOMと、8つのSEGをフルコントロールすることを考えて、ポート数の多い、
PIC32MXトレーニング基板(PIC32MX340F256・8MHz External
X'tal Oscillator, 20x PLL)を使うことにした。
・T1割込みを使って、駆動パルスを生成することにした。
割込み周期は、16mS(62.5Hz)とし、割込みの頭で、以下のような交流ドライブ処理を行った。
これによると、最小表示更新周期は、32mS(31.25Hz)ということになる。
//// 交流ドライブ
/// イニシャルレベルは共に、Hi
/// 割込みの頭で、COM1・7SEG_PORTのデータを反転する。
COM1 ^= 1;
SEVEN_SEG_PORT ^= 0xFF; ///
セグメント・データ更新処理(今回は固定表示)
if (!COM1) { // COM1が Loならば以下を実行
SEVEN_SEG_PORT= 0b11011011; // 0xDB→ "3℃"を表示
}
・久しぶりに、PIC32MXトレーニング基板を出して、PICkit2で、HEX書込みをしようと思ったら
「Device is Code Protected most be Erased first」エラーメッセージ発生。
Google翻訳だと「デバイスはコードで保護されています。
最初に消去する必要があります」ということらしい。
このエラー、デバイス認識OK→ インポートもOK→ 書込み動作の後に出た。
よく判らないが、[Tool]メニューの、Enable Code Orotectに、チェックマークを入れたり、入れなかったりしてWriteすると、その内、
書込みコンプリ―トにはなったが・・・・
このエラーは初体験。
WIN10のアップデートが関係あるのかな??
というか、WIN10で、PICkit2は動かないという情報がWEBにあった。
※ PIC32MXは、WIN10の場合、PICkit3でないと駄目なようだ。(PIC18F・PIC24Fは、WIN10と、PICkit2の組合せで書込めていた。)
・PIKkit3+MPLAB IPE
v3.05の組合せで問題無く、HEX書込みに成功。
動作確認もOK。他のセグメントが点灯してしまうが、今回は無視。
■ 2020.12.18
・STEP1のタイミングを自作ロジアナで確認してみた。
1画面に、6CHしか表示できないので、2画面に分けてタイミング波形を取得した。
良さそうである。
■ 2020.12.19
・STEP2プロジェクト開始
<動作仕様>
・ STEP2:
中央の7セグに、'0'〜'9'までを、約1秒毎に表示させる。
℃"セグメントは"℃"は固定表示でよい。
簡易的に、COM1のみで、COM0,COM2〜COM6は未接続にしてあるので、目的のセグメント以外も点灯してしまうが、
それは今回は無視する。(動作原理を実験によって理解するのが目的)
・ソフトを検討する。
@ まずは、7セグデコードの必要があるので、次のようなセグメント・テーブルを用意する。
unsigned char seg_data[] = { // Data Table 7Segment
0x77, 0x12, 0x5d, 0x5B, 0x3A, 0x6b, 0x6f, 0x52, 0x7f, 0x7B
// [0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
};
A セグメント・データ更新のタイミングは、COM1が
Loになった時の回数をカウントし、カウントが32になったら
セグメントテーブルの配列のナンバーを以下の様に更新することによって行った。
/// セグメント・データ更新処理
if (!COM1) { // COM1が Loならば以下を実行
++count;
SEVEN_SEG_PORT= seg_data[number] | 0x80; // count=1〜30まで同じデータをSEGに出力(最初は、'0'表示)
if (count == 31) { // 32mS x (31-1) = 960mS毎に、セグデータ更新('1'〜'9')
count= 0;
++number;
if (number < 10) SEVEN_SEG_PORT= seg_data[number] | 0x80;
else number= 0; // number= 10で、0にリセット
}
}
・動作確認は問題無し。OK
今回の動作写真は、バックライト無しにしてみました。
・タイミングも取ってみた。 以下は、'2'→ '3'への更新タイミングです。
■ 2020.12.22
・今迄の実験(STEP1, 2)では、COM1以外のCOMピンはオープンにしてある為、他のセグメントの一部が点灯してしまう。
他のセグメントを消したいが、他のCOM0, 2〜6を何らかの固定レベル印加で、安易に消せない。
全てのCOMピンをポート接続して、スキャンさせSEGデータとのタイミングで消すしかないように思う。
それには、中間レベルが必要になりそう。
中間レベルと、Hi、Loの3つのレベルを切替える必要がある。
PICの出力ポートに3ステートモードは無いので簡単には出来ない。
やるとすれば、マルチプレクサで切替える必要が出てくる。
それも、7つのCOMに対して実行する必要があり、とてもやる気が起こらない。
そこでセグLCDコントローラ・ブロック内蔵の、PICを選んで、それで仕切り直しすることにした。
・仕切り直しする前に、せっかくなので他のセグメントも意味あるものに点灯させようと、簡易的に全てのCOMを共通にして
同じ信号を入れてみた。
以下の写真のように、中央の、"88℃"(COM1,COM2で動く)は、7SEGの各セグメントの割付けが同じになっているので、
上下桁共に、'0'〜 '9'まで繰返し表示するが、右下の小さい"88"は、割付けが異なるので一部数字にならないセグメント点灯になる。
■ 2020.12.30
・これまでの経緯を、まとめて一旦HPにアップすることにした。
それからやはり複数COM(それも7コモン)を、PICだけでコントロールするのは、かなり難しいことが判ったので、
セグメントLCDのコントローラを持つPIC24FGCシリーズの内、私自身使用経験のある
「PIC24FJ64GC006」を使うことに方針変更して仕切り直すことにした。
これにしても設定がかなり面倒な感触ではあるが、学習を含めて来年チャレンジしてみようと思う。
※ ここから、「PIC24FJ64GC006を使って、セグメント液晶:TX10941-02の表示テストを行う」:STEP3の記事
■ 2021.1.1
・PICで始めるアナログ回路_後閑さん著書_7セグLCDの例で、セグメントLCDのコントローラを持つ
PIC24FJ64GC006による、デジタル・マルチメータの製作例が載っていたので、その記事を参考に
実験を進めて行こうと思います。
まずは記事を熟読して設定方法を私なりに理解してみようと思います。
■ 2021.1.7
・後閑さんの本を解読していた。
大方の流れは理解出来た。
自分なりに記事を整理すると以下のようになる。
<PIC24 GCファミリ内蔵LCDドライバモジュールについての覚え書き>
・コモンピンが8ピンまで増やせるので、最大8マルチプレクス方式まで対応できる。
→ 今回は、7_COMマルチプレックス
・セグメントピンが64ピンデバイスでは29ピンなので、最大29×8=232セグメントまで駆動可能
→ 今回は、SEGピンは8本なので、8x7= 56セグメント駆動
・バイアス電圧は、3種類まで使用可
・レジスタの種類
@ LCDCON: 制御レジスタ
A LCDREG: チャージポンプ制御
B LCDPS: 位相レジスタ
C LCDSE0〜 3: セグメント有効化レジスタ
D LCDDATA0〜 31: セグメントデータレジスタ
E LCDREF: リファレンス電圧制御レジスタ
・設定手順の概要
@ LCDSEnレジスタで、どのピンをセグメント制御用として使うかを設定
A LCDCONレジスタ+LCDPSレジスタで、バイアス電圧やマルチプレクスの選択・周期時間等の基本動作を設定
B LCDDATAxレジスタにセグメントデータを設定→ この設定が面倒そう。
→ これでスキャン制御が開始され、タイミング制御部でセグメント駆動ピンを順次駆動し、
LCDDATAxレジスタの設定内容にしたがって、バイアス制御部で生成された電圧をセグメントピンに出力する。
※ マルチプレクス方式を使う場合には、コモン出力ピン側も順次駆動され、コモンごとにセグメント出力ピンにバイアス電圧が出力される。
このスキャンをプログラム実行中も一定周期で繰り返す。
さらに、このスキャンはスリープ中も実行するようにできるため、スリープ中でも液晶表示器の表示が消えることはない。
//=====================================================================================================
・自分のハードに適用することを検討し始めた。
LCDデータセット等に必要になる表資料の以下3点をExcelにて作成した。
@ セグメント液晶:TX10941-02の、COMとSEGとPINの関係表
尚、各セグメントと電極の対応については、ここが参考になりました。
A LCDDATAnレジスタと、セグメント(SEGn)との対応表
B LCDデータテーブル表(7セグ用)
・上記とデータシートの各レジスタマップの説明を参考に今回の液晶の初期設定を検討して行った。
詳細は、本ページ末尾の、ソースを参照してください。
■ 2021.1.12
・PIC側の、その他のソフト検討に入る。
@ クロック設定
今回は省エネにしたいので、遅めの、Fcy= 1MHzの設定にした。
原発振は内蔵8MHzFRCを使用し、PostScalerにより1/4に分周し、Fosc= 2MHzとする。
/// CONFIG2
#pragma config FNOSC = FRCDIV // Initial Oscillator Select (Fast RC Oscillator with Postscaler (FRCDIV))
/// メイン
int main(void){
/* クロックの設定 */
CLKDIVbits.RCDIV = 2; // Fosc= 8MHz/4= 2MHzクロック (1MIPS= Fcy= 1MHz) ※ 2設定で1/4
A ポート設定
今回のPICボードは、以前ユニバーサル基板で作った、本PIC搭載の自作オシロ基板を改造(必要なピンをヘッダピンに引出す。)し
それを流用して使うことにした。
自作オシロ用のSW・RE・DSW類は今回未使用だがTRISとプルアップ設定は残した。
(ジャンパーにて本実験用接続と、オシロとしての接続を選択出来るようにした。)
設定は以下を参照してください。
■ 2021.1.14
・実験に使う自作オシロ基板の改造〜
テストソース作成〜 HEXまで準備完了。
尚、PICkit3によるHEX書込み時には以下の注意が必要になる。
ICSPDATピンと、RB7/COM6ピンが共用になっているので、HEX書込み時には、RB7/COM6ピン側のジャンパ
を外す必要がある。
書込み後、PICkit3を外し、ジャンパを接続して、P_ON起動させる。
(添付回路図はそう書いてるが、このジャンパピンは実際には未実装で hex書込み後、PICkit3コネクタ-4pinに直接
RB7/COM6からの1pinコネクタを挿入している。)
・動作確認で最初、中央の1桁目の7セグが表示しない等の現象が起きたが、これは、COM0,1ソケットのピン挿入先
が、1pinずれていたイージーミスで、これを直したら、下の7セグの表示がおかしい以外はOKになる。
下の7セグの表示がおかしいのはLCDデータ・テーブルのデータビットの読み違いが原因の記述ミスだった。
これで何とか、PIC24F_GCシリーズ内蔵の、LCDドライバによって、セグメントLCDを駆動することが出来た。
思ったより順調に動かせて、ほっと一息といったところ。
・表示テストプログラムは、7セグ部は、1秒毎に、00〜
99を繰返し、その他の個別セグメントは、ON/OFFを
繰返す様に動く。以下にPIC基板の様子及び、表示例と、MP4動画ををアップした。
※ MP4動画は、こちらからどうぞ→ LCD_MOV.mp4
■ 2021.1.15
・現在の設定:1/7マルチプレックス・1/3バイアス駆動・タイプA波形で動いているLCDのタイミング波形を確認してみた。
以下のような波形が取得出来た。それらしい波形になっている。
・1コモン当たりのスキャン時間(リングカウンタ入力クロック周期)は、LCDクロックの設定が
原発振:31.25kHz/32= 977Hzこれを、プリスケーラで分周し、977Hz/5=
195Hzとしこれが、リングカウンタに入力されるので、
195Hz≒ 5mS(5.128mS)ということになり、測定結果とほぼ一致している。
フレーム周波数は7コモン分なので、≒35mS(35.89mS=
27.9Hz)になる。
<回路図>
(1) PCB0112-1A0液晶
・こちらからどうぞ→ 「Aitendo_7桁7SEG液晶の実験回路図」
(2) TX10941-02液晶
・こちらからどうぞ→ 「セグ液晶テスト1_TX1094A-02」
「PIC24F_TX1094A_セグ液晶実験」→ 210119
追加更新
<最終ソース>
(1) PCB0112-1A0液晶
/// メインソース
LCD_PCB0112_TEST.c
/// LCDライブラリ
LCD_PCB0112.c
LCD_PCB0112.h
(2) TX10941-02液晶
/// メインソースのみ
LCD_TX1094A_TEST_1.c
(STEP1)
LCD_TX1094A_TEST_2.c
(STEP2)
PIC24F_GC_TX1094A_LCD_TEST.c
(STEP3)→ 210119 追加更新