;電熱服とグリップヒーター制御 Ver 1.0 bitメカ工房 2014-02-09(日) ;NKUROさん用に14.0V→12.8V自動復帰に変更。 ; ;A/D値を基準電圧4.096V用から5V仕様に変換修正表を使用して変更。 ; ;[プログラム概要] ;・制御熱量は100%、75%、50%の3段階調整とする。 ;・1つの釦で 0→100%→75%→50%→0… の繰り返しとする。 ;・電圧を検知し、低電圧時に自動OFFする。【12.3V以下でOFF】 ; 自動OFF後は、【10秒毎】に電圧チェックし【14.0V以上】で自動復帰とする。 ;・TMR2を利用してPWMのように使用する。 ;・オシレーターは内蔵の4MHzを使用する。 ;・タイマー1オーバーフロー割込を使用する。 ; ; 5V ┌―┐ ┌―┐ ; | | | | ; | | | | ; 0V ―┘ └―┘ └― ; ← 255→ ; tmr2 ; ;・タイマー2(8bit)のオーバーフローで1周期を制御する。 ; プリスケーラを最短【 1 】にした場合のオーバーフロータイム ; 1/4000000*4*1*256=0.000256秒 ; ;・タイマー1はプリスケール【8】(最大)で約0.52秒なので、それをA/Dチェック間隔に ; 使用する。 ; 1/4000000*4*8*256*256=0.524288秒 ; ;・タイマー0(8bit)のオーバーフローで押釦チャタリングを対策する。 ; プリスケーラを最短【 256 】にした場合のオーバーフロータイム ; 1/4000000*4*256*256=0.065536秒 ; ; ;[PIC選定その他仕様] ; ・PIC12F683使用。(秋月電子通商で100円/個) ; ・MCLRは内部接続モードとする。 ; ; ┌─┰─┐ ; 5V VDD ┥ ┝ Vss GND ; FETスイッチ GP5 ┥12F ┝ GP0[DAT] 元電圧A/D ; LED出力(青) GP4 ┥ 683 ┝ GP1[CLK] LED出力(緑) ; 押ボタンSW [VPP]GP3 ┥ ┝ GP2 LED出力(赤) ; └───┘ ; ;[プログラムの基本流れ概要] ; ; 電源ON ; ↓ ; 初期設定 ; ↓ ; ┌→電圧チェック Lo→→→→→→ FET_OFF・LED点滅他処理へ →→(省略) ; ↑ ↓OK ; ↑ 押釦チェック on→→→→ カウントアップ ; ↑ ↓off ↓ ; ↑ FET・LEDへの出力処理 ←←┘ ; ↑ ↓ ; └←┘ ; ; [割込] ; 約0.5秒間隔 A/Dチェック OK→┐ ; ↓Lo ↓ ; メモリーbit=1 ↓ ; ↓ ↓ ; 戻る ←←←←←┘ ; ; ;[凡例] (自分で分かりやすいように目印を付ける) ; mXXX:メモリー rXXX:ラベル sXXX:サブルーチン vXXX:変数 ★:調整箇所など ; ;======= PICコンフィギュレーション設定 ===========;(CVASM16アセンブラ用記述) include '12f683.inc' fuses _fcmen_off ;Fail-Safe Clock Monitor fuses _ieso_off ;Internal External Switchover bit fuses _bod_on ;低電圧リセット(約2V以下)→有り fuses _cpd_off ;eepromのコードプロテクト→無効 fuses _cp_off ;コードプロテクト→無効 fuses _mclre_off ;MCLR端子(リセット)→設定しない fuses _pwrte_on ;電源投入72ms間リセット→有効 fuses _wdt_off ;ウォッチドックタイマー→無効 fuses _intrc_osc_noclkout ;オシレーター設定→内蔵RC id '0102' ;Ver1.00 ;-------プログラムメモリー割当----------; mSELECT = 20h ;釦押セレクト位置 mAD_Lo = 21h ;A/D低電圧チェック mCOUNT = 22h ;汎用カウンター ;=======プログラム初期設定==============; org 0 ; jmp rSTART ; ;iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii; ;iiiiiii割り込み時プログラムiiiiiiiiiiii; ;iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii; org 4 ; clrb tmr1if ;タイマー1旗 setb go_done ;元電圧チェックA/D変換開始(20〜60μS) jb go_done,$ ;A/D変換終了まで待つ csa adresh,#101 ;★★12.3V以下はダメ setb mAD_Lo.0 ;00000001b reti ; ;iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii; ;iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii; rSTART mov gpio,# 010110b ;3色LED OFF ;(Bank 0) mov t1con,#00110000b ;bit7…設定項目無し ; 初期状態 0000 0000 ;bit6…0 オシレーター選択 ;bit5〜4…プリスケールレート【8】 ;bit3…1 タイマー1オシレーター制御 ;bit2…0 外部クロック同期 ;bit1…0 タイマー1クロックソース選択 ;bit0…0 タイマー1オフ mov t2con,# 0000100b ;bit2…タイマー2オン ; 初期状態 0000 0000 mov adcon0,#00000001b ;A/D設定 ; 初期状態 00-- 0000 mov cmcon0,#00000111b ;コンパレーターOFF setb rp0 ;ページ変更(Bank 1へ) ;(Bank 1) mov option_reg,#10000111b ;bit7…0 プルアップ【無】 ;bit6…割り込みエッジ ;bit5…0 タイマー0は内蔵クロック使用 ;bit4…タイマー0エッジ ;bit3…プリスケーラはタイマー0へ割当 ;bit2〜0…プリスケールレート【256】 mov trisio,# 001001b ;入出力ピン設定 mov intcon,#11000000b ;割込【有効】 ; 初期状態 0000 0000 mov pie1,#00000001b ;タイマー1割込【有効】 ; 初期状態 000- 0000 ; mov wpu,# 000000b ;プルアップピン設定 mov ansel,# 110001b ;GP0をA/Dに設定 ; 初期状態 -000 1111 clrb rp0 ;ページ変更(Bank 0へ戻す) ;(Bank 0) clr tmr2 ;(初期状態=0000 0000) clrb tmr2if ; clr mSELECT ;000000xxb 100→75→50→OFF clr mAD_Lo ; clr tmr1L ; clr tmr1h ; clrb tmr1if ;(初期状態=0) setb tmr1on ;タイマー1ON jnb tmr1if,$ ;★電圧安定まで少し待つ clrb tmr1if ; ;↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ; ;↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ; ;***[ メインループ ]********************; rREPEAT jnb mAD_Lo.0,rBAT_OK ;電圧低下チェック jmp rBAT_Lo ; rBAT_OK jb gpio.3,rS_CHK ;釦押チェック clr tmr0 ;チャタリング防止 clrb t0if ;0.065536秒 jnb t0if,$ ; jnb gpio.3,$ ;釦離待ち clr tmr0 ;チャタリング防止 clrb t0if ;0.065536秒 jnb t0if,$ ; inc mSELECT ;+1 and mSELECT,#00000011b ;上位6bit無効化 clr tmr2 ; ; setb tmr2if ; rS_CHK jnb tmr2if,rREPEAT ;T2旗無は釦チェックへ clrb tmr2if ; cje mSELECT,#00b,rPWM000 ;OFF cje mSELECT,#01b,rPWM100 ;100% cje mSELECT,#10b,rPWM075 ; 75% cje mSELECT,#11b,rPWM050 ; 50% ;---------------------------------------; rPWM000 mov gpio,# 000000b ;FET出力OFF、LED全点灯(白) jmp rREPEAT ; rPWM100 mov gpio,# 110010b ;FET出力ON、LED赤点灯 jmp rREPEAT ; rPWM075 mov gpio,# 110000b ;FET出力ON、LED赤+緑点灯(黄) cjbe tmr2,#210,$ ;★75% clrb gpio.5 ;FET出力OFF jmp rREPEAT ; rPWM050 mov gpio,# 110100b ;FET出力ON、LED緑点灯 cjbe tmr2,#150,$ ;★50% clrb gpio.5 ;FET出力OFF jmp rREPEAT ; ;***[ メインループここまで ]************; ;↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ; ;↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ; ;---------------------------------------; rBAT_Lo clrb gie ;割込停止処理 clrb gpio.5 ;FET出力OFF rBAT_LR cje mSELECT,#00b,rBLo000 ;OFF cje mSELECT,#01b,rBLo100 ;100% cje mSELECT,#10b,rBLo075 ; 75% cje mSELECT,#11b,rBLo050 ; 50% ;---------------------------------------; rBLo000 xor gpio,# 010110b ;LED緑+赤+青点滅(白) jnb tmr1if,$ ;T1旗無はここで待つ(0.5秒間隔用) clrb tmr1if ; jmp rAD_CHK ;元電圧チェックへ ;---------------------------------------; rBLo100 mov mAD_Lo,#19 ;★回数設定 rBL100a xor gpio,# 000100b ;LED赤点滅 rBL100b jnb gpio.3,rBLoOFF ;釦押チェック(押=OFFとする) jnb tmr1if,rBL100b ;T1旗無は釦チェックへ clrb tmr1if ; djnz mAD_Lo,rBL100a ;-1 jmp rAD_CHK ;元電圧チェックへ ;---------------------------------------; rBLo075 mov mAD_Lo,#19 ;★回数設定 rBL075a xor gpio,# 000110b ;LED赤+緑点滅(黄) rBL075b jnb gpio.3,rBLoOFF ;釦押チェック(押=OFFとする) jnb tmr1if,rBL075b ;T1旗無は釦チェックへ clrb tmr1if ; djnz mAD_Lo,rBL075a ;-1 jmp rAD_CHK ;元電圧チェックへ ;---------------------------------------; rBLo050 mov mAD_Lo,#19 ;★回数設定 rBL050a xor gpio,# 000010b ;LED緑点滅 rBL050b jnb gpio.3,rBLoOFF ;釦押チェック(押=OFFとする) jnb tmr1if,rBL050b ;T1旗無は釦チェックへ clrb tmr1if ; djnz mAD_Lo,rBL050a ;-1 jmp rAD_CHK ;元電圧チェックへ ;---------------------------------------; rBLoOFF clr tmr0 ;チャタリング防止 clrb t0if ;0.065536秒 jnb t0if,$ ; mov gpio,# 000000b ;FET出力OFF、LED全点灯(白) jnb gpio.3,$ ;釦離待ち clr tmr0 ;チャタリング防止 clrb t0if ;0.065536秒 jnb t0if,$ ; clr mSELECT ;00b jmp rBLo000 ; ;---------------------------------------; rAD_CHK setb go_done ;A/D変換開始(20〜60μS) jb go_done,$ ;A/D変換終了(bit0)まで待つ ; cjb adresh,#105,rBAT_LR ;★★12.8V未満はダメ cjb adresh,#106,rBAT_LR ;★★12.8V未満はダメ clrb mAD_Lo.0 ;電圧回復処理 setb gie ;割込再開 jmp rREPEAT ;