2013.11.27
前へ
次へ
ホームページトップへ戻る

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第516回]


●PICのテーブル参照とTimer1割込みのサンプルプログラム

前回からの続きです。
今回は前回まで説明してきましたテーブル参照の具体例となるサンプルプログラムをお見せします。
下のリストがそのサンプルプログラムですが、ここではテーブル参照に加えてTimer1の割込みも行なっています。
プログラムは短いものですが、けっこうややこしいことをしています。
;;; table lookup & timer1 sample
; 13/11/23
;
;  INTclock=4MHz
        #include <p16f887.inc>
        __CONFIG _CONFIG1,_WDT_ON& _INTOSC & _PWRTE_ON & _MCLRE_ON & _LVP_OFF
        __CONFIG _CONFIG2
;        
;WDT period is 16.5ms(reset value)
;
cf=0
zf=2
f equ 1
w equ 0
;
cntr equ 20
tcntr0 equ 21
tcntr1 equ 22
limit equ 23
t1Hdata equ 24
t1Ldata equ 25
udmk equ 26
;
savew equ 70
savests equ 71
;
     org 0
st0
     goto start
;
     org 04
        goto int
;
        org 05
;
start
        movlw 60;bk3
        movwf STATUS
        clrf ANSEL
        clrf ANSELH
        bcf STATUS,6;bk1
        movlw 64
        movwf OSCCON
        clrf TRISA
        clrf TRISB
        clrf TRISC
        clrf TRISD
        clrf TRISE
     bcf STATUS,5 ;bank0
;
        clrf PORTE
        movlw 4;*****************
        movwf PCLATH;************
;intset
        bsf STATUS,5;bank1
        bsf PIE1,0
        bcf STATUS,5;bank0
        clrf TMR1H
        clrf TMR1L
        movlw 1 
        movwf T1CON;T1 start
    movlw 0c0
   movwf INTCON
;
loop
        clrf cntr
        clrf udmk
loop1
        movlw 0a;=10
        movwf limit
loop2
        bsf PORTE,2
        movf cntr,w
        call Htable
        movwf t1Hdata
        movf cntr,w
        call Ltable
        movwf t1Ldata
        call t25ms
        bcf PORTE,2
        call t25ms
        btfsc udmk,0
        goto downcount
        incf cntr,f
        decfsz limit,f
        goto loop2
;set downcount
        incf udmk,f
        decf cntr,f
        goto loop1
downcount
        decf cntr,f
        decfsz limit,f
        goto loop2
        goto loop
;
;subroutine
;
;
;timer
;
t1ms
        movlw 0fa;=250
        movwf tcntr0
t1mslp
        clrwdt;1
        decfsz tcntr0,f;1
        goto t1mslp;2
        return
;
t25ms
        movlw 19;=25
        movwf tcntr1
t25mslp
        call t1ms
        decfsz tcntr1,f
        goto t25mslp
        return
;
        org 300
;
int
     movwf savew
     swapf STATUS,w
        clrf STATUS
     movwf savests
;
     bcf STATUS,5;bank 0
        movlw 1
        xorwf PORTE,f;pulse out
        bcf T1CON,0;stop T1
        movf t1Hdata,w
        movwf TMR1H
        movf t1Ldata,w
        movwf TMR1L
        movlw 1
        movwf T1CON;start T1
intend
        clrf PIR1;***************
     swapf savests,w
     movwf STATUS
     swapf savew,f
         swapf savew,w
     retfie
;
        org 400
;
Htable
        addwf PCL,f
        retlw 0d8
        retlw 0dc
    retlw 0e0
    retlw 0e4
    retlw 0e8
    retlw 0ec
    retlw 0f0
    retlw 0f4
    retlw 0f8
    retlw 0fc
;
Ltable
        addwf PCL,f
        retlw 0f0
        retlw 0d8
    retlw 0c0
    retlw 0a8
    retlw 90
    retlw 78
    retlw 60
    retlw 48
    retlw 30
    retlw 18
;
     end

実は今も作業中の特注品システムで使うプログラムはこれと同じようなことをもっと複雑にしたものなのです。
何をやっているのかといいますと。
PORTEのビット2から50ms周期のパルスを出力します。
50ms周期ですからHを25ms出力して、次にLを25ms出力する、という繰り返しです。
そのようにパルスを出力しながら、同時にPORTEのビット0から別の周期のパルスを出力します。
ビット0から出力するパルスはビット2からパルスを1つ出力するごとに2ms、4ms、6ms、と2msずつ周期が長くなるパルスです。
その周期が20msになったら、今度は18ms、16ms、と逆に2msずつ周期を短くし、これを2msになるまで続けます。

うーん。
ちょっとうまく説明できません。
図を描くといいのですけれど、その時間がありません。
出力波形をオシロで観測して写真を撮りましたので、整理して次回(ひょっとするとその次の回)にお見せします。

ビット0からパルスを出力するときにTimer1の割込みを使っています。
そのTimer1に与えるカウントデータにテーブル参照を使っています。

時間がなくなってしまいました。
説明の途中ですが、この続きは次回にいたします。

ワンボードマイコンでCP/Mを![第516回]
2013.11.27upload

前へ
次へ
ホームページトップへ戻る