2012年06月06日

秋月でPIC32MX 28pin DIP版出る

秋月でPIC32MX 28pin DIP版出る
* はじまり
2012/06
http://akizukidenshi.com/catalog/c/cpic32_dI_ssp/
秋月で、なんと、28pin DIP 300mil の32ビットマイコンPIC32MXが、
さらに、なんと 32KByte + USB機能付で220円ポッキリという
いわゆる、「秋月価格」で販売開始された。

PIC32MX220F032B
http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en556007

ちなみに、メーカ直販価格は2012/06時点で、1個 216円(80円/$)=$2.7、 
1000個以上で1個 168円(80円/$)=$2.1
http://www.microchipdirect.com/ProductSearch.aspx?keywords=PIC32MX220F032B-I/SO

少し前にARM Cortex-M0 の 太めな28pin DIP 600mil タイプがあったけど、このPIC32MX220の300milの
ほうが小さくて良いね。Coretex-M0 DIPも秋月に置いて欲しいけど。

より大容量型:
以下の様に同じ28pin DIPの大容量型も存在するので、これらも秋月価格でだしてほしいね。

    28pin DIP   Flash, SRAM, 
PIC32MX230F128B 128kb, 32kb, USB
PIC32MX250F064B  64kb, 16kb, USB

http://www.microchip.com/maps/microcontroller.aspx

* PIC32MX用コンパイラ
コンパイラは、
1, MPLAB系に付いてくる「pic32-gcc」、
2, Pinguinoプロジェクトで配布している「mips-gcc」(無料)、
  gcc version 4.5.2
  これはPinguinoをインストールすると自動でインストールされる。
  http://avr.paslog.jp/article/2477815.html
   Pinguino X.3なら
   C:\PinguinoX.3\win32\p32\bin
   に実行パスを通せばコンパイル可能。リンカスクリプトやビルドスクリプトは
   一度Pinguino上でコンパイルすると、
   C:\PinguinoX.3\source
   に生成されるので参考になる。
3, Sourcery Codebench Lite MIPS ELF
   gcc version 4.6.3
   mips-sde-elf-gcc
   mips-sde-elf-g++
   後述。 調査中。
4, Chipkit IDEに付属のgcc
   調査中。
   https://github.com/chipKIT32/chipKIT32-MAX/downloads
   mpide-0023-windows-20120903.zip (Windows用)をダウンロード、解凍します。
   

これらのgccは同じgccから派生した物と思われます。
比較はこれからだけど、最適化制限のあるMPLAB系のgccよりも最適化制限のない
その他のgccのほうがFlashサイズが小さくなる可能性が高い。
16bit長のコード生成 / mips16e:
『はじめて読む MIPS(リローデッド)』 by 中森章
http://www.cqpub.co.jp/interface/TechI/Vol39/app/mips_asm.pdf
が非常に参考になります。

ARMのThumbコードと同様に16bit長のコード生成が可能で、実行速度は落ちるものの
Flashサイズを激減させることが出来る。
今回のPIC32MX220等には必須だろう。

mips-gcc -Os -mips16 main.c 
の様にコンパイル時に「-mips16」オプションを付ける。
リンク時にも付ける。

MPLAB IDEの場合、コンパイルオプションの設定で、
General - 「Genarate 16-bit code」にチェックを入れる。
コードの最適化は、「-Os」にしておく。(最適化の期限切れのはずだけど、なぜか多少の効果がある)

アセンブラ出力で確認する:
MPLABなら
pic32-objdump -h -S main.elf  > main.lst 
mips gccなら
mips-objdump -h -S main.elf  > main.lst 
とELFファイルからアセンブラ出力が得られるので、実際の16bit長のコード、
32bit長のコードの使われ方が確認できる。

