;********************************************************************** ;TMR1 TIMER TEST1 2001.11.10 ;DEVICE : PIC16F873 ;CLOCK : 20MHz ;TMR1の割り込みを使った、インターバルタイマー動作 ;PORTBからカウントアップ出力を行なう ;内蔵の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なし BSF PIE1,TMR1IE ;TMR1オーバーフロー割り込み許可 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にクリア BSF INTCON,PEIE ;周辺割り込みの許可 BSF INTCON,GIE ;全体割り込みの許可 BSF T1CON,TMR1ON ;TMR1のTMR1ONビットをセット カウント開始 ;*********************************************************************** ;割り込みを待つループ ;*********************************************************************** LOOP NOP ;何もしない GOTO LOOP ;ラベルLOOPにジャンプ ;*********************************************************************** ;割り込み処理 ;*********************************************************************** INTR MOVLW 00H ;Wレジスタに00Hをセット MOVWF TMR1L ;TMR1Lに下位8ビットデータをセット MOVLW 00H ;Wレジスタに00Hをセット MOVWF TMR1H ;TMR1Hに上位8ビットデータをセット BCF PIR1,TMR1IF ;オーバーフローフラグのクリア BSF STATUS,RP0 ;メモリーバンクを1にセット BSF PIE1,TMR1IE ;オーバーフロー割り込み許可 BCF STATUS,RP0 ;メモリーバンクを0にセット INCF CNT1,F ;変数CNT1に+1する。 MOVF CNT1,W ;WレジスタにCNT1の値をセット MOVWF PORTB ;PORTBへCNT1の値を出力 RETFIE ;割り込みを許可してリターン END