;***************************************************************************** ; TMR2 のオーバーフロー及び PR2との一致による割込みです ; PR2=D'255' とオーバーフローは同一条件になります ; コンペアとオーバーフロ両方に使えて便利です 21.01.27 ***************************************************************************** ;----- 割込条件の設定 ---------------------------------------------------- ORG 4 GOTO PUSHU ;割込プログラムのスタート番地 W_TEMP EQU H'20' ;W レジスタの退避先 STATUS_TEMP EQU H'21' ;STATUS レジスタの退避先 ;----- TMR2 SET ---------------------------------------------------------- MOVLW B'0AAAA0BB' ;AAAA POST SCALE 1:1-16 ;BB PRI SCALE 1:1,4,16 MOVWF T2CON ;TMR2 停止しておきます ;----- PR2 SET ----------------------------------------------------------- BCF STATUS,RP1 ;BANK 0:1 を選択 BSF STATUS,RP0 ;BANK 1 を選択 MOVLW D'nn' ;コンペアで使用の時 MOVLW D'255' ;オーバーフローで使用の時 MOVWF PR2 ;リセット時にはD'255'にセット ;されている様です BCF STATUS,RP0 ;BANK 0 に戻します ;----- 割込設定 ---------------------------------------------------------- CLRF INTCON ;INTCON のクリア BSF INTCON,PEIE ;周辺割込の許可 BCF STATUS,RP1 ;BANK 0:1 を選択 BSF STATUS,RP0 ;BANK 1 を選択 BSF PIE1,TMR2IE ;TMR2 割込の許可 BCF STATUS,RP0 ;BANK 0 に戻す BCF PIR1,TMR2IF ;TMR2 割込発生フラグのクリア BSF INTCON,GIE ;全割込の許可 ;----- MAIN プログラム内での TMR2 のスタート ----------------------------- CLRF TMR2 ;TMR2 をクリアします BSF T2CON,TMR2ON ;----- 割込プログラム ---------------------------------------------------- PUSHU MOVWF W_TEMP ;レジスタ類の退避 SWAPF STATUS,W BCF STATUS,RP0 MOVWF STATUS_TEMP BTFSS PIR1,TMR2IF GOTO POP ;TMR2 割込では無い ; ここに目的のプログラムが入ります BCF PIR1,TMR2IF ;割込発生フラグのクリア POP BCF STATUS,RP0 ;レジスタ類の復帰 SWAPF STATUS_TEMP,W MOVWF STATUS SWAPF W_TEMP,SELF SWAPF W_TEMP,W RETFIE ;割込みを許可したリターン ;*************************************************************************** ; 補足事項です ;*************************************************************************** 注0 必要ならば FSR,PCH 等の退避及び復帰も行います 注1 AAAA ポストスケール 0000=1:1 0001=1:2 0010=1:3 0011=1:4 0100=1:5 0101=1:6 0110=1:7 0111=1:8 1000=1:9 1001=1:10 1010=1:11 1011=1:12 1100=1:13 1101=1:14 1110=1:15 1111=1:16 BB プリスケール(2倍及び8倍が無いので注意して下さい) 00=1:1 01=1:4 1*=1:16 注2 オーバーフロー時の時間巾(mS)は 4×プリスケール値×256×ポストスケール値 / 発振周波数(MHz)×1,000. 注3 実測の結果判明した事ですが PR2=0  サイクル=1 PR2=255  サイクル=256 何らかの処理に+1サイクルが必要の様ですので PR2 の設定値は「必要サイクル数」から −1 した値を設定して下さい 注4 コンペア時の時間巾(mS)は 4×プリスケール値×(PR2+1)×ポストスケール値 / 発振周波数(MHz) ×1,000. 注5 PR2 の設定数は 時間(μS)×発振周波数(MHz)/ 4×プリスケール値 ×ポストスケール値 から更に -1 した値となります  注6 コンペアとして使用した時の最小値は 割込みに要する時間により大幅に異なります 全割込み経過時間+アルファー が必要の様です 注7 発振周波数を 3.2768MHz にして、オーバーフロー設定の場合 PS1=312.5μS PS4=1.250mS PS16=5.00mS として使用出来ます 注8 発振周波数を 4MHz,8MHz,16MHz にしまして、コンペア設定を 行いますと割合にきれいな整数の時間巾が作れます 注9 最大時間巾は 3.2768MHzでは 80mS 4.0MHzでは 65.536mS 8MHzでは 32.768mS 16MHzでは 16.384mS  となります 注10 理由は有りませんが同じ結果(時間巾)が設定出来るのならば 私は プリ及び PR2 を大きく、ポスト値を小さくします 注11 今まで殆どの文献や資料には取り上げられていませんが 使ってみますと結構便利なものです 何故取り上げられなかったのか不思議です ;***************************************************************************