koheiのおもちゃ修理記録

宇部おもちゃ病院 毎月第2土曜日 13:00~16:00
宇部新天町の西の端、市民活動センターで開院してます。

2/3 Attiny13用プログラマーを作ろう!

2019-02-03 | PIC・電子工作
さて、去年11月に、悩みに悩んでPickit3を購入しました。中国直輸入のZIFアダプタ付き互換品で1,360円と、めっちゃお得でした。
まだまだシロウトで、自分でプログラムを作成するところまで到達できないので、とりあえず目標は「つつじが丘おもちゃ病院」の大泉さんが作ったプログラムをそのまま使わせて頂く事としますが、使用されているデバイスへの書き込みが必要です。

スタートとして、秋月で16F1503:10個や、16F1705:10個等をばっさり購入(送料が高いので、最大限まとめ買いします)。Pickitを買ったので、「後はメモリーチップ(24FC××とW25Q××)への書き込みができればいい」という事で、大泉さんの「シリアルフラッシュROM(24/25)ライター」を作ろう!と、16F1454も一緒に買いました。

ところが…、大泉さんの著作も日々進行し、ATTiny13を使った作品の中で使わせて欲しい物が出てきたのですが、ATTiny13へのプログラム書き込み、特にHVS(高電圧シリアルプログラミング)がどうもめんどう。安く買える、又は簡単に作れるプログラマーがありません。
買ったPickit3はMPLABとの連携が良く、一発でビルド&書き込みが出来てシロウトには使いやすいと思うので、後悔はしていませんが、メモリーチップとAVRへの書き込みツールが必要です…。

だいぶネットを探したのですが、結局大泉さんの巨大プロジェクト「PICプログラマー」が最適です。(そりゃそうだよね、大泉さんの作ったプログラムを使わせて貰おうと思ってるんだからww)
ところが、16F1459を買うのにまた高い送料が掛かるし、せっかく買った16F1454が無駄になってしまう。16F1454は16F1459とファミリーですが、USBインターフェースの付いた高機能PICで、おもちゃ換装用には使いそうにない…。

大泉さんの「PICプログラマー」は、USBからの給電のみで何でもできる、非常に高機能な作品。もうちょっと機能を絞れば、ファミリーである16F1454で代替できるのでは…?

20PIN→14PINなので、使用ポートに6個余裕があればいい。
「PICプログラマー」のVpp生成は、シロウトにはカルチャーショックな、すばらしい作りです。「ソフトの介在無しにVppを生成」が「?」でしたが、コンパレータで直接PWMを制御して、昇圧回路の電圧を安定化させてる様で、PICの機能を余す所なく使ってると感じます。
しかし、おもちゃドクターであれば、可変電源は必ず持ってる(べき!)ので、USBからの単一電源供給にこだわらず、Vppは外部から与えてあげればいいのでは?という事で、
・Vpp生成はせず、Vppは外部から供給する→2ポート
・外部オシレータ不使用→2ポート
・LEDを1個に減らした→1ポート
・VDDの5V/3V切り替えをなくす→1ポート
で、計6ポート空きができ、16F1454で実現できるはず。
つまり、フルバージョンの「PICプログラマー」と16F1454を使った簡易版「シリアルフラッシュROM(24/25)ライター」の「中間品」を勝手に作ろう!という企画ですww。

さて、前置きが長くなりましたが、部品は極力、他のおもちゃ修理にもよく使いそうな部品で、中国直輸入で「100個200円」といった買い方ができる物を使います。
ATTiny13への書き込みを主目的として、基板上での配線しやすさ等も若干考慮してポートを再定義して、下記の回路としました。

最初に「これでいいだろう」と思って考えた回路は、いろいろと間違いがありました。
AliExpressでN-chMOSFETは買ってたのですが、P-chMOSは買ってなかったので、N-chMOSで行けないかと思ったのですが、VppとVddのON/OFFは、ハイサイドでのスイッチングが必要で、ハイサイドでのON/OFFはP-chMOS又はPNPトランジスタじゃないとできないのでした。
(正確には、できなくはない。ONしたい電圧より3V程度高い電圧を準備してやって、G-S/B-E間に掛けないとONできない。普通はそんな面倒なことはしたくないので、ほぼできない…。)

