電源系の配線ミスってた(悔)
ふと、充電コントローラーを半田付けしてないのに、USBを差して動いているのだろうと気づく 。バッテリ出力に繋がるべきレギュレータ入力がUSB電源に繋がっていた。暫くはバッテリをつけないから、このままにしておくけど、それにしてもショック!! ああ、切って貼ってしないと。
PIC32でRAM上コード実行
PIC32のFlash回数は1000回(min)です。H8とかの100回よりましですが、PIC24の10000回と比べると、中華LCDとかのデータシートが怪しいデバイスのソフトを作るには、ちょっと心配です。また、Flash書き込みは時間がかかります。そこで、RAM上にシリアルポートからXmodemプロトコルでバイナリコードをダウンロードしてプログラムが実行できる簡易ローダーを作ろうと思いました。オプティマイズのPIC32USBで試作です。昔H8用にオールアセンブラで作ったことあるので、すぐできるかなと思っていましたが・・・
- 4バイトアライメントでバイナリコード格納用配列確保
- Xmodem(1K,128のチェックサムのみ)でバイナリコードを受信して配列へコピー
- インラインアセンブラで絶対ジャンプ命令(MIPSはJR+NOP)を使って片道切符で格納用配列のアドレスへジャンプ
int Jump( unsigned long dwAddress )
{
asm volatile(
".set noreorder\n" ←これが無いとnopが変な位置に移動する。
"jr $a0\n"
"nop\n"
"nop\n"
);
}
という感じで・・・
バイナリコードを転送し、配列をダンプしてダウンロードできていることを確認。
さて、絶対ジャンプ・・・あれ、動かん!!MPLAB SIMでも止まってします・・・
ちなみに転送するコードは別プロジェクトで、リンカースクリプトの.textセクションを格納用配列に設定し、pic32-objcopyでelfの.textを抜き出してbinaryに変換。
次の日、嫁さんの実家で、iPhoneに登録してあるPIC32のマニュアルのバス周りを読む、、、なんか色々なレジスタがあって面倒だなと思いつつ、ああそっか、PIC32はハーバードだ、データ領域として設定されているRAMではコードは実行できんのか、、(ちなみにH8はノイマン)
帰宅後、ということで、まじめに設定するのは面倒だし、PIC32USBのブートローダーのコードは非公開で、どう設定しているかわからないので、
void DummyFunc( void )
{
asm volatile(
".repeat 2048\n"
"nop\n"
".endr\n"
);
}
の関数をつくって、DummyFuncのアドレスに転送し、絶対ジャンプ、動いた!!
次はこの間作ったPIC32MX基板で動かそう。
バスマトリックスのレジスタ設定は、crt0.sとの整合がめんどうなので、.ramfuncセクションをうまく使えば、なんとかなりそうかな。
まさかこんなに役に立つとは・・
第36回のPIC情報交換会で私が頂いたジャンク基板はMCP1650のDC-DCの基板でした。私はグループ2の計画停電対象地区に在住です。まさか、こんなに役に立つとは思いもよりませんでした。秋月の1Wの100ルーメンのLEDを3つ付けて、タカチのアルミのケースに入れました。
捨ててしまった(T_T)
そういえば、先週の土曜日に鈴商でかったBU9480F君。小さいから無くさないように秋月で買った部品と同じ紙袋に入れておいたが、秋月の部品を取り出してその袋を捨ててしまっいた。ゴミはすでに出してしまったので、今頃、灰になってるでしょう。
作業場移転
年末に引越しし、作業場を立ち上げるのに時間がかかってしまった。
明日のPICクラブには作品が間に合わぬ・・・