2015.9.23
前へ
次へ
ホームページトップへ戻る

新製品の紹介(プチ連載です)
周波数カウンタ組立キット

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
たまにはちょいと息抜きで小品も作ってみたいものです。
簡単にチョイチョイと…。
でも、なかなかそうは簡単にはいかなくて、いつものごとく回を重ねてしまうことになるのかも…。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜


[第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

前へ
次へ
ホームページトップへ戻る