漢字表示方法

液晶に漢字を表示させるためにフォントデータは、PIC24だと外付けEEPROM、PIC32では512KBのフラッシュの半分をフォントデータとして占有していました。これはちょっと贅沢な使い方なので、何かいい方法ないかなと、ふと思ったら、SDカードにフォントデータを格納して、セクタ直接アクセスで読み出す方法に思いつきました。昔のMS-DOSの起動ディスクのMSDOS.SYSとIO.SYSの読み出し方法に似ています。
物理フォーマットしたまっさらなSDカードにフォントデータをコピーします。データ領域のセクタの先頭から順に配置されます。コピーするデータはフォントーデータがセクタを跨らないようにします。FATのデータ領域開始セクターから、リニアに配置されるので、漢字コードから計算してフォントデータが取り出せます。フォントデータは、物理配置が動かないように、Read only、システム属性をつけておきます。
文字を表示するたびに毎回SDカードへアクセスするので電流を食いそうですが、キャッシュを持たせればある程度回数は減らすことができます。

PIC32でMP3再生2

先日のRAM上プログラムダウンローダーでMP3再生ができることを確認しました。SDカード内のMP3ファイルを再生できます。
プログラムを全てをRAMに載せると容量が足りません。RAM上からROMコード呼び出す方法で、液晶表示、MDD File SystemはROM上、MP3デコーダDAC制御はRAM上に配置して、プログラムが収まるようにしています。
次の課題は写真の筐体内にある内蔵スピーカーの音質対策です。もうすぐ閉店のCoCoNet液晶工房で適当に選んだ直径1cmの小型スピーカーを内蔵していますが、音楽再生では音ワレがひどいです。しかも、半田付けのときコーンの一部を溶かしてしまいました。

小型スピーカーといえば携帯電話やiPhoneのスピーカーです。あんな小さくても良く鳴るので感心します。

この書き込みのスターは気にしないで、、、アイコンを連射したら、戻せなくなった・・

「リモートメッセージディスプレイ」とりあえず完成

bluetoothで液晶を制御して描画できるデバイスです。
当初、液晶描画用コマンド、画面保存コマンドを考えていましたが、都度コマンドを作るのは面倒なので、プリミティブな処理関数とLispライクなスクリプトエンジン載せました。
bluetoothのシリアルポートターミナルでスクリプトコードを書いて実行や電源投入後自動的にSDカードに保存したスクリプトコードをロードして実行できます。

★ランダムに円を書くスクリプトを実行

スクリプトはこんな感じです。


( progn
 ( setq @c 2 )
 ( concurrent
  ( progn ( locate 0 0 ) ( puts ( timestamp ) ) ( if ( keyup ) ( setq @c ( clip ( getnumtp ) 1 30 ) ) ( nop ) ) )
  ( while 1 ( progna ( circle ( rands 240 ) ( rands 320 ) @c ( rand ) 0 ) ) )
 )
)

BMP選択メニューを表示して、BMP表示するスクリプトを実行

スクリプトはこんな感じになります。

( progn
 ( setq @b 0 )
 ( setq @c ( filelistbs "*.BMP" 16 ) )
 ( while ( progn ( clrscr 0xffff ) ( data 1 ) )
  ( switch
   ( menubox "↑" ( load @b ) ( load ( + @b 1 ) ) ( load ( + @b 2 ) ) ( load ( + @b 3 ) ) "↓" )
   ( if ( > @b 0 ) ( setq @b ( - @b 1 ) ) ( nop ) )
   ( progn ( loadbmp 0 0 ( load @b ) ) ( while ( == ( touchy ) -1 ) ( nop ) ) )
   ( progn ( loadbmp 0 0 ( load ( + @b 1 ) ) ) ( while ( == ( touchy ) -1 ) ( nop ) ) )
   ( progn ( loadbmp 0 0 ( load ( + @b 2 ) ) ) ( while ( == ( touchy ) -1 ) ( nop ) ) )
   ( progn ( loadbmp 0 0 ( load ( + @b 3 ) ) ) ( while ( == ( touchy ) -1 ) ( nop ) ) )
   ( if ( < @b ( - @c 4 ) ) ( setq @b ( + @b 1 ) ) ( nop ) )
   ( nop )
  )
 )
)

関数は119個あります。ファイル操作、演算、制御、メモリ管理等のPC環境でも実行できる汎用的な関数は84個、PIC24Fのハードウェアを制御する関数は35個。内部で関数コードを128個としているので、もうすぐ枯渇します。

PIC32でRAMからROMコードを呼び出すことができた

ようやくで来ました。ebaseの設定でおかしな動きをしてました。
ROM上のダウンローダーが設定した割り込みベクタのベースアドレス(cp0_ebase)をRAM上プログラムに実行を移した時に書き換えていた。その後、RAM上プログラムがROM上ダウンローダーを呼んだら、RAM上のベクタを読みに行き、ROM上ダウンローダのベクタアドレスは設定されていないので迷子になっていました(リセット)。
各々のベクタをROM上ダウンローダーとRAM上プログラムが排他使用するようにしました。
これでMDD File Systemなどアプリ開発ではほぼ変更しないコードをROMに置くこと(追いやること)により、全部入れると128KBでは足りない大きなプログラムもRAM上で実行できるようになります。フラッシュにも書き込むこともないので寿命も気になりません。

PIC32でRAMコードからROMコードの呼び出しがうまく動かない

短いROM上コードは正常に戻ってくるが、Microchip solutionのMDD File SystemのFSInitを実行すると、戻って来れずリセットがかかってしまう・・・__longcall__属性してるけど・・・