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

PIC10F322 PIC_WAIT


任意サイクルのWAIT方法をPIC10F322に適用する。(2013.11.20 加筆修正)

<考え方の基本>
1.PIC10F322 はプログラム領域が小さいのでプログラミングの自由度を高めるため
PIC_WAITで紹介したようなテーブル参照を止める。

2.PIC10F322にはCALLW命令が無いためプログラムによる遅延を減らすには根本的に
無理がある。PIC10F322のコードではプログラムサイズをできるだけ小さくする志向とする。

3.WAITの引数はレジスタで渡す。(以下の例ではDL,DLHを使用)

4.最小範囲 (~255サイクルまで) のWAITにはPCL書き換え命令を使用する。

5.広範囲かつ任意サイクルのWAITを実現する。

(参考).CALLWを使用した場合の総遅延量=6サイクル。(詳細はPIC_WAITのページを参照)


<255サイクルまでのWAIT例1> W001は<0x100の領域に配置する。レジスタDLのみ使用。総遅延量13サイクル

<メインルーチン>
        MOVLW   ??                      ;遅延サイクル
        MOVWF   DL
        MOVLW   .13                     ;遅延量補正
        SUBWF    DL,F
        COMF      DL,F                    ;DL=/DL
        CALL       W001                  ;2



W001:
        CLRF       PCLATH                ;1
        SWAPF    DL,W                    ;1
        ANDLW    0x0F                    ;2
        ADDWF    PCL,F                   ;1
        fill          (CALL RET0C),(.15)
        MOVF      DL,W                   ;1
        ANDLW    0x0F                    ;1
        ADDWF    PCL,F                   ;2
        fill           (NOP),(.3)
RET0C:
        fill           (NOP),(.9)
RET03:
        fill           (NOP),(.2)
RET01:
        NOP
        RETURN                              ;2


<255サイクルまでのWAIT例2> W001は<0x100の領域に配置する。レジスタDL,DLHを使用。総遅延量11サイクル

<メインルーチン>
        MOVLW     ??                     ;遅延サイクル
        MOVWF     DL
        MOVLW     .11                   ;遅延量補正
        SUBWF      DL,F
        COMF        DL,F                  ;DL=/DL

        SWAPF      DL,W                 ;DLH:上位4ビット
        ANDLW     0x0F
        MOVWF     DLH

        MOVLW    0x0F                  ;DLH:下位4ビット
        ANDWF     DL,F
        CALL        W001                 ;2



W001:
        CLRF        PCLATH               ;1
        MOVF       DLH,W                ;1
        ADDWF     PCL,F                  ;2
        fill            (CALL RET0C),(.15)
        MOVF       DL,W                  ;1
        ADDWF     PCL,F                  ;2
        fill            (NOP),(.3)
RET0C:
        fill            (NOP),(.9)
RET03:
        fill            (NOP),(.2)
RET01:
        NOP
        RETURN                              ;2


上記サブルーチンを使用する場合W256、W65536の記述は次のようになる。



W256:
         ADDLW      0x01          ;1                   ;1
         BTFSC       STATUS,Z    ;1+1=2           ;1+1=2
         GOTO        $+6           ;2+253=255    ;2+1=3
         MOVWF     REG0                                ;3+1=4
         CALL         $+4            ;253                ;4+253=257
         INCFSZ      REG0,f        ;253+1=254    ;257+1=258
         GOTO        $-2             ;254+2=256    ;258+1=259
         NOP                                                  ;259+1=260
         MOVLW     .256-.61      ;1                   ;260+251=256+255
         ADDLW      .1               ;1
         skpz                            ;1
         GOTO        $-2             ;2/1
         GOTO        RET03         ;7 TOTAL:1+(1+1+2)*61-1+7=251


W65536:
         ADDLW      0x01
         BTFSC       STATUS,Z
         GOTO        $+6
         MOVWF     REG1
         CALL         $+4
         INCFSZ      REG1,F
         GOTO        $-2
         NOP                               ;[1]
         MOVLW     0x01              ;[1]
         CALL         W256             ;[65281]=2+254x256+255=255x256+1
         MOVLW     .256-.61         ;[1]
         ADDLW      .1                  ;[1]
         skpz                               ;[1]
         GOTO        $-2                ;[2/1]
         GOTO        RET01            ;[5] TOTAL:1+(1+1+2)*61-1+5=249