3.「割込み」について
 すべてのコンピュータは「割込み」機能を準備しています。 この「割込み」機能はコンピュータの最大の特徴であり、簡単なプログラムでは使わなくても済みますが、
ちょっと複雑な処理には不可欠です。  PIC16F88の場合13種の割込みが用意されていますが、その中の「タイマ1」を使った長時間タイマを紹介します。 
入門書によくあるプログラムのループを使ったタイマではループに入ってしまうと、他の処理が何もできなくなりますが、割込みを利用したタイマではタイマを動かしながら
通常通りの処理ができます。  
以下、PIC16F88/18xxの「割込み」のしくみから解説します。
3.1       PIC16F88/18xxの「割込み」のしくみ
 PIC16Fシリーズのマイコンは割込みが許可されていると、どの時点からでも割込みが発生し、現在実行しているアドレスの次のアドレスを退避した後、
4番地(「割込みベクタ」)にジャンプし、そこから命令の実行を再開始します。 従って、4番地以降に割込み後の処理(割込み処理)を記述します。 
割込み処理の最後にRETFIE命令を入れることで、退避された割込み前のアドレスに自動的に戻り、中断された通常処理を続行します。
3.2       「割込み処理」の中身
 割込み処理は、次の割込みを抑えるために、割込み禁止で実行します。 従って、一刻も早く抜け出すために、余分な処理はせず、必要最小限の処理に留めます。
 以下が当工房が使っているプログラム構成です。
3.3 コーディング例
  実際のコーディング例を以下に示します。 3.2の構成図と対比させて見てください。
  (この例はTMR1割込みとソフトタイマを組み合わせて、約5.5分の長時間タイマを作ったものです。 タイム・オーバーすると、内部フラグ(CFLAG)
  を立て、メインルーチンに組み込んだ処理にイベントの発生を伝えます。)
3.3.1 PIC16F88の場合
;******************************************************************
; Interrupt Handler
;******************************************************************
;
        ORG 4
INTPROC
BCF INTCON,GIE ;inhibit all interrupt
MOVWF IWSAVE ;save reg's at interrupt
SWAPF STATUS,W ;
MOVWF ISSAVE ;
MOVF PCLATH,W ;
MOVWF IPSAVE ;
MOVF FSR,W ;
MOVWF IFSAVE ;
; CLRF STATUS ;select bank 0
;Decode Interrupt element
BTFSC PIR1,TMR1IF ;check TMR1 int.flag
GOTO TMR1PROC ;
BTFSC PIR1,TMR2IF ;check TMR2 int.flag
GOTO TMR2PROC ;
GOTO PROCE ;
;***********************************************
; 5.5 minutes timer (262 ms interval)
;********************************
TMR1PROC
BCF PIR1,TMR1IF ;clear TMR1 flag for next
INCF INTCL,F ;count up int.timer(L)
BTFSS STATUS,Z ;check carry over
GOTO PROCE
INCF INTCH,F ;count up int.timer(H) (67 sec.)
MOVLW .5 ;check int. time over( 5.5 min.)
SUBWF INTCH,W ;
BTFSS STATUS,Z ;
GOTO PROCE
TPROC1
BSF CFLAG,TOVR ;set time over flag
CLRF INTCH ;reset int. timer
CLRF INTCL ;
GOTO PROCE
;
;***********************************************
TMR2PROC
   (省略)
;************************************************************
PROCE
MOVF IFSAVE,W ;restore reg's
MOVWF FSR ;
MOVF IPSAVE,W ;
MOVWF PCLATH ;
SWAPF ISSAVE,W ;
MOVWF STATUS ;
SWAPF IWSAVE,F ;
SWAPF IWSAVE,W ;     
BSF INTCON,GIE ;enable interrupt
RETFIE
3.3.2 PIC16F18xxの場合
;******************************************************************
; Interrupt Handler
;******************************************************************
;
        ORG 4
INTPROC
BCF INTCON,GIE ;inhibit all interrupt
; CLRF BSR ;select bank 0
;Decode Interrupt element
BTFSC PIR1,TMR1IF ;check TMR1 int.flag
GOTO TMR1PROC ;
BTFSC PIR1,TMR2IF ;check TMR2 int.flag
GOTO TMR2PROC ;
GOTO PROCE ;
;***********************************************
; 5.5 minutes timer (262 ms interval)
;********************************
TMR1PROC
BCF PIR1,TMR1IF ;clear TMR1 flag for next
INCF INTCL,F ;count up int.timer(L)
BTFSS STATUS,Z ;check carry over
GOTO PROCE
INCF INTCH,F ;count up int.timer(H) (67 sec.)
MOVLW .5 ;check int. time over( 5.5 min.)
SUBWF INTCH,W ;
BTFSS STATUS,Z ;
GOTO PROCE
TPROC1
BSF CFLAG,TOVR ;set time over flag
CLRF INTCH ;reset int. timer
CLRF INTCL ;
GOTO PROCE
;
;***********************************************
TMR2PROC
   (省略)
;************************************************************
PROCE
四角形吹き出し: すべての割込みを許可する。
BSF INTCON,GIE ;enable interrupt
RETFIE
3.4 割込み処理をコーディングする際の留意点
(1)   割込み処理は原則、割込み禁止で行う。
(2)   割込み前の主要レジスタの状態は必ず退避し、戻る直前で回復させる。(PIC16F18xxでは不要)
(3)   割込み処理内で、必ず割込みフラグはクリアする。(よく忘れるので、特に注意が必要)
(4)   割込み処理は即時処理が必要な場合を除き、イベントの刈り取り程度で簡潔に終わらせ、次の割込みに備える。
(5)   割込み処理の結果は専用の内部フラグやレジスタを用意し、そこを介して本処理をするメインルーチンに受け渡す。
3.5 あとがき
 PIC16F18xxではAutomatic Context Saving (ACS機能)がサポートされ、主要レジスタの退避、回復を隠しレジスタ(shadowレジスタ :bank 15)を使って
自動処理されるので、割り込み処理を高速に行えます。
 例えば、ポートAのRA1ピンを使って外部からのパルスを検知したい場合(IOC機能の利用)などには、より高速なパルスを刈り取ることが可能となる。