何とか動く
割り込みの勉強をしているのだがなんとかシミュレーションでは動くでも周期的な(ちゃんとした時間)の割り込みが理解できていない一応 プログラムですプログラム;**********************************************************;; テストプログラム 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レジスタセーブ DECFSZ INT_C,F GOTO T0EXIT 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 ; プログラム終了 ;**********************************************************追記:定数割り込み;**** 割り込み処理 **** 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 ; 割込みカウンタの設定少し変えてみました