PIC アセンブラ TMR0の使い方がいまいちわかりません。
*文字数制限の為コメントや繰り返し処理プログラムの一部を省きました。解りにくくてすみません。ココに載せてくれとかあったらそっちに全部載せます。
目標としてはPICでデジタル時計を作りたいのですが、手始めに正確な1秒を作って7セグを0から9まで表示しそれを繰り返す。と言うものをやってみようと思いプログラムしましたがウンともスンとも言いません。
流れとしては
初期処理
↓
TMR0割り込みが発生するまで無限ループ
↓
割り込みが発生したら割り込み回数をカウントし(12,8MHzクロック、プリスケーラを256設定で1250回フラグをカウントすると1秒)1秒間分カウントが終わったら7セグの表示を切り替え無限ループに戻る
どの数字まで表示したかは任意のレジスタに1を立てて判断する。PICはPIC16F628AなのでTMR1とかもあるんですが気分的にTMR0だけで時間を作ってみたかったのでTMR1とかは使ってません。で、3回くらいやり直してプログラムを作ったんですが全然動きません。
1、何処が悪いんでしょうか?
2、また、PIC16F628Aでは16番ピンがクロックの入力として使えますが
その設定方法があってるかわかりません。
コンフィグ設定で OSCをHSにしてポートの設定でRA7を入力にしておけば良いんでしょうか?プログラム中の記述で合ってますでしょうか?
3,7セグをカウントアップするだけのプログラムなのに
こんなに長くなる物なんですか?
(プログラムが下手だから?アセンブラだから?)
4、1秒のカウント方法ですがプログラム中の記述で正確に1秒をカウントしてますか?(計算間違ってますでしょうか?)
以下、プログラムになります。
list p=pic16f628a
include "p16f628a.inc"
__CONFIG _LVP_OFF &_MCLRE_ON &_BODEN_OFF &_PWRTE_ON &_WDT_OFF &_HS_OSC
time0 equ d'30' ;time4まで作る
tcount equ d'43'
count0 equ d'35' ;count7まで作る
koko0 equ d'43'
koko1 equ d'44'
org 0
goto start
org 4
goto wari
start
bcf intcon,gie
movlw b'00000111'
movwf cmcon
bsf status,rp0
movlw b'00000111'
movwf option_reg
movlw b'10100000'
movwf trisa
clrf trisb
bcf status,rp0
bcf status,z
bcf intcon,t0if
movlw b'00001000'
movwf count0
;この間に1から6の同じ処理が入ります。
movlw b'00000000'
movwf count7
time
movlw .30
movwf time0
bsf intcon,gie
bsf intcon,t0ie
clrf tmr0
roop
btfsc tcount,0
call segout
swapf count0,0
movwf portb
swapf portb,0
movwf count0
;この間に1から5が入ります
swapf count6,0
movwf portb
swapf portb,0
movwf count6
goto roop
wari
bcf intcon,t0ie
bcf intcon,t0if
incf time0,1
btfss status,z
goto modori
bcf status,z
movlw .255
movwf time0
incf time1,1
bcf status,z
goto modori
bcf status,z
movlw .255
movwf time0
movlw .255
movwf time1
incf time2,1
bcf status,z
goto modori
bcf status,z
movlw .255
movwf time0
movlw .255
movwf time1
movlw .255
movwf time2
incf time3,1
bcf status,z
goto modori
bcf status,z
movlw .255
movwf time0
movlw .255
movwf time1
movlw .255
movwf time2
movlw .255
movwf time3
incf time4,1
bcf status,z
goto modori
bcf status,z
movlw .30
movwf time0
movlw b'00000001'
movwf tcount
modori
bsf intcon,t0ie
retfie
segout
clrf tcount
btfss koko0,0
goto seg1
;この中間にseg2からseg6が入ります。
btfss koko0,7
goto seg8
btfss koko1,0
goto seg9
nop
goto seg0
seg1
bsfkoko0,0
movlw b'00000010'
movwf count0
movlw b'00000100'
movwf count1
movlw b'00000000'
movwf count2
movlw b'00000000'
movwf count3
movlw b'00000000'
movwf count4
movlw b'00000000'
movwf count5
movlw b'00000000'
movwf count6
movlw b'00000000'
movwf count7
nop
return
;この中間にseg2からseg9が入ります
seg0
clrf koko1
clf koko0
movlw b'00001000'
movwf count0
movlw b'00000100'
movwf count1
movlw b'00000010'
movwf count2
movlw b'00000001'
movwf count3
movlw b'10000000'
movwf count4
movlw b'01000000'
movwf count5
movlw b'00000000'
movwf count6
movlw b'00000000'
movwf count7
return
end
お礼
そうでしたか。以前にそれとなく使ってみたがうまくいかず使えないのかな?と思ってました。別のところが悪かったのですかね。 回答ありがとうございます。