Top > TinyBootloader

シリアルを使った書き込み(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する事により代用できるため、省略しても差し支えない。

max232.GIF

使い方

ダウンロード

ここからダウンロードする。

  • 使い方の詳細はここにあるが、英文なので自信が無ければ、とりあえず先に進もう。

    最新バージョンはtinybld195 Sep.2007

ブートローダーをPICに書き込む

  • PICライターでブートローダーを書き込む。

    ダウンロードしたzipを解凍すると、コンパイル済みのブートローダーがあらかじめ付いている。

    PIC16F88 の例
    tinybld16F88_20MHz_115200.HEX
      (外部OSC20MHz 115200bps用)
    tinybld16F88_i8MHz __19200.HEX
      (内部OSC8MHz 19200bps用)
    これらのソースコードが、同じディレクトリに格納されている。
    tinybld16F88.asm

Akitsuki PICプログラマを使って、書いてみた。

AkiPicWrite.JPG

  • 転送速度を変えたい場合は コンパイル環境を準備する必要がある。ということは、コードロードする転送速度は実行時に変える事ができない。コンパイル時点で転送速度が決まる。

    ソースコードは、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 となる。
  • コンパイラ \MPLAB\MCHIP_Tools\Mpasmwin.exe でコンパイル出来る。 zipを解凍したときに入っていた以下のファイルも使用する。
    bankswitch.inc
    icdpictypes.inc
    spbrgselect.inc

tinybldWin.exeを起動する。

こんな画面が出てきた!

TinyBootloader_00.JPG

書き込むHexファイルを選択する。

Browseボタンをおして、Hexファイルを選択する。

転送速度を設定する。

ブートローダーにあわせて転送速度を選ぶ。

COMポート番号を選ぶ。

PIC側の準備

電源をOFFにするか、MCLRをGNDに落とす。

転送開始!

Write Flash ボタンを押す。

PIC側のリセット解除

電源をONにするか、MCLRをGNDから離しプルアップ状態とする。

開始!!!

プログラムの転送が開始される。

失敗すると、こんな画面が出る。

TinyBootloader_01.JPG

うまく行くと、こんな画面が出る。

WRITE OKと出ればOK牧場!

TinyBootloader_02.JPG

たまに失敗するみたい。でもまぁほとんどOKだから

問題ないかなー♪

書き込み速度の目安

PIC16F88 プログラムサイズ total=4834 bytes の場合

転送速度(bps)所要時間(秒)
1152003.3秒
96009.1秒

よいしょ

  • 本田さん、仕事が早いですね!このページは大変参考になりそうです。私ものんびりトライしてみます! -- JG1VGX 福田 2007-11-28 (水) 00:06:27
  • 19200bpsで実験してます。私のところには873A, 877A, 88が手元にあるのですが、tinybldのソースがちょっと手を入れないとうまく動かないようで、873Aについては期待通りの動作をさせることができました。877A, 88と微妙に違うので、ソース解析中です。たった100ワードだから分かるだろうと思ったのですが、バンクやらページやらややこしいですね。PICごとにちょっと変えないとだめみたいです。 -- JG1VGX 福田 2007-11-29 (木) 21:42:19
  • その後いろいろやっていたら、結局ソースの問題ではなく、リセットの仕方でした。MCLRをGNDに落としながらWriteする方法で問題なく書き込めることを確認しました。チャタリングに敏感ですね。ソースを見たところ、PIC側では(コード圧縮のため?)受信エラーチェックしてません。その辺が時々エラーが出る原因でしょう。何回かやればできるし、そもそもエラーなら書き込みに入らないのでこれでいいかな。 -- JG1VGX 福田 2007-11-29 (木) 21:46:41
  • うんうん。正常終了してるのに動かないというわけじゃないですしね。2回ぐらいやればうまく動くみたいなので、実用上は問題なさそうですね。しかし、福田さんもやること はやっ^^;; -- JM7MUU 本田 2007-11-30 (金) 05:43:33
  • こんなの作ってみました〜(^^; http://www.jg1vgx.net/jp/index.php?USB%20Jig%20for%20Microcontrollers -- JG1VGX 福田 2007-12-06 (木) 22:44:26
  • お! なかなか面白いケーブルありますね! って、当局もどっかでこのケーブル見たことがあったような・・・ きっとそこいらにあるかも!!! 携帯電伝みたいなのについてたきがします。さすが福田さん!!! クリップをつけることで、汎用性が増しますね!! -- JM7MUU 本田 2007-12-07 (金) 06:24:22
  • DTMF送信機のソフトバージョンアップの時やDTMF送信機の設定をPCから行なうときに、ばっちぐーですねー。どんな風にしようかなぁ。容易に手に入れば、それを使うと楽ですね。手に入らない場合には、MAX232を使った回路図をみて、作りましょう という事にしようかな・・・ -- JM7MUU 本田 2007-12-07 (金) 14:59:42
  • 浦島ネタですみません。最近になって興味を持ったので試したのですが、初めは動きませんでした。色々と調べていくうちにサンプル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コンパイラをつかっていますが、この場合、
    Everything is expanded.Everything is shortened.
      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;

}}


Reload     Front page List of pages Search Recent changes Backup   Help   RSS of recent changes
Last-modified: Tue, 27 Dec 2016 19:33:37 JST (2670d)