;--------------------------------------------------------------------- ; 温度コントローラ ; ・設定温度でヒーター用AC出力をオンオフするコントローラ ; ・1時間毎、最大48時間タイマ ; ; 2010.8 naka ; ; OSC :4MHz X'tal ; PORT: ; (1). RC4〜7〔出力〕: LEDの桁に対応(アノード側のTr駆動) ; __ __ __ __ ; |__| |__| |__| |__| ; |__| |__| |__| |__| ; RC7 RC6 RC5 RC4 ; ; (2). RB0〜7〔出力〕LEDの各セグメント(カソード) ; RB0:a, RB1:b, RB2:c, RB3:d, RB4:e, RB5:f, RB6,g, RB7.dot ; _a ; f|_g|b ; e|__|c . dot ; d ; ; (3). RA0/AN0〔アナログ入力〕:温度センサの出力 ; (4). RA3/AN3〔アナログ入力〕:Vref+ 基準電圧ICの出力(2.5V) ; (5). RA1,RA2,RA4,RA5,RE3〔入力〕:タクトSW ; (6). RC1〔出力〕:圧電ブザー ; (7). RC2〔出力〕:SSR(Solid State Relay)制御用LED ; (8). RC3〔出力〕:START/STOP SWのLED(稼働中表示) ; ; 備考(発酵食品の発酵温度と時間): ; ・ヨーグルト 40〜45℃ 6〜8時間 ; ・カスピ海ヨーグルト 27℃ 8時間 ; ・パン生地 一次発酵 27〜30℃ 45〜60分 ; 二次発酵 35〜40℃ 20〜40分 ; ・納豆 40〜42℃ 24時間 ; ・甘酒 60℃前後 10時間 ;--------------------------------------------------------------------- ; デバイス定義 ;--------------------------------------------------------------------- LIST P=PIC16F886 INCLUDE "P16F886.INC" __CONFIG _CONFIG1, _CP_OFF & _MCLRE_OFF & _PWRTE_OFF & _WDT_ON & _XT_OSC & _BOR_ON & _DEBUG_OFF &_LVP_OFF & _IESO_OFF & _FCMEN_OFF __CONFIG _CONFIG2 ERRORLEVEL -302 ;アセンブル時のバンク警告メッセージ抑制 ;--------------------------------------------------------------------- ; 変数レジスタの定義 ;--------------------------------------------------------------------- LEDBUF EQU 20H ; LEDバッファ(20H〜23H:4バイト) COLCNT EQU 24H ; LEDカラムカウンタ PORTCB EQU 25H ; PortCバッファ SECFLG EQU 26H ; 0:残り時間カウント用、1:アラーム時間カウント用 SECCNT EQU 27H ; 1秒カウンタ HORCNTL EQU 28H ; 1時間カウンタ(3,600秒) 下位 HORCNTH EQU 29H ; 〃 上位 SETHOUR EQU 2AH ; 設定時間(H) REMHOUR EQU 2BH ; 残り時間(H) SETTEMP EQU 2CH ; 設定温度(度) SETTMP4 EQU 2DH ; 設定温度(4倍の値、0.25度単位) CURTEMP EQU 2EH ; 現在温度(度) CURTMP4 EQU 2FH ; 現在温度(4倍の値、0.25度単位) TMPBUF EQU 30H ; 温度バッファ30H〜33H:4バイト(移動平均のため) TMPBUFP EQU 34H ; 温度バッファポインタ TMPSUML EQU 35H ; 温度の移動平均用合計値(下位バイト)移動平均要否は評価後に判断 TMPSUMH EQU 36H ; 〃 (上位バイト) ; SWFLG EQU 37H ; SW状態フラグ(0:H-up,1:H-dwn,2:T-up,3:T-dwn,4:Start ; 5:alarm ERRFLG EQU 38H ; 0:WDT time out flag、1:55度以上になった WK EQU 39H ; 作業用 WCNT EQU 3AH ; WAIT用カウンタ VIBCNT EQU 3BH ; アラームのバイブレーションカウンタ ALMTMR EQU 3CH ; アラーム時間タイマ ; EE_ADDR EQU 3DH ; EEPROM読み書きアドレス EE_DATA EQU 3EH ; EEPROM読み書きデータ LOGADR EQU 3FH ; EEPROMへ温度を記録するアドレスカウンタ LPERIOD EQU 40H ; ログ記録間隔(03:4秒毎、07:8秒毎、 0F:16秒毎、1F:32秒毎、20:記録しない) BEF1PTR EQU 41H ; 温度バッファポインタ OFSTTMP EQU 42H ; 温度オフセット(設定温度よりオフセット分低い温度で通電オフ) CURTMP4R EQU 43H ; 現在温度(移動平均ではない生データ;ログ用) ;-------------------------------------------------------------------------- ; binariy to BCD変換用 bin EQU 50H hundreds EQU 51H tens_and_ones EQU 52H ;-------------------------------------------------------------------------- BKUPW EQU 7CH ; Wレジ待避用 BKUPS EQU 7DH ; STATUSレジ待避用 BKUPFR EQU 7EH ; FSRレジ待避用 BKUPPCL EQU 7FH ; PCLHレジ待避用 ;-------------------------------------------------------------------------- ; BANK1メモリ ;-------------------------------------------------------------------------- TMPBUFF EQU 0A0H ; 温度バッファ(A0H〜DBH 60バイト) ;--------------------------------------------------------------------- ; EEPROMデータ ;--------------------------------------------------------------------- ORG H'2100' DE D'30' ; デフォルト設定温度 DE D'01' ; デフォルト設定時間 ;--------------------------------------------------------------------- ; マクロ定義 ;--------------------------------------------------------------------- BANK0 MACRO BCF STATUS,RP0 ;BANK0に切り替える BCF STATUS,RP1 ; ENDM BANK1 MACRO BSF STATUS,RP0 ;BANK1に切り替える BCF STATUS,RP1 ; ENDM BANK2 MACRO BCF STATUS,RP0 ;BANK2に切り替える BSF STATUS,RP1 ; ENDM BANK3 MACRO BSF STATUS,RP0 ;BANK3に切り替える BSF STATUS,RP1 ; ENDM ;--------------------------------------------------------------------- ; リセットベクタ ;--------------------------------------------------------------------- ORG 00H ; リセット時の飛び込み先 RESET GOTO MAIN ; メイン処理へ ; ORG 04H ; 割り込み時の飛び込み先 GOTO INTRUPT ;--------------------------------------------------------------------- ; メイン処理 ;--------------------------------------------------------------------- MAIN CLRF ERRFLG BTFSS STATUS,4 ; WDT タイムアウト確認 BSF ERRFLG,0 ; タイムアウトリセットならERROR FLAG設定 ; CALL INIT ; 初期化 ; ; WDT TIMEOUT が起きていたら初期化の後でエラー表示し、停止。 BTFSC ERRFLG,0 GOTO ERRPRC ; エラー表示・通電停止 ; 電源を切らないとリセットしない ; CALL CHKMODE ; 動作モード確認 CALL REDSET ; 前回の設定情報をEEPROMから読み出す ; SETTING ;----------------------------- ; 時間・温度設定中 ;----------------------------- MOVF SETHOUR,W CALL DSPHOUR ; 時間表示 MOVF SETTEMP,W CALL DSPTEMP ; 温度表示 ; CLRWDT ; ワッチドッグタイマクリア BTFSC SWFLG,4 ; START/STOP SWが押された GOTO SET2RUN ; CALL SETHOR ; 時間設定 CALL SETTMP ; 温度設定 GOTO SETTING SET2RUN MOVF SETHOUR,W ; 設定時時間を残り時間へセット MOVWF REMHOUR DECF REMHOUR,F MOVF REMHOUR,W CALL DSPHOUR CALL WRTSET ; 設定情報をEEPROMへ記憶 CALL SSLEDON ; 稼働中LED ON CALL RELSW ; START/STOP SWが解放されるのを待つ CALL CHKTEMP ; スタート時の温度測定 CALL DSPTEMP ; 温度表示 CALL SETTBUF ; スタート時の温度を温度バッファに格納 CALL CLRHCNT ; 時間測定カウンタクリア(カウントダウンスタート) ; MOVLW D'2' MOVWF LOGADR ; 温度ロギングアドレス(評価用;起動時にSWを押していたときのみ記録) GOTO RUNNING ; RUNNING ;----------------------------- ; 稼働中 ;----------------------------- BTFSC SWFLG,4 ; START/STOP SWが押された GOTO RUN2STOP ; 停止に遷移 ; BTFSS SECFLG,0 ; 1秒待ち GOTO RUNNING ; BCF SECFLG,0 CLRWDT ; ワッチドッグタイマクリア CALL CNTDWN ; 時間カウントダウン BTFSC STATUS,Z ; タイムアップ GOTO RUN2END ; 終了処理に遷移 CALL CHKTEMP ; 温度測定 BTFSC ERRFLG,1 ; 55度を超えたらエラー GOTO ERRPRC CALL DSPTEMP ; 温度表示 CALL CALOTMP ; 通電オフのオフセット計算 CALL CTLTEMP ; 温度制御 CALL LOGCTMP ; 温度の記録(評価用) ; GOTO RUNNING RUN2END ; 終了への遷移前処理 MOVLW D'5' ; アラーム5秒 CALL ALMON RUN2STOP ; 停止(終了と停止の違いはアラームの有無) CALL TURNOFF ; 通電オフ CALL DSPOFF ; OF. 表示 CALL SSLEDOFF ; 稼働中LEDオフ CALL RELSW ; START/STOP SWが解放されるのを待つ GOTO ENDING ; 終了状態に遷移 ; ENDING ;----------------------------- ; 終了中(温度測定のみ継続) ;----------------------------- BTFSC SWFLG,4 ; START/STOP SWが押された GOTO END2SET ; BTFSS SECFLG,0 ; 1秒毎に温度測定 GOTO ENDING ; BCF SECFLG,0 CLRWDT ; ワッチドッグタイマクリア CALL CHKTEMP ; 温度測定 CALL DSPTEMP ; 温度表示 GOTO ENDING END2SET ; 設定中への遷移前処理 CALL ALMOFF ; アラームオフ(強制OFF) CALL RELSW ; スイッチ解放待ち CALL HDOTOFF GOTO SETTING ; ;--------------------------------------------------------------------- ; 割り込み処理(4ms毎) ;--------------------------------------------------------------------- INTRUPT ;レジスタ待避 MOVWF BKUPW ;バックアップ(Wレジ) SWAPF STATUS,W ;バックアップ(STATUSレジ) MOVWF BKUPS MOVF FSR,W ;バックアップ(FSRレジ) MOVWF BKUPFR MOVF PCLATH,W ;バックアップ(PCLATHレジ) MOVWF BKUPPCL ; BCF PIR1,CCP1IF ; CCP1割り込みクリア BANK1 BSF PIE1,CCP1IE ; CCP1割り込みイネーブル BANK0 ; INCF SECCNT,F MOVF SECCNT,W SUBLW D'250' ; 4ms x 250 = 1sec BTFSS STATUS,Z GOTO DSPLED CLRF SECCNT BSF SECFLG,0 ; 時間カウント用 BSF SECFLG,1 ; アラーム時間用 ; DSPLED ; LEDを表示 MOVF PORTCB,W ANDLW H'0F' MOVWF PORTCB MOVF COLCNT,W ; 表示桁 CALL DECCOL ; RC(4-7) LEDアノード IORWF PORTCB,F MOVF PORTCB,W MOVWF PORTC ; MOVLW LEDBUF ; LEDバッファ基点 ADDWF COLCNT,W ; 桁番号を加算 MOVWF FSR COMF INDF,W MOVWF PORTB ; カソードLOW ; INCF COLCNT,W ANDLW H'03' ; 桁番号は0-3 MOVWF COLCNT ; CHKSW ; SWの状態チェック MOVF SWFLG,W ANDLW B'11100000' MOVWF SWFLG BTFSS PORTA,1 ; Hour-up BSF SWFLG,0 BTFSS PORTA,2 ; Hour-down BSF SWFLG,1 BTFSS PORTA,4 ; Temp-up BSF SWFLG,2 BTFSS PORTA,5 ; Temp-down BSF SWFLG,3 BTFSS PORTE,3 ; Start/Stop BSF SWFLG,4 ; BTFSS SWFLG,5 ; アラーム確認 GOTO RSTREG BTFSS SECFLG,1 GOTO ALMCONT ; アラーム継続 BCF SECFLG,1 ; 秒フラグクリア DECFSZ ALMTMR,F ; アラームタイマカウントダウン GOTO ALMCONT ; アラーム継続 BCF SWFLG,5 ; アラームOFF GOTO RSTREG ; ALMCONT INCF VIBCNT,F ; アラームバイブレーションカウンタ MOVF VIBCNT,W SUBLW D'20' BTFSS STATUS,Z GOTO RSTREG ; CLRF VIBCNT MOVLW H'05' ; TMR2 on, Prescale 4 BTFSC T2CON,2 MOVLW H'00' MOVWF T2CON 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 ;割り込みから復帰 ;--------------------------------------------------------------------- DECCOL ADDWF PCL,F RETLW B'11100000' ; 0 RETLW B'11010000' ; 1 RETLW B'10110000' ; 2 RETLW B'01110000' ; 3 ;--------------------------------------------------------------------- ; 表示パターンを取り出す(Wレジ:0〜F) ; _a ; f|_g|b ; e|__|c . dot ; d ;--------------------------------------------------------------------- GETPTN ANDLW H'0F' ; 念のため下位4ビットのみ有効 ADDWF PCL,F ; '.gfedcba' RETLW B'00111111' ; 0 RETLW B'00000110' ; 1 RETLW B'01011011' ; 2 RETLW B'01001111' ; 3 RETLW B'01100110' ; 4 RETLW B'01101101' ; 5 RETLW B'01111101' ; 6 RETLW B'00000111' ; 7 RETLW B'01111111' ; 8 RETLW B'01101111' ; 9 RETLW B'01110111' ; A RETLW B'01111100' ; b RETLW B'01111001' ; c RETLW B'01011110' ; d RETLW B'01111001' ; E RETLW B'01110001' ; F ; ;--------------------------------------------------------------------- ; 初期化 ;--------------------------------------------------------------------- INIT BCF INTCON,GIE ;全割込み禁止 ; MOVLW B'11111111' MOVWF PORTB MOVLW B'11110001' MOVWF PORTCB MOVWF PORTC ; BANK1 MOVLW B'11111111' MOVWF TRISA ; ポートAは入力, RA6,7はOSC MOVLW B'00000000' MOVWF TRISB ; ポートBは出力 MOVLW B'00000000' MOVWF TRISC ; ポートCは出力 MOVLW B'00001000' MOVWF TRISE ; ポートE3は入力 ; MOVLW B'00010000' ; AN0,Vref+ MOVWF ADCON1 ; MOVLW H'00' ; 8bit PreScalerはWDTに使わない MOVWF OPTION_REG BCF PIE1,TMR1IE ; TMR1オーバーフロー割り込み禁止 BSF PIE1,CCP1IE ; CCP1割り込みイネーブル ; BANK3 MOVLW B'00001001' ; MOVWF ANSEL ; AN0をアナログ CLRF ANSELH ; (PortB)デジタル ; BANK0 ; CCP1で4ms割り込み発生(4ms×250=1秒カウント) MOVLW H'31' ; TIM1 プリスケーラ1:8 MOVWF T1CON ; MOVLW H'0B' ; Compare mode, trigger special event MOVWF CCP1CON ; MOVLW H'F4' ; D'500' (4ms毎の割り込み) MOVWF CCPR1L MOVLW H'01' MOVWF CCPR1H ; BANK2 MOVLW B'00010111' ; WDTプリスケーラ 1:65536 MOVWF WDTCON BANK0 ; ; アラーム音 CCP2->PWM mode MOVLW H'0F' ; PWM mode 設定 MOVWF CCP2CON ; MOVLW D'15' MOVWF CCPR2L ; Capture/Compare/PWM Register 2 Low Byte (LSB) BANK1 MOVLW D'125' ; 2KHz(prescale:4) MOVWF PR2 BANK0 ; CLRF LEDBUF CLRF LEDBUF+1 CLRF LEDBUF+2 CLRF LEDBUF+3 CLRF SECCNT CLRF COLCNT CLRF SECFLG CLRF SWFLG CLRF HORCNTH CLRF HORCNTL CLRF SETHOUR CLRF SETTEMP CLRF VIBCNT CLRF TMPBUFP CLRF BEF1PTR ; CLRWDT BSF INTCON,PEIE ; 周辺割り込み許可 BSF INTCON,GIE ; 割り込み許可 ; RETURN ;--------------------------------------------------------------------- ; 時間測定カウンタクリア ;--------------------------------------------------------------------- CLRHCNT CLRF SECFLG CLRF SECCNT CLRF HORCNTH CLRF HORCNTL RETURN ;--------------------------------------------------------------------- ; SW (START/STOP) が離(解除)されるのを待つ ;--------------------------------------------------------------------- RELSW BTFSS SWFLG,4 ; START/STOP SWが離されるまで待つ RETURN CLRWDT ; ワッチドッグタイマのクリア GOTO RELSW RETURN ;--------------------------------------------------------------------- ; カウントダウン(タイムアップ Z=1) ;--------------------------------------------------------------------- CNTDWN CALL HDOTTGL ; LED dotトグル ; MOVF HORCNTL,W ; 経過時間(秒)カウント ADDLW D'1' MOVWF HORCNTL BTFSC STATUS,C INCF HORCNTH,F ; MOVF HORCNTH,W SUBLW H'0E' ; 3600秒 = H'E10' ; SUBLW H'00' ; 16秒 = H'010' デバッグ用 BTFSS STATUS,Z RETURN MOVF HORCNTL,W SUBLW H'10' BTFSS STATUS,Z RETURN ; 1時間経過 CLRF HORCNTH CLRF HORCNTL ; MOVF REMHOUR,F ; 残り時間表示は、1時間未満のときに0表示なので BTFSC STATUS,Z ; 1時間経過後チェック時にすでに0だったらタイムアップ RETURN ; Zフラグ リターン ; DECF REMHOUR,F ; 残り時間デクリメント MOVF REMHOUR,W CALL DSPHOUR ; 残り時間表示 BCF STATUS,Z RETURN ;--------------------------------------------------------------------- ; 時刻表示(Wレジ値を表示) ;--------------------------------------------------------------------- DSPHOUR MOVWF WK ; 待避 MOVLW LEDBUF ; 時刻LED表示 MOVWF FSR MOVF WK,W CALL DSPDGT RETURN ;--------------------------------------------------------------------- ; 温度表示(Wレジ値を表示) ;--------------------------------------------------------------------- DSPTEMP MOVWF WK ; 待避 MOVLW LEDBUF+2 ; 温度LED表示 MOVWF FSR MOVF WK,W CALL DSPDGT RETURN ;----------------------------\----------------------------------------- ; 動作モード確認(起動時にタクトSWが押されていたら温度変化の記録モード) ; H-up : 4秒毎 ; H-down : 8秒毎 ; T-up : 16秒毎 ; T-down : 32秒毎 ; なし : 記録しない ;--------------------------------------------------------------------- CHKMODE CLRF LPERIOD BSF LPERIOD,5 ; デフォルトは記録しないモード ; MOVF SECCNT,F ; 割り込みが1回以上入るまで待つ BTFSC STATUS,Z ; (SWフラグがセットされる) GOTO $-2 CHKMOD0 BTFSS SWFLG,0 ; H-up SW GOTO CHKMOD1 ; ; MOVLW H'03' ; 4秒毎に記録 MOVWF LPERIOD INCF LPERIOD,W CALL DSPHOUR ; 4を表示 ; BTFSS SWFLG,0 ; 離されるまで待つ RETURN CLRWDT ; WDTクリア GOTO $-3 ; CHKMOD1 BTFSS SWFLG,1 ; H-down SW GOTO CHKMOD2 ; MOVLW H'07' ; 8秒毎に記録 MOVWF LPERIOD INCF LPERIOD,W CALL DSPHOUR ; 8を表示 ; BTFSS SWFLG,1 ; 離されるまで待つ RETURN CLRWDT ; WDTクリア GOTO $-3 ; CHKMOD2 BTFSS SWFLG,2 ; T-Up SW GOTO CHKMOD3 ; MOVLW H'0F' ; 16秒毎に記録 MOVWF LPERIOD INCF LPERIOD,W CALL DSPHOUR ; 16を表示 ; BTFSS SWFLG,2 ; 離されるまで待つ RETURN CLRWDT ; WDTクリア GOTO $-3 ; CHKMOD3 BTFSS SWFLG,3 ; T-Down SW GOTO CHKMOD4 ; MOVLW H'1F' ; 32秒毎に記録 MOVWF LPERIOD INCF LPERIOD,W CALL DSPHOUR ; 32を表示 ; BTFSS SWFLG,3 ; 離されるまで待つ RETURN CLRWDT ; WDTクリア GOTO $-3 ; CHKMOD4 RETURN ; ;--------------------------------------------------------------------- ; 時刻設定 ;--------------------------------------------------------------------- SETHOR BTFSS SWFLG,0 ; H-up GOTO SETHOR1 ; H-downチェック INCF SETHOUR,F ; 設定時間インクリメント MOVF SETHOUR,W ; 設計可能時間は1〜48H SUBLW D'49' BTFSS STATUS,Z GOTO $+3 MOVLW D'1' MOVWF SETHOUR ; MOVF SETHOUR,W CALL DSPHOUR ; 表示 ; BTFSS SWFLG,0 ; 離されるまで待つ GOTO SETHOR1 CLRWDT ; WDTクリア GOTO $-3 ; SETHOR1 BTFSS SWFLG,1 ; H-down GOTO SETHOR2 ; DECF SETHOUR,F BTFSS STATUS,Z ; 0H になったら 48H にする GOTO $+3 MOVLW D'48' MOVWF SETHOUR ; MOVF SETHOUR,W CALL DSPHOUR ; BTFSS SWFLG,1 ; 離されるまで待つ GOTO SETHOR2 CLRWDT ; WDTクリア GOTO $-3 ; SETHOR2 RETURN ; ;--------------------------------------------------------------------- ; 温度設定 ;--------------------------------------------------------------------- SETTMP BTFSS SWFLG,2 ; T-up GOTO SETTMP1 ; T-downチェック INCF SETTEMP,F ; 設定温度インクリメント MOVF SETTEMP,W ; 温度は25〜50度 SUBLW D'51' BTFSS STATUS,Z GOTO $+3 MOVLW D'25' MOVWF SETTEMP ; MOVF SETTEMP,W CALL DSPTEMP ; 表示 ; BTFSS SWFLG,2 ; 離されるまで待つ GOTO SETTMP1 CLRWDT ; WDTクリア GOTO $-3 ; SETTMP1 BTFSS SWFLG,3 ; T-down GOTO SETTMP2 ; DECF SETTEMP,F MOVF SETTEMP,W SUBLW D'24' ; 設定温度は25〜50度 BTFSS STATUS,Z ; 25 のデクリメントは 50 GOTO $+3 MOVLW D'50' MOVWF SETTEMP ; MOVF SETTEMP,W CALL DSPTEMP ; BTFSS SWFLG,3 ; 離されるまで待つ GOTO SETTMP2 CLRWDT ; WDTクリア GOTO $-3 ; SETTMP2 BCF STATUS,C ; 0.25度単位に変換 RLF SETTEMP,W MOVWF SETTMP4 BCF STATUS,C RLF SETTMP4,F ; RETURN ; ;--------------------------------------------------------------------- ; 時間dot ON/OFF(トグル動作), OFF(明示動作) ;--------------------------------------------------------------------- HDOTTGL BTFSC LEDBUF,7 GOTO HDOTOFF BSF LEDBUF,7 ; 表示 RETURN HDOTOFF BCF LEDBUF,7 ; 非表示 RETURN ;--------------------------------------------------------------------- ; START/STOP LED ON/OFF/トグル ;--------------------------------------------------------------------- SSLEDTGL BTFSC PORTCB,3 GOTO SSLEDOFF SSLEDON BSF PORTCB,3 MOVF PORTCB,W MOVWF PORTC RETURN SSLEDOFF BCF PORTCB,3 MOVF PORTCB,W MOVWF PORTC RETURN ;--------------------------------------------------------------------- ; 通電ON/OFF ;--------------------------------------------------------------------- TURNON BSF PORTCB,2 ; 通電ON(SSR-LED) MOVF PORTCB,W MOVWF PORTC BSF LEDBUF+2,7 ; 温度表示の 7-seg dot on RETURN TURNOFF BCF PORTCB,2 ; 通電OFF(SSR-LED) MOVF PORTCB,W MOVWF PORTC BCF LEDBUF+2,7 ; 温度表示の 7-seg dot off RETURN ; ;--------------------------------------------------------------------- ; アラームON/OFF ON時、Wレジ値が鳴らす時間(秒) ;--------------------------------------------------------------------- ALMON MOVWF ALMTMR ; アラーム時間(秒) BCF SECFLG,1 ; アラーム用秒フラグクリア BSF SWFLG,5 ; アラームON CLRF VIBCNT RETURN ALMOFF ; 時間切れ前に、強制的にOFFにする BCF SWFLG,5 ; アラームOFF BCF SECFLG,1 CLRF T2CON RETURN ; ;--------------------------------------------------------------------- ; 数値を数字パターンに変換(W値を FSR,FSR+1アドレスに) ;--------------------------------------------------------------------- DSPDGT MOVWF bin MOVF INDF,W ; dot状態保存 ANDLW B'10000000' MOVWF WK CALL binary_to_bcd MOVF tens_and_ones,W ANDLW H'0F' CALL GETPTN IORWF WK,W MOVWF INDF INCF FSR,F ; SWAPF tens_and_ones,W ANDLW H'0F' BTFSS STATUS,Z GOTO DSPDGT1 CLRW ; ゼロサプレス MOVWF INDF RETURN DSPDGT1 CALL GETPTN MOVWF INDF RETURN ;--------------------------------------------------------------------- ; 温度測定・表示 ;--------------------------------------------------------------------- CHKTEMP MOVLW B'01000001' ; A/Dオン(Fosc/8) ;; MOVLW B'10000001' ; A/Dオン(Fosc/32) MOVWF ADCON0 CALL WCHARGE ; チャージ待ち BSF ADCON0,1 ; A/D変換開始 BTFSC ADCON0,1 ; A/D変換が終わるまでループ GOTO $-1 ; BCF ADCON0,0 ; A/Dオフ ; MOVF ADRESH,W ; A/D変換結果を格納(上位8ビットのみ使用) MOVWF CURTMP4 ; 格納(0.25度単位) MOVWF CURTMP4R ; ログ用生データ ; CALL AVETEMP ; 移動平均(測定4回分の移動平均) ; ADDLW D'2' ; 表示温度の計算(四捨五入のために0.5度足す) MOVWF WK BCF STATUS,C RRF WK,F ; 4で割るため、右シフト2回 BCF STATUS,C RRF WK,W MOVWF CURTEMP ; MOVF CURTMP4,W SUBLW D'220' ; 55度を越えたらエラーリターン(停止) BTFSS STATUS,C ; 255/4=63.75度以上は測定出来ない(オーバーフロー) GOTO CHKTERR ; MOVF CURTEMP,W RETURN CHKTERR BSF ERRFLG,1 ; エラーリターン MOVF CURTEMP,W RETURN ; WCHARGE MOVLW D'7' ; 26usec(20usでよいはずだが念のため) MOVWF WCNT WCHGLP DECFSZ WCNT,F GOTO WCHGLP RETURN ;--------------------------------------------------------------------- ; 温度の移動平均(Wレジ 入力:現在の温度、出力:移動平均) ; (評価結果をみて、組み込むか判断) ;--------------------------------------------------------------------- AVETEMP CLRF TMPSUML CLRF TMPSUMH MOVWF WK ; 待避 MOVLW TMPBUF ; 温度バッファ ADDWF TMPBUFP,W ; ポインタ加算 MOVWF FSR MOVF WK,W MOVWF INDF ; バッファに格納 INCF TMPBUFP,W ; ポンタインクリメント ANDLW H'03' MOVWF TMPBUFP ; MOVLW D'4' MOVWF WK MOVLW TMPBUF ; 温度バッファ MOVWF FSR AVETMPL MOVF INDF,W ADDWF TMPSUML,F BTFSC STATUS,C INCF TMPSUMH,F INCF FSR,F DECFSZ WK,F GOTO AVETMPL ; ; 平均のために 4 で割る BCF STATUS,C RRF TMPSUMH,F RRF TMPSUML,F BCF STATUS,C RRF TMPSUMH,F RRF TMPSUML,W RETURN ;--------------------------------------------------------------------- ; 温度制御(測定温度は4倍値で格納し、内部精度0.25度:ex. 30度→120) ; 制御方法:オンオフ制御 ; 現在の温度が設定温度より高ければ通電OFF、低ければON ; 温度上昇の傾きから計算したオフセットで低い温度でOFFする。 ;--------------------------------------------------------------------- CTLTEMP ; MOVF OFSTTMP,W ; オフセット温度 SUBWF SETTMP4,W ; 設定温度' = 設定温度 - オフセット温度 MOVWF WK ; 設定温度'' = 設定温度 - 0.25度 DECF WK,W ; -1 (設定温度より0.25度低い温度でON/OFF制御) ; SUBWF CURTMP4,W ; 現在温度 - 設定温度'' ; 0又は正なら通電オフ、負なら通電オン BTFSC STATUS,C GOTO CTLOFF CALL TURNON RETURN CTLOFF CALL TURNOFF RETURN ; ;--------------------------------------------------------------------- ; 通電オフのオフセット温度 ; 設定温度より低い温度でオフするための値を温度上昇の傾きから計算。 ; 1分前の温度と、現在の温度を比べて傾きを求め、オフセット値にする。 ; 温度上昇が急な場合(傾きが大きい場合)、早めに通電オフしないと、 ; 慣性によって設定温度を大きく超えるオーバーシュートが起きるため。 ;--------------------------------------------------------------------- CALOTMP MOVLW TMPBUFF ; 温度バッファ ADDWF BEF1PTR,W MOVWF FSR BANK1 ; 温度バッファはバンク1 MOVF INDF,W ; 1分(60秒)前の温度(0.25度単位) BANK0 SUBWF CURTMP4,W ; 傾き = CURTMP4 - REF1TMP BTFSS STATUS,C CLRW ; 負のときは0 ; MOVWF OFSTTMP ; 傾き(度/分)の2倍をオフセットとする BCF STATUS,C RLF OFSTTMP,F ; 2倍 ; MOVF CURTMP4,W BANK1 MOVWF INDF ; BEF1PTRの位置に現在温度を格納 BANK0 INCF BEF1PTR,F MOVF BEF1PTR,W SUBLW D'60' BTFSC STATUS,Z CLRF BEF1PTR RETURN ;--------------------------------------------------------------------- ; 温度バッファの初期化(スタート時の温度を設定) ;--------------------------------------------------------------------- SETTBUF MOVLW D'60' MOVWF WK MOVLW TMPBUFF ; 温度バッファ(温度上昇傾き計算用) MOVWF FSR MOVF CURTMP4,W ; スタート時の温度 SETTBUF1 BANK1 MOVWF INDF BANK0 INCF FSR,F DECFSZ WK,F GOTO SETTBUF1 ; MOVWF TMPBUF ; 移動平均用温度バッファ MOVWF TMPBUF+1 MOVWF TMPBUF+2 MOVWF TMPBUF+3 RETURN ;--------------------------------------------------------------------- ; 動作完了 (OF.)表示 ;--------------------------------------------------------------------- DSPOFF ; OF. 表示 MOVLW B'00111111' ; 0 MOVWF LEDBUF+1 MOVLW B'11110001' ; F. MOVWF LEDBUF RETURN ;--------------------------------------------------------------------- ; エラー処理(エラー表示・通電オフ・温度測定のみ継続) ; E1: WDT Timeout, E2: 55度を越えた ;--------------------------------------------------------------------- ERRPRC CALL DSPERR ; エラー表示 CALL TURNOFF ; 通電オフ CALL SSLEDOFF ; Start/Stop LED off ; MOVLW D'5' ; アラーム時間(秒) CALL ALMON ; アラーム開始 ERRPRCL BTFSS SECFLG,0 ; 1秒毎に温度測定継続 GOTO $-1 BCF SECFLG,0 ; ; 温度測定・表示継続 CLRWDT CALL CHKTEMP ; 温度測定(結果:Wレジ,CURTEMP) CALL DSPTEMP ; 温度表示 GOTO ERRPRCL ; ;--------------------------------------------------------------------- ; エラー表示 ; E1: WDT Timeout, E2: 55度を越えた ;--------------------------------------------------------------------- DSPERR ; 時間表示LEDに E1. or E2. 表示 MOVLW B'01111001' ; E MOVWF LEDBUF+1 ; MOVLW B'10000110' ; 1. WDT Timeout BTFSC ERRFLG,1 MOVLW B'11011011' ; 2. 55度を超えた MOVWF LEDBUF RETURN ;--------------------------------------------------------------------- ; 温度を記録(評価用) ; 現在の温度をEEPROMへ書き込む(呼ぶ都度、アドレスカウントアップ) ; 2番地〜255番地(計254個記録できる) ;--------------------------------------------------------------------- LOGCTMP BTFSC LPERIOD,5 ; H20:記録しない(通常モード) RETURN MOVF HORCNTL,W ANDWF LPERIOD,W ; H03: 4秒毎に書き込む(4×254=1016秒≒17分) ; H07: 8秒毎に書き込む(8×254=2032秒≒34分) ; H0F:16秒毎に書き込む(16×254=4064秒≒68分) ; H1F:32秒毎に書き込む(32×254=8128秒≒135分) BTFSS STATUS,Z RETURN ; MOVF LOGADR,W ; 記録先アドレス BTFSC STATUS,Z ; 0番地(255迄書き込み済)なら何もせずにリターン RETURN ; MOVWF EE_ADDR MOVF CURTMP4R,W ; 現在温度(0.25度単位) MOVWF EE_DATA CALL WRTEEP ; INCF LOGADR,F RETURN ;--------------------------------------------------------------------- ; 設定温度、時間をEEPROMへ書き込む ;--------------------------------------------------------------------- WRTSET MOVLW D'1' MOVWF EE_ADDR ; 1番地 MOVF SETHOUR,W MOVWF EE_DATA CALL WRTEEP ; CALL WAIT ; 時間をおかないと書き込めなかったのでウェイト CALL WAIT ; CLRF EE_ADDR ; 0番地 MOVF SETTEMP,W MOVWF EE_DATA CALL WRTEEP ; RETURN WAIT MOVLW D'255' MOVWF WCNT WAITLP GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 NOP DECFSZ WCNT,F GOTO WAITLP RETURN ;--------------------------------------------------------------------- ; 設定温度、時間をEEPROMから読み出す ;--------------------------------------------------------------------- REDSET CLRF EE_ADDR ; 0番地 CALL REDEEP MOVWF SETTEMP MOVWF SETTMP4 BCF STATUS,C ; 4倍(0.25度単位へ) RLF SETTMP4,F BCF STATUS,C RLF SETTMP4,F ; MOVLW D'1' MOVWF EE_ADDR ; 1番地 CALL REDEEP MOVWF SETHOUR RETURN ;--------------------------------------------------------------------- ; EEPROMへ書き込む(アドレス:EE_ADDR, データEE_DATA) ;--------------------------------------------------------------------- WRTEEP MOVF EE_ADDR,W ; BANK2 MOVWF EEADR ; Data Memory Address to write BANK0 MOVF EE_DATA,W ; BANK2 MOVWF EEDAT ; Data Memory Value to write BANK3 BCF EECON1,EEPGD ; Point to DATA memory BSF EECON1,WREN ; Enable writes BCF INTCON,GIE ; Disable INTs. BTFSC INTCON,GIE ; SEE AN576 GOTO $-2 MOVLW H'55' ; MOVWF EECON2 ; Write 55h MOVLW H'AA' ; MOVWF EECON2 ; Write AAh BSF EECON1,WR ; Set WR bit to begin write NOP NOP BCF EECON1,WREN BSF INTCON,GIE ; Enable INTs. BANK0 RETURN ;--------------------------------------------------------------------- ; EEPROMから読み出す(アドレス:EE_ADDR, 結果:W) ;--------------------------------------------------------------------- REDEEP MOVF EE_ADDR,W ; BANK2 MOVWF EEADR ; Data Memory ; Address to read BANK3 BCF EECON1,EEPGD BSF EECON1,RD ; EE Read BANK2 MOVF EEDAT,W ; W = EEDAT BANK0 RETURN ;--------------------------------------------------------------------- ;http://www.piclist.com/techref/microchip/math/radix/b2bhp-8b3d.htm ;******************************** ;binary_to_bcd - 8-bits ; ;Input ; bin - 8-bit binary number ; A1*16+A0 ;Outputs ; hundreds - the hundreds digit of the BCD conversion ; tens_and_ones - the tens and ones digits of the BCD conversion binary_to_bcd: CLRF hundreds SWAPF bin, W ; swap the nibbles ADDWF bin, W ; so we can add the upper to the lower ANDLW B'00001111' ; lose the upper nibble (W is in BCD from now on) SKPNDC ; if we carried a one (upper + lower > 16) ADDLW 0x16 ; add 16 (the place value) (1s + 16 * 10s) SKPNDC ; did that cause a carry from the 1's place? ADDLW 0x06 ; if so, add the missing 6 (carry is only worth 10) ADDLW 0x06 ; fix max digit value by adding 6 SKPDC ; if was greater than 9, DC will be set ADDLW -0x06 ; if if it wasn't, get rid of that extra 6 BTFSC bin,4 ; 16's place ADDLW 0x16 - 1 + 0x6 ; add 16 - 1 and check for digit carry SKPDC ADDLW -0x06 ; if nothing carried, get rid of that 6 BTFSC bin, 5 ; 32nd's place ADDLW 0x30 ; add 32 - 2 BTFSC bin, 6 ; 64th's place ADDLW 0x60 ; add 64 - 4 BTFSC bin, 7 ; 128th's place ADDLW 0x20 ; add 128 - 8 % 100 ADDLW 0x60 ; has the 10's place overflowed? RLF hundreds, F ; pop carry in hundreds' LSB BTFSS hundreds, 0 ; if it hasn't ADDLW -0x60 ; get rid of that extra 60 MOVWF tens_and_ones ; save result BTFSC bin,7 ; remeber adding 28 - 8 for 128? INCF hundreds, F ; add the missing 100 if bit 7 is set RETURN ; all done! ; ;Note: SKPDC is equivalent to BTFSS STATUS, DC and SKPNDC is equivalent to BTFSC STATUS, DC ;-------------------------------------------------------------- END