電源系の配線ミスってた(悔)

ふと、充電コントローラーを半田付けしてないのに、USBを差して動いているのだろうと気づく 。バッテリ出力に繋がるべきレギュレータ入力がUSB電源に繋がっていた。暫くはバッテリをつけないから、このままにしておくけど、それにしてもショック!! ああ、切って貼ってしないと。

PIC32MX基板でRAM上コード実行

PIC32MX基板でも動かすことができました。.ramfuncではなく、マニュアル読んでバスマトリックスレジスタを設定しました。バスマトリックスのメモリパティショニングのレジスタはC32コンパイラのstartupルーチン(crt0.s)を書き換えて設定しています。
次のステップのAitendoのWQVGA LCDの動作確認だ!!

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セクションをうまく使えば、なんとかなりそうかな。

PIC32MX基板興し

以前にDigiKeyで買ったPIC32MX695F512H用に基板を興して、部品を実装しました。
LEDチカチカとUSB MSDの動作確認ができました。
[
その時買ったPickit3にも火をいれましたが、Pickit2と使い勝手が異なりちょっと手間取りました。Pickit3はCPUのアーキテクチャを変える度にPickit3のファームウェアが書き換えられます。頻繁に書き換えるのは嫌なのでPIC32用として利用します。PIC24用にPickit2もまだまだ現役。

まさかこんなに役に立つとは・・

第36回のPIC情報交換会で私が頂いたジャンク基板はMCP1650のDC-DCの基板でした。私はグループ2の計画停電対象地区に在住です。まさか、こんなに役に立つとは思いもよりませんでした。秋月の1Wの100ルーメンのLEDを3つ付けて、タカチのアルミのケースに入れました。

捨ててしまった(T_T)

そういえば、先週の土曜日に鈴商でかったBU9480F君。小さいから無くさないように秋月で買った部品と同じ紙袋に入れておいたが、秋月の部品を取り出してその袋を捨ててしまっいた。ゴミはすでに出してしまったので、今頃、灰になってるでしょう。