PIC16F628A 883周波数カウンタの周波数測定部の説明をします。基本的には「電子工作etc」といいうWebサイトに掲載されエイル周波数カウンタV7のアルゴリズムを使わせていただいています。
PIC16F628Aには、外部クロックTCXO(温度補償型水晶発振器)12.8MHzを供給します。
ゲートタイムは、TMR2を使い1秒を作り出します。詳しくは私のホームページ「JH7UBCホームページ」のPIC16F883周波数カウンタの試作の記事を参照してください。
PIC16F628AのTMR2は、8ビットカウンタですが、プリスケーラとポストスケーラを持っています。T2CONで、プリスケーラ1:16、ポストスケーラ1:1にセットします。
TMR2は8ビットカウンタですので、プリスケーラと組み合わさりクロック16×256個ごとにオーバーフローが発生します。この時、TMR2オーバーフロー割り込みが発生しますので、この割り込み回数をカウントして(実際にはカウントダウンして)1秒を作ります。
周波数カウンタ本体は、TMR1(16ビットカウンタ)を使います。TMR1だけで、65535Hzまで測定可能ですが、TMR1のオーバーフローをカウントすることにより、より高い周波数までカウントすることができます。
オーバーフローの回数は、例えば入力周波数が65.536MHzなら1000回と1msに1回となり、割り込みを使わなくともプログラムの中で処理ができます。具体的には、
;===== 測定 =====
FREQ
BTFSS T2CON,TMR2ON ;TMR2ON=1ならスキップ
GOTO MSTOP ;TMR2ON=0なら測定終了
BTFSS PIR1,TMR1IF ;TIMER1がオーバーフローしたらスキップ
GOTO FREQ
BCF PIR1,TMR1IF ;TMR1IFクリア
INCFSZ BYTE2 ;BYTE2+1 0ならスキップ
GOTO FREQ
INCF BYTE3 ;BYTE3+1
GOTO FREQ
FREQ
BTFSS T2CON,TMR2ON ;TMR2ON=1ならスキップ
GOTO MSTOP ;TMR2ON=0なら測定終了
BTFSS PIR1,TMR1IF ;TIMER1がオーバーフローしたらスキップ
GOTO FREQ
BCF PIR1,TMR1IF ;TMR1IFクリア
INCFSZ BYTE2 ;BYTE2+1 0ならスキップ
GOTO FREQ
INCF BYTE3 ;BYTE3+1
GOTO FREQ
という具合に測定ルーチンの中で処理しています。
測定が終わるとバイナリーBCD変換でTMR1(BYTE0+BYTE1)+BYTE2+BYTE3の32ビット(4バイト)の2進数を4バイトのBCD(10進化2進)に変換します。
このBCDコードを上位から4ビットずつアスキーコードにして全8バイト+CRコード(0Dh)をシリアル通信で表示部に送信しまうす。
アスキーコードで送信するのは、周波数測定部のチェックをするときにパソコンの通信ソフト(TerraTermを使っています)で容易に確認できるからです。
シリアル通信は、PIC16F628AのUSARTを使いボーレートは、19200bpsとしました。
USARTの設定はTXSTAとRCSTA、SPBRGで次のように行います。
;=== USARTの初期化 ===
BANKSEL TXSTA
MOVLW 0x24 ;非同期モード、高速通信モード
MOVWF TXSTA ;set TX mode
MOVLW d'41' ;12.8MHz, 19200bps
MOVWF SPBRG ;ボーレートセット
BANKSEL RCSTA
MOVLW 90h ;RB1,RB2をシリアルポートに
MOVWF RCSTA
BANKSEL TXSTA
MOVLW 0x24 ;非同期モード、高速通信モード
MOVWF TXSTA ;set TX mode
MOVLW d'41' ;12.8MHz, 19200bps
MOVWF SPBRG ;ボーレートセット
BANKSEL RCSTA
MOVLW 90h ;RB1,RB2をシリアルポートに
MOVWF RCSTA
以上、勘所のみ説明をしました。アセンブラのソースリストは後程JH7UBCブログに掲載します。
最後に回路図です。
次回は、周波数表示部について説明します。