2013-09
2013-08 FM3 RX62N SH2A PIC32MX
9月
PIC32MX: SPIは叩けるようになった。
- Pinguinoの割り込み系関数はmx220だと微妙にずれていて動かない
- (ので、ライブラリを手でコピペして、MCHIPのPDF見ながらいろいろ番号を書き換える必要がある)面倒ぃ
1bit DACは作れなかった。
- (一応、正弦波もどきは出せたけど・・・たぶん全部事前計算にすればDDSっぽいものなら作れるけど、なんかべつにPWMとそんな変わらん感じでボツ感漂う)
PIC32MXでVGA出力
PIC32MX: HIDBoot.Xを地道に改良。
- crt0.Sに .weakな例外ベクターのjmpテーブルを作成。(実際には例外は使ってないので他プロジェクトで活用するためのもの)
- コードサイズを1K弱縮めてみた。
- __IntVectorTable[]とか__IntSrcTable[]という大ボスがまだ残っている。
- HIDBoot.Xでは、実際のところ例外(割り込み)を使用しないので、INT***()関数を追放するか、最小機能のものに置き換えることが出来れば、さらに2kBは縮むはずだ。
- あと、一般例外(general_exception_vector)とブート例外(boot_exception)も、どうせ使ってない(NOPが置かれて放置されているだけ)ので、これらも外して、BOOT-ROMを全部フラットで使っちゃうとかすれば、下手すると常駐4kB FLASH(+3kB BOOT)に収まるかも。
PIC32MX: HIDBoot.Xをさらに改良
- __IntVectorTable[]とか__IntSrcTable[]は、無くてもなんとかなるっぽい。(INTClearFlag()がダミー関数になるけど)
- 消してみたら、FLASH使用量は5kB強になった。
- あと1kBなんだけど、BOOT-ROMのほうには512byteは空きがあるので、結局のところ4kBに収める射程内に入ってしまった。
ああどうしよう。縮めちゃうよ。
- なんかSPIを動かすという目標はぜんぜんつまんなくて、ROM4kBに収めることのほうが俄然面白い。 病気か?
- 作りかけだけど、ダウンロード:HIDBoot.Y.zip
600バイトくらい足が出ている。--- 今は逆に256byte以上余っている不思議。気づいたらそうなっていた。俺どうかしてる。
このまま行くと、全部mips16アセンブラで書きそうで怖い自分。--- その必要は無かった。crt0.S以外は全部Cでっせ。
次の予定
- せっかくFLASHが256以上空いたので、PIC32MXのPinの電位状態を一括モニタリングするpollコマンドを仕込んで、グラフィカル表示&マウスでLチカというのをやってみる(予定
PIC32MXでVGA出力
なんと、
- DMAでSPI2 out出来るようになった。(20Mbps)
- HSYNCはTimer1割り込みでタイミングを取っている。
- HSYNC割り込みでDMAを起動させている。
しかし、ジッターがひどくて画質的に実用性がない。
- というか液晶モニターがなかなか同期とってくれないって、どうよ?
- 一応640x480 31kHz (60Hz) VGA
原因究明中だけど、迷宮入りかも。 - 測定器欲しい。
今疑っているところ
- 水晶まわりの配線
- 電源周りのパスコン
- 水晶そのもの(12MHz)
- 水晶に繋ぐ負荷コンデンサ(付けてない)
- 各種SFRの設定値。(Tmr1割り込みとか割り込みとか・・・)
- そして、MicroChip本社。(エラッタのこと)
PIC32MXでVGA出力:原因究明中
電源周りのパスコン
- なんと、入れてなかった。
- 3端子の出力側の付け根に33uFの電解コンを一つ入れてた。
- AVdd-AVss間には0.1uF積セラが入ってる。
- PIC32MX内部電圧(2V?)のVcap-Vss間には10uF積セラが入ってる。
- 肝心の3.3V Vdd-Vss間には何も入れてなかった。(つまり、遠くに電解コン33uFがあるだけ状態)
3.3V Vdd-Vss間の一番近い位置に0.1uF積セラを入れてみた。
- けれど、直る気配なし。
- もしやと思って、WindowsPCからUSB給電するのをやめて、安物のUSB充電アダプタから電源を取るようにしたら 酷いジッターは直った。
原因はPCかよ。
- ただ、1ドット弱程度のジッタがある程度規則的に横方向に入る。
- それと、液晶モニターなのにときどき画像が乱れたり消える。
変だなー。
その後:
- あ、違った。usb_config.h 見たらPOLLINGじゃなくてINTERRUPTでUSB動かしてた。
- POLLINGにしたら、画面が全然出なくなったので、割り込みの初期設定をそもそもしていないっぽいというのが諸悪の根源だったらしい。
- 直さなきゃ。
PIC32MXでVGA出力:文字が出たっ
ここで、はまりポイントを解説
- 1) RB15のLED点滅は、SPI2をOnにした瞬間に使えない。
- 理由は、どうやらSPI2のSCKはRB15ピンに固定割り当てされている感じ。
- これが原因で、LEDが点かない=ハング、とずっと勘違いしてた。
- 2) usb_config.h で USB_INTEERUPTからUSB_POLLINGに変更したら死ぬ。
- この理由は、USB側での割り込み初期化が期待できなくなるから。
INTEnableSystemMultiVectoredInt(); INTEnableInterrupts();
- これを入れて解決。最初は asm("ei");を入れていたがハングするばかり。
- crt0.Sを見た限りでは、INTEnableSystemMultiVectoredInt();等価の処理は書かれている。まさかシングルベクターなわけはない(はず)。
- この理由は、USB側での割り込み初期化が期待できなくなるから。
- 3) USB_POLLINGでもジッターは出る。
- USBを使うのを諦めて、main()側を
while(1) { asm("wait"); }
- とか
while(1) { asm("nop"); }
- にすると直った。
- USBを使うのを諦めて、main()側を
- あと、DOT CLOCKがちょっと低めなので、クロック上げて、ソースを整理したい。
PIC32MXでVGA出力:ここまで出来た。
結局、640x480のドットクロック25.175MHzを出すことが出来なかった。
- ドットクロック20MHzだと、縦のラインがぼやける
- ドットクロック24MHzだと、2,3文字に1文字の割合で特定の縦ラインのドットが2倍になって文字が歪む。見栄えが悪い。
- たぶんブラウン管ならドットのサンプリングをしないので全然平気だとは思う。でも21世紀にブラウン管はありえない
- CPUを50.35MHzで動作させれば可能。
- そのためには、4.1958MHzか、その整数倍(5倍まで)の水晶が必要。
- ・・・
- 諦めて、800x600 SVGA @60Hz (ドットクロックは40MHz)を使うことにした。
- もちろん、40MHzのドットクロックは出せない(?要検証)ので、20MHzにして横倍フォント(実質400dot) ということにしてみた。
- HSYNCから、ドットクロック(文字)出力までが妙に間延びしているのは、DMA Kickのルーチンが思った以上に長いから。
- Cソース上ではさほど長くないのだが、SVGAでは1dot=40MHzなので、100クロック掛かれば100dot空くわけで・・・。
- 実際そのくらい。
- あらかじめセットアップする量を増やすとか、全部アセンブラで縦書き(つまり関数は絶対呼ばない)とかすればましに なるのかも。
- Tmr1Interrupt()関数で、MIPS32コード見たら絶望した。MIPSって、こんなに割り込み応答に時間が掛かるのか。
9d00331c <_Tmr1Interrupt>: 9d00331c: 401a6800 mfc0 k0,c0_cause 9d003320: 401b7000 mfc0 k1,c0_epc 9d003324: 27bdff90 addiu sp,sp,-112 9d003328: afbb006c sw k1,108(sp) 9d00332c: 401b6000 mfc0 k1,c0_status 9d003330: 001ad282 srl k0,k0,0xa 9d003334: afbb0068 sw k1,104(sp) 9d003338: 7f5b7a84 ins k1,k0,0xa,0x6 9d00333c: 0000d012 mflo k0 9d003340: 7c1b2044 ins k1,zero,0x1,0x4 9d003344: afba0064 sw k0,100(sp) 9d003348: 0000d010 mfhi k0 9d00334c: afba0060 sw k0,96(sp) 9d003350: 409b6000 mtc0 k1,c0_status 9d003354: afa20018 sw v0,24(sp) 9d003358: 3c02bf88 lui v0,0xbf88 9d00335c: afbf005c sw ra,92(sp) 9d003360: 8c421030 lw v0,4144(v0) 9d003364: afb90058 sw t9,88(sp) 9d003368: 30420010 andi v0,v0,0x10 9d00336c: afb80054 sw t8,84(sp) 9d003370: afb00050 sw s0,80(sp) 9d003374: afaf004c sw t7,76(sp) 9d003378: afae0048 sw t6,72(sp) 9d00337c: afad0044 sw t5,68(sp) 9d003380: afac0040 sw t4,64(sp) 9d003384: afab003c sw t3,60(sp) 9d003388: afaa0038 sw t2,56(sp) 9d00338c: afa90034 sw t1,52(sp) 9d003390: afa80030 sw t0,48(sp) 9d003394: afa7002c sw a3,44(sp) 9d003398: afa60028 sw a2,40(sp) 9d00339c: afa50024 sw a1,36(sp) 9d0033a0: afa40020 sw a0,32(sp) 9d0033a4: afa3001c sw v1,28(sp) 9d0033a8: 10400012 beqz v0,9d0033f4 <_Tmr1Interrupt+0xd8> 9d0033ac: afa10014 sw at,20(sp) 9d0033b0: 3c02bf88 lui v0,0xbf88 9d0033b4: 24030010 li v1,16 9d0033b8: ac431034 sw v1,4148(v0) 9d0033bc: 3c02bf88 lui v0,0xbf88 9d0033c0: 24100001 li s0,1 9d0033c4: 24040018 li a0,24 9d0033c8: ac506138 sw s0,24888(v0) 9d0033cc: 77400c67 jalx 9d00319c <wait_125ns> 9d0033d0: 00000000 nop 9d0033d4: 3c02bf88 lui v0,0xbf88 9d0033d8: ac506134 sw s0,24884(v0) 9d0033dc: 77400cac jalx 9d0032b0 <gen_VSYNC> 9d0033e0: 00000000 nop 9d0033e4: 3c02a000 lui v0,0xa000 9d0033e8: 8c43010c lw v1,268(v0) 9d0033ec: 24630001 addiu v1,v1,1 9d0033f0: ac43010c sw v1,268(v0) 9d0033f4: 41606000 di 9d0033f8: 000000c0 ehb 9d0033fc: 8fba0064 lw k0,100(sp) 9d003400: 8fbf005c lw ra,92(sp) 9d003404: 03400013 mtlo k0 9d003408: 8fba0060 lw k0,96(sp) 9d00340c: 8fb90058 lw t9,88(sp) 9d003410: 03400011 mthi k0 9d003414: 8fb80054 lw t8,84(sp) 9d003418: 8fb00050 lw s0,80(sp) 9d00341c: 8faf004c lw t7,76(sp) 9d003420: 8fae0048 lw t6,72(sp) 9d003424: 8fad0044 lw t5,68(sp) 9d003428: 8fac0040 lw t4,64(sp) 9d00342c: 8fab003c lw t3,60(sp) 9d003430: 8faa0038 lw t2,56(sp) 9d003434: 8fa90034 lw t1,52(sp) 9d003438: 8fa80030 lw t0,48(sp) 9d00343c: 8fa7002c lw a3,44(sp) 9d003440: 8fa60028 lw a2,40(sp) 9d003444: 8fa50024 lw a1,36(sp) 9d003448: 8fa40020 lw a0,32(sp) 9d00344c: 8fa3001c lw v1,28(sp) 9d003450: 8fa20018 lw v0,24(sp) 9d003454: 8fa10014 lw at,20(sp) 9d003458: 8fba006c lw k0,108(sp) 9d00345c: 409a7000 mtc0 k0,c0_epc 9d003460: 8fba0068 lw k0,104(sp) 9d003464: 27bd0070 addiu sp,sp,112 9d003468: 409a6000 mtc0 k0,c0_status 9d00346c: 42000018 eret
- 案の定、$k0,$k1は壊したまま放置している。
- 乗算の結果レジスタも退避が必要らしい。
- こうしてみると、ARMって、コンテキストスイッチ軽いなぁ。(NEON/vfpを除く)
- ↓VGA/SVGAの両方に対応させてみました。
もっと読む: PIC32MXでVGA出力をやってみる
TinyBasic2 for RasPi
これ:
- SDLやtermioを使わないようにコンパイルしてみた。
- MinGW32でstripしてexeのサイズが63kB
- こりゃPIC32MXに入れるのは無理?
そんなことは無かった。
- もっと読む: PIC32MXでBASICを動かす
PICとAndroidとUSB接続する Microbridge
- またなんかやばそうなものを見つけてきた。
- そうそう、アンドロイドのUSB端子から、ADB(debugger)接続するプロトコル をPICに喋らせたら、端末をハックし放題(デバッグし放題、とも言う)だよねー、って昔言ってたやつをほんとに実行してる人がいたわけ。
これから読む。・・・