今の所、ICSPはあまり考えていない。それならば「Vddプリチャージ」や、Vpp(MCLRピン)のHi-Zは必要ない気がしますが、一応機能としては残す事にしました。
「Vddプリチャージ」は、「多分こんな機能だろう」と推測し、PNPトランジスタでベース電流を下げて、供給電流を制限する事にしました。

PNPトランジスタは、壊れた家電からたまたま回収したMarking:AHRの2SB1197使いました。Vce(sat)が低くて、良さげです。(他、無謀にも、抵抗のほとんどや10μFのコンデンサも、同じ家電からの回収品を使いましたww。)

さて、おもちゃじゃないので小さく作る必要は無いのですが、たまたまあったユニバーサル基板の切れ端を使って、こんな感じ。

表面実装品の多用で、裏はこんな感じになりました。

ネットをうろうろしてたら、「ユニバーサル基板での製作で、ハンダ面にビニール線で配線するのは良くない」と書いている記事がありました。
・被覆がリード線の先で傷ついたり他のハンダ付け時に溶けたりして、ショートの可能性がある。(実際こないだやってしまった…。)
・配線ミスが発見しにくい、後から修正しにくい。

おもちゃではスペースに制限があって無理なこともありますが、今回はスペースに余裕があるので、その意見を採用して、ビニール線は表だけにしました。
表は若干配線が目立ちますが、裏はすっきりしました。

この回路で元の機能が動くように、プログラムを変更します。
ポートの設定は「app_device_cdc_basic.c」の冒頭部分「// ユーザアプリで使う定数」で定義されているので、ここを注意深く書き換えていきます。
次の「// プログラマーへのコマンドデータ」の所は触りません。
「// プログラマーを初期化」の部分は、ポートの変更に合わせて、ポートの初期化を注意深く変更すると共に、Vpp生成部分をばっさりコメントアウト。
「//コマンドシーケンスを実行する」の部分は、使わない様にする機能は、枠だけ残してコメントアウト。LEDのポートも変更したので、「leds.c」のポート定義も変更します。

これで、パソコン側のプログラムは変更せずに、プログラマーがちゃんと動くはず!
パソコン側のプログラムを解凍して起動。一発でうまくいくかな……いかないよね…ww。

まず疑わしいのは、USBドライバーの設定。
大泉さんHPでは
『PICプログラマーを始めて導入するときはUSBドライバーの登録が必要。USBドライバー本体はWindows標準のものを使用する。infファイルとcatファイルは「PICプログラマー\ISP\ISPpic18F14k50\Windows」(中略)にある。』
とありますが、作ったPICプログラマー、USBポートに差しただけで、デバイスマネージャーに「COM6」が出たので、ドライバー登録せずとも認識・通信できるのかと思ったのですが、そうはいかないのかな…。

指定の通り、フォルダにあるinfファイルをインストールしようとしたのですが、「ファイルが見つかりません」とエラーが出てインストールできません…。
infファイルの中身を見ながら、怪しそうなファイル名のものについて、場所を確認してpathを通してみたりと、だいぶ悩みました。
調べてくと、PICのUSBを使うためのinfとcatファイルは、元はMicrochipのMLAの中にある様なので、MLAの中のinfファイルを見つけてインストールを掛けたら、インストール成功しました!

(結局、infファイル内で指定してる\i386や\amd64のフォルダが、infファイルと同じ場所に無いのが原因だったのかな?と思います。)

よしっ、これでどうだ!……まだ動かない…。
1ヶ所、ポートの初期化に間違いがあったので修正したけど、まだ動かない…。
「読込み」は、エラー無く終了して、何らかHexファイルができるけど、ちゃんと読めてるかどうか怪しい…。
「書込み」は失敗に終わる…。書き込んだつもりだけど、読込みベリファイしたら違います、というメッセージの様子。

AtmelStudioでコンパイルすると「eepファイル」もできるので、これを選択して書き込みすると、エラーが出ないけど、書き込み出来てるか分からない…。(上記画面コピーログの「15:57:36」の方。)

さて、なんとか元々の制作者である大泉さんに問い合せせずに自力で完成させたかったのですが、そろそろ問い合せをするしかないかしら…。
土曜日1日中悩んで、土曜の夕方にとうとう大泉さんに問合せ。

