トップページ PIC ブートローダー

PIC18F2550対応ブートローダー                             2010/6/11更新
 パソコンとつなげるため以心電信にRS-232Cのインターフェースをつけました。それならブートローダーも作ってしまえ!ということでブートローダーはどんなものか?から調査を始めました。PICのような比較的シンプルな機器の場合次のような2種類の方法があるようです。
1.リセット後一定時間通信を監視して、ブートローダーに対する通信があれば書き込みをおこな方法です。これはブートローダーのため特別なスイッチなどを用意する必要がありません。しかし、ブートローダーを使わないで通常に立ち上げたい場合、一定時間待たされてしまい時間に追われている状況ではイライラします。これはMikroC Pro for PICのブートローダーで採用している方法みたいです。

2.リセット直後、特定のスイッチなどが押されていたらブートローダーの処理をする。すでに回路にスイッチがあればこれを流用できます。(スイッチなどがない回路ではあたたに作る必要があります。)これはUSB PIC Trainerではこの方法です。どれ位のプログラム量なのかROMライターで読み込もうとしたのですが、プロテクトがかかっていて読み込めませんでした。ブートローダーのプログラムって、そんな機密性のあるほどのものなの?と思ってしまいました。そういえば、どこかのサイトで、ブートローダーの書かれたMCUを間違ってROMライターで焼いてしまい、ブートローダーの機能が消失してしまったときは、新規にMCUを購入してくださいとあったような...

結局、2の方法にしました。
そしてプログラムができたら、ソース付で公開しようと思ったのです。
仕様
 全体の流れは次のようになります。
1.オートCQスイッチを押してリセット(または電源投入)する。
2.ブートローダーが起動したことを表示する。
  オートCQLEDがピカピカと2回点滅して、消灯する。
3.パソコンからHEXファイルをRS-232Cで転送する。
  PICは転送されたデータをフラッシュメモリに書き込む。
4.転送が終了するとPICは送られたプログラムを実行する。
簡単操作です。
まずはHEXファイルを知ることから
 HEXファイルはテキストファイルですが、中身のをすべて理解しようとするのは大変です。(何しろ機械語が書かれているわけですから....)HEXフィルの内容は次のようになります。

:
10000000AEEF00F00000000000EF00F00000000084

10
データの量10は16進表記。この場合16データがある。

0000アドレス4桁の16進表記。アドレス0000はプログラムとしてのアドレスが最初に表記される。コンフィグレーションの表記でもう一度記述されるので2回目の0000は無視する。

00データの種別。00の行だけがブートローダーの対象となる。

AEEF00F00000000000EF00F000000000データ本体。

84チェックサム。ブートローダーで直接関係なので無視する。
要するに種別が00の行で、アドレスとデータによりFLASH ROMに書き込みをします。
アドレスの定義
ブートローダーとブート対象のプログラムのアドレスを区別しなくてはなりません。
ブートローダーのアドレス     0x7c00以降
対象のプログラムのアドレス   0x0100以降
当然のことですが、対象のプログラムのアドレスが0x7c00以上になるとブートローダーと共存できません。対象のプログラムは最大31488バイトになります。
MikroC Pro for PICの場合、
#pragma orgall 0x0x0100
で指定します。
ブートローダープログラム概要
ブートローダーのプログラム本体は0x7c00以降に配置されます。

オートCQスイッチを押してリセット(または電源投入)するとブートローダーが起動します。押していないときは、0x7fc0にジャンプします。0x7fc0には対象のプログラムのジャンプ先がアセンブラのGOTO命令で書かれています。
ブートローダーが起動すると、以下の手順でFLASH ROMへ書き込みをします。

書き込みの方法:
パソコンは書き込むべきアドレスに64バイトのデータをRS-232Cで送ってきます。
ブートローダーはアドレスとデータを64バイト書き込むという単純な処理です。
1.ベクターアドレスの書き込み
パソコン側はHEXファイルから0番地からのGOTO 命令と割り込みのGOTO命令を見つけてそれを64バイト送る。実際有効なのは最初から16バイトのデータでそれ以外は0xFFになっています。それをブートローダーは受信して0x7fc0に64バイト書き込みます。これでブートローダーが起動しなかったときのジャンプができるようになります。

2.プログラム本体の書き込み
同様にして64バイト単位で書き込みをします。

3.書き込みの終了
パソコンは書き込み終了の指示をブートローダに出します。これを受けてブートローダーは先に書き込んだ0x7fc0にジャンプします。これで対象プログラムが起動します。

以上、大雑把な説明です。詳しくはソースファイルを見てください。
トダウンロード
きれいにコーディングしていません。あちこちに見にくいところがあります。何しろソースファイルの公開を前提にしていなかったもので....きれいに書き直すのも手間がかかるので見にくいままとします。

PIC側のソースファイルおよびHEXファイル     MCBL100.lzh
MikroC Pro for PICで開発しました。

New!
パソコン側のソースファイルおよびHEXファイル  PCBL101.lzh
Visual C++ 6.0で開発しました。
なぜだ?
Mikro C Pro for PICでの不具合がブートローダーでプログラムを送ると正常に動作しました。ちょっと見ましたがよくわかりません。時間をかければわかると思いますが、今は時間がないのでそんなことする気はありません。MikroC Pro for PICが生成するHEXファイルと秋月さんのROMライターの相性の問題みたいです

問題解決! Ver1.01

結果は....
今までやっていたROMライターによるプログラムでは、
1.ボードからPICを外し・・・ここでPICのピンを曲げる危険あり
2.ROMライターにセットして・・・ここでPICの向きやピンがずれたりするミスが起きる
3.ROMライターで焼く.・・・・・・20秒くらいかかる
4.PICをボードに戻す・・・ここでPICのピンを曲げるや挿入を間違えてPICを壊す危険あり
となります。特に1と4でPICを物理的、電気的に壊す危険があります。

今回のブートローダーで、1、2、4の作業から開放されました。また3については書き込みが5秒くらいで終わります。

ずいぶん楽になったーーーーー!