;--------------------------------------------------------------------- ; AC100Vオフタイマー(常時ON, 1H, 2H, 3H, 連続) ; 2017.6.9 naka ; ; 扇風機のオフタイマーが壊れたので電子タイマーを製作。 ; SSRでAC100Vのコントロールをしており、扇風機以外でも使える。 ; ; (1). 出力ポート ; GP0: 緑LED(常時オン) ; GP1: 赤LED(1H) ; GP2: 赤LED(2H) ; GP4: 赤LED(3H) ; GP5: ソリッドステートリレーのLED ; (2). 入力ポート ; GP3: タクトスイッチ(アクティブLow) ; ; 機能 ; 電源を入れたら、常時オン(連続)モード ; タクトスイッチを押すたびに以下のモードを順次切り替える ; (1) 電源オフ ; (2) 1時間タイマ ; (3) 2時間タイマ ; (4) 3時間タイマ ; (5) 常時オン (電源を入れたときはこのモード) ; ; 時間設定時のLED点灯 ; 赤 赤 赤 緑 ; オフ ○ ○ ○ ○ ; 常時オン ○ ○ ○ ● ; 1H ● ○ ○ ○ ; 2H ● ● ○ ○ ; 3H ● ● ● ○ ; ; タイマ動作中は1秒ごとにLED点滅(★) ; 赤 赤 赤 緑 ; 3Hにセット ● ● ● ○ ; 2H〜3H ● ● ★ ○ ; 1H〜2H ● ★ ○ ○ ; 0H〜1H ★ ○ ○ ○ ; オフ ○ ○ ○ ○ ; ; 備考 ; ・PICの内蔵発振4MHzなので精度は最悪±1%(1時間で±36秒) ; ;--------------------------------------------------------------------- LIST P=PIC12F615 INCLUDE "P12F615.INC" __CONFIG _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _IOSCFS_4MHZ & _INTRC_OSC_NOCLKOUT & _BOR_OFF ERRORLEVEL -302 ;アセンブル時のバンク警告メッセージ抑制 ;--------------------------------------------------------------------- ; マクロ定義 ;--------------------------------------------------------------------- BANK0 MACRO BCF STATUS,RP0 ;BANK0に切り替える ENDM BANK1 MACRO BSF STATUS,RP0 ;BANK1に切り替える ENDM ;--------------------------------------------------------------------- ; 変数レジスタの定義 ;--------------------------------------------------------------------- SEC64CNT EQU 40H ; 64秒をカウント(1秒の補正のため) SECCNT EQU 41H ; 1秒を数えるカウンタ(244で1秒;但し64秒毎に253) HOUR EQU 42H ; 時 MIN EQU 43H ; 分 SEC EQU 44H ; 秒 SWFLG EQU 45H ; タクトスイッチフラグ MODE EQU 46H ; 時間設定モード SECFLG EQU 47H ; 1秒フラグ TIMOUT EQU 48H ; タイムアウトフラグ TMP EQU 49H ; 作業用 ; BKUPW EQU 50H ; 割り込み待避用 BKUPS EQU 51H ; 割り込み待避用 BKUPFR EQU 52H ; 割り込み待避用 BKUPPCL EQU 53H ; 割り込み待避用 ;--------------------------------------------------------------------- ; リセット・割り込み ;--------------------------------------------------------------------- ORG 00H ; リセット時の飛び込み先 RESET GOTO MAIN ; ;--------------------------------------------------------------------- ; 割り込み処理(4.096ms毎)で時間をカウント ;--------------------------------------------------------------------- ORG 04H ; 割り込み時の飛び込み先 INTRUPT ;レジスタ待避 MOVWF BKUPW ;バックアップ(Wレジ) SWAPF STATUS,W ;バックアップ(STATUSレジ) MOVWF BKUPS MOVF FSR,W ;バックアップ(FSRレジ) MOVWF BKUPFR MOVF PCLATH,W ;バックアップ(PCLATHレジ) MOVWF BKUPPCL ; BCF INTCON,T0IF ;割り込みフラグリセット ; INCF SECCNT,F ; 秒をカウント ; MOVF SEC64CNT,W SUBLW D'63' BTFSC STATUS,Z GOTO CNT253 CNT244 MOVF SECCNT,W SUBLW D'244' ; 4.096ms x 244 = 0.999424sec BTFSS STATUS,Z ; 補正するには64秒毎に244ではなく、 ; 253(244+9)カウントする(CNT253のラベル) GOTO CHKSW GOTO CNT1SEC CNT253 MOVF SECCNT,W SUBLW D'253' ; 4.096ms x 244 = 0.999424sec BTFSS STATUS,Z ; 補正するには64秒毎に244ではなく、 ; 253(244+9)カウントする GOTO CHKSW CLRF SEC64CNT ; 64秒カウンタクリア DECF SEC64CNT ; 2行下でincするのでdecしておく CNT1SEC CLRF SECCNT INCF SEC64CNT,F ; 補正のための回数カウント ; ; 秒分時のカウント BSF SECFLG,0 ; 秒フラグ CHKSW ; タクトスイッチ確認(4ms毎に確認してチャタリングを回避) CLRF SWFLG BTFSS GPIO,3 BSF SWFLG,0 ;アクティブLow ; RSTREG ;レジスタ復元 MOVF BKUPPCL,W ;復元(PCLATHレジ) MOVWF PCLATH MOVF BKUPFR,W ;復元(FSRレジ) MOVWF FSR SWAPF BKUPS,W ;復元(STATUSレジ) MOVWF STATUS SWAPF BKUPW,F ;復元(Wレジ) SWAPF BKUPW,W ; RETFIE ;割り込みから復帰 ;--------------------------------------------------------------------- ; メイン ;--------------------------------------------------------------------- MAIN CALL INIT ; 初期設定 ; MAINLP CALL SETMOD ; SW確認 CALL CNTDWN ; カウントダウン CALL DSPLED ; LED表示 ; GOTO MAINLP ; ;--------------------------------------------------------------------- ; 初期設定 ;--------------------------------------------------------------------- INIT BCF INTCON,GIE ; 全割込み禁止 BANK1 CLRF ANSEL ; GP0-2をデジタルI/O CLRF TRISIO ; ポートを出力設定 ; Timer0割り込みタイマーセット MOVLW H'83' ;プリスケーラを1:16にする MOVWF OPTION_REG ;約244ヘルツ(約4ms)で割り込みが入るはず BANK0 ;clock4MHz -> 1Mcycle ;1Mcycle/256/16 = 244Hz ;244回の割り込みで約1秒弱 CLRF GPIO ; CLRF SEC64CNT CLRF SECCNT CLRF SECFLG CLRF SEC CLRF MIN CLRF HOUR CLRF SWFLG CLRF TIMOUT MOVLW D'4' ; 電源投入時は常時オン(mode4) MOVWF MODE ; BSF INTCON,T0IE ; タイマー0割り込みイネーブル BSF INTCON,GIE ; 割り込み許可 RETURN ; ;--------------------------------------------------------------------- ; モード設定 ; スイッチ操作が1秒なかったらリターン(カウントダウン開始へ) ; ただし、オフモード時は即リターン ;--------------------------------------------------------------------- SETMOD BTFSS SWFLG,0 ; SW確認 RETURN ; SETMOD1 INCF MODE,F ; 0:オフ, 1:1H, 2:2H, 3:3H, 4:常時オン MOVF MODE,W SUBLW D'5' BTFSC STATUS,Z CLRF MODE CALL DSPMOD ; BTFSC SWFLG,0 ; SWリリース確認 GOTO $-1 ; CALL CLRTIM ; タイマカウンタのクリア ; MOVF MODE,F BTFSC STATUS,Z GOTO SETMOD4 ; mode 0ならZフラグをもって即リターン ; SETMOD2 BTFSC SWFLG,0 ; SW確認 GOTO SETMOD1 BTFSS SECFLG,0 ; それ以外は1秒経ったらリターン GOTO SETMOD2 ; CLRF SEC CLRF MIN MOVF MODE,W MOVWF HOUR CLRF TIMOUT CALL DSPMOD RETURN SETMOD4 CALL DSPMOD RETURN ; ;--------------------------------------------------------------------- ; タイマークリア ;--------------------------------------------------------------------- CLRTIM CLRF SEC64CNT CLRF SECCNT CLRF HOUR CLRF MIN CLRF SEC CLRF SECFLG CLRF TIMOUT RETURN ; ;--------------------------------------------------------------------- ; カウントダウン ;--------------------------------------------------------------------- CNTDWN MOVF MODE,F ; オフ|タイムアウト BTFSC STATUS,Z RETURN ; MOVF MODE,W SUBLW D'4' ; 常時オン BTFSC STATUS,Z RETURN ; BTFSS SECFLG,0 ; 秒フラグ確認 RETURN ; BCF SECFLG,0 ; DECF SEC,F MOVF SEC,W SUBLW D'255' BTFSS STATUS,Z RETURN ; MOVLW D'59' MOVWF SEC DECF MIN,F MOVF MIN,W SUBLW D'255' BTFSS STATUS,Z RETURN ; MOVLW D'59' MOVWF MIN DECF HOUR,F MOVF HOUR,W SUBLW D'255' BTFSS STATUS,Z RETURN ; BSF TIMOUT,0 CLRF MODE ; タイムアウトしたらmode 0 RETURN ; ;--------------------------------------------------------------------- ; モード表示 ;--------------------------------------------------------------------- DSPMOD MOVF MODE,W ; 時間に応じたLED点灯 MOVWF TMP CALL MODDT MOVWF GPIO RETURN MODDT CLRF PCLATH MOVF TMP,W ADDWF PCL,F RETLW B'00000000' ; オフ RETLW B'00100010' ; 0H-1H 点灯,SSR RETLW B'00100110' ; 1H-2H 点灯,SSR RETLW B'00110110' ; 2H-3H 点灯,SSR RETLW B'00100001' ; 常時点灯,SSR ; ;--------------------------------------------------------------------- ; LED表示 ;--------------------------------------------------------------------- DSPLED MOVF MODE,F BTFSC STATUS,Z GOTO DSPLED1 ; オフ BTFSC TIMOUT,0 GOTO DSPLED1 ; オフ MOVF MODE,W SUBLW D'4' ; 常時オン BTFSC STATUS,Z GOTO DSPLED2 ; オン MOVF HOUR,W ; 時間に応じたLED点灯 MOVWF TMP BCF STATUS,C RLF TMP,F ; 2倍 BTFSS SEC,0 ; 1秒毎の点滅(最下ビットの偶数奇数で判断) INCF TMP,F CALL LEDDT MOVWF GPIO RETURN LEDDT CLRF PCLATH MOVF TMP,W ADDWF PCL,F RETLW B'00100000' ; 0H-1H 点滅 RETLW B'00100010' ; 0H-1H 点灯,SSR RETLW B'00100110' ; 1H-2H 点灯,SSR (あえて逆) RETLW B'00100010' ; 1H-2H 点滅 ( ↑ ) RETLW B'00100110' ; 2H-3H 点滅 RETLW B'00110110' ; 2H-3H 点灯,SSR RETLW B'00110110' ; 2H-3H 点灯,SSR(念のため) RETLW B'00110110' ; 2H-3H 点灯,SSR(念のため) DSPLED1 ; オフ MOVLW B'00000000' ; 全て消灯 MOVWF GPIO RETURN DSPLED2 ; 常時オン MOVLW B'00100001' ; 緑,SSR MOVWF GPIO RETURN ; ;--------------------------------------------------------------------- END ;--------------------------------------------------------------------- ; 終わり ;---------------------------------------------------------------------