PIC用ブートローダー(Bootloader)の製作

H8やAVRではパソコンからプログラムをブートローダーを使ってRS232C経由で書き込めます。PICでもFlash/ROMと USARTを持った機種ならPICライターを使わずにブートローダーでパソコンからプログラムを書き込めるのではないかと考え、ネットで検索した結果 マイクロチップのアプリケーションノートのAN851 A FLASH Bootloader for PIC16 and PIC18 Devices とAN732 Inplementing a Bootloader for PIC16F87Xの2つのブートローダープログラムが見つかりました。

AN851

AN851(詳しい説明は ここ)は試して見ましたがうまく行きませんでした。ネットで調べるとうまく行かないと言うクレームが結構あったのでWindows側のプログラムが パソコンの環境によってうまく動かない場合があるようです。

AN732

AN732はPIC16F87X用ブートローダーでパソコンからプログラムをWindows用のターミナルプログラムで送り、 PICのPortBのPin0,Pin1,Pin2の3つのPinをフロー制御に使用します。Pin0はブートローダーでプログラムをダウンロードするか否かの選択SWの 入力、Pin1はRTSの出力、Pin2はCTS入力です。PICのPinを3本も使うのが難点です。

AN732改良ブートローダーの製作

AN732のプログラムにおいてPortBのPin0,Pin1,Pin2の役割をじっくり検討するとPin2は省いても大丈夫そう です。Pin0は入力でPin1は出力です。そこでPin0に選択SW入力とRTS出力を受持たせれば、Pin1本だけで出来そうです。ターゲットはPIC16F877 にしました。

プログラムの修正

PIC16F877用のブートローダープログラムを修正します。
マイクロチップのウェブサイトからダウンロードしたBoot877.asmを以下の様に修正します。左端は行番号です。(下行が変更後)
主な変更点はTEST_INPUTをTEST_RTSに置換、RTS_OUTPUTをTEST_RTSに置換、CTS_INPUTをコメントアウトです。

プログラム修正部(TXTファイル)

49	TEST_INPUT  EQU	0	;Port B Pin 0 input indicates download
49	TEST_RTS    EQU	0	;Port B Pin 0 input indicates download&output for flow control

50	RTS_OUTPUT  EQU	1	;Port B Pin 1 output for flow control
50	;RTS_OUTPUT EQU	1	;Port B Pin 1 output for flow control

51	CTS_INPUT   EQU	2	;Port B Pin 2 input for flow control
51	;CTS_INPUT  EQU	2	;Port B Pin 2 input for flow control

139		btfss	PORTB,TEST_INPUT ;check pin for boot load		
139		btfss	PORTB,TEST_RTS ;check pin for boot load
		
230		bsf	PORTB,RTS_OUTPUT ;set RTS off to stop data being received
230		bsf	PORTB,TEST_RTS ;set RTS off to stop data being received

373		bsf	PORTB,RTS_OUTPUT ;set RTS off before setting as output
373		bsf	PORTB,TEST_RTS ;set RTS off before setting as output

375		bcf	TRISB,RTS_OUTPUT ;enable RTS pin as output
375		bcf	TRISB,TEST_RTS ;enable RTS pin as output

390		bcf	PORTB,RTS_OUTPUT ;set RTS on for data to be received
390		bcf	PORTB,TEST_RTS ;set RTS on for data to be received

401		btfsc	PORTB,CTS_INPUT	;check CTS to see if data can be sent
401		;btfsc	PORTB,CTS_INPUT	;check CTS to see if data can be sent

修正後のASMファイルをMPLABでアセンブルしてHEXファイルを作製します。参考にPIC16F877用(クロック10MHz)の HEXファイルを示します。

Boot877修正HEXファイル

PIC基板とパソコンのCOMポートを接続するRS232付きアタッチメントの作り方

DSUB9ピン♀コネクターとRS232C互換のADM3202を乗せた小型基板に5芯のシールド線の先に5ピンの コネクター♀を付けたアタッチメントを作製します。電源はPIC基板から取ります。シールド線には壊れたマウスのシールド線を使いました。PIC 基板には5ピンのコネクター♂を付けRB0,RX,TX,Vdd,GNDを引き出して置きます。又リセットSW(付けなくてもよい)とブートロードSW (ONでRB0ピンLow)を設置します。PIC基板とパソコンのCOMポートの間をこのアタッチメントで接続します。

PIC基板とパソコン」を接続するRS232C付きアタッチメント
PIC基板とパソコン」を接続するRS232C付きアタッチメント
PIC基板とRS232CアタッチメントとCOMポートの接続
PIC基板とRS232CアタッチメントとCOMポートの接続

PIC基板とRS232C付きアタッチメント回路図 PIC基板とRS232C付きアタッチメント回路図

ブートローダーの使い方

使用するPIC16F877にPICライターでブートローダープログラム(Boot877修正HEXファイル)を書き込みます。 書き込み済みのPICを基板に取付けPIC基板とRS232CアタッチメントとパソコンのCOMポートを接続します。

  1. ブートロードSWを押したままで基板の電源を入れるか、リセットSWを押します。。
  2. ブートロードSWを放します。
  3. パソコンからターミナルソフトでプログラム(HEXファイル)をPICに転送します。
  4. ターミナルソフトは1行送信するごとに'.'を受信します。
  5. 転送が成功すると’S’、失敗すると’F’を受信します。
  6. 失敗した場合は電源を入れ直すか、リセットSWでリセットし始めからやり直します。
  7. 電源を入れ直すか、リセットすると転送したプログラムが実行されます。

ターミナルソフトにはAcknowrichを使用しました。AN732ではTeraTarmProを推奨していますがTeraTarmProでは うまく転送出来ませんでした。

目次へ戻る