;************************************************************************ ;** RB(ポートB)<7:4> ビットの変化による割込み ;** 発信機周波数 任意、アイドルタイムに影響します、今回は 8MHZ ;** にて検証 ;** 使用例    データロガー等で入力値の変化待ち ;** 2005年11月16日V1.0 ;************************************************************************ TITLE "RB<7:4> INT Program" LIST P=16F873,F=INHX8M,R=DEC ;16F873で動作確認16F84にても可能 ;------------------------------------------------------------------------ ; 入出力端子の使用状態 ;------------------------------------------------------------------------ ;RA<4:0> OUT ;出力に使用 ;RB<7:4> IN ;割込、起動に使用 ;------------------------------------------------------------------------ ; 定数定義 ;------------------------------------------------------------------------ W EQU 0 ;W  レジスタを指定 SELF EQU 1 ;自分自身のレジスタを指定 STATUS EQU H'03' ;Status レジスタ RA EQU H'05' ;Port A 端子 RB EQU H'06' ;Port B 端子 INTCON EQU H'0B' ;割込 レジスタ W_TEMP EQU H'20' ;W レジスタの退避先 STATUS_TEMP EQU H'21' ;STATUS レジスタの退避先 COUNT1 EQU H'31' ;アイドリング用 COUNT2 EQU H'32' COUNT3 EQU H'33' OPTION_REG EQU H'81' ;Option レジスタ TRISA EQU H'85' ;Port A の設定先 TRISB EQU H'86' ;Port B の設定先 ADCON1 EQU H'9F' ;Port A のA/D又はデジタル設定先 ;16F84 にては未使用 ;------------------------------------------------------------------------ ; スタートアドレスの設定 ;------------------------------------------------------------------------ ORG 0 GOTO START ;一般プログラムのスタート番地 ORG 4 GOTO PUSHU ;割込プログラムのスタート番地 ;------------------------------------------------------------------------ ; サブルーチン プログラム ;------------------------------------------------------------------------ MS10 CLRF COUNT1 ;10mS 程度のアイドリング MOVLW D'26' MOVWF COUNT2 LOOP1 DECFSZ COUNT1,SELF GOTO LOOP1 DECFSZ COUNT2,SELF GOTO LOOP1 RETURN S3 MOVLW D'250' ;2.5秒 程度のアイドリング MOVWF COUNT3 LOOP2 CALL MS10 DECFSZ COUNT3,SELF GOTO LOOP2 RETURN ;------------------------------------------------------------------------ ; システムのイニシャライズ ;------------------------------------------------------------------------ START BCF STATUS,6 ;BANK 0,1 を選択 BCF STATUS,5 ;BANK 0  を選択 CLRF INTCON ;割込レジスタをクリア BSF STATUS,5 ;BANK 1 を選択 MOVLW B'00000110' ;Port A 全てをデジタル使用 MOVWF ADCON1 ;レジスタに書込 MOVLW B'00000000' ;Port A 全て出力に設定 MOVWF TRISA ;Port A Setup MOVLW B'11110000' ;Port B<7:4> を入力に設定 MOVWF TRISB ;Port B Setup BCF STATUS,5 ;BANK 0 を選択 CLRF RA ;RA をクリアしておく CLRF RB ;RB をクリアしておく ;------------------------------------------------------------------------ ; メインルーチン ;------------------------------------------------------------------------ MAIN NOP ;おまじない CLRF RA ;RA をクリアしておく BCF INTCON,0 ;RB<7:4> 割込フラグをクリア BSF INTCON,3 ;RB<7:4> の割込を許可 BSF INTCON,7 ;グローバル割込を許可 NOP LOOP3 NOP GOTO LOOP3 ;アイドリングループ ;------------------------------------------------------------------------ ; 割込プログラム ;------------------------------------------------------------------------ PUSHU MOVWF W_TEMP ;レジスタ類の退避 SWAPF STATUS,W ; BCF STATUS,5 ; MOVWF STATUS_TEMP ; BTFSS INTCON,0 ;割込の確認 GOTO POP ;RB<7:4> では無い CALL MS10 ;10mS のチャッタリング防止 SWAPF RB,W ;RB を読み込んで ANDLW B'00001111' ;下の 4 ビットを使用 MOVWF RA ;RA に書込 MOVF RA,SELF ;RA をチェックして SKPNZ ;RA が 0 なら BSF RA,4 ;RA,4 をセット CALL S3 ;2.5 秒程度のアイドリング CLRF RA ;RA をクリア BCF INTCON,0 ;RB<7:4> 割込フラグのクリア POP BCF STATUS,5 ;レジスタ類の復帰 SWAPF STATUS_TEMP,W ; MOVWF STATUS ; SWAPF W_TEMP,SELF ; SWAPF W_TEMP,W ;  RETFIE ;割込みを許可したリターン ;------------------------------------------------------------------------ ; END 処理 ;------------------------------------------------------------------------ END ;------------------------------------------------------------------------ ; 注意事項 ;------------------------------------------------------------------------   割込の許可は必要最大限遅い所にプログラムをする。 割込の許可の前にフラグをクリアしておく。 割込のプログラムは出来るだけ短くする。 RB<7:4> のノイズを極力小さくする。 ノイズが大きいと設定に関係なく、割込が発生する恐れがある。 その他必要が在れば PCLATH,FSR レジスタの退避、復帰の処理も行う。 上記のプログラムを実効します時には、全ての割込フラグをクリア してから「アイドリング」状態にて待機する様にします。 RB<7:4> の何れかの端子に変化を発生させますと、割込のベクターに ジャンプして RB<7:4> の状態を 2.5 秒程度の時間 RA に出力します。 RA,4 端子はオープンコレクター出力ですので「抵抗」で「プルアップ」を   ないと出力が出て来ません。 URL http://int.picfun.net Copyright (c) 2005-2006, Kurosu. All Rights Reseved