*OpenOCD/JTAGでPIC32MX220に書込み&デバッグ
以下のスレッド、まだ全部読めてないけどPIC32MX220F03Bは既に
OpenOCDで対応済み風。
http://www.mail-archive.com/openocd-devel@lists.sourceforge.net/msg01059.html
なので、JTAGアダプタさえあればPickit3なしでもFLASH書込み&デバッグが今すぐ
出来る可能性が高い。
28pinしかないのでちょっとつらいけど、
Pingunoプロジェクトの
http://avr.paslog.jp/article/2477815.html
PIC32MX220用のブートローダがそのまま使えるらしいので、
最初にブートローダだけ書いて使うという手が良いかも。
ついでにPinguinoも試せる。

* PIC32MX220のエラッタ
http://ww1.microchip.com/downloads/jp/DeviceDoc/jp556114.pdf
2012/06現在入手できるのは、たぶんリビジョン「A0」か「A1」のはず。
(エラッタは今のところ11個)
ちなみに、このリビジョン「Ax系列」はかなり初期の段階で、これから修正が
入るのと新たなバグが発見されて「Bx系列、「Cx系列」に移行して行くと思われる。

エラッタは全部熟知したほうが良いわけだけど、なかなか大変。
自分的にハデ目なものを挙げてみる。
(以下はざっくりめなので詳細はエラッタ参照のこと)

(1)CPUの書込みサイクル・バグ
  通常、CPUの書込みサイクルの初期段階で「割込みが入る」と、
  (a)  書込みサイクルキャンセル(或いは保留?) 
  (b)→ 割込み処理開始 → 割込み終了
  (c)→ キャンセルされた書込みサイクル開始
という形になるが、(a)部にバグがあって
「書込みサイクルがキャンセルされずに実行されてしまう」ので
 結局、余分に書込みが発生してしまうのだ。orz
問題:
  書込み先がメモリなら無問題なものの、SPI,I2C,UARTなどの送信レジスタ
  だった場合、同じデータが2度送られるという凶悪なバグが発生する。
  (PMPも同様らしい)

対策:
  送信レジスタに書く前に必ず割込みを禁止する。
  又は、送信にDMAを使えば避けることができる。

orz

エラッタは読んだ方が良い。
まず、エラッタを読む。

* pic32prog: PIC32MX220をPickit2/Pickkit3で書き込む
このソフトを使うと
http://code.google.com/p/pic32prog/
Pickit2で標準サポートされていないPIC32MX群への書込みが
できるらしい。
Windows/Linuxで動作可能の様だ。

ここ数日(2012/06/19)で大きく変わっていて、
(1)Pickit2/Pickit3対応
(2)WindowsではUSB HID対応となり、LibUSB-Win32のドライバは不要となった。
(3)LinuxはLibUSBベース
(4)デバイスIDの誤記修正
(5)書込み速度の改善
等々、良い感じになってきた。

特にWindows用がHID直接タイプになったので非常に使い易い。
(ドライバのインストール不要で、pic32prog.exeを実行するだけ)

コンパイル済みの実行ファイル:
http://code.google.com/p/pic32prog/source/browse/trunk/pic32prog.exe
実は上のリンクから実行ファイルが取得できないので、
こちらで取得したものを置いておきます。
解凍するといろんなファイルに混じってpic32prog.exeが出てきます。:D
pig32prog_src_pack_2012017.zip
これは、うまく書込みできないのでirukaさんのページのものを取得してください。
PIC32MXについて(概要) 
http://hp.vector.co.jp/authors/VA000177/html/PIC32MX.html

使い方:
http://code.google.com/p/pic32prog/wiki/README



* pic32prog はダメだった orz 2012/11 
このソフトで実際に「Pickit2」からPIC32MX220F032Bへ書き込んでみたものの、
LEDチカチカさえ出来なかった。orz
ソースを見るとコンフィグファイルの書込み部分に難ありな感じでした。
素直にPickit3を買った方が良いかも。 orz
(2013/02)
Programming pinguino 32 PIC32MX220 hid bootloader not responding
http://code.google.com/p/pic32prog/issues/detail?id=5&sort=-id
上のページでも同様にコンフィグ部分に不具合があると指摘されている。
上のページから得られるファイルにPic32progで書き込めるPinguino 32のブートローダファイルが
あるので、そのうち試してみよう。
(2013/02)
irukaさんの改良版pic32progで見事書込み&LEDチカチカ成功しました。
大感謝 m(__)m

