楽天市場
[無料でホームページを作成] [通報・削除依頼]

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/