新製品の紹介(プチ連載です)
周波数カウンタ組立キット
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
たまにはちょいと息抜きで小品も作ってみたいものです。
簡単にチョイチョイと…。
でも、なかなかそうは簡単にはいかなくて、いつものごとく回を重ねてしまうことになるのかも…。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第4回]
●周波数カウンタ製作の動機
この長い年月を周波数カウンタなしにやってきましたのに、なぜ今になって突然に作る気になったのかといいますと。
そのきっかけはクロック発生回路組立キットにありました。
クロック発生回路組立キットは「トランジスタでCPUをつくろう[第65回]」で紹介しております。
このキットでは2種類の異なる方法でパルスを発生させているのですが、そのうちの1ms(1KHz)をベースとするパルスはPIC16F628Aを使ってソフトウェアで発生させています。
PIC16F628Aはもちろん水晶によるクロックで動作していますからそれなりに正確なはずですし、そのシステムクロックを内蔵タイマー(Timer1)でカウントし、割り込みによってパルスを発生させていますから、まず間違いはないと思いました。
思いましたが、やっぱりそれは確認してみる必要があります。
オシロスコープで確認してみた限りでは大体1msのパルスであることは間違いなさそうです。
しかしオシロスコープでは大体のところしかわかりません。
こういうことになりますと、やっぱり周波数カウンタの必要性を痛感します。
たまたま自由に使ってくださいということで、ありがたくお借りしていた周波数カウンタが手元にありましたので、それで測ってみましたら。
ちょっと足りないのですね。
998Hzでした。
ところがこの周波数カウンタ。
せっかくご好意で貸していただいたものなのですが、ちょっと設定によくわからないところがあって、そのためかどうか、やや信頼性に疑問があるところがあったりしました。
PICのプログラムのほうは何回も確認しましたが、それほど難しいことはやっていませんから、2Hzもずれるということはちょっと考えられません。
果たしてPICが問題なのか、それともお借りした周波数カウンタに問題があるのか、それを確かめるためにはやっぱり自分で納得がいく周波数カウンタを作って、それで測定してみるのが一番よいように思いました。
それが今回の周波数カウンタ製作のそもそもの動機でありました。
さて。
とにかく大体満足の行く程度の精度の周波数カウンタの試作品ができましたので、そもそもの製作のきっかけになりましたクロック発生回路組立キットの1msパルスをさっそく測定してみました。
そうしましたら、なんと。
●やっぱり998Hzでした

うーん。
ということはやっぱり問題はPICにありそうです。
でもですね。
そんなに難しいことはやってないのですよね。
下がそのプログラムです。
1msパルス(1KHz)の出力はPIC16F628Aを使って行なっています。
;;;1ms pulse out
;2015/4/30 5/17
;
; 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 0f4;1f4H=500,1(us)*500=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
|
CPUクロックは4MHzですからシステムクロックはその1/4の1MHzです。
ちょうど1μsですから、Timer1でシステムクロックを500回カウントするごとにH、Lを交互に出力すれば1KHzのパルスになります。
500回のカウントごとに割込みを発生させるのに、あらかじめCCPR1レジスタにセットした1F4H(=500)とTMR1レジスタとが一致したときにspecial event triggerが発生するcompare modeを利用します。
compare mode(CCP1M<3:0> 1011)は下記を参照。

[出典]Microchip Technology Inc.PIC16F628A Data Sheet
見ていただいた通りの簡単なプログラムですからおかしなところはないはずなのですが…。
しかし、どう考えてもTMR1レジスタとCCPR1との比較で1カウントのずれが発生しているとしか思えません。
そこで何か見落としているところはないか、もう一度PIC16F628AのDataSheetをじっくり読み直してみました。
そうしましたら。
わかりました。
やっと、謎が解けました。
いいところですけれど。
謎解きは次回にいたします。
周波数カウンタ組立キット[第4回]
2015.9.21upload
前へ
次へ
ホームページトップへ戻る