;******************************************************************************* ; TMR0 を使用したインターバル割込 ; 発信機周波数 3.2768MHZ が望ましい ; 使用例 ハードウエアタイマーを使用した精度の高いインターバル信号の作製 ; 2005年11月9日V1.0 ;******************************************************************************* TITLE "TMR0 INT Program" LIST P=16F873,F=INHX8M,R=DEC ; 16F873 で動作確認 16F84 にても可能 ;------------------------------------------------------------------------------- ; 入出力端子の使用状態 ;------------------------------------------------------------------------------- ;RA<5:0> OUT ;デモ出力 ;------------------------------------------------------------------------------- ; 定数定義 ;------------------------------------------------------------------------------- W EQU 0 ;W  レジスタを指定 SELF EQU 1 ;自分自身のレジスタを指定 TMR0 EQU H'01' ;TMR0 カウンター STATUS EQU H'03' ;Status レジスタ INTCON EQU H'0B' ;割込 レジスタ RA EQU H'05' ;Port A 端子 W_TEMP EQU H'20' ;W レジスタの退避先 STATUS_TEMP EQU H'21' ;STATUS レジスタの退避先 OPTION_REG EQU H'81' ;Option レジスタ TRISA EQU H'85' ;Port A の設定書込 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,5 ;TMR0 割込を使用可能にする BSF STATUS,5 ;BANK 1 を選択 MOVLW B'00000110' ;Port A 全てをデジタル使用 MOVWF ADCON1 ;レジスタに書込 MOVLW B'00000000' ;Port A 全て出力設定 MOVWF TRISA ;Port A Setup ; MOVLW B'XX000ABC' ;内部発信機,ウオッチドッグタイマー未使用 ;ABC の設定は注意事項参照 ;XX は RB のプルアップ及び RB,0 割込にて使用 MOVLW B'11000111' ;80mS に設定 MOVWF OPTION_REG ;レジスタに書込 BCF STATUS,5 ;BANK 0 を選択 CLRF RA ;------------------------------------------------------------------------------------- ; メインルーチン ;------------------------------------------------------------------------------------- ;MAIN XXX XXX ;一般のプログラム BCF INTCON,2 ;割込み発生フラグをクリアしておく CLRF TMR0 ;TMR0 カウンターをクリアする BSF INTCON,7 ;設定されている割込みを使用可能(許可)する ; BCF INTCON,7 ;割込を中止した時は ; NOP ;おまじない ; BCF INTCON,2 ;割込み発生フラグもクリアする LOOP1 NOP ;実際にはここに色々なプログラムが入る NOP GOTO LOOP1 ;アイドリングをしているだけ ;-------------------------------------------------------------------------------------- ; 割込プログラム ;-------------------------------------------------------------------------------------- PUSHU MOVWF W_TEMP ;レジスタ類の退避 SWAPF STATUS,W ; BCF STATUS,5 ; MOVWF STATUS_TEMP ; BTFSS INTCON,2 ;割込の確認 GOTO POP ;TMR0 割込では無い ; XXX XXX ;割込みの目的プログラム INCF RA,SELF ;例 RA をインクリメントする BCF INTCON,2 ;割込み発生フラグをクリアする POP BCF STATUS,5 ;レジスタ類の復帰 SWAPF STATUS_TEMP,W ; MOVWF STATUS ; SWAPF W_TEMP,SELF ; SWAPF W_TEMP,W ; RETFIE ;割込みを許可したリターン ;------------------------------------------------------------------------------------ ; END 処理 ;------------------------------------------------------------------------------------ END ;------------------------------------------------------------------------------------ ; 注意事項 ;------------------------------------------------------------------------------------ 割込の許可は必要最大限遅い所にプログラムをします 割込の許可の前にフラグをクリアしておきます 割込のプログラムは出来るだけ短くします その他必要が在れば PCLATH,FSR レジスタの退避、復帰の処理も行います ABC の設定は発信機に 3.2768MHZ を使用した場合 000=625μS(1600Hz) 001=1.25mS(800Hz) 010=2.50mS(400Hz) 011=5.00mS(200Hz) 100=10.0mS(100Hz) 101=20.0mS(50Hz) 110=40.0mS(25Hz) 111=80.0mS(12.5Hz) となります 上記のプログラムを実効しますと、割込の都度RAポートが順番に増加して いくのが分かります。 RA,4端子はオープンコレクター出力ですので「抵抗」で「プルアップ」を しないと出力が出て来ません。 TMR0 を使用したインターバルタイマー早見表(内部クロック) ----------------------------------------------------------- 発振周波数 プリスケラー (M Hz) 1/2(000) 1/4(001) 1/8(010) 1/16(011) 1/32(100) 1/64(101) 1/128(110) 1/256(111) 1.00 488.2・・Hz 244.14・・Hz 122.07・・ 2.048mS 4.096mS 8.192MS 16.38MS 32.768MS 65.53MS 131.0mS 262.1mS 3.2768 1600Hz 800Hz 400Hz 200Hz 100Hz 50Hz 25Hz 12.5Hz 0.625mS 1.25mS 2.5mS 5.0mS 10.0mS 20.0mS 40.0mS 80.0mS