84ワードのPICブートローダー
84ワードのPICブートローダー
84ワードのブートローダーは過去にATTINY2313Aで実現したことがあるのですが、
コード効率の劣るPIC16Fでは無理とあきらめていました。
今回WDTを使用することで、この点をブレークスルーできましたのでご紹介します。
PIC10F322やPIC12F1822などではWDTの初期値が約2秒に設定されています。
84ワードながらフラッシュとEEPROMの両方の書き込みに対応します。
◎考え方
1.ブートローダーのコードの多くを占める約1秒のタイムアウトルーチンを廃止し、
WDTを使用したタイムアウトルーチンを組み込む。
※タイムアウトの処理は従来と異なり、タイムアウトすると必ずWDTリセットがかかる。
2.84ワードは5*16+4ワードである。ブートローダーは消去ページの境界に配置する必要があるため、
消去ページが32ワード以上のPICには適用できない。
◎対象デバイス(塔載可能性のあるデバイス)
自己書き込み可能なPIC16Fで消去ページが16ワード以下のデバイス
PIC10F322(84ワードで作動しました。)
PIC12F617 (2014.02.06 追記、100ワードで作動しました。)
PIC12F752 (2014.02.06 追記、100ワードで作動しました。)
PIC16F753 (2014.02.06 追記、100ワードで作動しました。)
PIC12F1571 (2014.02.06 追記、100ワードで記述できました。(β版))
PIC12F1572 (2014.02.06 追記、84ワードで記述できました。(β版))
PIC12F1612 (2014.02.06 追記、100ワードで記述できました。(β版))
PIC16F1613 (2014.02.06 追記、100ワードで記述できました。(β版))
PIC12F1822(84ワードで作動しました。)
PIC16F1823(84ワードで作動しました。)
PIC12F1501 (2014.02.06 追記、100ワードで作動しました。)
PIC16F1503 (2014.02.06 追記、100ワードで作動しました。)
PIC16F1507 (2014.02.06 追記、100ワードで作動しました。)
PIC16F87x (2014.02.01 追記、WDTを用いず84ワードで作動しました。 872を除く)
PIC16F87xA (2014.02.01 追記、WDTを用いず84ワードで作動しました。)
PIC16F88x (2014.01.22 追記、84ワードで作動しました。)
◎コード変更例(PIC12F1822)
①.Config _WDTE_SWDTEN を定義し、プログラムでWDTを操作
(100ワード仕様)
__CONFIG _CONFIG1, _FOSC_INTOSC & _BOREN_OFF & _WDTE_OFF & _CP_OFF & _PWRTE_ON & _CPD_OFF & _MCLRE_OFF
(84ワード仕様)
__CONFIG _CONFIG1, _FOSC_INTOSC & _BOREN_OFF & _WDTE_SWDTEN & _CP_OFF & _PWRTE_ON & _CPD_OFF & _MCLRE_OFF
②.WDTリセットの検出 WDTによるリセットをSTATUSレジスタから検出
(100ワード仕様)
IntrareBootloader:
;init int clock & serial port
movlp (max_flash>>8)-1
movlb 0x01 ;BANK1
bsf OSCCON,6 ;internal clock 16MHz
(84ワード仕様)
IntrareBootloader:
;init int clock & serial port
btfss STATUS,NOT_TO
bra way_to_exit2 ;timeout
movlp (max_flash>>8)-1 ;set PAGE
movlb 0x01 ;BANK1
bsf OSCCON,6 ;internal clock 16MHz
③.1秒タイムアウト部 Receiveルーチンを呼び出す度にWDTスタート、受信するとWDTストップ、クリア
※WDTではタイムアウトが約2秒となる
(100ワード仕様)
Receive:
movlw xtal/2000000+1 ;for 20MHz => 11 => 1second
movwf cnt1
rpt2:
clrf cnt2
rpt3:
clrf cnt3
rptc:
movlb 0x00 ;BANK0
movf PIR1,w ;w=PIR1
movlb 0x03 ;BANK3
andlw (1<<RCIF) ;w=w.and.RCIF
skpnz ;test RX
goto $+4 ;not recive
movf RCREG,w ;return in w
addwf crc,f ;compute checksum
return
decfsz cnt3,f
goto rptc
decfsz cnt2,f
goto rpt3
decfsz cnt1,f
goto rpt2
;timeout:
way_to_exit: ;exit in all other cases; must be BANK3
bcf RCSTA,SPEN ;deactivate UART
movlb 0x00 ;BANK0
movlp 0x00 ;PAGE0
bra first_address ;PAGE=0, Please do not change the GOTO instruction.
(84ワード仕様)
Receive:
movlb 0x01 ;BANK1
bsf WDTCON,SWDTEN ;start WDT
movlb 0x00 ;BANK0
btfss PIR1,RCIF ;recive done ?
bra $-1 ;not recive
movlb 0x01 ;BANK1
bcf WDTCON,SWDTEN ;stop WDT and clear
movlb 0x03 ;BANK3
movf RCREG,w ;return in w
addwf crc,f ;compute checksum
return
way_to_exit: ;exit in all other cases; must be BANK3
bcf RCSTA,SPEN ;deactivate UART
way_to_exit2:
movlb 0x00 ;BANK0
movlp 0x00 ;PAGE0
bra first_address ;PAGE=0, Please do not change the GOTO instruction.
ソースコードはこちらからダウンロードできます。
ttp://sourceforge.net/p/tinypicbootload/discussion/general/thread/24e44bca/
84ワードのブートローダーは過去にATTINY2313Aで実現したことがあるのですが、
コード効率の劣るPIC16Fでは無理とあきらめていました。
今回WDTを使用することで、この点をブレークスルーできましたのでご紹介します。
PIC10F322やPIC12F1822などではWDTの初期値が約2秒に設定されています。
84ワードながらフラッシュとEEPROMの両方の書き込みに対応します。
◎考え方
1.ブートローダーのコードの多くを占める約1秒のタイムアウトルーチンを廃止し、
WDTを使用したタイムアウトルーチンを組み込む。
※タイムアウトの処理は従来と異なり、タイムアウトすると必ずWDTリセットがかかる。
2.84ワードは5*16+4ワードである。ブートローダーは消去ページの境界に配置する必要があるため、
消去ページが32ワード以上のPICには適用できない。
◎対象デバイス(塔載可能性のあるデバイス)
自己書き込み可能なPIC16Fで消去ページが16ワード以下のデバイス
PIC10F322(84ワードで作動しました。)
PIC12F617 (2014.02.06 追記、100ワードで作動しました。)
PIC12F752 (2014.02.06 追記、100ワードで作動しました。)
PIC16F753 (2014.02.06 追記、100ワードで作動しました。)
PIC12F1571 (2014.02.06 追記、100ワードで記述できました。(β版))
PIC12F1572 (2014.02.06 追記、84ワードで記述できました。(β版))
PIC12F1612 (2014.02.06 追記、100ワードで記述できました。(β版))
PIC16F1613 (2014.02.06 追記、100ワードで記述できました。(β版))
PIC12F1822(84ワードで作動しました。)
PIC16F1823(84ワードで作動しました。)
PIC12F1501 (2014.02.06 追記、100ワードで作動しました。)
PIC16F1503 (2014.02.06 追記、100ワードで作動しました。)
PIC16F1507 (2014.02.06 追記、100ワードで作動しました。)
PIC16F87x (2014.02.01 追記、WDTを用いず84ワードで作動しました。 872を除く)
PIC16F87xA (2014.02.01 追記、WDTを用いず84ワードで作動しました。)
PIC16F88x (2014.01.22 追記、84ワードで作動しました。)
◎コード変更例(PIC12F1822)
①.Config _WDTE_SWDTEN を定義し、プログラムでWDTを操作
(100ワード仕様)
__CONFIG _CONFIG1, _FOSC_INTOSC & _BOREN_OFF & _WDTE_OFF & _CP_OFF & _PWRTE_ON & _CPD_OFF & _MCLRE_OFF
(84ワード仕様)
__CONFIG _CONFIG1, _FOSC_INTOSC & _BOREN_OFF & _WDTE_SWDTEN & _CP_OFF & _PWRTE_ON & _CPD_OFF & _MCLRE_OFF
②.WDTリセットの検出 WDTによるリセットをSTATUSレジスタから検出
(100ワード仕様)
IntrareBootloader:
;init int clock & serial port
movlp (max_flash>>8)-1
movlb 0x01 ;BANK1
bsf OSCCON,6 ;internal clock 16MHz
(84ワード仕様)
IntrareBootloader:
;init int clock & serial port
btfss STATUS,NOT_TO
bra way_to_exit2 ;timeout
movlp (max_flash>>8)-1 ;set PAGE
movlb 0x01 ;BANK1
bsf OSCCON,6 ;internal clock 16MHz
③.1秒タイムアウト部 Receiveルーチンを呼び出す度にWDTスタート、受信するとWDTストップ、クリア
※WDTではタイムアウトが約2秒となる
(100ワード仕様)
Receive:
movlw xtal/2000000+1 ;for 20MHz => 11 => 1second
movwf cnt1
rpt2:
clrf cnt2
rpt3:
clrf cnt3
rptc:
movlb 0x00 ;BANK0
movf PIR1,w ;w=PIR1
movlb 0x03 ;BANK3
andlw (1<<RCIF) ;w=w.and.RCIF
skpnz ;test RX
goto $+4 ;not recive
movf RCREG,w ;return in w
addwf crc,f ;compute checksum
return
decfsz cnt3,f
goto rptc
decfsz cnt2,f
goto rpt3
decfsz cnt1,f
goto rpt2
;timeout:
way_to_exit: ;exit in all other cases; must be BANK3
bcf RCSTA,SPEN ;deactivate UART
movlb 0x00 ;BANK0
movlp 0x00 ;PAGE0
bra first_address ;PAGE=0, Please do not change the GOTO instruction.
(84ワード仕様)
Receive:
movlb 0x01 ;BANK1
bsf WDTCON,SWDTEN ;start WDT
movlb 0x00 ;BANK0
btfss PIR1,RCIF ;recive done ?
bra $-1 ;not recive
movlb 0x01 ;BANK1
bcf WDTCON,SWDTEN ;stop WDT and clear
movlb 0x03 ;BANK3
movf RCREG,w ;return in w
addwf crc,f ;compute checksum
return
way_to_exit: ;exit in all other cases; must be BANK3
bcf RCSTA,SPEN ;deactivate UART
way_to_exit2:
movlb 0x00 ;BANK0
movlp 0x00 ;PAGE0
bra first_address ;PAGE=0, Please do not change the GOTO instruction.
ソースコードはこちらからダウンロードできます。
ttp://sourceforge.net/p/tinypicbootload/discussion/general/thread/24e44bca/
- ご質問などはこちらからどうぞ
- ページ更新情報
- 最近嬉しかったこと
- 1kワードのTINYBASIC STM32L010F4
- やってくれたな!!店長よ
- 東大版TINYBASIC (STM32)
- 1kワードのTINYBASIC STM32版 その2
- 1kワードのTINYBASIC STM32版 その1
- 1kワードのTINYBASIC その8
- 1kワードのTINYBASIC その7
- 1kワードのTINYBASIC その6
- 1kワードのTINYBASIC その5
- 1kワードのTINYBASIC その4
- 1kワードのTINYBASIC その3
- 1kワードのTINYBASIC その2
- 1kワードのTINYBASIC その1
- 電大版TINYBASIC for PIC ミニマムお試し版5
- 電大版TINYBASIC for PIC ミニマムお試し版4
- 電大版TINYBASIC for PIC ミニマムお試し版3
- 電大版TINYBASIC for PIC ミニマムお試し版2
- 電大版TINYBASIC for PIC ミニマムお試し版
- PICで電大版TINYBASIC 実装編その5
- PICで電大版TINYBASIC 実装編その4
- PICで電大版TINYBASIC 実装編その3
- PICで電大版TINYBASIC 実装編その2
- PICで電大版TINYBASIC 実装編その1
- PICで電大版TINYBASIC 準備編その2
- PICで電大版TINYBASIC 準備編その1
- PIC18F24K42をPICKIT2で焼くTIPS その2
- PIC18F24K42をPICKIT2で焼くTIPS
- PIC16F18313ブートローダー書き込み器の製作
- PIC16F18857をPICKIT2で焼くその2
- PIC16F18857をPICKIT2で焼く
- PIC16F18313をPICKIT2で焼くその2
- PIC16F18313をPICKIT2で焼く
- PIC16F5XX USBIO
- HVT-BT200の予約制御
- 再考 PIC16F57 USBIO
- PIC16F5X USBIO
- 続12 8ピンPICでUSB PIC16F18313 HID-シリアルアダプター
- ucontrol.com.arに接続できない
- 続続 LPC1114 USBブートローダー
- 続PIC10F200 電子サイコロ
- PIC10F200 電子サイコロ
- LPC1114 8ch簡易ロジックアナライザー USB版
- 続 LPC1114 USBブートローダー
- LPC1114 8ch簡易ロジックアナライザー
- LPC1114 USBブートローダー
- LPC1114でUSB
- 続LPC810でUSB
- LPC810でUSB
- USB_NCO
- USB出力の周波数カウンター
- HIDアダプターについてのまとめ その2
- HIDアダプターについてのまとめ
- 極小ブートローダー まとめ
- 極小ブートローダー ATTiny 其の2
- 極小ブートローダー PIC10F322 其の6
- 極小ブートローダー PIC10F322 其の5
- 極小ブートローダー PIC10F322 其の4
- 極小ブートローダー PIC10F322 其の3
- 極小ブートローダー ATTiny13A
- 極小ブートローダー PIC10F322 其の2
- 極小ブートローダー PIC10F322
- 続11 8ピンPICでUSB PIC16F57_USBIO (その3)
- 続10 8ピンPICでUSB PIC16F505_USBIO (その2)
- 続9 8ピンPICでUSB PIC16F57_USBIO (その2)
- 続8 8ピンPICでUSB PIC16F505_USBIO
- 続7 8ピンPICでUSB PIC16F57_USBIO
- 続6 8ピンPICでUSB PIC16F570_USBIO
- 続5 8ピンPICでUSB PIC12F615_USBIO
- 続4 8ピンPICでUSB 16FUSBの改良版
- 続続続8ピンPICでUSB -30MHz+ソフトシリアル-
- 続続8ピンPICでUSB -16FUSBを30MHzで動かす-
- 続8ピンPICでUSB -ターミナルソフトからの操作-
- 8ピンPICでUSB -16FUSBの移植-
- 番外 MSP430 タイニーブートローダー
- 番外 C8051 タイニーブートローダー
- 続続続 Tiny AVR/PIC Bootloader+
- 続続 Tiny AVR/PIC Bootloader+
- 続 Tiny AVR/PIC Bootloader+
- Tiny AVR/PIC Bootloader+
- 番外 続ATTINY13A OSCCAL の簡易校正
- 番外 ATTINY13A OSCCAL の簡易校正
- 番外 続ATTINY13A ソフトシリアル
- 番外 ATTINY13A ソフトシリアル
- 番外 続Arduinoからタイニーブートローダーを使用する
- 番外 Arduinoからタイニーブートローダーを使用する
- 番外 LPC1114FN28/102 アセンブラサンプル
- 番外 LPC810 タイニーブートローダーの自己書き換え
- 番外 LPC810 EEPROM エミュレーション
- 番外 LPC810 タイニーブートローダー
- 番外 LPC810でアセンブラ
- 続続続PIC10F322 ソフトシリアル一考察
- 続続PIC10F322 ソフトシリアル一考察
- 続PIC10F322 ソフトシリアル一考察
- PIC10F322 ソフトシリアル一考察
- 84ワードのPICブートローダー
- 続PIC10F322 Ring-DDS
- Tinybldの自己更新プログラム
- プログラム領域をROMのように使う
- PIC10F322 256ビットプログラム発振器
- PIC18F EEPROM エミュレーション Jタイプ
- PIC18F EEPROM エミュレーション
- PIC16F EEPROM エミュレーション
- PIC10F322専用 周波数カウンター
- PIC18F Jタイプ ブートローダー
- PICの制約を取り除く
- 番外 ATTINY2313A用ブートローダー
- 続番外 ATTINY13A用ブートローダー
- 番外 ATTINY13A用ブートローダー
- 続PIC10F322 フラッシュメモリの操作
- PIC10F322 フラッシュメモリの操作
- PIC10F322 PIC_WAIT
- ビット列の並び替え その2
- ビット列の並び替え その1
- 故障した温水便座を使えるようにする
- PIC10F322 RA3を出力ポートとして使用
- PIC10F322 周波数カウンタ Part2
- PIC10F322 AN592準拠 周波数カウンタ
- PIC10F322 Ring-DDS
- microchipのAN592に関する一考察
- PIC10F322 3-ch リモコンライン切り替え器
- PIC10F322 4-SW リモコン送信器
- PIC10F322 二相発振器
- PIC_DELAY
- 続PIC_WAIT
- PIC_WAIT
- ご質問などはこちらからどうぞ
- ページ更新情報
- 最近嬉しかったこと
- 1kワードのTINYBASIC STM32L010F4
- やってくれたな!!店長よ
- 東大版TINYBASIC (STM32)
- 1kワードのTINYBASIC STM32版 その2
- 1kワードのTINYBASIC STM32版 その1
- 1kワードのTINYBASIC その8
- 1kワードのTINYBASIC その7
- 1kワードのTINYBASIC その6
- 1kワードのTINYBASIC その5
- 1kワードのTINYBASIC その4
- 1kワードのTINYBASIC その3
- 1kワードのTINYBASIC その2
- 1kワードのTINYBASIC その1
- 電大版TINYBASIC for PIC ミニマムお試し版5
- 電大版TINYBASIC for PIC ミニマムお試し版4
- 電大版TINYBASIC for PIC ミニマムお試し版3
- 電大版TINYBASIC for PIC ミニマムお試し版2
- 電大版TINYBASIC for PIC ミニマムお試し版
- PICで電大版TINYBASIC 実装編その5
- PICで電大版TINYBASIC 実装編その4
- PICで電大版TINYBASIC 実装編その3
- PICで電大版TINYBASIC 実装編その2
- PICで電大版TINYBASIC 実装編その1
- PICで電大版TINYBASIC 準備編その2
- PICで電大版TINYBASIC 準備編その1
- PIC18F24K42をPICKIT2で焼くTIPS その2
- PIC18F24K42をPICKIT2で焼くTIPS
- PIC16F18313ブートローダー書き込み器の製作
- PIC16F18857をPICKIT2で焼くその2
- PIC16F18857をPICKIT2で焼く
- PIC16F18313をPICKIT2で焼くその2
- PIC16F18313をPICKIT2で焼く
- PIC16F5XX USBIO
- HVT-BT200の予約制御
- 再考 PIC16F57 USBIO
- PIC16F5X USBIO
- 続12 8ピンPICでUSB PIC16F18313 HID-シリアルアダプター
- ucontrol.com.arに接続できない
- 続続 LPC1114 USBブートローダー
- 続PIC10F200 電子サイコロ
- PIC10F200 電子サイコロ
- LPC1114 8ch簡易ロジックアナライザー USB版
- 続 LPC1114 USBブートローダー
- LPC1114 8ch簡易ロジックアナライザー
- LPC1114 USBブートローダー
- LPC1114でUSB
- 続LPC810でUSB
- LPC810でUSB
- USB_NCO
- USB出力の周波数カウンター
- HIDアダプターについてのまとめ その2
- HIDアダプターについてのまとめ
- 極小ブートローダー まとめ
- 極小ブートローダー ATTiny 其の2
- 極小ブートローダー PIC10F322 其の6
- 極小ブートローダー PIC10F322 其の5
- 極小ブートローダー PIC10F322 其の4
- 極小ブートローダー PIC10F322 其の3
- 極小ブートローダー ATTiny13A
- 極小ブートローダー PIC10F322 其の2
- 極小ブートローダー PIC10F322
- 続11 8ピンPICでUSB PIC16F57_USBIO (その3)
- 続10 8ピンPICでUSB PIC16F505_USBIO (その2)
- 続9 8ピンPICでUSB PIC16F57_USBIO (その2)
- 続8 8ピンPICでUSB PIC16F505_USBIO
- 続7 8ピンPICでUSB PIC16F57_USBIO
- 続6 8ピンPICでUSB PIC16F570_USBIO
- 続5 8ピンPICでUSB PIC12F615_USBIO
- 続4 8ピンPICでUSB 16FUSBの改良版
- 続続続8ピンPICでUSB -30MHz+ソフトシリアル-
- 続続8ピンPICでUSB -16FUSBを30MHzで動かす-
- 続8ピンPICでUSB -ターミナルソフトからの操作-
- 8ピンPICでUSB -16FUSBの移植-
- 番外 MSP430 タイニーブートローダー
- 番外 C8051 タイニーブートローダー
- 続続続 Tiny AVR/PIC Bootloader+
- 続続 Tiny AVR/PIC Bootloader+
- 続 Tiny AVR/PIC Bootloader+
- Tiny AVR/PIC Bootloader+
- 番外 続ATTINY13A OSCCAL の簡易校正
- 番外 ATTINY13A OSCCAL の簡易校正
- 番外 続ATTINY13A ソフトシリアル
- 番外 ATTINY13A ソフトシリアル
- 番外 続Arduinoからタイニーブートローダーを使用する
- 番外 Arduinoからタイニーブートローダーを使用する
- 番外 LPC1114FN28/102 アセンブラサンプル
- 番外 LPC810 タイニーブートローダーの自己書き換え
- 番外 LPC810 EEPROM エミュレーション
- 番外 LPC810 タイニーブートローダー
- 番外 LPC810でアセンブラ
- 続続続PIC10F322 ソフトシリアル一考察
- 続続PIC10F322 ソフトシリアル一考察
- 続PIC10F322 ソフトシリアル一考察
- PIC10F322 ソフトシリアル一考察
- 84ワードのPICブートローダー
- 続PIC10F322 Ring-DDS
- Tinybldの自己更新プログラム
- プログラム領域をROMのように使う
- PIC10F322 256ビットプログラム発振器
- PIC18F EEPROM エミュレーション Jタイプ
- PIC18F EEPROM エミュレーション
- PIC16F EEPROM エミュレーション
- PIC10F322専用 周波数カウンター
- PIC18F Jタイプ ブートローダー
- PICの制約を取り除く
- 番外 ATTINY2313A用ブートローダー
- 続番外 ATTINY13A用ブートローダー
- 番外 ATTINY13A用ブートローダー
- 続PIC10F322 フラッシュメモリの操作
- PIC10F322 フラッシュメモリの操作
- PIC10F322 PIC_WAIT
- ビット列の並び替え その2
- ビット列の並び替え その1
- 故障した温水便座を使えるようにする
- PIC10F322 RA3を出力ポートとして使用
- PIC10F322 周波数カウンタ Part2
- PIC10F322 AN592準拠 周波数カウンタ
- PIC10F322 Ring-DDS
- microchipのAN592に関する一考察
- PIC10F322 3-ch リモコンライン切り替え器
- PIC10F322 4-SW リモコン送信器
- PIC10F322 二相発振器
- PIC_DELAY
- 続PIC_WAIT
- PIC_WAIT