1. |
はじめに |
PICのプログラム書込み時間は数十秒で済み、一昔前にマイコンで2732等にプログラムを書いていた頃に比べたら隔世の感があります。
しかし、「1BIT I/Oでのシリアル送受信実験」のページで紹介した1ビットシリアル通信を使ってディバッグしながらPICライタでプログラムを更新するためには、シリアルケーブルの繋ぎ替えが必要であり、またPIC自体の抜き差しも必要で不便でした。
そこで1BITシリアル通信を使ったPIC16F88用のブートローダを作成しました。シリアル通信はソフト制御なので好きなI/Oピンを割り振ることができ、プログラム更新とディバッグとでケーブルの繋ぎ替えもPICの抜き差しも必要なくなるのでディバッグ環境がかなり改善されます。
今回は勉強も兼ねてパソコン側のソフト開発環境としてマイクロソフトのホームページから無料でダウンロードできるVisual C++ 2005 Express Editionを使いました(自前でVC6は持っているのですが)。
ガベージコレクションでメモリ領域が管理されたことで開放忘れを気にせずにプログラムできるのは良いのですが、慣れていないせいもあってヘルプを引き引きのんびりと作りました(VC6で作った方が絶対早かったでしょう・・まぁ馴れれば.Net環境でも効率が上がるのでしょうが)
|
2. |
特徴 |
主な特徴は次のとおりです。
|
1) |
PCとの通信は1ビットのI/Oで行っており通信自体もソフト制御なので、ブートローダには任意のI/Oピンを一つだけ割り振るだけでよい。MCLRピンについても特に制約はありません。
|
2) |
ローダー自体のサイズは非常にコンパクト(133ワード)で、0F7BH〜0FFFHのアドレスに収められていてアプリケーション側のプログラムサイズをあまり圧迫しません。
|
3) |
アプリケーションプログラム側では0000H〜0F7AHまでの領域を使用可能です。多くのブートローダは最初の0000H〜0003Hを指定のコードにする等の条件が必要ですが、本ブートローダはそのような制約はありません。
|
4) |
ロード対象はアプリケーションのコードのある領域のみであり、かつEEPROM領域は無視するのでロードが非常に高速です。
|
5) |
PC側のプログラムでは設定条件を自動保存し、次回起動時に設定内容を受け継ぎます。また、HEXファイルの指定はエクスプローラからのドラッグ&ドロップに対応しています。(マイクロソフトのホームページから無料でダウンロード可能なVisual C++ 2005 Express Edition環境で開発)
|
6) |
PC側のプログラムでディバイス依存のパラメータは定義ファイルで設定するようにしているので他のフラッシュタイプのPICに対しても適用が容易(なはず)。
[2008/11/23追記]
16F88に内蔵のUSARTに対応。ブートローダサイズが91ワードとなり、ブートローダとしては世界最小クラスになりました(アプリケーションからは0x0000〜0x0fa4の範囲が自由に使えます)
[2012/07/08追記]
PIC16F886にも対応しました。1BITシリアル通信版でローダー自体のサイズが130ワードで0x0000〜0x1f7dの範囲がアプリケーションから自由に使用できます。
[2015/06/29追記]
PIC24FJ64GA002に対応しました。ローダーを80ワードで実現。私の知る限り世界最小のブートローダーです。
|
|
3. |
使用方法 |
本ブートローダを使用するためには、PIC側ハードウェアがパソコンとシリアル通信できることが基本条件です。
「1BIT I/Oでのシリアル送受信実験」のページで紹介している1bit通信用のハードウェアを作成することを推奨します(ディバッグにも役立ちます)。
MAX232等のI/F用ICを使ったインターフェースでも使用可能です。
本ブートローダの使用手順は
1)
|
ハードウェア条件
PIC16F88側でパソコン側とシリアル通信可能なインターフェースを準備する。(「1BIT I/Oでのシリアル送受信実験」で紹介したI/F 2版の使用を推奨)
通常の2ポートを使ったシリアルインターフェースでも使用可能です。
|
2)
|
PIC側ローダプログラムの準備
16F88内蔵のUSARTを使う場合は16F88HW_9600.hex、ソフトウェアシリアル通信(使用ポートはPORTA.7)を使う場合は16F88R7_19200.hexがそのまま使えます。
シリアル通信に使用するI/Oピンを変更する場合は、条件に応じてPIC側ソースプログラム「Serial.h」内の
bit RS232_OUTBIT @ PORTA.7;
bit RS232_INPBIT @ PORTA.7;
#define RS232C_SET_INP TRISA.7=1;
#define RS232C_SET_OUT TRISA.7=0;
の4箇所を設定し(上記サンプルはRA7ポートで入出力する例)、BKD社のfreeのCコンパイラ(CC5X)でコンパイルしhexファイルを作成します 。
尚、MAX232等を使用している場合はシリアル信号が反転するので「SERIAL_POLARITY」を「1」でdefineするようにしてください。
またconfigワードを変更する場合は「OneBitLoader.c」内のconfig定義部分を変更して下さい。
「1BIT I/Oでのシリアル送受信実験」で紹介したI/Fを使いRA7でシリアル通信する場合には公開しているhexファイルがそのまま使えます。
|
3)
|
パソコン側ソフトのインストール
公開しているファイルを解凍し、「OneBitLoader(PC)」フォルダ配下のファイルを
同じディレクトリに入れます。インストール作業はこれだけです。
主なファイルは
・OneBitLoader.exe
|
パソコン側のブートローダソフト本体 |
・OneBitLoader.ini
|
設定ファイル |
・16F88R7_19200.hex
|
1BITシリアル通信(2版)用PIC側ソフト(RA7使用) 2008/12/07 追加
|
・16F88R7V1_9600.hex
|
1BITシリアル通信(1版)用PIC側ソフト(RA7使用) |
・16F88HW_9600.hex
|
USART用PIC側ソフト |
・16F886A7_19200.hex
|
PIC16F886用PIC側ソフト(RA7使用) 2012/07/16 修正 |
・16F886B7_19200.hex
|
PIC16F886用PIC側ソフト(RB7使用) 2012/07/16 追加 |
・24FJ64GAB6_38400.hex
|
PIC24FJ64GA002用 RB6(15番ピン)でシリアル通信するタイプ |
・24FJ64GAB7_38400.hex
|
PIC24FJ64GA002用 RB7(16番ピン)でシリアル通信するタイプ |
レジストリ設定はしていませんのでアンインストールする場合はフォルダごと削除するだけです。
但し、PC側ソフトはVisual C++ 2005 Express Editionで開発しているため、動作させるためには .NetFramework2.0 環境が必要です。インストールしていない場合はマイクロソフトのホームページからダウンロードしインストールして下さい。
2012/07/08 追記 WinXP環境が無くなってしまったので今回、WinVista環境でVisual C++ 2008 Express でコンパイルしています。
|
4)
|
PICへのブートローダの書込み
PICライタを使って作成したブートローダhexファイルをPICへ書き込みます。
RS−232CケーブルでPCとPICを接続し、ハイパーターミナル等の通信ソフトを起動します(シリアルのモードは8bit、no parity、stopbit=1、配布版での通信速度はファイルの数字の通り)。この状態でPIC側の電源を入れると「8」または「9」の文字が一個送信され、その後、ターミナルソフト側からのキー入力文字がエコーバック表示されれば動作確認okです。
一度PICにブートローダーを書き込めば、その後はPICライタなしでアプリケーションの書き換え(下記5項の手順)が可能になります。
|
5)
|
アプリケーションプログラムのロード
OneBitLoader.exeを起動すると右のようなウィンドが表示されます。
"** start"以降のメッセージはこの時点では表示されません。
・「HexLoad」ボタンでhexファイル指定(またはエクスプローラからドラッグ&ドロップ)
・Serial通信ポートの指定
・Deviceは現時点では16F88だけです(ソフトウェア通信かUSART通信かの選択肢になります)
の設定後、「Write」ボタンを押し、5秒以内にPIC側の電源を入れるかリセットするとPICへのダウンロードが開始します。
ダウンロード完了後、ダウンロードしたアプリケーションが自動的に起動されます。
パソコン側で「Write」ボタンを押していない状態でPICを起動した場合は約200ms後に既にダウンロード済みのアプリケーションが起動されます(PCを繋げずにPIC側の電源を入れた場合も同様)。
再度アプリケーションをダウンロードする場合は5)の手順だけでokです。
ダウンロードしたアプリケーションはPIC内フラッシュメモリに書き込まれますのでPIC側の電源を切っても消えません。
|
|
|
|
4. | ダウンロード |
本ソフトウェアのダウンロードは下記のリンクをクリックしてください。
|
5. | その他 |
1)
|
16F88以外のディバイスを追加したい場合、PC側のソフトに関してはOneBitLoader.ini内の「DEVICES = 16F88」の行の末尾に「, xxxxx」を追加し、xxxxx.defを「16F88.def」にならって作成すれば、Deviceのコンボボックスに追加され選択可能となります(xxxxxは追加するディバイス名)。PIC側のプログラムはFlashRomタイプのPICであれば移植は容易なはずです。
|
2)
|
書込み対象プログラムの関数の先頭アドレスは0002H以降になるようにして下さい。
|
|
[history]
|
2017/10/17 Ver 0.0.8e
|
・PIC16F88書き込み時にエラーが発生する場合があったので修正
・PIC16F88のSerial.hにOnebitLoader用bit変更の場合の変更サンプルを記載
|
2017/10/17 Ver 0.0.8d
|
・PC側アプリで書込み開始時にエラーが発生することがあったので対処
・PIC16F88でOnebitLoader用にRB7を使用するHexファイルを追加
|
2015/11/22 Ver 0.0.8c
|
・PIC24FJ64GA002 対応版
|
2012/07/16 Ver 0.0.6(変更なし)
|
・PIC16F886 で電源の立上り時間が遅い場合、エラーになるケースがあったので、F886のconfig設定でPower-up Timer機能を有効にした。またローダー用のI/OをRB7版(28ピン目なので使い易い^^)も追加した。^^
注意:バージョンアップはPIC側とPC側の両方行ってください
|
2012/07/08 Ver 0.0.6
|
・PIC16F886 に対応。F886は28ピンでプログラムメモリはF88の2倍の8KBで秋月電子さんではF88より安くなっています^^
注意:バージョンアップはPIC側とPC側の両方行ってください
|
2008/12/07 Ver 0.0.5b
|
・1BIT シリアル通信 I/F 2版 に対応。
・パソコン側ソフトでディバイス選択時通信速度を自動設定するようにした。
注意:バージョンアップはPIC側とPC側の両方行ってください
|
2008/11/24 Ver 0.0.5a
|
パソコン側ソフトで書込みデータのアドレスが上限ぎりぎりの場合の処理を修正。
|
2008/11/23 Ver 0.0.5
|
16F88に内蔵のシリアル通信機能(USART)に対応。従来のソフトウェア通信の場合のブートローダサイズをダイエット。
注意:バージョンアップはPIC側とPC側の両方行ってください
|
2008/10/04 Ver 0.0.4
|
PC環境により、動作しないという報告を頂きましたので、WinXPで再コンパイルしました。(前回はWin2Kでコンパイル)
|
2008/04/19 Ver 0.0.3
|
Vcc5V時の安定化のために配布版の通信速度を19200bpsから9600bpsに変更
(通信速度を下げても予想に反して書込み時間はほとんどかわらず(EEPROM書込み自体に時間がかかっているということでしょう))
0000hにgoto 1のようなコードはうまく動作しませんでしたが今回対応しました。(大久保様 バグレポートありがとうございました)
注意:バージョンアップはPIC側とPC側の両方行ってください
|
2006/02/12 Ver 0.0.2
|
初期化処理を含まない部分的なコードの書込みに対応
|
2006/01/22
|
more shorter code and modify receive error function by T.Satoh
|
2006/01/09
|
first published by T.Satoh
|