シリアルを使った書き込み(PIC)
TinyBootloader
概要
これは、PICマイコンのプログラミングをCOMポート経由で行う事ができるソフトウェアである。PIC専用のライターが無くてもプログラムを入れ替えることが出来る。こういったソフトウェアはいくつか世の中に出回っているが、コードサイズが100ワード以下というものは、これしかない! ブートローダーのコードサイズが小さいということは、その分おおきなプログラムを入れることが出来るということだ。PIC16F88でテストをしているがすこぶる好調だ。DTMF送信機のマイコンには是非 TinyBootloader を採用しようと思っている。今後の開発でも、やはりブートローダーがあると便利だし、採用の方向で検討中である。これは便利だ。
大雑把な流れ
PICにはブートローダーというプログラムをあらかじめ書き込んでおく。(この時は、PICライターが必要。) これは、シリアルポートから受信したデータを自分のプログラム領域に展開するプログラムである。
このブートローダーはプログラム領域の大きいアドレスの方にマッピングしておく。
受け取ったプログラムは通常通り、小さいアドレスの方から詰め、ブートローダープログラムは消さないようにする。
リセット割り込みにより、割り込みベクターにとび、そこからブートローダープログラムに飛ぶ。
PC側へブート準備完了メッセージを投げて、PC側から応答がなければ、通常のプログラムへ飛ぶ。
PC側からブート要求メッセージが到着したら、PC側からプログラムを受け取り、PIC内部のプログラム領域に展開する。
接続図
つなぐのは シリアルのTX,RX,GND だけである。MAX232 レベル変換ICを仲介して接続する。MCLRも自動で行いたい場合にはさらに ***も接続する必要があるが、PICの電源をOFF/ONする事により代用できるため、省略しても差し支えない。
ここからダウンロードする。
ブートローダーをPICに書き込む
Akitsuki PICプログラマを使って、書いてみた。
- 転送速度を変えたい場合は コンパイル環境を準備する必要がある。ということは、コードロードする転送速度は実行時に変える事ができない。コンパイル時点で転送速度が決まる。
ソースコードは、tinybld16F88.asm の例では、
4行目から7行目で クロック速度と転送速度を選択する。
;をつけるとコメントアウトされる。以下の例では、クロック8MHzとなり 19200bpsを使用することになる。
xtal EQU 8000000 ;
baud EQU 19200;
;xtal EQU 20000000;
;baud EQU 115200
- 内部OSC/外部OSC切り替え
22行目から24行目で 内部OSCか外部OSCかを選択する。
_INTRC_IO というのが内部OSC
_HS_OSC というのが外部OSC となる。
tinybldWin.exeを起動する。
こんな画面が出てきた!
書き込むHexファイルを選択する。
Browseボタンをおして、Hexファイルを選択する。
転送速度を設定する。
ブートローダーにあわせて転送速度を選ぶ。
COMポート番号を選ぶ。
PIC側の準備
電源をOFFにするか、MCLRをGNDに落とす。
転送開始!
Write Flash ボタンを押す。
PIC側のリセット解除
電源をONにするか、MCLRをGNDから離しプルアップ状態とする。
開始!!!
プログラムの転送が開始される。
失敗すると、こんな画面が出る。
うまく行くと、こんな画面が出る。
WRITE OKと出ればOK牧場!
たまに失敗するみたい。でもまぁほとんどOKだから
問題ないかなー♪
書き込み速度の目安
PIC16F88 プログラムサイズ total=4834 bytes の場合
転送速度(bps) | 所要時間(秒) |
115200 | 3.3秒 |
9600 | 9.1秒 |
よいしょ
- 本田さん、仕事が早いですね!このページは大変参考になりそうです。私ものんびりトライしてみます! -- JG1VGX 福田
- 19200bpsで実験してます。私のところには873A, 877A, 88が手元にあるのですが、tinybldのソースがちょっと手を入れないとうまく動かないようで、873Aについては期待通りの動作をさせることができました。877A, 88と微妙に違うので、ソース解析中です。たった100ワードだから分かるだろうと思ったのですが、バンクやらページやらややこしいですね。PICごとにちょっと変えないとだめみたいです。 -- JG1VGX 福田
- その後いろいろやっていたら、結局ソースの問題ではなく、リセットの仕方でした。MCLRをGNDに落としながらWriteする方法で問題なく書き込めることを確認しました。チャタリングに敏感ですね。ソースを見たところ、PIC側では(コード圧縮のため?)受信エラーチェックしてません。その辺が時々エラーが出る原因でしょう。何回かやればできるし、そもそもエラーなら書き込みに入らないのでこれでいいかな。 -- JG1VGX 福田
- うんうん。正常終了してるのに動かないというわけじゃないですしね。2回ぐらいやればうまく動くみたいなので、実用上は問題なさそうですね。しかし、福田さんもやること はやっ^^;; -- JM7MUU 本田
- こんなの作ってみました〜(^^; http://www.jg1vgx.net/jp/index.php?USB%20Jig%20for%20Microcontrollers -- JG1VGX 福田
- お! なかなか面白いケーブルありますね! って、当局もどっかでこのケーブル見たことがあったような・・・ きっとそこいらにあるかも!!! 携帯電伝みたいなのについてたきがします。さすが福田さん!!! クリップをつけることで、汎用性が増しますね!! -- JM7MUU 本田
- DTMF送信機のソフトバージョンアップの時やDTMF送信機の設定をPCから行なうときに、ばっちぐーですねー。どんな風にしようかなぁ。容易に手に入れば、それを使うと楽ですね。手に入らない場合には、MAX232を使った回路図をみて、作りましょう という事にしようかな・・・ -- JM7MUU 本田
- 浦島ネタですみません。最近になって興味を持ったので試したのですが、初めは動きませんでした。色々と調べていくうちにサンプルHEXとasmがパラメータ以外のところで一致していない事に気がつきました。873Aなのですが、20MHz115200bpsに合わせて修正して、ようやく動作させる事が出来ました。再アセンブルしてお使いの方、ご注意。 -- JR3TZB 河村 &new([nodate]){date}: Invalid date string;
- どこのあたりですか? 具体的に現象を書いていただけますと、他の方に役に立つときがくるかもしれませんです^^ -- JM7MUU 本田 &new([nodate]){date}: Invalid date string;
- 結果的には原典のコメントアウトしている部分を復活させた事になりました。水晶の周波数は毎回変わるので次回はどうなるか分かりませんが・・・。tinybld16F873A.asmを元にしたファイルになりますが、お送りしましょうか? -- JR3TZB 河村 &new([nodate]){date}: Invalid date string;
- ところで、WARNING: PCLATH not fully initialised before GOTO! ... sucessfully repaired., というワーニングは普通に出ますか? どこにも書いていないので不安で。 -- JR3TZB 河村 &new([nodate]){date}: Invalid date string;
- そのWARNING: は割り込みベクター定義がされていないということです。これはブートローダーのせいではなく、ロードしようとしているコードの事です。私は HI-TECH PICCコンパイラをつかっていますが、この場合、
1
2
3
4
|
-
|
!
| static void interrupt isr(void)
{
}
|
こんな感じの割り込み関数を準備するだけで、OKです。他のコンパイラでも同じようなかんじで割り込み用の関数定義方法が準備されているので、それに準拠して割り込み関数を準備すれば消えたと思います。 -- JM7MUU 本田 &new([nodate]){date}: Invalid date string;
- コメントアウトしている部分は意図的にそうしているようです。必要におうじてコメントを外してつかってね!という意味のようですよ^^ -- JM7MUU 本田 &new([nodate]){date}: Invalid date string;
- 割り込みの方ではなくて、ブートローダに飛ぶ側でした。元々のスタートがpage0にあったためですね。気にしない事にします。だけど普通はそうなりませんか?Cだとそうなりませんか?私はこれまでアセンブラで通しているので違和感を感じました。 -- JR3TZB 河村 &new([nodate]){date}: Invalid date string;
}}