;************************************************************************* ;** RB(ポートB),0 ビットの立上り又は立下りによる割込み ;** 発信機周波数 任意 ;** 使用例 位相制御時のゼロクロス取り込み ;** プログラムに依る緊急停止 ;** 2005年11月9日V1.0 ;************************************************************************* TITLE "RB0 INT Program" LIST P=16F873,F=INHX8M,R=DEC ;16F873で動作確認16F84にても可能 ;------------------------------------------------------------------------ ; 入出力端子の使用状態 ;------------------------------------------------------------------------ ;RA<5:0> OUT ;デモ出力用 ;RB,0 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 レジスタの退避先 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 ;割込プログラムのスタート番地 ;------------------------------------------------------------------------ ; システムのイニシャライズ ;------------------------------------------------------------------------ START BCF STATUS,6 ;BANK 0,1 を選択 BCF STATUS,5 ;BANK 0  を選択 CLRF INTCON ;割込レジスタをクリア BSF INTCON,4 ;RB,0 割込を使用可能にする BSF STATUS,5 ;BANK 1 を選択 MOVLW B'00000110' ;Port A 全てをデジタル使用 MOVWF ADCON1 ;レジスタに書込 MOVLW B'00000000' ;Port A 全て出力設定 MOVWF TRISA ;Port A Setup ; MOVLW B'XXXXXXX1' ;0 ビット目は入力に  ; ;他は使用目的に合わせる MOVLW B'11111111' ;例 全て入力に設定 MOVWF TRISB ;Port B に書込 ; MOVLW B'10XXXXXX' ;RBプルアップ未使用 ↓設定 ;ウオッチドッグタイマー及び TMR0 ; ;タイマーに拘らなければ X は全て ; ; 0 にても可 ; MOVLW B'11XXXXXX' ;RBプルアップ未使用 ↑設定 MOVLW B'00000000' ;例 プルアップ使用、↓設定 MOVWF OPTION_REG ;レジスタに書込 BCF STATUS,5 ;BANK 0 を選択 CLRF RA ;------------------------------------------------------------------------ ; メインルーチン ;------------------------------------------------------------------------ ;MAIN XXX XXX ;一般のプログラム BCF INTCON,1 ;割込み発生フラグをクリアしておく NOP ;おまじない BSF INTCON,7 ;設定されている割込みを使用可能 ; ;(許可)する ; BCF INTCON,7 ;割込を中止した時は ; NOP ; ; BCF INTCON,1 ;割込み発生フラグもクリアする LOOP1 NOP ;実際にはここに色々なプログラム ; ;が入る GOTO LOOP1 ;アイドリングをしているだけ ;------------------------------------------------------------------------ ; 割込プログラム ;------------------------------------------------------------------------ PUSHU MOVWF W_TEMP ;レジスタ類の退避 SWAPF STATUS,W ; BCF STATUS,5 ; MOVWF STATUS_TEMP ; BTFSS INTCON,1 ;割込の確認 GOTO POP ;RB,0 では無い ; XXX XXX ;割込みの目的プログラム INCF RA,SELF ;例 RA をインクリメントする BCF INTCON,1 ;割込み発生フラグをクリアする POP BCF STATUS,5 ;レジスタ類の復帰 SWAPF STATUS_TEMP,W ; MOVWF STATUS ; SWAPF W_TEMP,SELF ; SWAPF W_TEMP,W ; RETFIE ;割込みを許可したリターン ;------------------------------------------------------------------------ ; END 処理 ;------------------------------------------------------------------------ END ;------------------------------------------------------------------------ ; 注意事項 ;------------------------------------------------------------------------  割込の許可は必要最大限遅い所にプログラムをする 割込の許可の前にフラグをクリアしておく   割込のプログラムは出来るだけ短くする RB,0 のノイズを極力小さくする ノイズが大きいと設定に関係なく、立上りと立下りの両方で割込が発生する その他必要が在れば PCLATH,FSR レジスタの退避、復帰の処理も行う 上記のプログラムを実効しますと、割込の都度 RA ポートが順番に増加して いくのが分かります。 RA,4 端子はオープンコレクター出力ですので「抵抗」で「プルアップ」を しないと出力が出て来ません。 RB,0 端子に簡単なスイッチを接いでテストをしますと、一回のスイッチの 「入り」に対して凄い数の割込が発生する事が多いです。 これはスイッチの「チャタリング」に寄るものでして、「切り」にした時にも 発生する事があります。 これの防ぎ方に付きましては色々な方法がありますので、項を改めまして 記載したいと思います。 URL int.picfun.net Copyright (c) 2005-2006, Kurosu. All Rights Reseved