2013-09

2013-08 FM3 RX62N SH2A PIC32MX


9月

PIC32MX: SPIは叩けるようになった。

  • Pinguinoの割り込み系関数はmx220だと微妙にずれていて動かない
  • (ので、ライブラリを手でコピペして、MCHIPのPDF見ながらいろいろ番号を書き換える必要がある)面倒ぃ


1bit DACは作れなかった。

  • (一応、正弦波もどきは出せたけど・・・たぶん全部事前計算にすればDDSっぽいものなら作れるけど、なんかべつにPWMとそんな変わらん感じでボツ感漂う)


PIC32MXでVGA出力

  • https://raw.github.com/iruka-/ATMEL_AVR/master/web/jpg/pic32vga.jpg
  • とりあえずだらだらと続けている。
  • 目標は、TTL爺さんよりは先に完成させたい。





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を起動させている。


  • https://raw.github.com/iruka-/ATMEL_AVR/master/web/jpg/vgatest1.jpg

しかし、ジッターがひどくて画質的に実用性がない。

  • というか液晶モニターがなかなか同期とってくれないって、どうよ?
  • 一応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();等価の処理は書かれている。まさかシングルベクターなわけはない(はず)。


  • 3) USB_POLLINGでもジッターは出る。
    • USBを使うのを諦めて、main()側を
       while(1) {
            asm("wait");
       }
    • とか
       while(1) {
            asm("nop");
       }
    • にすると直った。


  • あと、DOT CLOCKがちょっと低めなので、クロック上げて、ソースを整理したい。





PIC32MXでVGA出力:ここまで出来た。

結局、640x480のドットクロック25.175MHzを出すことが出来なかった。

  • ドットクロック20MHzだと、縦のラインがぼやける
  • ドットクロック24MHzだと、2,3文字に1文字の割合で特定の縦ラインのドットが2倍になって文字が歪む。見栄えが悪い。
    • たぶんブラウン管ならドットのサンプリングをしないので全然平気だとは思う。でも21世紀にブラウン管はありえない
  • CPUを50.35MHzで動作させれば可能。
  • そのためには、4.1958MHzか、その整数倍(5倍まで)の水晶が必要。
  • ・・・
  • 諦めて、800x600 SVGA @60Hz (ドットクロックは40MHz)を使うことにした。
  • https://raw.github.com/iruka-/ATMEL_AVR/master/web/jpg/vgatest2.jpg
  • もちろん、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に入れるのは無理?


そんなことは無かった。





PICとAndroidとUSB接続する Microbridge


  • またなんかやばそうなものを見つけてきた。
  • そうそう、アンドロイドのUSB端子から、ADB(debugger)接続するプロトコル をPICに喋らせたら、端末をハックし放題(デバッグし放題、とも言う)だよねー、って昔言ってたやつをほんとに実行してる人がいたわけ。

これから読む。・・・




<前の月次の月>