ちょっとTea Time!? 液晶利用再チャレンジ! 2024.12.19
夜な夜な部品箱を整理していたら、こんな液晶表示器がでてきました。
いつ買ったんだろう?
結構大型ですし、240x64DOTのものです。
で、端子をみてみたら半田付けした後があります。
あまり思い出せませんが、過去に動かそうとしたはずです。
ということで、過去の記事を検索したらありました。
ちょっとTea Time!? 閉店セールの激安LCDを動かしてみる!
約4年前にデジットの閉店セールのときに100円で買った液晶表示器のようです.
思い出したように記事を読み返して、うまく動かせなかった理由をみると、
PICで動かそうとして、速度的に難しかったようです.なんせ、外部からクロックを供給しないと
動かないLCDですから。
こんな液晶表示器がでてきました。
端子に半田付けした形跡がありすから、動かそうとしたはずです。
RP2040をつかって再チャレンジ!
前回はPICをつかって上手く動かせませんでした。原因はPICの速度にあったようですが、
いまはかなり高速で動くPICO(RO2040マイコン)があります。それを使って動かしてみることにしました。
RP2040のマイコンは幾つも買ってしまってあるのですが、今回はIO点数も少ないので、
小型のものを使いました。
この液晶は年代もののようで、動かすには-12Vの電源も必要です。
そのためDCDCも引っ張り出してきて-15Vを加えました。推奨値から
少々電圧オーバですが、まあ問題ないでしょう。
RP2040を使ったマイコンです。円安の前は200円台で購入できました。
基板の裏側にRP2040が載っています。
こんな形でLCDに接続です。LCDは-12V電圧が必要なので、DCDCをつかって-15Vを供給です。え?ちょっと高いって?
共立で購入した安価なDCDCを使って-15Vを生成しています。たしか330円だったかな?
やっぱりPICでは役不足だった?
まずは簡単なテストパターンを描いてみました。
最初は1ラインあたり1ms毎に描いてみました。64ラインあるので全体で64msかかります。
リフレッシュレートは16Hzです。一応、表示はされましたが、さすがにちらつきます。
そこで、ライン描画を200us毎に変更です。このときリフレッシュレートは78Hzになりますから、
もう大丈夫でしょう。このとき、1ライン描くのに約50usかかっているようです。
200us毎のタイミングで50usが描画だけで消費されますから、CPUの占有率は25%です。
結構大きいなあ〜。 そりゅあ、PICでは描くだけでも無理なわけだわ。
ちなみに、PICの命令サイクルは最高の64MHzで動作させても62.5ns(4クロックで1命令)
に対してRP2040は125MHzなので8ns(1クロック1命令)ですから、すくなくともPICの7〜8倍は
高速です。さらに、内部処理がPICが8bitに対してRP2040が32Bitですから、全体的な
性能差はそれ以上になりますからね。
テストパターンの表示ができました。ただ、画面リフレッシュレートが16Hz程度なので、ちらつきが目立ちます。
表示のための割り込み処理を200uS毎に変更です。これでリフレッシュレートは
約78Hzになります。これで画面のちらつきはなくなりました。表示のための負荷
占有率は約25%です。
RP2040ならでは
ドットマトリックスのLCDに何かを表示しようとしたときには、画像イメージをRAM上に置いておく必要があります。
240x64なので、1ドットあたり1バイトを割り当てると15kB必要です。PICだと、RAMは最大でも8kBしかありません
から到底無理です。そこで8ドットを1バイトに割り当てれば必要なRAMは2kBに収まります。これならPICでも対応できますが、
プログラム負荷が大きくなりますから、速度的にも無理がでてくるでしょう。
その点、RP2040ではRAMを256kBもっていますから、1ドット1バイトの割り当てでも余裕です。
まあ、RAMの無駄使いではありますが、使わないのももったいない話ですしね。
で、画像イメージのRAMが持てれば文字表示なんかも簡単にできます。さっそく試してみました。
16x16ドットフォントで表示です。このサイズなので、かなり大きく見えます。
16x16Dotフォントを表示です。昔の液晶なのか、見る角度でかなりコントラストが変わります。
やっぱり昔のLCDだなあ〜
見る角度によってコントラストがかなりかわります。このあたりは年代モノということなんでしょうね。
見る角度でコントラストがかなりかわります。
何につかう?
これは反射型のLCDなので、野外の太陽光の下でもつかえそうです。そのため、テニスマシンの表示器に
とも考えていますが、200us毎の割り込みが必要となると、サーボコントロールのパルス生成(500〜2500us幅)
にかち合っちゃうなあ〜。まあ、おいおい考えていきましょう。
備忘録:LOADタイミングはゆっくりと
LOADパルス幅は最小でも125ns必要です。RP2040の
サイクルが8nsですから、16サイクル分必要です。
とはいえ、すこし短めにしていますが(笑。
そのため、かなり命令は冗長な感じになります。
void image_buffer_write() { static int line = 0; int i; if(line==0) output_high(LCD_FRM); for(i=0;i<240;i++){ output_high(LCD_CLK); if(image_buffer[i][line]) output_high(LCD_DI); else output_low(LCD_DI); output_low(LCD_CLK); } output_high(LCD_LOAD); output_high(LCD_LOAD); output_high(LCD_LOAD); output_high(LCD_LOAD); output_high(LCD_LOAD); output_high(LCD_LOAD); output_high(LCD_LOAD); output_high(LCD_LOAD); output_low(LCD_LOAD); output_low(LCD_FRM); line++; if(line==64) line=0; } |
割り込みの1ライン表示のルーチンです。
一応、波形も観察です。
ドライバのデータシート:MSM5260.pdf
CP(CLK)波形: LOWレベルパルスが50nsと短いけど、
まあいいか(本来はmin125nS)
LOADパルスも短めです(本来はmin125ns)
(おしまい)