ようやくスタートラインに立てたもののすでにモチベーションが...(爆

*UBW32プロジェクト
というのもあるらしい
http://www.schmalzhaus.com/UBW32/


* 最適化制限のない CodebenchのMIPS, コマンドライン コンパイラ
CodebenchもMIPS用のコンパイラを出しているので、MPLAB(X)のコンパイラに付属の
PIC32MXマイコン用ヘッダファイルやリンカスクリプトを使えば、
最適化制限なしでコンパイルできるんじゃないかと思います。
Sourcery CodeBench Lite Edition for MIPS ELF 
https://sourcery.mentor.com/GNUToolchain/subscription3537?lite=MIPS
のページに入って、「IA32 Windows Installer」を選択。
ダウンロードは登録が必要。

探査中。




参考文献:


参考:

1個200円のマイコンに書き込むために約4000円のライタが売れまくるという戦略。
も、あるにはある。(爆


検索キー: pic32 pic32mx pic32mx220 PIC32MX220F032B Pickit2 Pickit3 pic32prog errata エラッタ Pinguino


posted by Copyright (C) avrin All Rights Reserved. at 00:00| Comment(17) | PIC32MX | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
Pickit2での書き込みですが、私も1日はまってしまいました、いろいろ調べたら、「#pragma config DEBUG」の設定をしないと良いという記述を見つけ、試したところ書き込みできました。
Posted by クリタス at 2012年11月25日 19:28
こんばんわ、audinです。
書込みありがとうございます。
config DEBUGなしでもう一度ためしてみます。
Posted by audin at 2012年11月25日 21:00
audinさん、こんばんは。
自分もconfigの罠にはまりました。

不思議なことにdevcfg0のdebug bitが'10'でも
RAMを16バイト未満使用ならLチカが動いて、
16バイト以上使用ならLチカすら動かない、
という不思議な現象です。
(ホントに.bssの初期化サイズ以外全く同一
のHEX で試してそうなりました。)

結果的にはdebug bitを'11'にmodifyすることで
PinguinoのBOOTLOAERがちゃんと動くように
なりました。
(pic32progをバキバキ改造してやりました)
Posted by iruka at 2013年02月16日 01:44
28PIN DIPなMIPSで困っていることですが、
なにぶんにもコードがでかいことですね。

PinguinoのBL(ブートロ)は12k常駐しますので
残量20kということになりますが、さらに
4kはboot flashの代わりのベクターエリアと
いう設定なので、実質16kしかコードを置けません

printfを使っただけでオーバーします。
というより、絶対番地へ飛ぶjmp命令が常に
16バイトも消費してます。(爆)
Posted by iruka at 2013年02月16日 01:50
こんばんわ、
irukaさんのpled.zipで見事にLEDチカチカ出来ました。(^^)/
ブートローダはこれから試してみます。
ありがとうございます。m(__)m
MIPS32はコード効率が悪そうですね。jump命令16バイトは絶句です。
"-mips16"オプションは必須な感じですがPinguinoは
無関心のようです。(爆
ARM7同様にスタートアップコードと割込み関係だけはmips32コードであることが必要みたいです。

あと、PinguinoのX.3はだいぶ前から放置されているのでX.4のrev.684が比較的まともだと思います。
Posted by audin at 2013年02月16日 19:24
audinさん、こんばんは。
さっきPinguinoのGUIを使って、
01.Basic - Print Formatted - Printf.pde
を試してみました。

普通にビルドするとlink errorが出ますが、
CDC.printlnを半分くらい削ると14K程度に
なって、ちゃんとスケッチとして動作する
ようです。

Pinguinoにはいろいろ謎があって面白いです。
スケッチはC++ではなくCの拡張子みたいなん
ですけれど、
CDC.printf() みたいにC++風に書いてあって
それが何故か/source/user.cではCDCprintfに
置き換わって動いていたりしてpythonは魔術です。
というかworking_dir/には*.pycしかなくて
ソース読めなかったりします。
Posted by iruka at 2013年02月16日 21:57
あと、X.4でコンパイルエラーがでたら「Pinguino」-「View stdout」でエラー内容が参照できます。
(source/stdoutと等価です)
Makefile32.win32内の「copy」コマンドは「cp」に変更しておきます。(utf8のエラー防止)
この辺はPIC18Fだと無問題だったのですが、MIPSコンパイラはエラーコメントを日本語で出すのが問題の様です。
Posted by audin at 2013年02月17日 01:18
こんばんは。
たびたびすみません。netlaputaは入れないようです。
ttp://wiki.pinguino.cc/index.php/Development_environment_applications_and_support_libraries
に書いてあるようにPython25を入れてwxPython2.8を入れようとすると、for Python26なので入りませんでした。無理して入れてみたのですが、MSVCP90.dllが無いとかわけわかめになるようです。

>これが比較的最新版の入手法ですがメンドクサイので多くの人が挫折しているようです。(爆

PinguinoX.3でSerialがうまく動かなかったので
X.4にしようとしたんですが案の定挫折しました。
Posted by iruka at 2013年02月17日 23:27
すいませんURL間違えてました。

仮想マシン上のXPでやってみましたがPythonは、
今はv2.6じゃないとうまくないようです。
v.2.6ならこれで。
ttp://www.python.org/ftp/python/2.6.6/python-2.6.6.msi
参照ページ(インストール系)
ttp://avr.paslog.jp/article/2239812.html
以下にX.4のインストールの補足を追記しました。
ttp://avr.paslog.jp/article/2477815.html
ページが分散してしてしまったのでそのうちまとめようと思います。
あと、実験的ですが、簡単にインストールできるパッケージを作成中です。
Posted by audin at 2013年02月18日 07:16
どもこんばんはirukaです。
Py2.6はこれから試します。
PinguinoX.3ではSerialが動かなかったので、PinguinoX.4にあるexample/とかp32/をPinguinoX.3に接木することで、wxguiだけX3な
X4環境を作ってSerialPrintfを試そうと悪あがき
してました。

結果は惨敗です。U1TX,U1RX(U2TX,U2RXも)に
なんの信号も出てきません。というか0Vです。

割り込みによるBlinkも全然動かなくて、ぐぐって
みたら無理やりIntハンドラーをスケッチに書いてるページに辿り着きました。そもそもOnTimer0()
とか実装されてませんでした。
Posted by iruka at 2013年02月18日 19:51
こんばんわ、audinです。
>そもそもOnTimer0()とか実装されてませんでした。
PIC32の方はずっと書込み不能だったので無関知でしたが、まだまだ絶賛開発途中でしたか :D

ひとまず、新規ページに簡単にGUIがインストールできるものをアップしました。
Posted by audin at 2013年02月21日 22:21
audioさん、こんばんは。

相変わらずSerialはだめなんですが、
CDCprintfとか割り込みとかは動くようになりました。

mips16なソースは混ぜても危険ではなく動くみたいでした。(jalx命令でmips16コードを呼び出します)
スケッチ自体をmips16でコンパイルしようとするとpinguino/core/system.cあたりにインラインアセンブリやマクロが山盛りで入っていてそれらは
MIPS32限定品なのでエラーするのは仕方ないですね。(全部外部関数にしてそれらだけMIPS32でビルドしておくとか)

Pinguinoのブートロは一応MX220で動いてますし、
インチキ(?)PicKit2も安定してますので環境としては悪くないです。あと、AN1388ブートローダー
をMPLABでビルドして-mips16で動きました。
Posted by iruka at 2013年02月21日 23:27
こんばんわ、
いろいろ情報ありがとうございます。

>CDCprintfとか割り込みとかは動くようになりました。
まとまったら本家に投げちゃいたいですね。
>system.cあたりにインラインアセンブリやマクロが山盛りで入っていて
これ気づきませんでした。
去年トライしたときは以下のアトリビュートで
割込みとスタートアップコードだけなんとかしようと画策しましたが、Flashに書き込めないので挫折しました。(^^;
型 __attribute__((__nomips16__)) func(void)
型 __attribute__((__mips16__)) func(void)
Posted by audin at 2013年02月22日 00:19
audinさん、こんばんは。
UBW32のブートローダーHIDBoot.X.zipをMX220
に対応させてみました。

以下のサイトに公開しました。
ttp://hp.vector.co.jp/authors/VA000177/html/PIC32MX.html

MPLAB付属のpic32-gccは'-mips16'が効くみたいです。-mips16でビルドするとコードサイズは11K程度になります。

BOOT-ROMが3K(BFC0_0000〜BFF)ありますので、
そこに詰め込めればFLASH消費量 8K以内に詰め込めそうで、そうでない感じです(爆

詰めたところで、ユーザーエリアが4K増えるだけ
で焼け石に水なんですけど・・・。

MIPS32はメモリー空間32bit FLATなMPUのはずなのに、どういうわけかPIC18Fみたいな細切れSEGメモリーに詰め込む時代錯誤感半端無い、
相変わらずのMCHIP法則が発動しています。
Posted by iruka at 2013年02月23日 01:08
UBW32/Pinguino用のブートローダーHIDBoot.X
をMX220対応させて、8KB(+3K)に詰め込み成功
しました。(1kB弱の余裕があります)

ライター(PicKit2互換機)とブートロが完成し
ましたので、(自分的には)目的達成です。

全体を-mips16でビルドできるようにするためには、mips16でコンパイルエラーする関数を片っ端から
__attribute__((__nomips16__))
すればOKです。

というかMicroChipのライブラリは大抵そうなっています。
Pinguinoのライブラリはそこが手抜きです。

というかスケッチをmain32.cにインクルードさせ
ると同時にそれに必要なシステムライブラリも
ソースでインクルードして一発芸コンパイルする
環境もどうかとは思っています。
(そこがArduinoの強引さなんでしょうけど)
Posted by iruka at 2013年02月25日 20:44
audinです。
軽量型ブートローダすばらしいです。
今後使わせていただきます。

ようやくブレッドボード改造してPIC32 Pinguino readyになったところなので、これからいろいろ試したいと思います。

CDC.printf()もirukaさんのページを参考にうまく動きました。m(__)m

PinguinoのUARTですが、
p32/include/pinguino/core/io.c
の最後あたりにMX220F032の定義があるので、
以下を追加で動作しました。マッピング漏れでした。
SPIは未確認です。
#ifdef __SERIAL__ U1RXRbits.U1RXR=4;//Define U1RX as RB2 ( D10 )
RPB3Rbits.RPB3R=1;//Define U1TX as RB3 ( D9 )
#endif
#ifdef __SPI__
SDI1Rbits.SDI1R=1;//Define SDI1 as RB5
RPA4Rbits.RPA4R=3;// Define SDO1 as RA4
#endif
ピン数が少ないのでSPIはオーバーラップしてます。
Posted by audin at 2013年02月26日 07:53
audinさん、ご助言ありがとうございます。
おかげでSerialも動きました。
PinguinoX.3のスケッチのままでOKでした。

io.cのソース読んだら、remapのTX,RXがどこに
繋がるべきか分かりました。

配線チェックしてたらU1TXとU1RXが逆でした。がっくり。
(以前に試したときはU1TXもU1RXもHi.Zになってた気がしたんだけど、きっと夢でも見てたんでしょうね)
Posted by iruka at 2013年02月26日 22:50
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。