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