専門家に聞いた!繰り返す痔の原因は!? >>

現在、一定時間に車の車速信号をカウントして、その一定時間が経てばカウントをストップして、そのカウント数に対応するLEDを点灯させるというものを作ろうとしています。
一定時間というのは1秒にしたいのですが、色んな方のサイトを調べてみたらTMR0機能の内部クロックを使用してカウント出来るのは20msとかばかりで、1秒という長い時間をカウントされている資料が見つかりません。
どなたかやり方を教えてもらえないでしょうか。
手持ちのPICは16F873Aで、水晶は10MHzです。
宜しくお願い致します。

A 回答 (1件)

1.20ms割り込みを50回数えて1秒のイベントを得る


2.クロックを2MHz以下にして、TMR1を使う
3.TMR1に32kHzの発信器を接続して1秒を作る。
    • good
    • 0
この回答へのお礼

有難う御座いました。

お礼日時:2007/09/24 23:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QPIC アセンブラ 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

*文字数制限の為コメントや繰り返し処理プログラムの一部を省きました。解りにくくてすみません。ココに載せてくれとかあったらそっちに全部載せます。

目標としてはPICでデジタル時計を作りたいのですが、手始めに正確な1秒を作って7セグを0から9まで表示しそれを繰り返す。と言うものをやってみようと思いプログラムしましたがウンともスンとも言いません。
流れとしては
初期処理

TMR0割り込みが発生するまで無限ループ

割り込みが発生したら割り込み回数をカウントし(12,8MHzクロック、プリス...続きを読む

Aベストアンサー

ソースを見た限り動くはずなのでMPLABのシミュレータ(MPLAB SIM)で動かしてみましたが、ちゃんと動きますよ。1秒かどうかは疑問ですが。

ただ、まずい点を言うと。
WARI ;以下割り込み処理
BCF INTCON,GIE ;全割り込み禁止
これはいらない筈です。
INCF TIME0,1 ;定数TIME0がオーバーフローしらたZフラグが立つ
でSTATUSが変化するのでSTATUSの保存を必ず行ってください。
BCF STATUS,Z ;Zフラグが立っていればフラグクリアする
は何のフォローにもなっていない。大間違いです。
今回の場合はメインに何も処理がないので大丈夫ですけどね。

これで動かないと回路に問題がある気がしますが。


人気Q&Aランキング