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