復活!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
前へ
次へ
ホームページトップへ戻る