;********************************************************** ; ; テストプログラム PIC12F629を使用したLED点滅 ; TMR0を使用した割り込み ; ; 2007/12/05 version 1.00 初版 ; ; Copyright 2007 yas ;********************************************************** ;デバイス設定 list P=PIC12F629 ;使用するPICの設定 include "P12F629.INC" ;読み込む設定ファイルを指定 ;********************************************************** ; コンフィギュレーションビットの設定 CB = _CPD_OFF ;EEPROMもプログラム・メモリも CB &= _CP_OFF ;コード・プロテクトしない CB &= _BODEN_OFF ;ブラウンアウトリセットを使わない CB &= _MCLRE_OFF ;MCLRリセットを使わない CB &= _PWRTE_ON ;パワーアップ・タイマを使う CB &= _WDT_OFF ;ウォッチドッグタイマを使わない CB &= _INTRC_OSC_NOCLKOUT ;内部発振器を使う __CONFIG CB ;********************************************************** ;ファイルレジスタの設定 INT_C EQU 20h ;TMR0割込み回数カウント INT_F EQU 21h ;TMR0割込み回数発生フラグ INT_W EQU 22h ;Wレジスタセーブ領域 INT_ST EQU 23h ;STATUSレジスタセーブ領域 ;********************************************************** ; プログラム先頭アドレス ORG 0 ;リセットベクタ(0番地)を指定する GOTO START ;プログラムスタートへ行く ORG 4 ;割込みベクタ(4番地)を指定する ;**** 割り込み処理 **** BCF INTCON,T0IF ; 割込みフラグクリア MOVWF INT_W ; Wレジスタセーブ SWAPF STATUS,W MOVWF INT_ST ; STATUSレジスタセーブ MOVF TMR0,0 ; TMR0をWレジスタセーブ ADDLW d'133' ; WにXXXを加算して ; デバイスに書き込みオシロで測定した結果 ; 内部クロック4MでD133の設定の時 ; 250μsごとに割り込みが入る MOVWF TMR0 ; TMR0に戻す BSF GPIO,1 ; GPIO1をONする BCF GPIO,1 ; GPIO1をOFFする DECFSZ INT_C,F ; 割込みカウンターから-1して GOTO T0EXIT ; 0以外ならジャンプ BSF INT_F,0 ; TMR0割込み2回発生フラグセット MOVLW 2 MOVWF INT_C ; 割込みカウンタの設定 T0EXIT SWAPF INT_ST,W MOVWF STATUS ; STATUSレジスタロード SWAPF INT_W,F SWAPF INT_W,W ; Wレジスタロード RETFIE ; 割込み許可にしてリターン ;********************************************************** ;プログラムスタート START ;**** 初期化 **** BSF STATUS, RP0 ;bank1へ CALL 3ffh ;内部発振周波数校正値の読み込み MOVWF OSCCAL ;OCCALレジスタに校正値をセット MOVLW b'00001000' ;BP3のみ入力GP5:4,2:0を出力に設定 MOVWF TRISIO ;       ____ ; ┌─────GPPU ポートプルアップ する ; │┌────INTEDG 割り込みエッジ ? ; ││┌───TOCS TMR0ソース選択 ? ; │││┌──TOSE TMR0エッジ選択 ↑=0 ; ││││┌─PSA プリスケラー割り当て TMR0=0 ; │││││┌PS プリスケラーレート 111=1:256 ; ↓↓↓↓↓↓ ; 00000111 MOVLW b'00000000' ;OPTION_REGを設定 MOVWF OPTION_REG ; BCF STATUS, RP0 ;bank0へ CLRF GPIO MOVLW b'00000111' ;GP2:0をデジタルI/Oに設定 MOVWF CMCON MOVLW b'10100000' ; INTCONの設定 MOVWF INTCON ; GIE:1 ,T0IE:1 MOVLW 2 MOVWF INT_C ; 割込みカウンタの設定 CLRF INT_F ; TMR0割込み2回発生フラグクリア CLRF GPIO ; PORTBをクリア CLRF TMR0 ; TMR0をクリア ;**** メインルーチン **** LOOP BTFSS INT_F,0 ; TMR0割込み2回発生? GOTO LOOP ; NO BCF INT_F,0 ; TMR0割込み2回発生フラグクリア BTFSC GPIO,2 ; GPIO2がONならMAIN_1へ GOTO MAIN_1 ; OFFならスキップ BSF GPIO,2 ; GPIO2をONする GOTO LOOP ; LOOPに戻る MAIN_1 BCF GPIO,2 ; GPIO2をOFFする GOTO LOOP ; LOOPに戻る END ; プログラム終了 ;**********************************************************