***************************************************************************** ; TMR1 のカウンター値と CCPR1H,CCPR1L との一致による割込みです ; 16ビット設定が出来、ほぼ任意の時間巾が作れとても便利です ; 外部入力によるカウントも出来ますが今回は省略します    21.01.26 ***************************************************************************** ;----- 割込条件の設定 ---------------------------------------------------- ORG 4 GOTO PUSHU ;割込プログラムのスタート番地 W_TEMP EQU H'20' ;W レジスタの退避先 STATUS_TEMP EQU H'21' ;STATUS レジスタの退避先 ;----- TMR1 SET ----------------------------------------------------------- MOVLW B'00BB0000' ;BB PRI SCALE 1:1,2,4,8 ;内部クロック使用 MOVWF T1CON ;TMR1 を停止しておきます ;----- CCP1CON SET -------------------------------------------------------- MOVLW B'00001011' ;スペシャル、コンペアモードを設定 MOVWF CCP1CON ;設定をレジスタに書込 ;----- CCPR1H,CCPR1L SET -------------------------------------------------- MOVLW D'HHH' ;上位のコンペア数を MOVWF CCPR1H ;上位コンペアレジスタに設定 MOVLW D'LLL' ;下位のコンペア数を MOVWF CCPR1L ;下位コンペアレジスタに設定 ;----- 割込設定 ---------------------------------------------------------- CLRF INTCON ;INTCON のクリア BSF INTCON,PEIE ;周辺割込の許可 BCF STATUS,RP1 ;BANK 0:1 を選択 BSF STATUS,RP0 ;BANK 1 を選択 BSF PIE1,CCP1IE ;CCP1 割込の許可 BCF STATUS,RP0 ;BANK 0 に戻す BCF PIR1,CCP1IF ;CCP1 割込発生フラグのクリア BSF INTCON,GIE ;全割込の許可 ;----- MAIN プログラム内での TMR1 のスタート ----------------------------- CLRF TMR1H ;TMR1 H のカウンターをクリアします CLRF TMR1L ;TMR1 L のカウンターをクリアします BSF T1CON,TMR1ON ;----- 割込プログラム ---------------------------------------------------- PUSHU MOVWF W_TEMP ;レジスタ類の退避 SWAPF STATUS,W BCF STATUS,RP0 MOVWF STATUS_TEMP BTFSS PIR1,CCP1IF GOTO POP ;CCP1 割込では無い ; ここに目的のプログラムが入ります BCF PIR1,CCP1IF ;割込発生フラグのクリア POP BCF STATUS,RP0 ;レジスタ類の復帰 SWAPF STATUS_TEMP,W MOVWF STATUS SWAPF W_TEMP,SELF SWAPF W_TEMP,W RETFIE ;割込みを許可したリターン ;************************************************************************** ; 補足事項です ;************************************************************************** 注0 必要ならば FSR,PCH 等の退避及び復帰も行います 注1 論理的には1カウントより 665,536 カウント迄の1カウント単位の 任意の長さのインターバルタイマーが作れるはずですが 短い時間の方は、割込に使用するプログラムの長さにより制限を受けます 注2 又原因は不明ですが実測の値は1カウント分長くなっておりますので 調整値として CCPR1L の設定を−1する必要があります この事は殆どの図書や参考資料に記載されているのを見かけません それらの筆者の方はプログラムを実際に動作をさせているのでしょうか? 注3 割込の許可は必要最大限遅い所にプログラムをします 割込の許可の前にフラグをクリアしておきます 割込のプログラムは出来るだけ短くします 注4 プリスケラ 8MHz発振器の場合単位時間及び最大値 AB=00 1:1 0.5μS 32.76mS AB=01 1:2 1.0μS 65.53mS AB=10 1:4 2.0μS 131.07mS AB=11 1:8 4.0μS 262.14mS 注5 時間幅(μS)=(カウント設定数+1)*4*プリスケラ/発振周波数(MHz) カウント設定数=( 時間幅(μS)/4/プリスケラ*発振周波数(MHz))-1 となります 注6 H=0 L=255 実測 256 H=1 L=0 実測 257 H=1 L=43 実測 300 設定値は 要求値から−1をしてセットする必要が あります 注6 発振周波数を 3.2768MHz にして、オーバーフロー設定の場合 PS1=312.5μS PS4=1.250mS PS16=5.00mS として使用出来ます 注7 発振周波数を 4MHz,8MHz,16MHz にしまして、コンペア設定を 行いますと割合に任意の時間巾が作れます 注8 最大時間巾は 3.2768MHzでは 80mS 4.0MHzでは 65.536mS 8MHzでは 32.768mS 16MHzでは 16.384mS  となります ;*************************************************************************