;********************************************************** ; ; テストプログラム PIC12F629を使用したLED点滅 ; TMR0を使用した割り込み ; ; http://homepage3.nifty.com/mitt/pic/index.html ; 上記ホームページのPIC16F84A版をPIC12F629に移植 ; ; 2007/12/09 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 ;********************************************************** ;入出力ピン又はビットの設 ; #define O_BLK GPIO, 0 ;点滅出力 #define O_B_PWM GPIO, 1 ;PWM点滅出力 #define O_INT_PLS GPIO, 2 ;割り込みパルス出力 #define I_PLS GPIO, 3 ; #define O_NC4 GPIO, 4 ; #define O_NC5 GPIO, 5 ; ;********************************************************** ;ファイルレジスタの設定 ; t_cycle EQU 20h ; 1周期をカウント(0〜99) t_width EQU 21h ; ONの時間をカウント(0〜99) t_add EQU 22h ; t_widthに加算する値(0 or -1) save_st EQU 23h ; STATUSのセーブ領域 save_w EQU 24h ; W-regのセーブ領域 ;********************************************************** ; プログラム先頭アドレス ; ORG 0 ; リセットベクタを指定する。 GOTO INIT ; 初期処理に行く ;********************************************************** ; TMR0割込み処理 ORG 4 ; 割込みベクタを指定する。 BCF INTCON,T0IF ; 割込みフラグクリア MOVWF save_w ; W-regセーブ SWAPF STATUS,W ; MOVWF save_st ; STATUSレジスタセーブ MOVLW d'159' ; 固定値を wに代入 ADDWF TMR0, F ; w とTMR0を加算してTMR0に戻す BSF O_INT_PLS ; 割り込みパルス ON BCF O_INT_PLS ; 割り込みパルス OFF INCF t_cycle,F ; MOVLW d'100' ; 100 SUBWF t_cycle,W ; BTFSS STATUS,Z ; t_cycle = 100 ? GOTO T0EXIT ; no ; yes CLRF t_cycle ; 0 → t_cycle MOVF t_add,W ; ADDWF t_width,F ; t_widthにt_addを加算 BSF O_BLK ; RB0をON T0EXIT SWAPF save_st,W ; MOVWF STATUS ; STATUSレジスタロード SWAPF save_w,F ; SWAPF save_w,W ; W-regロード RETFIE ; 割込み許可にしてリターン ;********************************************************** ; PICの初期化 INIT BSF STATUS, RP0 ; STATUSのRP0をセット CALL 3ffh ; 内部発振周波数校正値の読み込み MOVWF OSCCAL ; OCCALレジスタに校正値をセット MOVLW b'00001000' ; BP3のみ入力他は出力に設定し MOVWF TRISIO ; TRISIOに書き込み MOVLW b'00001000' ; OPTION_REGを設定 MOVWF OPTION_REG ; OPTION_REGに書き込み BCF STATUS,RP0 ; STATUSのRP0をクリア MOVLW b'00000111' ; GP2:0をデジタルI/Oに設定 MOVWF CMCON ;CMCONに書き込み MOVLW b'10100000' ; INTCONの設定 MOVWF INTCON ; GIE:1 ,T0IE:1 BSF O_BLK ; PORTBのRB0(緑色LED)をON MOVLW d'1' MOVWF t_add ; 1 → t_add CLRF t_cycle ; 0 → t_cycle CLRF t_width ; 0 → t_width CLRF TMR0 ; TMR0をクリア ;********************************************************** ; メイン処理 LOOP MOVF t_width,F ; SUBWF t_cycle,W ; BTFSC STATUS,Z ; t_cycle = t_width ? BCF O_BLK ; yes RB0をOFF MOVLW d'100' ; 100 SUBWF t_width,W ; BTFSC STATUS,Z ; t_width = 100 ? GOTO MAIN20 ; yes MOVF t_width,W ; BTFSS STATUS,Z ; t_width = 0 ? GOTO LOOP ; no MOVLW d'1' ; MOVWF t_add ; 1 → t_add BSF O_B_PWM ; RB1 ON (赤色LED点灯) GOTO LOOP ; MAIN20 MOVLW 0FFh ; MOVWF t_add ; -1 → t_add BCF O_B_PWM ; RB1 OFF (赤色LED消灯) GOTO LOOP ; END ; プログラムの終了をアセンブラに指示する ;**********************************************************