;********************************************************************** ;TMR1 TIMER TEST2 2002.10.21 ;DEVICE : PIC16F873 ;CLOCK : 20MHz ;CCP1の割り込みを使った、TMR1インターバルタイマー動作 ;PORTBからカウントアップ出力を行なう ;CCP1に設定した値とコンペアマッチするとTMR1のカウントをクリアして ;割り込み処理を行う。 ;内蔵のTMR1カウンタだけで最長105mSのインターバルを発生する。 ;********************************************************************** list p=16F873 #include __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC & _LVP_OFF CNT1 EQU 20H ;アドレス20Hを変数CNT1とする。 ;********************************************************************** ORG 0 ;リセット時の開始アドレスセット GOTO MAIN ;メインルーチンMAINにジャンプ ORG 4 ;割り込みアドレスセット GOTO INTR ;割り込みルーチンINTRにジャンプ MAIN BSF STATUS,RP0 ;メモリーバンクを1にセット MOVLW 080H ;Wレジスタに80Hをセット MOVWF OPTION_REG ;OPTION_REGに80Hをセット PULL UPなし BCF PIE1,TMR1IE ;TMR1オーバーフロー割り込み禁止 BSF PIE1,CCP1IE ;CCP1コンペアマッチ割り込み許可 CLRF TRISB ;TRISBをクリア PORT-Bを出力にセット BCF STATUS,RP0 ;メモリーバンクを0にセット MOVLW 30H ;Wレジスタに30Hをセット MOVWF T1CON ;T1CONレジスタ プリスケーラ1:8 停止 MOVLW 00H ;Wレジスタに00Hをセット MOVWF TMR1L ;TMR1Lに下位8ビットデータをセット MOVLW 00H ;Wレジスタに00Hをセット MOVWF TMR1H ;TMR1Hに上位8ビットデータをセット CLRF CNT1 ;CNT1変数を00Hにクリア MOVLW 0BH ;Wレジスタに0BHをセット MOVWF CCP1CON ;CCP1CONレジスタ コンペアスペシャルイベント MOVLW 00H ;Wレジスタに00Hをセット MOVWF CCPR1L ;CCPR1Lに下位8ビットデータをセット MOVLW 80H ;Wレジスタに80Hをセット MOVWF CCPR1H ;CCPR1Hに下位8ビットデータをセット BSF INTCON,PEIE ;周辺割り込みの許可 BSF INTCON,GIE ;全体割り込みの許可 BSF T1CON,TMR1ON ;TMR1のTMR1ONビットをセット カウント開始 ;*********************************************************************** ;割り込みを待つループ ;*********************************************************************** LOOP NOP ;何もしない GOTO LOOP ;ラベルLOOPにジャンプ ;*********************************************************************** ;割り込み処理 ;*********************************************************************** INTR BCF PIR1,CCP1IF ;コンペアマッチフラグのクリア BSF STATUS,RP0 ;メモリーバンクを1にセット BSF PIE1,CCP1IE ;コンペアマッチ割り込み許可 BCF STATUS,RP0 ;メモリーバンクを0にセット INCF CNT1,F ;変数CNT1に+1する。 MOVF CNT1,W ;WレジスタにCNT1の値をセット MOVWF PORTB ;PORTBへCNT1の値を出力 RETFIE ;割り込みを許可してリターン END