新製品の紹介(プチ連載です)
周波数カウンタ組立キット
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
たまにはちょいと息抜きで小品も作ってみたいものです。
簡単にチョイチョイと…。
でも、なかなかそうは簡単にはいかなくて、いつものごとく回を重ねてしまうことになるのかも…。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第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
前へ
次へ
ホームページトップへ戻る