とにかく、知らないことが多すぎるww!
Hexファイルの見方が分からなかった。「Hexファイル」というからには「バイナリーかな…?」と思ってたので、「Hexファイルエディター」みたいなヤツをダウンロードして開いてみるも、「なんで0x30が一杯あるの…?」という状態。
夕方に、回路図とプログラム(ファーム)の変更部分と送って大泉さんに問合せした後もゴソゴソしてて、AtmelStudioからHexファイルが見れることを発見!
なんかデータ読めてる。下の方に「FB・LB等のデータかな?」という部分もある。
という事で、夜のうちに大泉さんから第一段の回答頂きましたが、引き続き読み込んだHexファイルを送って、回答待ち。
読み込んだHexファイルはこんな感じ。
:020000040000FA
:1000000000000000000000000000000000000000F0
:1000100000000000000000000000000000000000E0
 (中略)
:1001F00000000000000000000000000000000000FF
:1002000001000100010001000100010001000100E6
:1002100001000100010001000100010001000100D6
 (中略)
:1003F00001000100010001000100010001000100F5
:020000040010EA
:0200000079F88D
:020000040020DA
:01000000FC03
:020000040030CA
:030000001E900748
:020000040040BA
:020000005C5D45
:00000001FF

日が変わって日曜日。朝早々に大泉さんからの回答を頂き。
> 添付されていたHEXファイルは tiny13A を読み込んだ結果ですね。
> 正しく読めていると思います。その根拠は
> ・デバイスID(0x1e9007)が読めている
> ・ヒューズビット(0x79f8)がそれらしい値で読めている
> ・内部オシレータ校正値(0x5c5d)がそれらしい値で読めている
> ・ロックバイト(0xfc)がそれらしい値で読めている
> ・ロックバイトは読み書きともプログラムされているため、内容の読み出しはできていない。
> お使いのtiny13Aはプロテクトが掛かっていますので、「チップ消去」を行えば、読み書きできるようになると思います。

昨日から頭が痛くて泣きそうなのだけど、朝から「インテルHexフォーマット」の勉強。そっか、バイナリーじゃなくて、ASCII文字列なんだー!
そして、大泉さんのPICプログラマーの使い方説明の中の「FB、LB、SB、CBの情報をHEXファイルでやり取りする。FBはアドレス0x100000、LBはアドレス0x200000、SBはアドレス0x300000、CBはアドレス0x400000 に配置している。FBとLBの設定値をHEXファイルに埋め込んでおけば…」の意味もやっと分かった~。

そして、Attiny13aのデータシートも勉強。LBが「0xfc」だと、プログラム書き込みができないだけでなく、読込(ベリファイ)も出来ないんだ~。
しかも、ヒューズビットからすると、RESET無効で通常のISPも不可。なんてヒドい設定!

AliExpressで5個171円→@34円のSOPのATtiny13aを買ったんだけど、まっさらな新品じゃなかったのかしら?
変換基板も含めると秋月で買うのとあまり変わらないのだけど、送料掛からない分だけ安いかな?と思ったのですが、「何かの製品に使おうと思って、プログラム書き込みして、読みも書きもできないようにロック掛けた後、やっぱり使うのやめて廃棄にした」みたいな商品かしら?
これだと、HVSが出来ない(するつもりのない)環境の人は、買った時点で終了じゃん?
(まあぼくの場合は、どうせHVSするつもりだったから、最終的にはいいんだけどww。)

さてさて、全部解明されて準備完了!なんとかがんばって、今日中に「Lチカ」まで辿り着こう!
まずは、RESETピン有効のまま、「SW押してる間だけ、LEDが点滅する」にチャレンジ。(RESETピンは20kΩでプルアップ)
(ポートの操作が、ArduinoともPICとも違って独特…。最初は書き方がよく分からず、一発では動きませんでした…。)

うまく行ったので、引き続き、RESETピン(ピン1)を入力に使ったプログラムにチャレンジ。晒すほどの内容でもないのですが、最終のプログラムはこんな感じ。

(ほんとは、割り込みを使うとか、SW押されるまではsleepするとかすれば、もっと勉強になるのに…ww。)
同様にブレッドボードで動作確認。

バッチリ動いて、これでATtiny13aのプログラミング準備、完了です!長い戦いだった~www。
コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 1/12 宇部おもちゃ病院定期開院 | トップ | 2/9 宇部おもちゃ病院定期開院 »

コメントを投稿