PICでLCD、SDカード、漢字フォント、Bitmap表示

2016年9月20日

dsPIC30F4013でタイトル通りの事ができましたよ。
完成図
SDカードとLCD(DST9901A-NH)の配線でカオスになってます。@4本タッチパネルは配線していないので更に。
SD_LCD_BMP_FONT
Bitmapと12×12と16×16(ど真ん中の漢字)、それ以外は12×12の英文字の図
テストのため、3つのBitmapがSDカードに入っているので、次のファイル名が画面に出てます
時計もRTCがないため固定値からカウント
完成図1
回路図よー
dsPIC30F4031_QVGQ_LCD
全部のPIN完璧に使ってます
UART(PIC18Fと通信でUSBの予定)はまだ作ってないですが、Windowsとつないで特にやりたいこともないみたいな
しかしよくやりましたわ
・SDカード
・LCD
・SDカードに入っている漢字フォント表示
・SDカードに入っているBitmapファイルの表示
・PICKITの次切り替え
解説
SDカードは、「microchip_solutions_v2013-06-15」にある、
C:\Program Files (x86)\Microchip\microchip_solutions_v2013-06-15\Microchip\MDD File System
の中に入っているものを使いました。足りないファイルが3つくらい必要ですが、検索をかけて見つかったものを入れて完成です。
HardwareProfile.hですが、dsPIC30F4013用のがなく、18F、24F、33E、24Eしか書いていないわけですが、とりあえず似ている24Fのをコピーしてぺースとしてあとは、PINの場所を設定してレジスタが1つだけ名前が違うので、そこも変更。
さてさてここで厳しい現実。このプログラム。バッファで1kbyteとその他もろもろで、大体のPICは2kしかないので、stak error起こして終了です。
なので、FSconfig.hの中にあるフォーマットや書き込みやdirをコメントアウト、#define FS_MAX_FILES_OPENを3から1にして、やっとのことで動いた有様です。
HardwareProfile.hの中にある#define USE_SD_INTERFACE_WITH_SPIをコメントから外します。
あとは、するっと動いたがします。
英文字フォントだけFlashに入れておきます。そうすると、SDカード内のファイル一覧が表示できます。
フォントは電子工作の実験室の何処かにあったものを使わせてもらいました。
16×16のフォントはSDカード内に入れて使います。これを作るのが大変でした。
あー、ここで結構重要なのが、SDカードさした時にすごい電流引っ張るみたいで、電源の近くにセラミックと電解コンデンサつけておいた方がいいみたいです。Trapのアドレスエラーとかクロックエラーとか出ます。
LCDですが、aitendoさんから購入した400×240です。
上下に1列ずつPINが出るように、クイックポジで作りました。2列で作るとポジの配線が上手くいくかどうかとか、スタットつけないと自立出来ないとかブレットボードで使えないとかで、上下1列ずつです。
Bitmap表示するまで色がへだったんですが、RGB16bitがBGRで初期化しないとだめで、ちょっと時間かかりました。
FSfread(&bfh, 1, sizeof(BITMAPFILEHEADER), fp) != sizeof(BITMAPFILEHEADER))
こんな感じでBitmapヘッダをつるっと読み込んで、ヘッダにあるbitmapが始まるオフセットにseekして、24bitのデータを16bitフォーマットに変換して、つるっと表示です。BitmapはBGRで並んでるんですねぇ。


あとは、PICKIT3のデバックPINの変更です。
回路図にある4052はアナログスイッチです。TC4052とか他社でも出しているはずです。PGDが双方だと思うので、アナログスイッチです。電源ON時はそれ以外のPINがInputのはずだったので、PGDをEMUCD1に切り替えるため、一番先に切り替えるPINを出力にして、デバックPINを切り替えます。
アナログ回路で、4051 4052辺りはよく使うので、いっぱい持ってます。
書き込みはPGD,PDCで、終わったらConfiguration通りに動くんですが、ここの切り替え普通はどうやるんでしょう。知っている人がいたら教えてください。


その後ですが、dsPIC33FJ256GP710とPIC32MX220F032Bは一度だけPGx1からConfiguration registerを別のところに書き変えたら、以降はそこでいんですよね。なぜこのPICだけおかしいのかよくわかりません。
そういえば、ブレークポイントも設定しておくとリセットできないのはこのPICだけなんですよね。そしてメモリも容量の表示が実際より大きかったり。わけがわかりません。


5V->3.3Vレギュレータですが、2A品なので流石にそこまではというわけですが、熱くなるのでヒートシンクをつけました。電流測ればいいわけですが、なまぐさ面倒なの調べませんが、レギュレータに保護回路があるはずなので、おkじゃないかと。
あとはRTC使いたいわけですが、SD,WE,LCDのCSは固定なのでいらないかなと。送信データがずれたときに必要なんでしょうか。とりあえず、SD_WEは使わないのであと1PINくらい必要かな。んー無理かなー、18FでA/Dとかやるつもりなので、このままがいいでしょう。
それと、タッチパネルプログラムしてないですねぇ。用途が微妙でメモリ少なすぎるので、タッチボタンつけても、画像処理のメモリがないです。んー、何かいい使い道ないですかねぇ。表示ファイル押して、表示とか?
dsPIC33FJ256GP506と変換基板持っているわけですが、四角形に2列ずつコネクタがあるわけですが、またそれを2列に変換しないと使えません(´Д`)
が、使う気になればいけるわけで、SDカードもフルスペックで動きますねぇ。いまLCDは8bitバスで動いているので、16bitで通信ができそうで、画像表示に2秒くらいかかるのが早くなるとか、画像の上にWindouwつけたり、もやれそうなメモリ持ってるし。そういえば、5VトレラントPINがほとんどだったので、18Fとの通信も楽かな。USBのデータって3.3V何でしょうか? その辺は作るときに考えましょう。
漢字が小さすぎるので、32×32フォント探したんですが、ないです。BDFファイル形式のがそれっぽいみたいですが、ヘッダーとか構造を調べないとだめとか、メモリ虫の生きだとか。
水晶発振子付いてますが、いまはFRC_PLL16にして、120MHzで動かしています。UART使う時に困りそうなんですが、キャリブレートの方法がMicrochipの何処かに書いてあったので、見てみます。
それで、1Pinあきましたね。RTC頑張ればつきそうですが18Fでやってもいいわけで。
こうやって記事を書いていると、dsPIC33FJ256GP506を使いたい衝動にかられてますw
A/Dは、500msecでMain処理しないといけないのでRTOS?。チャレンジするのもいいかもしれません。ソフトウェア割り込みって使ったことないのですが、多分想像どおりなのかな。結局18F使わないと、USBでつながらないわけですが、豪華PIC32が山ほど持っているので、こっちに任せましょうか。
MCU変えるにしても、ここまで作ったんだからプリント版作って、ちゃんとしたものは作っておきたいですね。このままでは、実験品になって、超もったいないです。LCDは小さい方を採用といことで。ほんとPIN配列めちゃくちゃなんですよねぇ。ジャンパ線かなり必要かもしれませんねぇ