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

続PIC_WAIT

WAITループから抜け出す方法  (2013.11.21 全面改訂)


WAITループから抜け出す方法として割り込みや、ポートセンスがある。

PIC_WAITにおけるポートセンスの方法について考察する。


<<考えかた>>
1.255サイクル以内のWAITの場合
CALLW+ジャンプテーブルの処理ではポートセンスができないので、
呼び出し側にポートセンスの処理を埋め込む。
2.256サイクル以上のWAITの場合
サブルーチンW65536はW256を参照することを利用し、W256内部にポート
センスの処理を埋め込む、W256内部でジャンプテーブルを参照すると、
都合が悪いのでこれをループの処理に変更する。




<W256元>
W256     ADDLW    0x01
             BTFSC     STATUS,Z
             GOTO      W249            ← RETURN命令はジャンプ先のテーブルの最後に存在。
             MOVWF    REG0           ← ユーザーがレジスタを定義
             CALL       W249
             INCFSZ     REG0,F
             GOTO       $-2
             NOP
             GOTO       W247           ← RETURN命令はジャンプ先のテーブルの最後に存在。



<W256変更> ポートセンスを埋め込む,PORTC,0がLowの時EXITに抜ける。

W256    ADDLW      0x01
            BTFSC       STATUS,Z
            GOTO        NP249          ;NOP249+RETURN2=251
            MOVWF      REG0
            CALL         NP249          ;CALL2+NOP249+RETURN2=253
            INCFSZ      REG0,F
            GOTO        $-2
            NOP
NP249   MOVLW      .256-.61        ;[1]
            ADDLW      .1                  ;[1]
            BTFSS       STATUS,Z     ;[1]
            GOTO        $-2               ;[2] 1+(1+1+2)*61-1=244
            GOTO        $+1              ;[2]
            NOP                              ;[1]
            BTFSS       PORTC,0       ;[1]
            GOTO        EXIT              ;[1] 244+2+1+1+1(SKIP)=249
            RETURN



<<W65536の変更>> 変更しなくてもよい



<ウェイトの実施>
255サイクルまでのWAIT用にポートセンスを埋め込む。 PORTC,0=0の時EXITに抜ける。

       ・
       ・
    MOVF    DL,W        ← 1
    MOVLP  0x05         ← 1+1=2
    CALLW                  ← 2+2(CALLW)+2(RETURN)=6
    BTFSS   PORTC,0  ← 6+1=7
    GOTO    EXIT         ← 7+1(SKIP)=8
    INCFSZ  DM,W       ← 8+1=9
    CALL     W256        ← 9+1(SKIP)=10
    INCFSZ  DH,W        ← 10+1=11
    CALL     W65536     ← 11+1(SKIP)=12
       ・
       ・


上記構文でWAITの遅延サイクルは12サイクルとなる。