;******************************************************************************** ;** TMR1 CCP タイマー1のコンペアを使用した割込 ;** 発信機周波数 8.00MHZ が切りが良い ;** 使用例    ハードウエアタイマーを使用した長時間のタイマー ;**        位相制御時のトリガータイムの作成 ;** サンプルの例では RB,1とRB,2の端子に交互に設定した ;** 時間巾の出力が出ます。LEDのランプを付ければ、肉眼でも ;** 確認出来ます。 ;** 2005年11月8日V1.0 ;******************************************************************************** TITLE "TMR1 CCP Program" LIST P=16F873,F=INHX8M,R=DEC ; 16F873 で動作確認 ;------------------------------------------------------------------------------- ; 入出力端子の使用状態 ;------------------------------------------------------------------------------- ;RB,1 OUT ;デモNO1出力 ;RB,2 OUT ;デモNO2出力 ;------------------------------------------------------------------------------- ; 定数定義 ;------------------------------------------------------------------------------- W EQU 0 ;W  レジスタを指定 SELF EQU 1 ;自分自身のレジスタを指定 STATUS EQU H'03' ;Status レジスタ RB EQU H'06' ;Port B 今回は RB<2:1> に出力してみる RC EQU H'07' ;今回は未使用 INTCON EQU H'0B' ;グローバル 割込設定レジスタ ;基本割込検出フラグを含む PIR1 EQU H'0C' ;周辺機器  割込検出フラグ TMR1L EQU H'0E' ;16ビット 下位カウンター TMR1H EQU H'0F' ;16ビット 上位カウンター T1CON EQU H'10' ;タイマー1 設定レジスタ CCPR1L EQU H'15' ;コンペア用 下位レジスタ CCPR1H EQU H'16' ;コンペア用 上位レジスタ CCP1CON EQU H'17' ;キャプチャー,コンペア設定レジスタ W_TEMP EQU H'20' ;W  レジスタの退避先 STATUS_TEMP EQU H'21' ;STATUS  レジスタの退避先 HTEMP EQU H'30' ;作業用の H レジスタ LTEMP EQU H'31' ;作業用の L レジスタ TRISB EQU H'86' ;Port B の設定先 TRISC EQU H'87' ;Port C の設定先 PIE1 EQU H'8C' ;周辺機器 割込設定レジスタ ;-------------------------------------------------------------------------------- ; スタートアドレスの設定 ;-------------------------------------------------------------------------------- ORG 0 GOTO START ;一般プログラムのスタート番地 ORG 4 GOTO PUSHU ;割込プログラムのスタート番地 ;-------------------------------------------------------------------------------- ; システムのイニシャライズ ;-------------------------------------------------------------------------------- START BCF STATUS,6 ;BANK 0,1 を選択 BCF STATUS,5 ;BANK 0  を選択 CLRF INTCON ;グローバル割込レジスタをクリア BSF STATUS,5 ;例 BANK 1 を選択 ; MOVLW B'XXXXXX0X' ;例 1 ビット目は出力 他は使用目的に合わせる MOVLW B'00000000' ;例 全て出力 MOVWF TRISB ;例 Port B に書込 BCF STATUS,5 ;例 BANK 0  を選択 CLRF RB ;例 MOVLW B'00001010' ;コンペアモードを設定 MOVWF CCP1CON ;設定をレジスタに書込 BSF STATUS,5 ;BANK 1 を選択 MOVLW B'00000100' ;コンペア 割込 MOVWF PIE1 ;設定をレジスタに書込 BCF STATUS,5 ;BANK 0  を選択 ; MOVLW B'00AB0000' ;内部クロック,停止中 ABは注意事項参照 MOVLW B'00010000' ;例 1カウント 1.0μS MOVWF T1CON ;設定をレジスタに書込 BSF INTCON,6 ;周辺機器の割込を設定 BCF T1CON,0 ;TMR1 を停止させておく ;------------------------------------------------------------------------------------- ; メインルーチン ;------------------------------------------------------------------------------------- ;MAIN XXX XXX ;一般のプログラム MAIN NOP ; MOVLW D'00' ;例 作業用のレジスタに値を入れる ; MOVWF HTEMP ;例 ; MOVLW D'10' ;例 10カウント分を作る ; MOVWF LTEMP ;例 MOVLW H'FF' ;例 最大値 MOVWF HTEMP ;例 MOVLW H'FF' ;例 最大値 MOVWF LTEMP ;例 MAIN2 BCF INTCON,7 ;割込レジスタのクリア MOVF HTEMP,W ;作業用レジスタの値を MOVWF CCPR1H ;コンペア H レジスタに移す MOVF LTEMP,W ;作業用レジスタの値を MOVWF CCPR1L ;コンペア L レジスタに移す BCF T1CON,0 ;TMR1 を停止させておく CLRF TMR1H ;TMR1 H のカウンターをクリアする CLRF TMR1L ;TMR1 L のカウンターをクリアする BCF PIR1,2 ;割込み発生フラグをクリアしておく NOP ;おまじない BSF INTCON,7 ;設定されている割込みを使用可能(許可)する BSF T1CON,0 ;TMR1 をスタートさせる BSF RB,1 ;例 出力端子を HIGHT にする ; XXX XXX ;この先に色々なプロラムが続く LOOP1 NOP NOP ; BTFSC RB,1 ;例 割込が完了して端子がクリアされるのを待つ GOTO LOOP1 ; NOP NOP BCF INTCON,7 ;割込レジスタのクリア MOVF HTEMP,W ;作業用レジスタの値を MOVWF CCPR1H ;コンペア H レジスタに移す MOVF LTEMP,W ;作業用レジスタの値を MOVWF CCPR1L ;コンペア L レジスタに移す BCF T1CON,0 ;TMR1 を停止させておく CLRF TMR1H ;TMR1 H のカウンターをクリアする CLRF TMR1L ;TMR1 L のカウンターをクリアする BCF PIR1,2 ;割込み発生フラグをクリアしておく NOP ;おまじない BSF INTCON,7 ;設定されている割込みを使用可能(許可)する BSF T1CON,0 ;TMR1 をスタートさせる BSF RB,2 ;例 出力端子を HIGHT にする LOOP2 NOP NOP ; BTFSC RB,2 ;例 割込が完了して端子がクリアされるのを待つ GOTO LOOP2 ; NOP NOP ; GOTO MAIN2 ;最初に戻る ; BCF INTCON,7 ;割込を中止した時は ; NOP ; ; BCF PIR1,2 ;割込み発生フラグもクリアする ;-------------------------------------------------------------------------------------- ; 割込プログラム ;-------------------------------------------------------------------------------------- PUSHU MOVWF W_TEMP ;レジスタ類の退避 SWAPF STATUS,W ; BCF STATUS,5 ; MOVWF STATUS_TEMP ; TRG BTFSS PIR1,2 ;割込の確認 GOTO POP ;コンペアでは無い ; XXX XXX ;割込みの目的プログラム BCF RB,1 ;例 出力端子を LOW レベルにする NOP ;おまじない BCF RB,2 ;例 出力端子を LOW レベルにする BCF T1CON,0 ;TMR1 を停止 BCF PIR1,2 ;割込み発生フラグをクリアする POP BCF STATUS,5 ;レジスタ類の復帰 SWAPF STATUS_TEMP,W ; MOVWF STATUS ; SWAPF W_TEMP,SELF ; SWAPF W_TEMP,W ; RETFIE ;割込みを許可したリターン ;----------------------------------------------------------------------------------- ; END 処理 ;----------------------------------------------------------------------------------- END ;------------------------------------------------------------------------------------ ; 注意事項 ;------------------------------------------------------------------------------------ タイマーを動かし始めたならば、コンペア用の CCPR1H,CCPR1L はいじらない事 誤動作する事が多い。 タイマー動作中に演算値を変更する場合は HTEMP,LTEMP を用意してそちらに 書き込んでおく。 コンペア成立時に RC,2/CCP1 端子をハードでセット又はクリアするモードも 有りますが、任意の端子にパルスを作りたいので、割込ルーチンの内で ソフト的に処理しました。 ソフトで端子のセット及びクリアを行いますので、設定値とは若干の誤差が出ます。 カウント数を10にした上記プログラムによる誤差 割込 5 ステップ  目的に付く迄 7 ステツプ 計 12 ステップ×0.5マイクロ 6.0 マイクロセコンドの 増加 予め 6.0 マイクロセコンド 分を設定値より引いておくと良いです。   割込の許可は必要最大限遅い所にプログラムをする 割込の許可の前にフラグをクリアしておく 割込のプログラムは出来るだけ短くする その他必要が在れば PCLATH,FSR レジスタの退避、復帰の処理も行う 8.00MHZ の発信器を使用した場合 1カウントの時間巾及び最大設定時間は AB=00 0.5μS 32.76mS AB=01 1.0μS 65.53mS AB=10 2.0μS 131.07mS AB=11 4.0μS 262.14mS となります URL http://int.picfun.net Copyright (c) 2005-2006, Kurosu. All Rights Reseved