新製品の紹介(プチ連載です)
周波数カウンタ組立キット
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
たまにはちょいと息抜きで小品も作ってみたいものです。
簡単にチョイチョイと…。
でも、なかなかそうは簡単にはいかなくて、いつものごとく回を重ねてしまうことになるのかも…。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第6回]
●Compare mode(2)
PICはちょっと独特のクセがある石で、それは重々承知しているはずだったのですが、見事にはまってしまいました。
PIC16F628AのData Sheetをもう一度よく読み直してみましたら、下のように書いてあるところに気が付きました(赤線は筆者)。

[出典]Microchip Technology Inc.PIC16F628A Data Sheet
赤線をつけた部分がまさに今回のキモでありました。
TMR1H,TMR1Lレジスタペアは(CCPR1と値が一致した)その次のクロックの上がりエッジでリセットされる。
と書いてあります。
そこのところをよく読まずに、私は勝手に下の図の上側の図のように考えてしまったのですが、実際には下側の図の動作になるのでした(それぞれの図の下側の波形は内部で発生する割り込み信号を図示したもの)。

システムクロック(1μs)を500回カウントするごとに出力をトグルさせて1KHzのパルスを出力させたつもりが、実際には501μsごとのHLパルス(周期1.002ms、998Hz)を出力させていたのでした。
CCPR1にはTMR1でカウントさせたい値−1を設定しなければいけなかったのでした。
これでやっと謎が解けましたので、プログラムをそのように修正して出力を確認してみました。
1msのパルスを出力するプログラムは[第4回]でお見せしましたが、それを下のように修正しました。
;;;1ms pulse out
;2015/4/30 5/17 9/21
;
; 4MHz internal clock
; 4MHz
#include <p16f628a.inc>
__CONFIG _BODEN_ON & _WDT_ON & _EXTCLK_OSC & _PWRTE_ON & _MCLRE_OFF & _LVP_OFF
;
;
cf=0
zf=2
f equ 1
w equ 0
;
savew equ 70
savests equ 71
;
org 0
st0
goto start
;
org 4
goto int
;
org 5
;
start
movlw 7;a0-a3 is digital !!!!!
movwf CMCON
;
bsf STATUS,5 ;bank 1
movlw 0;ra=out
movwf TRISA
movwf TRISB;rb=out
movlw 04;CCP1 int enable
movwf PIE1
bcf STATUS,5 ;bank0
movlw 0c0
movwf INTCON
movlw 0f3;1f3H=499,1(us)*(499+1)=500us
movwf CCPR1L
movlw 01
movwf CCPR1H
movlw 0b
movwf CCP1CON
movlw 01
movwf T1CON
clrf PIR1
movlw 1
;
loop
clrwdt
goto loop
;
int
xorwf PORTB,f
clrf PIR1
retfie
;
end
|
直したのは1箇所だけです。
movlw 0f4 としていたところを、movlw 0f3 にしました。
このようにプログラムを変更したあとでテストをしたときの写真です。

きっかり1000Hzになりました。
周波数カウンタ組立キット[第6回]
2015.9.23upload
前へ
次へ
ホームページトップへ戻る