***************************************************************************** ; TMR0 のオーバーフローによる割込みです ; 外部入力によるカウントも出来ますが今回は省略します ; WDT と共通の部分がありますので注意を要します 21.01.27 ***************************************************************************** ;----- 割込条件の設定 ---------------------------------------------------- ORG 4 GOTO PUSHU ;割込プログラムのスタート番地 W_TEMP EQU H'20' ;W レジスタの退避先 STATUS_TEMP EQU H'21' ;STATUS レジスタの退避先 ;----- TMR0 SET ---------------------------------------------------------- BCF STATUS,RP1 ;BANK 0:1 を選択 BSF STATUS,RP0 ;BANK 1 を選択 MOVLW B'**000###' ;** PORTB にて使用 ;内部クロック使用 WDT 未使用 ;### PRI SCALA 1:2-256 MOVWF OPTION_REG ; BCF STATUS,RP0 ;BANK 0 に戻します ;----- 割込設定 ---------------------------------------------------------- CLRF INTCON ;INTCON のクリア BSF INTCON,T0IE ;TMR0 割込の許可 ;----- MAIN プログラム内での TMR0 のクリア及び割込みの許可 --------------- CLRF TMR0 ;TMR0 を強制的にクリアします BCF INTCON,T0IF ;T0IF 割込発生フラグのクリア BSF INTCON,GIE ;全割込の許可 ;----- 割込プログラム ---------------------------------------------------- PUSHU MOVWF W_TEMP ;レジスタ類の退避 SWAPF STATUS,W BCF STATUS,RP0 MOVWF STATUS_TEMP BTFSS INTCON,T0IF GOTO POP ;TMR0 割込では無い ; ここに目的のプログラムが入ります BCF INTCON,T0IF ;割込発生フラグのクリア POP BCF STATUS,RP0 ;レジスタ類の復帰 SWAPF STATUS_TEMP,W MOVWF STATUS SWAPF W_TEMP,SELF SWAPF W_TEMP,W RETFIE ;割込みを許可したリターン ;************************************************************************** ; 補足事項です ;************************************************************************** 注0 必要ならば FSR,PCH 等の退避及び復帰も行います 注1 時間巾(mS)は 4×PS値×256 / 発振周波数(MHz)×1,000 となります 注2 発振周波数 PS=2 PS=256 3.2768(MHz) 0.625 80.00 (mS) 4.0 0.512 65.536 8.0 0.256 32.768 10.0 0.2048 26.2144 16.0 0.128 16.384 20.0 0.1024 13.1072 注3 TMR0 にはスタート、停止の機能がありませんのでセットを行いますと 直ぐにカウントを始めます。割込みの許可は MAIN プログラムの内での 準備が整ってからにした方が良いと思います 注4 割込の許可は必要最大限遅い所にプログラムをします 割込の許可の前にフラグをクリアしておきます 割込のプログラムは出来るだけ短くします 注5 外部入力を使用する場合は PORTA,4 を入力に設定して (ハイインピーダンス化)? MOVLW B'**1H0###' ;H=1 立下りでカウント ;H=0 立上りでカウント MOVWF OPTION_REG ;とします ;**************************************************************************