EVSE Control Software (Old Car) |
|
|
| (一部未完成) 鋭意製作中です しばらくお待ち下さい |
|
8ピンの PIC12F683 を用いて EVSE の制御を行います
このプログラムはタイマー割込みを使い、一定時間毎に処理を行う構造とします
主な機能は
(1)CPLT信号(1kHz PWM)の生成
(2)CPLT信号レベルの測定・判定(A/D変換)
(3)充電電流の ON/OFF制御(リレー駆動・簡易PWM)
(4)動作状態の LED点滅パターン表示
(5)パラメータの設定変更機能(パソコンとの通信)
(6)その他
簡易モニター機能
ソフトUART機能(パソコンとの通信用)
(1)TMR0割込を416uSとする
PIC12F683 では UARTが内臓されていないので、ソフトで UARTをエミュレートします
1bitを生成するためのクロックに相当する時間をTMR0の割込で作成します
通信レートを 300bpsとすると、 1bitは 3333uS となり
1bitを 8clockで構成すると、1clockは 416.6uS となります
(ソフトUARTの動作は6.で説明します)
416uSの割込をカウントして一定時間毎の処理を行うための基準時間を生成します
416uS×48count≒20mS 20mS毎の処理
20mS×50count≒1Sec 1秒毎の処理
( 1S ×60count≒1min 1分毎の処理 )
( 1min×60count≒1Hr 1時間毎の処理 )
各カウンタは上記カウント値をセットして割込毎にデクリメントします
カウント値が 0になったタイミングで処理を行えば一定時間毎に実行されます
(2)フォアグランドとバックグランド
タイマー割込処理の中で行う処理をバックグランドとします
時間に制約される処理(リアルタイム処理)を行います
タイマー割込処理以外での処理をフォアグランドとします
時間に制約されるない処理を行います
ここでは、実行に時間がかかる処理(主にモニター機能)を実行します
(1)初期設定、周波数設定
(2)デューティ比設定
(1)初期設定
(2)A/D変換、平均化
(3)電圧判定
リレーは動作電圧電流とも大きいのでトランジスタを介して駆動します
正論理で出力します
今回、小型の筐体に密閉状態で押し込みましたので、温度上昇を抑えるため
極力消費電力を減らす対策をしました
具体的には、リレー駆動時には正規の電圧(12V)を加えて駆動して、
可動鉄片が吸着してからは、保持に必要な電流に減らす方法です
(一般には大型のリレーやコンタクターに用いられる方法です)
(1)ディレーロジック
リレー駆動開始から一定時間(このリレーでは 50mS以上)を生成します
20mS毎の割込みタイミングでカウンタをデクリメントして 0になった時
フラグをセットします
(2)簡易PWM
CCPユニットのPWM機能は精度の必要な CPLT信号生成で使っていますので
416uSの割込みタイミングでカウンタをデクリメントして生成します
具体的には、416uSの間 ONにして、416uS*2=832uSの間 OFFにします
これで、周期:1.25mS(周波数:800Hz)、デューティ比:33%の PWMとなります
(3)駆動の切換
リレー駆動開始からディレー時間内は駆動信号を完全に ONします
ディレー時間後は、簡易PWM動作に切り替えて電圧を 1/3にします
電圧を 1/3にすると電力は 1/9になり、リレーはほとんど発熱しなくなりました
今回、パソコンを接続できる様にしていますが、これはデバッグや設定のためで
通常の使用時には 1個のLEDで動作状態を表示する様にしました
LEDの電流は少ないので CPUのポートで直接駆動しますが
駆動能力の大きなシンク(吸込)側で駆動する様にアノード側を+5Vに接続しました
そのため点滅は負論理になります
(1)点滅パターンのデータ
動作状態は LEDの点滅パターンで表示します
点滅パターンは次のフォーマットで EEPROMに書き込んでおきます(変更可能です)
状態毎の 周期=T*20mS、点灯時間=D*20mS を設定します T,D:1BYTE(0〜255)
例えば、T=50, D=25の場合 周期1秒で0.5秒点灯を繰り返します
状態 点滅パターン(イメージ) 周期
デューティ
スタンバイ ■____________________________________■____________(2秒 1%)
EV接続 ■■■■■■■■■■__________________■■■■■■■(1秒50%)
通電(充電) ■■■■■■■■■■■■■■■■■■■■■■■■■■(連続点灯)
通電(換気充電) ■■■■■■■■■■■■■■■■■____■■■■■■■(1秒90%)
異常 ■■____■■____■■____■■____■■____■■____■■(0.2秒50%)
(2)点滅パターン制御ロジック
動作状態が変わる毎に、対応した EEPROMアドレスから点滅パターンのデータを
取り出して点灯パターンの周期カウンタ、点灯カウンタにセットします
20mS毎の割込みタイミングでカウンタをデクリメントして 0になった時
点灯・消灯を行います
(1)1文字送信
送信の場合は、416uS毎の割込みで 8カウント毎に 1bitを生成し
1bitを 10(start:1+data:8+stop:1)カウントして 1文字を生成・送出します
(2)1文字受信
受信の場合は、送信の場合と基本的には同じですが
歩調同期の動作として、416uS毎の割込みで常時スタートビットのエッジ検出をします
スタートビットのエッジが検出されたら、スタートビットの中央でサンプリング
するため、1/2bit時間(4カウント)後を基準とします
その後は、8カウント毎に 1bitづつ取り込んで行き 1文字(8bit)取り込んだ後、
ストップビットを確認して受信完了とします
(3)エラー処理
フレーミングエラー
前述のストップビットを確認したタイミングで信号が Hiの場合は OK
Loの場合は、ストップビットを確認できないため「フレーミングエラー」です
オーバーランエラー
受信タスクが受信完了した時点で、まだ受信完了フラグが立っていたら
「オーバーランエラー」とします(受信バッファは1個だけです)
モニタタスクが受信データを取り出した時、受信完了フラグを降ろします
(1)文字列(1行)入力
受信完了フラグが立ったら受信バッファから文字列バッファに移す
CR($0D)なら1行入力完了、コマンド解析へ、それ以外は次の文字を取込むため
文字列バッファのポインタをインクリメントしてバッファフルをチェック
(2)コマンド解析
文字列バッファの先頭文字をチェック、それぞれのコマンド処理ルーチンへ
コマンド以外の場合は「?」を送出してコマンド待ちへ
(3)コマンドフォーマット
処理 コマンド 内容
ルーチン フォーマット
HELP_ "?"[CR] HELP Command
DS_EEP "E"[CR] EEPROM Display Command
DUMP_ "D"[CR] EEPROM Dump Command
DS_EE1 "aa"[CR] EEPROM One data Display
ST_EE1 "aadd"[CR] EEPROM One data Set (EEPROM Load Command兼用)
DS_RAM "R"[CR] RAM Dump Command
DS_RM1 "Raa"[CR] RAM data Display
EEPRD_ EEPROM Data ReaD address:(WEEPAD),data:(WEEPDT)
EEPWR_ EEPROM Data Write address:(WEEPAD),data:(WEEPDT)
CHKHEX C:0 Nomal return, C:1 Error return
DMPTTL Dump title
' 0 1 2 3 4 5 6 7 8 9 A B C D E F'[CR]
CTRLC2 Cancel return(abort)
RXDTS_ Receve Data Strings
TXDT1_ (W) --> Transmit 1 Chara
TXHEX2 (W) --> 2 ASCII(HEX) & Transmit
TXHEXL (W)Lo Nibble --> ASCII(HEX) & Transmit
W(xxxxHHHH) --> "0"..."9","A"..."F"
TX_DOT Transmit "."
TX_SPA Transmit " "
CR_LF_ Transmit [CR][LF]
*** B2_BCD Binary to Hexadecimal conversion
*** BCD_B2 Hexadecimal to Binary conversion
|
LIST P=12F683,R=DEC,C=128,N=90
#include ; processor specific variable definitions
errorlevel -302 ; suppress message 302 from list file
__CONFIG _FCMEN_OFF & _IESO_OFF & _CP_OFF & _CPD_OFF & _BOD_ON & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
;===============================================================
; EVSE Control Circuit (1kHz Signal & Relay) With Test Monitor
; 充電ステーション制御プログラム
; 主な機能
; (1)EV接続検出 Control Pilot:9V
; (2)通電指示検出 Control Pilot:6V
; (3)通電換気指示検出 Control Pilot:3V
; (4)異常検出 Control Pilot:<1.5V
; (5)通電能力送出 EV未接続:DC+12V
; EV接続時:1kHz 振幅:±12V Duty:10%-50%
; デフォルト値 25%:15A [A]=[%]*0.6 (6A:10% - 30A:50% 設定可能)
; (6)通電制御<--EV(通電指示)
; 通電指示から40mS(*1)後にリレーON (Control Pilot信号の短絡時などの誤動作防止)
; リレーONから1秒間(*1)は100%(12V)で駆動、その後はPWM制御 デューティ33%(*1)
; PWMデューティ比は 1:n に設定可能(n=1:50% or n=2:33%) (駆動電力低減・発熱低減)
;
;---------------------------------------------------------------
;
; V00.40 EVSE Control Circuit 2014/07/19
; V00.31 EVSE Control Circuit (コメント追加) 2014/07/19
; V00.30 EVSE Control Circuit (1kHz Signal & RelayPD) 2014/07/18
; V00.20 EVSE Control Circuit (1kHz Signal & Relay) 2014/06/26
; V00.10 EVSE Control Circuit (1kHz Signal & Relay) 2014/06/25
; V00.00 EVSE Control Circuit (1kHz Signal & Relay) 2014/06/21
; EVSE683(Electric Vehicle Service Equipment) 2014/06/21
; CSSD683(2010/03/03版)から移植 2014/06/21
; BATAL683(2009/11/26版)から移植 (相違点)■■■12F683(旧;◆675)2010/02/22
;---------------------------------------------------------------
ORG 0x2170 ; Program Date & Version
DE 0x00 ;0x70:V00.40 (Version)
DE 0x40 ;0x71:
DE 0x20 ;0x72:2014/07/20 (Program Date)
DE 0x14 ;0x73:
DE 0x07 ;0x74:
DE 0x20 ;0x75:
; ;----------------------------------
DE " " ;0x76
DE "E" ;0x77:EVSE683
DE "V" ;0x78
DE "S" ;0x79
DE "E" ;0x7A
DE "6" ;0x7B
DE "8" ;0x7C
DE "3" ;0x7D
DE " " ;0x7E
DE " " ;0x7F
;
;===============================================================
; Superviser: TX, RX task
; Main: MONITOR(Dump RAM, Dump EEPROM, Modifay EEPROM)
; Command fomat:
; aadd[CR] Set Data Command aa:address, dd:data
; aa[CR] Disp Data Command aa:address ---> aadd
; D[CR] Dump EEPROM All 00xx[CR,LF] ... 3Fxx[CR,LF]
; E[CR] ---> Disp EEPROM All E 0 1 2 ... F [CR,LF]
; 00 XX XX XX ... XX[CR,LF]
; Raa[CR] Disp Ram Command Raa:address ---> Raadd
; R[CR] ---> Disp RAM All R 0 1 2 ... F [CR,LF]
; 00 XX XX XX ... XX[CR,LF]
; C[CR] Forth ON GP4:Lo
; c[CR] Forth OFF GP4:Hi
; L[CR] Forth ON GP5:Lo
; l[CR] Forth OFF GP5:Hi
; ?[CR] Version Infomation
;
; Control [Ctrl-C] interrupt (R,E,D)
; [Ctrl-X] Cancel
; [BS] 1chr delete
; Character Set "0123456789","ABCDEF","abcdef","LlSsRr?"
; [CR],[BS],[Ctrl-C],[Ctrl-X]
;
; Communication Data (start:1 + data:8 + stop:1)
;---------------------------------------------------------------
; 1秒毎 A/Dデータ送信
;---------------------------------------------------------------
;◆ Tera Term: Terminal setup
; Terminal size:80x24 New-line_R:CR,T:CR Terminal_ID:VT100 Kanji_R:JIS,T:JIS
;◆ Tera Term: Serial port setup
; Poet:COM1 BaudRate:300 Data:8bit Parity:none Stop:1bit FlowCon:none
; Transmit delay:50mS/chr 200mS/line
;---------------------------------------------------------------
; Hardware Connection
; I/O(P) GP5(2) GP4(3) GP3(4) GP2(5) GP1(6) GP0(7) [2014/06/21]
; (AI) --- --- --- Pilot Analog [2014/06/21]
; (DI) --- --- RXD --- --- --- Digital [2014/06/21]
; (DO) LED LRY --- CCP1 TXD --- Digital [2014/06/21]
; (PRG) Vpp CLK DAT (Prog.)
;
;(旧) (AI) --- C.Sense --- --- Analog [2010/02/22]
;(旧) (DI) --- --- RXD --- --- /SW1 Digital [2010/02/22]
;(旧) (DO) /FETG2 /FETG1 --- TXD --- Digital [2010/02/22]
;(旧) (PRG) Vpp CLK DAT (Prog.) [2010/02/22]
;
;■■■■ RX GPIO,3 ---> GPIO,3(そのまま) ---> GPIO,3(そのまま) [2014/06/21]
;■■■■ TX GPIO,4 ---> GPIO,1(変更) ---> GPIO,1(そのまま) [2014/06/21]
;■■■■ AI GPIO,2 ---> GPIO,0(変更) [2014/06/21]
;■■■■ DI GPIO,0 ---> (/SW1 廃止) [2014/06/21]
;■■■■ DO GPIO,2 ---> (CCP1 追加) [2014/06/21]
;■■■■ DO GPIO,3 ---> (LRY 変更) [2014/06/21]
;■■■■ DO GPIO,4 ---> (LED 変更) [2014/06/21]
;
;===============================================================
; Declare EEPROM Data
;===============================================================
; ORG 0x2100 ;番地
;; ;CNTHRH:CNTHRL 充電時間
; DE 0x00 ;0x00:CNTHRH 256-65535 累積時間 H
; DE 0x00 ;0x01:CNTHRL 0- 255 L
; DE 0x00 ;0x02:CNTHRL 0- 255 今回時間
; DE 0x00 ;0x03:CNTMIN 0- 59 今回分
;;
; DE 0x00 ;0x04:充電回数 H
; DE 0x00 ;0x05: L
; DE 0x00 ;0x06:未使用■
; DE 0x00 ;0x07:未使用■
;;
; DE 0x00 ;0x08:"POW-ON" H [08]番地 (WTMSTS,2: +1 指示/済)
; DE 0x00 ;0x09: L
; DE 0x00 ;0x0A:"SW-ON" H [0A]番地 (WTMSTS,3: +1 指示/済)
; DE 0x00 ;0x0B: L
; DE 0x00 ;0x0C:"CMD-ON" H [0C]番地 (WTMSTS,4: +1 指示/済)
; DE 0x00 ;0x0D: L
; DE 0x00 ;0x0E:"wakeup" H [0E]番地 (WTMSTS,5: +1 指示/済)
; DE 0x00 ;0x0F: L
;;
;; ;0x10:未使用■
;; ;----
;; ;0x4F:未使用■
;---------------------------------------------------------------
; 以下の EEPROM 内に保持する設定値はパワーオンリセット時に読込むため
; 変更後は「電源を入れ直す」と反映される
ORG 0x2150 ; Preset Value 状態表示 LED点滅データ
; ;周期=T*20mS, デューティ=D*20mS
DE 0x64 ;0x50:T1111T EQU 0X46;"1111" 周期
DE 0x01 ;0x51:T1111D EQU 0X47;"1111" デューティ
DE 0x32 ;0x52:T1110T EQU 0X48;"1110" 周期
DE 0x19 ;0x53:T1110D EQU 0X49;"1110" デューティ
DE 0x32 ;0x54:T1100T EQU 0X4A;"1100" 周期
DE 0x32 ;0x55:T1100D EQU 0X4B;"1100" デューティ
DE 0x32 ;0x56:T1000T EQU 0X4C;"1000" 周期
DE 0x2D ;0x57:T1000D EQU 0X4D;"1000" デューティ
DE 0x0A ;0x58:T0000T EQU 0X4E;"0000" 周期
DE 0x05 ;0x59:T0000D EQU 0X4F;"0000" デューティ
; ;0x5A:未使用■
; ;----
; ;0x5E:未使用■
;
ORG 0x215F
DE 0x02 ;0x5F:CHGDLT 充電リレー オンディレー時間 ■2014/07/19■
;---------------------------------------------------------------
ORG 0x2160 ; Preset Value
DE 0x7D ;0x60:PWM100 PWM Width Duty Cycle 100% Value
DE 0x7C ;0x61:PWMDTS 100% 50% 40% 30% 25% 20% 16% 10%
; ; 1F0 F8 C7 95 7C 64 50 32
DE 0x03 ;0x62:CNTPCH Control Pilot 接続上限判定値(10.5V)
DE 0x60 ;0x63:CNTPCL (0x7C-->0x60仮)
DE 0x02 ;0x64:CNTPHH Control Pilot 充電上限判定値(7.5V)
DE 0x7D ;0x65:CNTPHL
DE 0x01 ;0x66:CNTPLH Control Pilot 充電下限判定値(4.5V)
DE 0x7E ;0x67:CNTPLL
DE 0x00 ;0x68:CNTPVH Control Pilot 換気下限判定値(1.5V)
DE 0x7F ;0x69:CNTPVL
DE 0x0F ;0x6A:CNTPHY Control Pilot 判定幅(Hysteresis)
; ;
DE 0x32 ;0x6B:Relay On Delay(n*20mS後にPWM) 0x32=50:1Sec
DE 0x02 ;0x6C:Relay PWM(ON:0.4mS, OFF:n*0.4mS) 0x02:33%
; ;
DE 0x01 ;0x6D:Startup timer0 (Sec) ;W_SUT0 EQU 0x2B
DE 0x05 ;0x6E:Startup timer1 (Sec) ;W_SUT1 EQU 0x2C
;
DE 0x35 ;0x6F:TMR0 data(S_TMR0)実験値:0x35=55
; ; OK範囲:0x28〜(0x35)〜0x3C
;===============================================================
; Declare Register
;===============================================================
; ;File Register Address
OPTREG EQU 0x01 ;0x81 : OPTION_REG
;===============================================================
; Work Area (counter/timer/flag/buffer tempolary work)
;===============================================================
;---------------------------------------------------------------
WTRSTS EQU 0x20 ;TX & RX status ________
; WTRSTS,0 ;RX Busy flag __________ Busy ______
; WTRSTS,1 ;RX Done flag ______ RX ______
; ; (read)____________ Done
; WTRSTS,2 ;RX Over run Err or RX Frameing Err
; WTRSTS,3 ;Cancel Flag
; ; ________
; WTRSTS,4 ;TX Busy flag __________ Busy ______
; WTRSTS,5 ;TX Done flag ______ TX ______
; ; start ____________ Done
; WTRSTS,6 ;RX Complete
; WTRSTS,7 ;RX on the way
;---------------------------------------------------------------
WRXDT_ EQU 0x21 ;RX data reg.
WRXDTB EQU 0x22 ;RX data Input buffer
WRXCC_ EQU 0x23 ;RX clk count
WTRBC_ EQU 0x24 ;TX(7:4) & RX(3:0) bit count
WTXDT_ EQU 0x25 ;TX data reg.
WTXCC_ EQU 0x26 ;TX clk count
WT_02S EQU 0x27 ;Timer count 20mS
WT_SEC EQU 0x28 ; // // 1 Sec
;WT010S EQU 0x29 ; // // 100mS [2014/06/26]
;WT_MIN EQU 0x29 ; // // 1 Min [未使用]
;WT_HUR EQU 0x2A ; // // 1 Hur [未使用]
W_SUT0 EQU 0x2B ;Startup timer0 (Sec)
W_SUT1 EQU 0x2C ;Startup timer1 (Sec)
; EQU 0x2D ;
;---------------------------------------------------------------
WCNTPS EQU 0x2E ;Control Pilot 前回判定結果
WCNTPL EQU 0x2F ;Control Pilot 判定結果
; WCNTPL,0 ;未接続(>10.5V)
; ; CNTPCH(0x62):CNTPCL(0x63)
; WCNTPL,1 ;接続(9V)
; ; CNTPHH(0x64):CNTPHL(0x65)
; WCNTPL,2 ;充電(6V)
; ; CNTPLH(0x66):CNTPLL(0x67)
; WCNTPL,3 ;換気(3V)
; ; CNTPVH(0x68):CNTPVL(0x69)
; WCNTPL,4 ;異常(<1.5V
; ;CNTPHY(0x6A) 判定幅(Hysteresis)
; WCNTPL,5 ;
; WCNTPL,6 ;
; WCNTPL,7 ;
;
WTXMST EQU 0x30 ;TX Moniter control & statu
; WTXMST,0 ;Data TX Flag
; WTXMST,1 ;[CR][LF] Flag
; WTXMST,2 ;"."ON(Toggle control)
; WTXMST,3 ;TX Enable Flag
; WTXMST,4 ;A/D判定 Flag
; WTXMST,5 ;
; WTXMST,6 ;
; WTXMST,7 ;
;
WTMSTS EQU 0x31 ;Timer, TX control & statu
; WTMSTS,0 ;
; WTMSTS,1 ;
; WTMSTS,2 ;POW-ON起動 +1 指示/済
; WTMSTS,3 ;SW1-ON +1 指示/済
; WTMSTS,4 ;CMD-ON +1 指示/済
; WTMSTS,5 ;wakeup +1 指示/済
; WTMSTS,6 ;Startup timer User 0:on count, 1:timeup W_SUT1
; WTMSTS,7 ;Startup timer Mon. 0:on count, 1:timeup W_SUT0
;---------------------------------------------------------------
WADR0H EQU 0x32 ;ch0H A/D convertion Work
WADR0L EQU 0x33 ; 0L
WADAVH EQU 0x34 ;averege data H
WADAVL EQU 0x35 ; L
WADAVC EQU 0x36 ;averege count
WADTMP EQU 0x37 ;Temp work
WCTRHH EQU 0x38 ;Threshold compare level Hi
WCTRHL EQU 0x39 ;Threshold compare level Lo
WCOMPH EQU 0x3A ;compare work H
WCOMPL EQU 0x3B ;compare work L
;
CNTPCH EQU 0x3C ;0x62 未接続(>10.5V)
CNTPCL EQU 0x3D ;0x63
CNTPHH EQU 0x3E ;0x64 接続(9V)
CNTPHL EQU 0x3F ;0x65
CNTPLH EQU 0x40 ;0x66 充電(6V)
CNTPLL EQU 0x41 ;0x67
CNTPVH EQU 0x42 ;0x68 換気(3V)
CNTPVL EQU 0x43 ;0x69 異常(<1.5V)
CNTPHY EQU 0x44 ;0x6A 判定幅(Hysteresis)
; EQU 0X45 ;
T1111T EQU 0X46 ;"1111" 周期
T1111D EQU 0X47 ;"1111" デューティ
T1110T EQU 0X48 ;"1110" 周期
T1110D EQU 0X49 ;"1110" デューティ
T1100T EQU 0X4A ;"1100" 周期
T1100D EQU 0X4B ;"1100" デューティ
T1000T EQU 0X4C ;"1000" 周期
T1000D EQU 0X4D ;"1000" デューティ
T0000T EQU 0X4E ;"0000" 周期
T0000D EQU 0X4F ;"0000" デューティ
;
WTMTSV EQU 0x50 ;タイマー周期設定値
WTMDSV EQU 0x51 ;デューティ 設定値
WTMTCT EQU 0x52 ;タイマー周期現在値
WTMDCT EQU 0x53 ;デューティ 現在値
;
WGP4CS EQU 0x54 ;GP4 Control & Status
; WGP4CS,0 ;GP4(S) 判定部で ON/OFF
; WGP4CS,1 ;GP4(D) 20mS割込で GP4(S)を保存
; WGP4CS,2 ;GP4(D-1) 20mS割込で GP4(D)を保存
;
; WGP4CS,3 ;GP4(N) 20mS割込で GP4(D-1)を保存
; WGP4CS,4 ;GP4(N-1) 20mS割込で GP4(N)を保存
; WGP4CS,5 ;GP4(On Delay)GP4:ONの一定時間後にON
; WGP4CS,6 ;
; WGP4CS,7 ;
;
;---------------------------------------------------------------
; ; 判定部で ONしてから PWM作動実際に ONするまでの時間設定 1Sec=50*0.02Sec
; EEPROM DE 0x02 ;0x5F:_CHGDL 充電リレー オンディレー時間 ■2014/07/19■
;
_CHGDL EQU 0x55 ;EEPROM:0x5F の値
WCHGDL EQU 0x56 ;On Delay timer counter
;
;---------------------------------------------------------------
; ; リレー ONしてから PWM作動するまでの時間設定 1Sec=50*0.02Sec
; EEPROM DE 0x32 ;0x6B:Relay On Delay(n*20mS後にPWM) 0x32=50:1Sec■
; ; NG 1 20mS NG(リレー吸着せず)
; ; OK 2 40mS (一応リレー作動する)
; ; OK 50 1Sec リレー作動(安全を見てこの値とする)
_DELAY EQU 0x57 ;EEPROM:0x6B の値
WDELAY EQU 0x58 ;On Delay timer counter
;
;---------------------------------------------------------------
; ; PWM作動(1Sec)後 PWM の OFF 時間を決める数値 (1 or 2)
; ; 3以上(デューティ:25%以下)はリレー吸引を持続できず NG
; ; ON:416(uS), OFF:416*n(uS) n=1 or N=2 (>2:NG)
; EEPROM DE 0x02 ;0x6C:Relay PWM(ON:0.4mS, OFF:n*0.4mS) 0x02:33% ■
; ; T= 416
; ; n PWM F 電力低減率
; ; OK 1 50% 1.2kHz 25%(75%OFF)
; ; OK 2 33% 800Hz 11%(89%OFF)
; ; NG 3 25% 600Hz NG(リレー離落)
_DTYCT EQU 0x59 ;EEPROM:0x6C の値
WDTYCT EQU 0x5A ;Dutycycle timer counter
;
; EQU 0x5B ;
; EQU 0x5C ;
; EQU 0x5D ;
; EQU 0x5E ;
; EQU 0x5F ;
;---------------------------------------------------------------
S_TMR0 EQU 0x60 ;TMR0 Pre Set Value
;---------------------------------------------------------------
WREGHH EQU 0x61 ;HEXH work
WREGHX EQU 0x62 ;HEXL work
W_TMPL EQU 0x63 ;work for BCD-2B L
W_TMPH EQU 0x64 ;
W_CT_1 EQU 0x65 ;
W_CT_2 EQU 0x66 ;
WRDTCT EQU 0x67 ;RX Data count
WRXD00 EQU 0x68 ;Receve Data buffer BeGin Address
WRXD01 EQU 0x69 ;
WRXD02 EQU 0x6A ;
WRXD03 EQU 0x6B ;
WRXD04 EQU 0x6C ;
; EQU 0x6D ;
; EQU 0x6E ;
; EQU 0x6F ;
;---------------------------------------------------------------
; ;BANK0(70H-7FH) & BANK1(F0H-$FFH)
;---------------------------------------------------------------
W_STAT EQU 0x70 ;Save STATUS reg. for IRQ
W_WREG EQU 0x71 ;Save W reg. for IRQ
W_FSR_ EQU 0x72 ;Save FSR reg. for IRQ
W_FSR2 EQU 0x73 ;Save FSR reg. for Subr
;
WEECTL EQU 0x7D ;EEPROM Data control flag
; WEECTL,0 ;桁上がり指示 (カウンタ積算(+1) 処理)
W_DTCT EQU 0x7D ;EEPROM Data save count temp.
WEEPAD EQU 0x7E ;work for EEPROM Address cal.
WEEPDT EQU 0x7F ;EEPROM Data disp.Temp
;---------------------------------------------------------------
; EQU 0xA0 ;BANK1
; .... ;
; EQU 0xBF ;
;
;===============================================================
; Reset Process
;===============================================================
ORG 0x000 ;Reset vector
GOTO INIT ;Initialize
;
ORG 0x004 ;Interrupt vector
;===============================================================
; Interrupt Service
;===============================================================
;---------------------------------------------------------------
; ;save register
;---------------------------------------------------------------
PUSH MOVWF W_WREG ;Save W reg.
SWAPF W_WREG,1
SWAPF STATUS,0 ;Get status
MOVWF W_STAT ;Save it
MOVF FSR,W ;Save SFR
MOVWF W_FSR_
;
;---------------------------------------------------------------
; Interrupt source analize
;---------------------------------------------------------------
BCF STATUS,RP0 ;BANK0
BTFSS INTCON,T0IF ;TMR0 Over Flow ?
GOTO INIINT ;init
;
;---------------------------------------------------------------
; TMR0 Service 416uS 毎割込
;---------------------------------------------------------------
;S_TMR0 EQU 66 ;0x42 F:4MHz, P:2, T:416uS (256-208)+18=66
;S_TMR0 EQU 63 ;0x3F F:4MHz, P:2, T:416uS (256-208)+15=63
;S_TMR0 EQU 57 ;0x39 F:4MHz, P:2, T:416uS (256-208)+ 9=57
;
INTRTC
MOVF S_TMR0,W ;TMR0 data (from EEPROM)
; MOVLW S_TMR0 ;TMR0 Pre Set
MOVWF TMR0
;
BCF INTCON,T0IF ;clr int flag
;
;---------------------------------------------------------------
; ;RX data input
;---------------------------------------------------------------
; ;RX status _________
; WTRSTS,0 ;RX Busy flag _________ RX Busy ______
; WTRSTS,1 ;RX Done flag ______ ______
; ; (read)____________ Done
;---------------------------------------------------------------
BTFSC WTRSTS,0 ;
GOTO INTRX1 ; RX Busy
; ;not RX Busy
; ;---------- bit 0 process ------
BTFSC GPIO,3 ;RX Start Bit Check
GOTO INTTX0 ; not Start
; ; Start
;---------------------------------------------------------------
BTFSC WTRSTS,1 ;RX Over run Err Check
BSF WTRSTS,2 ;RX Over run Err Flag set
; ;(OverRun)が起きても次の文字を読む
; GOTO INTRX9 ;(OverRun)の時次の文字を読まない
;
; MOVLW 16 ;---------- Start bit process --
MOVLW 8 ;---------- Start bit process --
;****** MOVF C_CLKC,W
MOVWF WRXCC_
BCF STATUS,C
RRF WRXCC_,F ;1/2:half bit time set
MOVLW 0xF0
ANDWF WTRBC_,F ;Clear RX bit count
BSF WTRSTS,0 ;RX Busy set
GOTO INTTX0
;
;INTRX9 BSF WTRSTS,2 ;RX Over run Err Flag set
; BSF WTRSTS,1 ;RX Done Flag set
; BCF WTRSTS,0 ;RX Busy flag reset
; GOTO INTTX0
;
INTRX1 DECFSZ WRXCC_,F ;---------- 1 bit time counter -
GOTO INTTX0 ;WRXCC_><0
; ; =0
; MOVLW 16 ;---------- Start bit process --
MOVLW 8 ;---------- Start bit process --
;****** MOVF C_CLKC,W
MOVWF WRXCC_
; ;---------- bit 0-9 process ----
MOVF WTRBC_,W ;WTRBC_,3:0 RX bit count
ANDLW 0x0F
SUBLW 8 ;8-(W)
BTFSC STATUS,C
GOTO INTRXR ;8 >= count
; ;8(9)< count
; ;1BYTE input conplete
MOVF WRXDT_,W
MOVWF WRXDTB ;set RX buffer
;-------------------------------;[Ctrl-C]check
BCF WTRSTS,3 ;Cancel Flag clear
ANDLW 0x7F
SUBLW 0x03
BTFSC STATUS,Z
BSF WTRSTS,3 ;Receve [Ctrl-C] (Flag set)
BTFSC WTRSTS,3
BCF WTXMST,3
;-------------------------------;
CLRF WRXDT_
;***** BCF WTRSTS,2 ;RX Over run or Frameing Err Flag
BSF WTRSTS,1 ;RX Done Flag set
BCF WTRSTS,0 ;RX Busy flag reset
MOVLW 0xF0
ANDWF WTRBC_,F ;Clear RX bit count
; ;-------------------------------
BTFSC GPIO,3 ;RX Stop Bit Check
GOTO INTTX0 ;Stop Bit:1 OK
BSF WTRSTS,2 ;RX Over run or Frameing Err Flag
; ;-------------------------------
GOTO INTTX0
;
INTRXR BSF STATUS,C
BTFSS GPIO,3 ; ---> C
BCF STATUS,C
RRF WRXDT_,F ;C ---> WRXDT_ 1bit input
INCF WTRBC_,F
;
;---------------------------------------------------------------
; ;TX data output
;---------------------------------------------------------------
INTTX0
BTFSC WTRSTS,5
GOTO INTTX9 ;TX Done
; ; Start
BTFSC WTRSTS,4 ;
GOTO INTTXB ;TX Busy
; ; not Busy
; ; =0
; MOVLW 16 ;---------- clk counter set(1st)
MOVLW 8 ;---------- clk counter set(1st)
;****** MOVF C_CLKC,W
MOVWF WRXCC_
; ;---------- Start bit process --
BSF WTRSTS,4 ;TX Busy flag set
MOVLW 0x0F
ANDWF WTRBC_,F ;Clear TX bit count
GOTO INTTXL ;0 count [Start Bit ---> Lo]
;
INTTXB DECFSZ WTXCC_,F ;---------- 1 bit time counter -
GOTO INTTX9 ;WTXCC_><0
; ; =0
; MOVLW 16 ;---------- clk counter set(1st)
MOVLW 8 ;---------- clk counter set(1st)
;****** MOVF C_CLKC,W
MOVWF WTXCC_
;
SWAPF WTRBC_,W ;WTRBC_,7:4 TX bit count
ANDLW 0x0F
SUBLW 10 ;10-(W)
BTFSS STATUS,Z
GOTO INTTXT ;10><(W)
; ;10= (W)
; ;---------- TX Done ------------
BSF GPIO,1 ;keep Hi
BSF WTRSTS,5 ;TX Done flag set
BCF WTRSTS,4 ;TX Busy flag reset
GOTO INTTX9
;
INTTXT SWAPF WTRBC_,W ;WTRBC_,7:4 TX bit count
ANDLW 0x0F
SUBLW 9 ;9-(W)
BTFSC STATUS,Z
; ;9 count [Stop Bit ---> Hi]
GOTO INTTXH ;---------- Stop bit process ---
; ;9><(W)
BSF STATUS,C
RRF WTXDT_,F ;1 ---> [7]---[0] ---> C
BTFSC STATUS,C
GOTO INTTXH ;Hi
; ;Lo
INTTXL BCF GPIO,1 ;output Lo, [Start Bit]
GOTO INTRTZ
;
INTTXH BSF GPIO,1 ;output Hi, [Stop Bit]
;
INTRTZ MOVLW 0x10
ADDWF WTRBC_,F ;INC TX bit count
INTTX9
;
;---------------------------------------------------------------
; Relay Control (On Delay & PWM)
;---------------------------------------------------------------
;WGP4CS EQU 0x54 ;GP4 Control & Status
; WGP4CS,0 ;GP4(S) 判定部で ON/OFF
; WGP4CS,1 ;GP4(D) 20mS割込で GP4(S)を保存
; WGP4CS,2 ;GP4(D-1) 20mS割込で GP4(D)を保存
; WGP4CS,3 ;GP4(On Delay)GP4:ONの一定時間後にON
;
; WGP4CS,4 ;GP4(N) 20mS割込で GP4(D-1)を保存
; WGP4CS,5 ;GP4(N-1) 20mS割込で GP4(N)を保存
; WGP4CS,6 ;GP4(PWM Delay)GP4:ONの一定時間後にPWM
; WGP4CS,7 ;
;_CHGDL EQU 0x55 ;EEPROM:0x5F:elay On Delay(n*20mS後にON) 0x02=2:40mS
;WCHGDL EQU 0x56 ;On Delay timer counter
;_DELAY EQU 0x55 ;EEPROM:0x6B:Relay On Delay(n*20mS後にPWM) 0x32=50:1Sec■
;WDELAY EQU 0x56 ;On Delay timer counter
;_DTYCT EQU 0x57 ;EEPROM:0x6C:Relay PWM(ON:0.4mS, OFF:n*0.4mS) 0x02:33% ■
;WDTYCT EQU 0x58 ;Dutycycle timer counter
;
;■■■ WGP4CS,0>WGP4CS,3 WGP4CS,1>WGP4CS,4 WGP4CS,2>WGP4CS,5 WGP4CS,3>WGP4CS,6
;-------------------------------;
BTFSC WGP4CS,4
GOTO GP4CK1
BCF GPIO,4 ;GP4:OFF(0)
GOTO GP4END
;
GP4CK1
BTFSC WGP4CS,6
GOTO POWDWN ;オンディレー後
; ;オンディレー前
BSF GPIO,4 ;GP4:-->ON(1)
GOTO GP4END
;
POWDWN BTFSC GPIO,4 ;パワーダウン(PWM)処理
GOTO GP4ON ;現在:ON
; ;現在:OFF
MOVF WDTYCT,W
BTFSC STATUS,Z
GOTO GP4ON ;既に 0
DECFSZ WDTYCT,F ;デクリメント
GOTO GP4END ;カウント中
; ;カウンタ=0
BSF GPIO,4 ;GP4:-->ON(1)
GOTO GP4END
;
GP4ON BCF GPIO,4 ;GP4:ON-->OFF(0)
;
MOVF _DTYCT,W
MOVWF WDTYCT ;カウンタセット
;
GP4END
;
;---------------------------------------------------------------
; ;A/D Service
;---------------------------------------------------------------
;WADR0H EQU 0x32 ;ch0H A/D convertion Work
;WADR0L EQU 0x33 ; 0L
;WADAVH EQU 0x34 ;averege data H
;WADAVL EQU 0x35 ; L
;WADAVC EQU 0x36 ;averege count
;WADTMP EQU 0x37 ;Temp work
; ;
; MOVLW B'10000001' ; [2014/06/21]
; || |||+------;1:ADON
; || ||+-------;0:GO/1:DONE
; || ++--------;00:AN0,01:AN1,10:AN2,11:AN3
; |+------------;0:VDD,1:VREF
; +-------------;0:LJst,1:RJst
;
BSF ADCON0,1 ;Go
INTAL0 BTFSC ADCON0,1
GOTO INTAL0
;
BSF STATUS,RP0 ;BANK=1
MOVF ADRESL,W ;A/D ch0L Data read
BCF STATUS,RP0 ;BANK=0
ADDWF WADR0L,F
BTFSC STATUS,C
INCF WADR0H,F
;
MOVF ADRESH,W ;A/D ch0H Data read
ADDWF WADR0H,F
;
;------------------------------------------ Averege ------------
DECFSZ WADAVC,F ;averege counter
GOTO INTRT1
;---------------------------------------------------------------[2014/06/27]
; ; A/D 平均値計算(16回加算結果/16 : 4bit右シフト)
MOVLW 0x10 ;Set 16 ■ 416uS * 16 = 6.6mS ■
MOVWF WADAVC
;
SWAPF WADR0L,W
ANDLW 0x0F
MOVWF WADAVL
SWAPF WADR0H,W
ANDLW 0xF0
IORWF WADAVL,F
;
SWAPF WADR0H,W
ANDLW 0x0F
MOVWF WADAVH
;
;;--------------------------------------------------------------
; MOVLW 0x40 ;Set 64 ■ 416uS * 64 = 26.6mS ■
; MOVWF WADAVC
;;
; CLRF WADAVH
;; ; WADAVH C WADR0H C WADR0L C
;; ; 98765432 10xxxxxx ?
; RLF WADR0L,F ; 98765432 1 0xxxxxx?
; RLF WADR0H,F ; 9 87654321 0xxxxxx?
; RLF WADAVH,F ; 00000009 87654321 0xxxxxx?
; RLF WADR0L,F ; 00000009 87654321 0 xxxxxx??
; RLF WADR0H,F ; 00000009 8 76543210 xxxxxx??
; RLF WADAVH,F ; 00000098 76543210 xxxxxx??
;;
; MOVF WADR0H,W
; MOVWF WADAVL ;平均値 L セット
;;--------------------------------------------------------------
CLRF WADR0H
CLRF WADR0L
; ;A/D 平均値計算済(結果を判定に使用可能)
BSF WTXMST,4 ;A/D判定開始指示 Flag [2014/06/27]
;
;---------------------------------------------------------------
; superviser process ;Timer process
;---------------------------------------------------------------
;WT_02S EQU 0x27 ;Timer count 20mS 208uSx96=20mS
; 416uSx48=20mS
;WT010S EQU 0x29 ; // // 100mS 20mSx5=100mS [2014/06/26]
;WT_SEC EQU 0x28 ; // // 1 Sec 20mSx50=1Sec
;**WT_MIN EQU 0x29 ; // // 1 Min x60=1Min■■■未使用■■■
;**WT_HUR EQU 0x2A ; // // 1 Hur x60=1Hur■■■未使用■■■
;W_SUT0 EQU 0x2B ;Startup timer0 (Sec)
;W_SUT1 EQU 0x2C ;Startup timer1 (Sec)
;---------------------------------------------------------------
INTRT1
DECFSZ WT_02S,F ;20mS Timer
GOTO PULL ;not 0
; MOVLW 96 ;TM0=208uS
MOVLW 48 ;TM0=416uS
MOVWF WT_02S
;-------------------------------;(20mS) Interval Process
;
;WGP4CS EQU 0x54 ;GP4 Control & Status
; WGP4CS,0 ;GP4(S) 判定部で ON/OFF
; WGP4CS,1 ;GP4(D) 20mS割込で GP4(S)を保存
; WGP4CS,2 ;GP4(D-1) 20mS割込で GP4(D)を保存
; WGP4CS,3 ;GP4(On Delay)GP4:ONの一定時間後にON
;
; WGP4CS,4 ;GP4(N) 20mS割込で GP4(D-1)を保存
; WGP4CS,5 ;GP4(N-1) 20mS割込で GP4(N)を保存
; WGP4CS,6 ;GP4(PWM Delay)GP4:ONの一定時間後にPWM
; WGP4CS,7 ;
;_CHGDL EQU 0x55 ;EEPROM:0x5F:elay On Delay(n*20mS後にON) 0x02=2:40mS
;WCHGDL EQU 0x56 ;On Delay timer counter
;_DELAY EQU 0x55 ;EEPROM:0x6B:Relay PWM Delay(n*20mS後にPWM) 0x32=50:1Sec■
;WDELAY EQU 0x56 ;On Delay timer counter
;_DTYCT EQU 0x57 ;EEPROM:0x6C:Relay PWM(ON:0.4mS, OFF:n*0.4mS) 0x02:33% ■
;WDTYCT EQU 0x58 ;Dutycycle timer counter
;
;■■■ WDELAY>WCHGDL _DELAY>_CHGDL _DELAY;EEP:0x6B>_CHGDL;EEP:0x5F
;
;■■■ WGP4CS,0>WGP4CS,3 WGP4CS,1>WGP4CS,4 WGP4CS,2>WGP4CS,5 WGP4CS,3>WGP4CS,6
;
MOVF WCHGDL,W
BTFSC STATUS,Z
GOTO GP4OD1 ; =0 既にタイムアップ
DECFSZ WCHGDL,F ; >0 タイマー減算
GOTO GP4OD1 ; >0 まだ減算中
BSF WGP4CS,3 ;GP4 Delay タイムアップ
;
;-------------------------------;
GP4OD1 BCF WGP4CS,2 ;GP4(D) ---> GP4(N-1)
BTFSC WGP4CS,1
BSF WGP4CS,2 ;GP4(D-1)=1
; ;GP4(D-1)=0
BCF WGP4CS,1 ;GP4 ---> GP4(N)
BTFSC WGP4CS,0 ;GP4(S)
BSF WGP4CS,1 ;GP4(D)=1
; ;GP4(D)=0
BTFSS WGP4CS,1
BCF WGP4CS,3 ;GP4 Delay リセット
;
;-------------------------------;
BTFSC WGP4CS,2 ;GP4 立ち上りエッジチェック
GOTO GP4OD2
; ;GP4(N-1)=0
BTFSC WGP4CS,1
GOTO GP4OD2
; ;GP4(N)=1 立ち上り
BCF WGP4CS,63 ;GP4 Delay リセット
MOVF _CHGDL,W
MOVWF WCHGDL ;タイマーセット
;
;-------------------------------;
GP4OD2
;-------------------------------;
MOVF WDELAY,W
BTFSC STATUS,Z
GOTO GP4OD3 ; =0 既にタイムアップ
DECFSZ WDELAY,F ; >0 タイマー減算
GOTO GP4OD3 ; >0 まだ減算中
BSF WGP4CS,6 ;GP4 Delay タイムアップ
;
;-------------------------------;
GP4OD3 BCF WGP4CS,5 ;GP4(N) ---> GP4(N-1)
BTFSC WGP4CS,4
BSF WGP4CS,5 ;GP4(N-1)=1
; ;GP4(N-1)=0
BCF WGP4CS,4 ;GP4 ---> GP4(N)
BTFSC WGP4CS,3 ;GP4(S)
BSF WGP4CS,4 ;GP4(N)=1
; ;GP4(N)=0
BTFSS WGP4CS,4
BCF WGP4CS,6 ;GP4 Delay リセット
;
;-------------------------------;
BTFSC WGP4CS,5 ;GP4 立ち上りエッジチェック
GOTO GP4ODE
; ;GP4(N-1)=0
BTFSC WGP4CS,4
GOTO GP4ODE
; ;GP4(N)=1 立ち上り
BCF WGP4CS,6 ;GP4 Delay リセット
MOVF _DELAY,W
MOVWF WDELAY ;タイマーセット
;
;-------------------------------;
GP4ODE
;---------------------------------------------------------------
; ; LED 状態表示点滅パターン生成
;WTMTSV EQU 0x50 ;タイマー周期設定値
;WTMDSV EQU 0x51 ;デューティ 設定値
;WTMTCT EQU 0x52 ;タイマー周期現在値
;WTMDCT EQU 0x53 ;デューティ 現在値
;
DECFSZ WTMTCT,F ;(タイマー周期)-1
GOTO I20MS1 ;>0
; ;=0
MOVF WTMTSV,W ;タイマー周期設定値
MOVWF WTMTCT ;SET
MOVF WTMDSV,W ;デューティ 設定値
MOVWF WTMDCT ;SET
BCF GPIO,5 ;LED:ON
GOTO I20MSE
;
I20MS1 MOVF WTMTCT,F ;=0 ?
BTFSC STATUS,Z
GOTO I20MSE ;=0
; ;>0
DECFSZ WTMDCT,F ;(タイマー現在値)-1
GOTO I20MSE
BSF GPIO,5 ;LED:OFF
;
I20MSE
;---------------------------------------------------------------
;;WT010S EQU 0x29 ; // // 100mS 20mSx5=100mS [2014/06/26]
; DECFSZ WT010S,F ;100mSec Timer
; GOTO I010SE
; MOVLW 5
; MOVWF WT010S
;-------------------------------;(100mS) Interval Process [2014/06/26]
;
; BSF WTXMST,4 ;A/D判定 Flag
;
;I010SE ; [2014/06/26]
;---------------------------------------------------------------
DECFSZ WT_SEC,F ;1Sec Timer
GOTO PULL
MOVLW 50
MOVWF WT_SEC
;-------------------------------;(1S) Interval Process
;
;-------------------------------;■■■■■[DEBUG]2014/06/22
; BTFSC GPIO,5
; GOTO LEDON
;LEDOFF BSF GPIO,5 ;LED:OFF
; GOTO LEDNXT
;LEDON BCF GPIO,5 ;LED:ON
;LEDNXT
;-------------------------------;■■■■■[DEBUG]2014/06/22
; ;---------------------
; ;Startup timer(0)
; ;---------------------
;Startup timer ;01234567890
; (0)1秒 W_SUT0 WTMSTS,7;__~~~~~~~~~~~~~~~~~~~~
; (1)5秒 W_SUT1 WTMSTS,6;__________~~~~~~~~~~~~
;-------------------------------;
BTFSC WTMSTS,7
GOTO INT010
DECFSZ W_SUT0,F
GOTO INT010
BSF WTMSTS,7 ;W_SUT0 = 0 (Timeup)
;---------------------------------------------------------------
; 起動 1秒後に1回だけ実行する処理
;---------------------------------------------------------------
;
;
;---------------------------------------------------------------
INT010
; ;---------------------
; ;Startup timer(1)
BTFSC WTMSTS,6 ;---------------------
GOTO INT020
DECFSZ W_SUT1,F
GOTO INT020
BSF WTMSTS,6 ;W_SUT1 = 0 (Timeup)
;---------------------------------------------------------------
; 起動 N秒後に1回だけ実行する処理
;---------------------------------------------------------------
;
;
;
;---------------------------------------------------------------
INT020
;
;
;■■■■■ TEST & DEBUG BEGIN ■■■■■
BTFSC WTXMST,3 ;TX Enable Flag
BSF WTXMST,0 ;データ送出タイミング(1秒毎)
;■■■■■ TEST & DEBUG END ■■■■■
;
;---------------------------------------------------------------
INT090
;
;---------------------------------------------------------------
; DECFSZ WT_MIN,F ;1Min Timer
; GOTO PULL
; MOVLW 60
; MOVWF WT_MIN
;-------------------------------;(1M) Interval Process
;
;---------------------------------------------------------------
; DECFSZ WT_HUR,F ;1Hur Timer
; GOTO PULL
; MOVLW 60
; MOVWF WT_HUR
;-------------------------------;(1H) Interval Process
;
;
;---------------------------------------------------------------
GOTO PULL
;
;---------------------------------------------------------------
; ;Restore register
;---------------------------------------------------------------
INIINT MOVLW S_INTC ;init
MOVWF INTCON
PULL MOVF W_FSR_,W ;Restore FSR
MOVWF FSR
SWAPF W_STAT,0 ;Restore status
MOVWF STATUS
SWAPF W_WREG,0 ;Restore W reg.
RETFIE
;---------------------------------------------------------------
; End of Interrupt Service
;---------------------------------------------------------------
;■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
;===============================================================
; START: Main Program Start
;===============================================================
MAIN MOVLW S_INTC ;
MOVWF INTCON ;
;
MOVLW 0x00
CALL TXDT1_
CALL CR_LF_
;-------------------------------;Startup control
; WTMSTS,6(W_SUT1) ;Startup timer User 0:on count, 1:timeup
; WTMSTS,7(W_SUT0) ;Startup timer Mon. 0:on count, 1:timeup
MAIN01
; CLRWDT
BTFSS WTMSTS,7 ;Startup timer timeup?
GOTO MAIN01
;
MOVLW "*"
CALL TXDT1_
CALL CR_LF_
;-------------------------------;起動回数カウンタ積算(+1) 処理
;; MOVLW 0x06 ;起動回数 H [06]番地
; MOVLW 0x09 ;EEPROM 0x08:CNTSTH 0x09:CNTSTL 起動回数
; MOVWF WEEPAD
; CALL EEPCT_ ;EEPROM カウンタ積算(+1)処理
;-------------------------------;
GOTO CLEARW
;
;---------------------------------------------------------------
LOOP
; CLRWDT ;Main Loop
NOP
NOP
;---------------------------------------------------------------
;WCNTPS EQU 0x2E ;Control Pilot 前回判定結果
;WCNTPL EQU 0x2F ;Control Pilot 判定結果
;
;WTMTSV EQU 0x50 ;タイマー周期設定値
;WTMDSV EQU 0x51 ;デューティ 設定値
;WTMTCT EQU 0x52 ;タイマー周期現在値
;WTMDCT EQU 0x53 ;デューティ 現在値
;
;T1111T EQU 0X46 ;"1111" 周期 未接続(>10.5V)
;T1111D EQU 0X47 ;"1111" デューティ
;T1110T EQU 0X48 ;"1110" 周期 接続(9V)
;T1110D EQU 0X49 ;"1110" デューティ
;T1100T EQU 0X4A ;"1100" 周期 充電(6V)
;T1100D EQU 0X4B ;"1100" デューティ
;T1000T EQU 0X4C ;"1000" 周期 換気(3V)
;T1000D EQU 0X4D ;"1000" デューティ
;T0000T EQU 0X4E ;"0000" 周期 異常(<1.5V)
;T0000D EQU 0X4F ;"0000" デューティ
;
;■■■■■ テスト中 ■■■■■
; BSF WTXMST,5 ;DEBUG 2014/06/25
BTFSS WTXMST,4 ;A/D判定 Flag
GOTO MCHK99
;
CALL CHKCP ;状態判定
;
MOVF WCNTPS,W
SUBWF WCNTPL,W
BTFSS STATUS,Z
GOTO MCHKBG ;>< (状態変化)
; ;= (変化無し)
MOVLW B'00001100'
SUBWF WCNTPL,W
BTFSC STATUS,Z
;■ BSF GPIO,4 ;"1100"充電(6V) RLY:ON
BSF WGP4CS,0 ;■
;
MOVLW B'00001111'
SUBWF WCNTPL,W
BTFSC STATUS,Z
CALL PWM100 ;"1111"未接続(>10.5V) Duty:100%
GOTO MCHK99
;
MCHKBG
;■ BCF GPIO,4 ;RLY:OFF
BCF WGP4CS,0 ;■
MOVF WCNTPL,W
MOVWF WCNTPS ;Data Save
;
MOVLW B'00001111'
SUBWF WCNTPL,W
BTFSC STATUS,Z
GOTO MCHK0F ;"1111"未接続(>10.5V)
;
CALL PWMDTS ;PWM Duty Cycle Set(EEPROM:[$61]
;
MOVLW B'00001110'
SUBWF WCNTPL,W
BTFSC STATUS,Z
GOTO MCHK0E ;"1110"接続(9V)
MOVLW B'00001100'
SUBWF WCNTPL,W
BTFSC STATUS,Z
GOTO MCHK0C ;"1100"充電(6V)
MOVLW B'00001000'
SUBWF WCNTPL,W
BTFSC STATUS,Z
GOTO MCHK08 ;"1000"換気(3V)
MOVLW B'00000000'
SUBWF WCNTPL,W
BTFSC STATUS,Z
GOTO MCHK00 ;"0000"異常(<1.5V)
;■ BCF GPIO,4 ;RLY:OFF
BCF WGP4CS,0 ;■
GOTO MCHK99 ;"????"
;
MCHK0F MOVF T1111T,W ;未接続(>10.5V)
MOVWF WTMTSV
MOVF T1111D,W
MOVWF WTMDSV
GOTO MCHK99
;
MCHK0E MOVF T1110T,W ;接続(9V)
MOVWF WTMTSV
MOVF T1110D,W
MOVWF WTMDSV
GOTO MCHK99
;
MCHK0C MOVF T1100T,W ;充電(6V)
MOVWF WTMTSV
MOVF T1100D,W
MOVWF WTMDSV
;***** BSF GPIO,4 ;RLY:ON
;***** BSF WGP4CS,0
GOTO MCHK99
;
MCHK08 MOVF T1000T,W ;換気(3V)
MOVWF WTMTSV
MOVF T1000D,W
MOVWF WTMDSV
GOTO MCHK99
;
MCHK00 MOVF T0000T,W ;異常(<1.5V)
MOVWF WTMTSV
MOVF T0000D,W
MOVWF WTMDSV
; GOTO MCHK99
;
MCHK99
;---------------------------------------------------------------
;
;-------------------------------;A/D Data TX
; WTXMST,0 ;Data TX Flag
; WTXMST,1 ;[CR][LF] Flag
; WTXMST,2 ;"."ON(Toggle control)
; WTXMST,3 ;TX Enable Flag
; WTXMST,4 ;A/D判定 Flag
;
BTFSC WTXMST,1 ;[CR][LF] control
CALL CR_LF_
BCF WTXMST,1
;
; BTFSS WSWSTS,3 ;SW1 Long ON(Toggle control)
; GOTO DTTX_E
BTFSS WTXMST,0 ;Data TX Flag
GOTO DTTX_E
;
CALL CR_ ;[CR]のみ
MOVF WADAVH,W ;A/D data H
CALL TXHEXL
SWAPF WADAVL,W ;A/D data M
CALL TXHEXL
MOVF WADAVL,W ;A/D data L
CALL TXHEXL
;
BTFSC WTXMST,2 ;"." TX [2014/06/24]
GOTO MTXM_1
;
CALL TX_SPA ;" " TX
BSF WTXMST,2
GOTO MTXM_2
;
MTXM_1 CALL TX_DOT
BCF WTXMST,2
MTXM_2
; CALL CR_LF_
;
BCF WTXMST,0 ;Data TX Flag
DTTX_E
;-------------------------------;カウンタ積算(+1) 処理
;; DE 0x00 ;0x08:POW-ON (H)起動
;; WTMSTS,2 ;POW-ON起動 +1 指示/済
; BTFSS WTMSTS,2
; GOTO LOOP_0 ;処理済
;; ;未処理
; BCF WTMSTS,2 ;指示Flag (済)
; MOVLW 0x08 ;"SW-ON" H [08]番地
; MOVWF WEEPAD
; CALL EEPCT_ ;EEPROM カウンタ積算(+1)処理
;-------------------------------;カウンタ積算(+1) 処理
;; WTMSTS,3 ;SW1-ON +1 指示/済
;LOOP_0 BTFSS WTMSTS,3
; GOTO LOOP_1 ;処理済
;; ;未処理
; BCF WTMSTS,3 ;指示Flag (済)
; MOVLW 0x0A ;"SW-ON" H [0A]番地
; MOVWF WEEPAD
; CALL EEPCT_ ;EEPROM カウンタ積算(+1)処理
;-------------------------------;カウンタ積算(+1) 処理
;; DE 0x00 ;0x0E:wakeup (H)
;; WTMSTS,5 ;wakeup +1 指示/済
;LOOP_1 BTFSS WTMSTS,5
; GOTO LOOP_2 ;処理済
;; ;未処理
; BCF WTMSTS,5 ;指示Flag (済)
; MOVLW 0x0E ;"wakeup" H [0E]番地
; MOVWF WEEPAD
; CALL EEPCT_ ;EEPROM カウンタ積算(+1)処理
;-------------------------------;
LOOP_2 BTFSC WTRSTS,2 ;RX Over run or Frameing Err ?
GOTO EPOERR
;
BTFSS WTRSTS,1 ;RX Done ?
GOTO LOOP
;
CALL RXDTS_ ;Receve data
;
BTFSS WTRSTS,6 ;Receve complete ?
GOTO LOOP ;no
; ;yes
CALL INPUT ;Input Command Analyze
GOTO CLEARW
;
EPOERR BCF WTRSTS,2 ;Over run or Frameing Err(flag reset)
;
MOVLW "?" ;"?"
CALL TXDT1_
CALL CR_LF_ ;[CR][LF]
;
CLEARW CLRF WRXD00
CLRF WRXD01
CLRF WRXD02
CLRF WRXD03
CLRF WRXD04
; CLRF WRXD05
; CLRF WRXD06
; CLRF WRXD07
CLRF WRDTCT
;
MOVLW B'00110000' ;Init Data
ANDWF WTRSTS,F
;
GOTO LOOP
;
;■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
;---------------------------------------------------------------
;PWM Duty Set
;---------------------------------------------------------------
PWM100 ;100%(常時ON, OFF時間無し)
; ;100% Preset Data: 0x01F0
; ; 0000000111110000 0x01F0
; ;CCPR1L 01111100 0x7C
; ;CCP1CO<4:5> 00
BCF CCP1CON,4 ; PWM duty cycle LS bits
BCF CCP1CON,5
;
MOVLW 0x60 ;PWM100 の EEPROM番地
BSF STATUS,RP0 ;BANK=1
MOVWF EEADR
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
;
MOVWF CCPR1L ;CCPR1L PWM duty cycle MS bits
;
; MOVLW 125 ;0x7D
; MOVWF CCPR1L ;CCPR1L PWM duty cycle MS BYTE
RETURN
PWMDTS
;-------------------------------; CCPR1L preset [2014/06/26]
; DE 0x00 ;0x60:PWMPWH PWM Width
; DE 0x7C ;0x61:PWMPWL 100% 50% 40% 30% 25% 20% 16% 10%
; ; 1F0 F8 C7 95 7C 64 50 32
;
MOVLW 0x61 ;PWMPWL
BSF STATUS,RP0 ;BANK=1
MOVWF EEADR
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
;
MOVWF CCPR1L ;CCPR1L PWM duty cycle MS bits
BCF STATUS,C
RRF CCPR1L,F
BTFSC STATUS,C
BSF CCP1CON,4 ; PWM duty cycle LS bit
;
BCF STATUS,C
RRF CCPR1L,F
BTFSC STATUS,C
BSF CCP1CON,5 ; PWM duty cycle LS bit
;
RETURN
;---------------------------------------------------------------
; Control Pilot 状態判定
;---------------------------------------------------------------
; ; 判定閾値にヒステリシスを持たせた判定
; ;
;
CHKCP
;WCNTPL EQU 0x2F ;Control Pilot 判定結果
; 判定閾値(EEPROM)
; WCNTPL,0 ;未接続(>10.5V) CNTPCH(0x62):CNTPCL(0x63)
; WCNTPL,1 ;接続(9V) CNTPHH(0x64):CNTPHL(0x65)
; WCNTPL,2 ;充電(6V) CNTPLH(0x66):CNTPLL(0x67)
; WCNTPL,3 ;換気(3V) CNTPVH(0x68):CNTPVL(0x69)
; WCNTPL,4 ;異常(<1.5V
; CNTPHY(0x6A) 判定幅(Hysteresis)
;
; ;「未接続(>10.5V)」状態のチェック
MOVF CNTPCH,W ;判定閾値 H,L (10bit)
MOVWF WCOMPH
MOVF CNTPCL,W
MOVWF WCOMPL
MOVF CNTPHY,W ;ヒステリシス幅(8bit)を加算
ADDWF WCOMPL,F
BTFSC STATUS,C
INCF WCOMPH,F
CALL CHKCPH ;ヒステリシス上側の判定
BTFSC STATUS,C
BSF WCNTPL,0 ;「ヒステリシス上側」より大きい時:1
;
MOVF CNTPCH,W ;判定閾値 H,L (10bit)
MOVWF WCOMPH
MOVF CNTPCL,W
MOVWF WCOMPL
MOVF CNTPHY,W
SUBWF WCOMPL,F ;ヒステリシス幅(8bit)を減算
BTFSS STATUS,C
DECF WCOMPH,F
CALL CHKCPL ;ヒステリシス下側の判定
BTFSC STATUS,C
BCF WCNTPL,0 ;「ヒステリシス下側」より大き小さい時:0
;
;-------------------------------
;
MOVF CNTPHH,W ;接続(9V)
MOVWF WCOMPH
MOVF CNTPHL,W
MOVWF WCOMPL
MOVF CNTPHY,W
ADDWF WCOMPL,F
BTFSC STATUS,C
INCF WCOMPH,F
CALL CHKCPH
BTFSC STATUS,C
BSF WCNTPL,1
;
MOVF CNTPHH,W
MOVWF WCOMPH
MOVF CNTPHL,W
MOVWF WCOMPL
MOVF CNTPHY,W
SUBWF WCOMPL,F
BTFSS STATUS,C
DECF WCOMPH,F
CALL CHKCPL
BTFSC STATUS,C
BCF WCNTPL,1
;
;-------------------------------
;
MOVF CNTPLH,W ;充電(6V)
MOVWF WCOMPH
MOVF CNTPLL,W
MOVWF WCOMPL
MOVF CNTPHY,W
ADDWF WCOMPL,F
BTFSC STATUS,C
INCF WCOMPH,F
CALL CHKCPH
BTFSC STATUS,C
BSF WCNTPL,2
;
MOVF CNTPLH,W
MOVWF WCOMPH
MOVF CNTPLL,W
MOVWF WCOMPL
MOVF CNTPHY,W
SUBWF WCOMPL,F
BTFSS STATUS,C
DECF WCOMPH,F
CALL CHKCPL
BTFSC STATUS,C
BCF WCNTPL,2
;
;-------------------------------
;
MOVF CNTPVH,W ;換気(3V)
MOVWF WCOMPH
MOVF CNTPVL,W
MOVWF WCOMPL
MOVF CNTPHY,W
ADDWF WCOMPL,F
BTFSC STATUS,C
INCF WCOMPH,F
CALL CHKCPH
BTFSC STATUS,C
BSF WCNTPL,3
;
MOVF CNTPVH,W
MOVWF WCOMPH
MOVF CNTPVL,W
MOVWF WCOMPL
MOVF CNTPHY,W
SUBWF WCOMPL,F
BTFSS STATUS,C
DECF WCOMPH,F
CALL CHKCPL
BTFSC STATUS,C
BCF WCNTPL,3
;
;-------------------------------
BCF WTXMST,4 ;判定完了(判定指示フラグOFF)
RETURN
;
;
;---------------------------------------------------------------
; ;上限値判定 A/D平均値と判定閾値との比較(2BYTE比較)
; ;判定< [A/D] : C=1
; ;判定>=[A/D] : C=0
;
CHKCPH MOVF WADAVH,W ;判定-A/D
SUBWF WCOMPH,W ;(f)- (w)
BTFSS STATUS,C
GOTO CHKCP1 ;(f)< (w) -->1
; ;(f)>=(w)
BTFSS STATUS,Z
GOTO CHKCP0 ; > -->0
; ; =
MOVF WADAVL,W
SUBWF WCOMPL,W ;(f)- (w)
BTFSS STATUS,C
GOTO CHKCP1 ;(f)< (w) -->1
GOTO CHKCP0 ;(f)>=(w) -->0
;---------------------------------------------------------------
; ;下限値判定 A/D平均値と判定閾値との比較(2BYTE比較)
; ;判定>=[A/D] : C=1
; ;判定< [A/D] : C=0
;
CHKCPL MOVF WADAVH,W ;判定-A/D
SUBWF WCOMPH,W ;(f)- (w)
BTFSS STATUS,C
GOTO CHKCP0 ;(f)< (w) -->0
; ;(f)>=(w)
BTFSS STATUS,Z
GOTO CHKCP1 ; > -->1
; ; =
MOVF WADAVL,W
SUBWF WCOMPL,W ;(f)- (w)
BTFSS STATUS,C
GOTO CHKCP0 ;(f)< (w) -->0
;***** GOTO CHKCP1 ;(f)>=(w) -->1
;
;-------------------------------;結果のセットと戻り
CHKCP1
BSF STATUS,C ;C=1
RETURN
CHKCP0
BCF STATUS,C ;C=0
RETURN
;
;===============================================================
; SUBROUTINE:INPUT:Input Command Analyze
;===============================================================
INPUT BCF WTRSTS,6 ;RX Complete Flag
;
MOVF WRXD00,W
SUBLW 0x0D ;"CR" ?
BTFSC STATUS,Z
RETURN
;
MOVF WRXD00,W
SUBLW "?"
BTFSC STATUS,Z
GOTO HELP_ ;"?":Help command
;
MOVF WRXD01,W
SUBLW 0x0D ;□"CR" ?
BTFSC STATUS,Z
;****** GOTO DS_EEE ;Error
GOTO INP_50 ;EX command
;
MOVF WRXD02,W
SUBLW 0x0D ;□□"CR" ?
BTFSC STATUS,Z
GOTO DS_EE1 ;"CR":EEPROM One data Display
;
MOVF WRXD03,W
SUBLW 0x0D ;□□□"CR" ?
BTFSS STATUS,Z
GOTO INP_20 ;□□□□[?]
;
MOVF WRXD00,W
SUBLW "R"
BTFSC STATUS,Z
GOTO DS_RM1 ;"R"aa[CR]
;
MOVF WRXD00,W
SUBLW "r"
BTFSC STATUS,Z
GOTO DS_RM1 ;"r"aa[CR]
;
GOTO DS_EEE ;Error
;
;---------------------------------------------------------------
INP_20 MOVF WRXD04,W ;Parameter Set
SUBLW 0x0D ;□□□□"CR" ?
BTFSC STATUS,Z
GOTO ST_EE1 ;"CR":EEPROM One data Set
;
GOTO DS_EEE ;Error
;****** RETURN
;---------------------------------------------------------------
INP_50 MOVF WRXD00,W ;EX command
SUBLW "R"
BTFSC STATUS,Z
GOTO DS_RAM ;"R":RAM Display command
MOVF WRXD00,W
SUBLW "r"
BTFSC STATUS,Z
GOTO DS_RAM
;
MOVF WRXD00,W
SUBLW "E"
BTFSC STATUS,Z
GOTO DS_EEP ;"E":EEPROM Display command
MOVF WRXD00,W
SUBLW "e"
BTFSC STATUS,Z
GOTO DS_EEP
;
MOVF WRXD00,W
SUBLW "D"
BTFSC STATUS,Z
GOTO DUMP_ ;"D":EEPROM DUMP command
MOVF WRXD00,W
SUBLW "d"
BTFSC STATUS,Z
GOTO DUMP_
; ;---------------
MOVF WRXD00,W
SUBLW "t" ;"t":TX A/D Data Flag ON/OFF
BTFSC STATUS,Z
GOTO INP_60
;
MOVF WRXD00,W
SUBLW "T" ;"T":TX A/D Data Flag ON/OFF
BTFSC STATUS,Z
GOTO INP_60
; ;---------------
MOVF WRXD00,W
SUBLW "l" ;"l":GP5 Forth OFF
BTFSC STATUS,Z
GOTO INP_62
;
MOVF WRXD00,W
SUBLW "L" ;"L":GP5 Forth ON
BTFSC STATUS,Z
GOTO INP_63
;
GOTO DS_EEE ;Error
;
INP_60 ;TX A/D Data Flag ON/OFF
BTFSC WTXMST,3
GOTO INP_61
BSF WTXMST,3
RETURN
INP_61
BCF WTXMST,3
RETURN
;-------------------------------;(CMD-ON)回数カウンタ積算(+1) 処理
;; WTMSTS,4 ;CMD-ON +1 指示/済
; MOVLW 0x0C ;起動回数 H [0C]番地
; MOVWF WEEPAD
; CALL EEPCT_ ;EEPROM カウンタ積算(+1)処理
;-------------------------------;
; RETURN
INP_62
; BTFSS WCONTR,6
; GOTO INP_69 ;コマンド無効
; ;コマンド有効
; CALL CR_LF_
; BSF GPIO,5 ;LCD Forth OFF (GP5:1)
RETURN
INP_63
; BTFSS WCONTR,6
; GOTO INP_69 ;コマンド無効
; ;コマンド有効
; CALL CR_LF_
; BCF GPIO,5 ;LCD Forth ON (GP5:0)
RETURN
INP_69 ;コマンド無効
MOVLW "?" ;"?"
CALL TXDT1_
CALL CR_LF_ ;[CR][LF]
RETURN
;
;===============================================================
; "?" HELP Command Table
;===============================================================
HELP_ MOVLW "V" ;"Vnn.nn "
CALL TXDT1_
;
MOVLW 0x70
BSF STATUS,RP0 ;BANK=1
MOVWF EEADR
BCF STATUS,RP0 ;BANK=0
CALL TXEEX2 ;vv
MOVLW "."
CALL TXDT1_
CALL TXEEX2 ;vv
CALL TX_SPA
; ;------ "yyyy/mm/dd"
CALL TXEEX2 ;YY
CALL TXEEX2 ;YY
MOVLW "/"
CALL TXDT1_
CALL TXEEX2 ;MM
MOVLW "/"
CALL TXDT1_
CALL TXEEX2 ;DD
;
; CALL TX_SPA
;
MOVLW 10
MOVWF W_DTCT
;
HELP_1 CALL TXEECH
DECFSZ W_DTCT,F
GOTO HELP_1
CALL CR_LF_
RETURN
;
TXEEX2 BSF STATUS,RP0 ;BANK=1
BSF EECON1,0 ;RD
MOVF EEDATA,W
INCF EEADR,F
BCF STATUS,RP0 ;BANK=0
CALL TXHEX2
RETURN
;
TXEECH BSF STATUS,RP0 ;BANK=1
BSF EECON1,0 ;RD
MOVF EEDATA,W
INCF EEADR,F
BCF STATUS,RP0 ;BANK=0
CALL TXDT1_
RETURN
;===============================================================
; Dump title
; ' 0 1 2 3 4 5 6 7 8 9 A B C D E F'[CR]
;===============================================================
DMPTTL CLRF W_CT_2
MOVLW 0x10
MOVWF W_CT_1
DMPTL0 CALL TX_SPA
CALL TX_SPA
MOVF W_CT_2,W
CALL TXHEXL
INCF W_CT_2,F
DECFSZ W_CT_1,F
GOTO DMPTL0
CALL CR_LF_
RETURN
;
;===============================================================
; EEPROM Dump Command
;===============================================================
DS_EEP MOVLW "E"
CALL TXDT1_
CALL DMPTTL
;
CLRF WEEPAD ;EEPROM Address Set
MOVLW 0x10 ;16*16=256 BYTE
MOVWF W_CT_2
;
E_L_2 MOVLW 0x10
MOVWF W_CT_1
SWAPF WEEPAD,W
CALL TXHEXL
MOVF WEEPAD,W
CALL TXHEXL
E_L_1 CALL TX_SPA
CALL EEPRD_
;
SWAPF WEEPDT,W ;EEPROM Data
CALL TXHEXL
MOVF WEEPDT,W ;EEPROM Data
CALL TXHEXL
INCF WEEPAD,F ;EEPROM Address Inc.
DECFSZ W_CT_1,F
GOTO E_L_1
CALL CR_LF_
;-------------------------------;Cancel check
BTFSC WTRSTS,3 ;Cancel Flag
GOTO CTRL_C
;-------------------------------;
DECFSZ W_CT_2,F
GOTO E_L_2
;
RETURN
;
;---------------------------------------------------------------
; Cancel return
;---------------------------------------------------------------
CTRLC2 MOVF W_FSR2,W
MOVWF FSR ;Restor FSR
;
CTRL_C
; CALL CR_LF_
MOVLW "*" ;abort
CALL TXDT1_
CALL CR_LF_
;
BCF WTRSTS,3 ;Cancel Flag
RETURN
;
;===============================================================
; RAM Dump Command
;===============================================================
DS_RAM MOVF FSR,W
MOVWF W_FSR2 ;Save FSR
;
MOVLW "R"
CALL TXDT1_
CALL DMPTTL
;
MOVLW 0 ;0x00-0x5F
MOVWF FSR
MOVLW 0x08 ;8*16=128 BYTE
MOVWF W_CT_2
CALL RB_L_2
;-------------------------------;Cancel check
BTFSC WTRSTS,3 ;Cancel Flag
GOTO CTRLC2
;-------------------------------;
;
MOVLW 0x80 ;0x80-0x9F
MOVWF FSR
MOVLW 0x08 ;8*16=128 BYTE
MOVWF W_CT_2
CALL RB_L_2
;-------------------------------;Cancel check
BTFSC WTRSTS,3 ;Cancel Flag
GOTO CTRLC2
;-------------------------------;
;
MOVF W_FSR2,W
MOVWF FSR ;Restor FSR
RETURN
;---------------------------------------------------------------
RB_L_2 MOVLW 0x10
MOVWF W_CT_1
SWAPF FSR,W
CALL TXHEXL
MOVF FSR,W
CALL TXHEXL
RB_L_1 CALL TX_SPA
SWAPF INDF,W
CALL TXHEXL
MOVF INDF,W
CALL TXHEXL
INCF FSR,F
DECFSZ W_CT_1,F
GOTO RB_L_1
CALL CR_LF_
;-------------------------------;Cancel check
BTFSC WTRSTS,3 ;Cancel Flag
RETURN
;-------------------------------;
DECFSZ W_CT_2,F
GOTO RB_L_2
RETURN
;
;---------------------------------------------------------------
; DS_RM1 ;"Raa"[CR]
;---------------------------------------------------------------
DS_RM1 MOVF WRXD01,W
MOVWF W_TMPH
MOVF WRXD02,W
MOVWF W_TMPL
CALL CHKHEX ;(W)<-- HEX <--(W_TMPH:W_TMPL)
BTFSC STATUS,C
GOTO DS_EEE ;C:1 Error return
; ;C:0 Nomal return
MOVWF WEEPAD ;EEPROM ADDRESS
;
MOVF FSR,W
MOVWF W_FSR2 ;Save FSR
MOVF WEEPAD,W
MOVWF FSR
;
MOVLW "R" ;"Raadd"[CR][LF]
;
CALL TXDT1_
SWAPF FSR,W
CALL TXHEXL
MOVF FSR,W
CALL TXHEXL
;
SWAPF INDF,W
CALL TXHEXL
MOVF INDF,W
CALL TXHEXL
;
CALL CR_LF_
;
MOVF W_FSR2,W
MOVWF FSR ;Restor FSR
RETURN
;
;---------------------------------------------------------------
; DUMP_ Command
;---------------------------------------------------------------
DUMP_ MOVLW 0x00
MOVWF WEEPAD ;EEPROM ADDRESS
CALL EEPRD_ ;EEPROM READ
MOVLW 0x00 ;EEPROM DATA(DATA COUNT)
MOVWF W_DTCT ;0x00 256Byte
;
CALL CR_LF_ ;[CR][LF]
;
DUMP_1 CALL EEPRD_ ;EEPROM READ
SWAPF WEEPAD,W ;EEPROM ADDRESS
CALL TXHEXL ;(W)Lo Nibble-->ASCII(HEX)&TX
MOVF WEEPAD,W ;EEPROM ADDRESS
CALL TXHEXL
;
SWAPF WEEPDT,W ;EEPROM DATA
CALL TXHEXL
MOVF WEEPDT,W ;EEPROM DATA
CALL TXHEXL
;
CALL CR_LF_ ;[CR][LF]
;
;-------------------------------;Cancel check
BTFSC WTRSTS,3 ;Cancel Flag
GOTO CTRL_C
;-------------------------------;
INCF WEEPAD,F
DECFSZ W_DTCT,F ;END CHECK
GOTO DUMP_1
;
RETURN
;
;---------------------------------------------------------------
; DS_EE1
;---------------------------------------------------------------
DS_EE1 MOVF WRXD00,W
MOVWF W_TMPH
MOVF WRXD01,W
MOVWF W_TMPL
CALL CHKHEX ;(W)<-- HEX <--(W_TMPH:W_TMPL)
BTFSC STATUS,C
GOTO DS_EEE ;C:1 Error return
; ;C:0 Nomal return
MOVWF WEEPAD ;EEPROM ADDRESS
CALL EEPRD_ ;EEPROM READ
;
SWAPF WEEPAD,W ;EEPROM ADDRESS
CALL TXHEXL ;(W)Lo Nibble-->ASCII(HEX)&TX
MOVF WEEPAD,W ;EEPROM ADDRESS
CALL TXHEXL
;
SWAPF WEEPDT,W ;EEPROM DATA
CALL TXHEXL
MOVF WEEPDT,W ;EEPROM DATA
CALL TXHEXL
;
CALL CR_LF_ ;[CR][LF]
RETURN
;
DS_EEE MOVLW "?" ;"?"
CALL TXDT1_
CALL CR_LF_ ;[CR][LF]
RETURN
;
;---------------------------------------------------------------
; ST_EE1
;---------------------------------------------------------------
ST_EE1 MOVF WRXD00,W
MOVWF W_TMPH
MOVF WRXD01,W
MOVWF W_TMPL
CALL CHKHEX ;(W)<-- HEX <--(W_TMPH:W_TMPL)
BTFSC STATUS,C
GOTO DS_EEE ;C:1 Error return
; ;C:0 Nomal return
MOVWF WEEPAD ;EEPROM ADDRESS
;
MOVF WRXD02,W
MOVWF W_TMPH
MOVF WRXD03,W
MOVWF W_TMPL
CALL CHKHEX ;(W)<-- HEX <--(W_TMPH:W_TMPL)
BTFSC STATUS,C
GOTO DS_EEE ;C:1 Error return
; ;C:0 Nomal return
MOVWF WEEPDT ;EEPROM DATA
;
CALL EEPWR_
;
CALL CR_LF_ ;[CR][LF]
RETURN
;
GOTO DS_EEE ;C:1 Error return
;
;===============================================================
; CHKHEX (W) <-- HEX <-- (W_TMPH:W_TMPL)
; C:0 Nomal return, C:1 Error return
;===============================================================
CHKHEX MOVF W_TMPH,W ;h.
ANDLW 0x7F
MOVWF W_TMPH
;
SUBLW 0x60
BTFSC STATUS,C
GOTO CHKXH1 ;C=1 (W)=<60 : next
; ;C=0 (W)> 60
MOVF W_TMPH,W
SUBLW 0x66
BTFSS STATUS,C
GOTO CHKHX9 ;C=0 (W)> 66 : Error
; ;C=1 (W)=<66 : "a"..."f"
MOVLW 0x20
SUBWF W_TMPH,F ; "A"..."F" <-- "a"..."f"
;
CHKXH1 MOVF W_TMPH,W
SUBLW 0x2F
BTFSC STATUS,C
GOTO CHKHX9 ;C=1 (W)=<2F : Error
; ;C=0 (W)> 2F
MOVF W_TMPH,W
SUBLW 0x39
BTFSC STATUS,C
GOTO CHKXH2 ;C=1 (W)=<39 : "0"..."9"
; ;C=0 (W)> 39
MOVF W_TMPH,W
SUBLW 0x46
BTFSS STATUS,C
GOTO CHKHX9 ;C=0 (W)> 46 : Error
; ;C=1 (W)=<46
MOVF W_TMPH,W
SUBLW 0x40
BTFSC STATUS,C
GOTO CHKHX9 ;C=1 (W)=<40 : Error
; ;C=0 (W)> 40 : "A"..."F"
MOVF W_TMPH,W
ANDLW 0x0F
ADDLW 9
MOVWF W_TMPH
;
CHKXH2 MOVF W_TMPH,W
ANDLW 0x0F
MOVWF W_TMPH
;-------------------------------
MOVF W_TMPL,W ;h.
ANDLW 0x7F
MOVWF W_TMPL
;
SUBLW 0x60
BTFSC STATUS,C
GOTO CHKXL1 ;C=1 (W)=<60 : next
; ;C=0 (W)> 60
MOVF W_TMPL,W
SUBLW 0x66
BTFSS STATUS,C
GOTO CHKHX9 ;C=0 (W)> 66 : Error
; ;C=1 (W)=<66 : "a"..."f"
MOVLW 0x20
SUBWF W_TMPL,F ; "A"..."F" <-- "a"..."f"
;
CHKXL1 MOVF W_TMPL,W
SUBLW 0x2F
BTFSC STATUS,C
GOTO CHKHX9 ;C=1 (W)=<2F : Error
; ;C=0 (W)> 2F
MOVF W_TMPL,W
SUBLW 0x39
BTFSC STATUS,C
GOTO CHKXL2 ;C=1 (W)=<39 : "0"..."9"
; ;C=0 (W)> 39
MOVF W_TMPL,W
SUBLW 0x46
BTFSS STATUS,C
GOTO CHKHX9 ;C=0 (W)> 46 : Error
; ;C=1 (W)=<46
MOVF W_TMPL,W
SUBLW 0x40
BTFSC STATUS,C
GOTO CHKHX9 ;C=1 (W)=<40 : Error
; ;C=0 (W)> 40 : "A"..."F"
MOVF W_TMPL,W
ANDLW 0x0F
ADDLW 9
MOVWF W_TMPL
;
CHKXL2 MOVF W_TMPL,W
ANDLW 0x0F
MOVWF W_TMPL
;
SWAPF W_TMPH,W
IORWF W_TMPL,W
BCF STATUS,C ;Nomal return
RETURN
;
CHKHX9 MOVLW 0
BSF STATUS,C ;Error return
RETURN
;
;===============================================================
; RXDTS_:Receve Data Strings
;===============================================================
; WRXD00: Data buffer BeGin Address
; WRDTCT: Data Pointer
; "CR" 0x0D: Delimiter
;---------------------------------------------------------------
RXDTS_ MOVLW WRXD00 ;Data Begin Address
ADDWF WRDTCT,W
MOVWF FSR
;
BCF WTRSTS,1 ;■
MOVF WRXDTB,W ;■
MOVWF INDF ;Store Data
;-------------------------------;[BS]check
ANDLW 0x7F
SUBLW 0x08
BTFSS STATUS,Z ;Receve [BS] ?
GOTO RXDTX0
; ;[BS]
MOVLW 0x08 ;[BS] echo
CALL TXDT1_
MOVLW " " ; " " echo
CALL TXDT1_
MOVLW 0x08 ;[BS] echo
CALL TXDT1_
;
MOVF WRDTCT,F
BTFSS STATUS,Z
DECF WRDTCT,F ;not 0
GOTO RXDTS8
;-------------------------------;Echoback
RXDTX0 MOVF WRDTCT,W
SUBLW 4
BTFSS STATUS,Z
GOTO RXDTX1 ;4 >< WRDTCT
; ;4 = WRDTCT
MOVLW 0x08 ;[BS] echo
CALL TXDT1_
RXDTX1 MOVF INDF,W
CALL TXDT1_
;-------------------------------;[ETX][CAN]check
MOVF INDF,W
ANDLW 0x7F
SUBLW 0x03
BTFSC STATUS,Z
GOTO RXDTC_ ;Receve "ETX"(Ctrl-C)
;
MOVF INDF,W
ANDLW 0x7F
SUBLW 0x18
BTFSC STATUS,Z
GOTO RXDTC_ ;Receve "CAN"(Ctrl-X)
;-------------------------------;[CR]check
MOVF INDF,W
ANDLW 0x7F
SUBLW 0x0D
BTFSC STATUS,Z
GOTO RXDTS9 ;Receve "CR"
; ; not"CR"
MOVF WRDTCT,W
SUBLW 3 ;3 - (W)?
BTFSC STATUS,C
INCF WRDTCT,F ;3 >=(W)
GOTO RXDTS8 ;3 < (W) Data over count
;
;-------------------------------;Cancel Prosess
RXDTC_ CALL CR_LF_ ;[CR][LF]
;
CLRF WRXD00 ;clear work & flag
CLRF WRXD01
CLRF WRXD02
CLRF WRXD03
CLRF WRXD04
;
CLRF WRDTCT
BCF WTRSTS,6 ;RX Complete
BCF WTRSTS,7 ;RX on the way
GOTO RXDTSE
;
RXDTS8
; BCF WTRSTS,6
BSF WTRSTS,7 ;RX (On the way)
GOTO RXDTSE
;
RXDTS9 BSF WTRSTS,6 ;RX Complete !
BCF WTRSTS,7
CLRF WRDTCT
;
RXDTSE RETURN
;
;===============================================================
; TXHEX2: (W) --> 2 ASCII(HEX) & Transmit
; TXHEXL: (W)Lo Nibble --> ASCII(HEX) & Transmit
; W(xxxxHHHH) --> "0"..."9","A"..."F"
;===============================================================
TXHEX2 MOVWF WREGHH
SWAPF WREGHH,W
CALL TXHEXL
MOVF WREGHH,W
;
TXHEXL ANDLW 0x0F
IORLW 0x30
MOVWF WREGHX
SUBLW 0x39 ;39-(W)
BTFSC STATUS,C
GOTO TXHEX1 ;"0"..."9"
MOVF WREGHX,W ;"A"..."F"
ADDLW 7
MOVWF WREGHX
TXHEX1 MOVF WREGHX,W
GOTO TXDT1_
;
;===============================================================
; TX_DOT: Transmit "."
;===============================================================
TX_DOT MOVLW 0x2E
GOTO TXDT1_
;===============================================================
; TX_SPA: Transmit " "
;===============================================================
TX_SPA MOVLW 0x20
GOTO TXDT1_
;===============================================================
; CR_LF_: Transmit [CR][LF]
;===============================================================
CR_ MOVLW 0x0D ;CR
GOTO TXDT1_
CR_LF_ MOVLW 0x0D ;CR,LF
CALL TXDT1_
LF_ MOVLW 0x0A ;LF
;===============================================================
; TXDT1_: (W) --> Transmit 1 Chara ---> (RS-232C) ASCII
;===============================================================
TXDT1_ BTFSS WTRSTS,5 ;TX Done ?
GOTO TXDT1_ ;wait for previous chara output
;
MOVWF WTXDT_ ;set data to work
BCF WTRSTS,5 ;TX start
TXDT11 BTFSS WTRSTS,4 ;TX Busy ?
GOTO TXDT11 ;wait for TX start
; CLRWDT
RETURN
;
;===============================================================
; B2_BCD:Binary to Hexadecimal conversion
;===============================================================
; W_BINH:W_BINL --> W_DSX5:W_DS43:W_DS21, counter:W_BITC
;---------------------------------------------------------------
;B2_BCD BCF STATUS,C
; MOVLW .16
; MOVWF W_BITC
; CLRF W_DSX5
; CLRF W_DS43
; CLRF W_DS21
;B2_BC1 RLF W_BINL,F
; RLF W_BINH,F
; RLF W_DS21,F
; RLF W_DS43,F
; RLF W_DSX5,F
; DECFSZ W_BITC,F
; GOTO ADJDEC
;
; RETURN ;Return B2_BCD
;
;ADJDEC MOVLW W_DS21
; MOVWF FSR
; CALL ADJBCD
; MOVLW W_DS43
; MOVWF FSR
; CALL ADJBCD
; MOVLW W_DSX5
; MOVWF FSR
; CALL ADJBCD
; GOTO B2_BC1
;---------------------------------------------------------------
; ADJBCD:Adjust BCD
;---------------------------------------------------------------
;ADJBCD MOVLW 3 ;Adjust BCD
; ADDWF INDF,W
; MOVWF W_BFDT ;Save temp work
; BTFSC W_BFDT,3 ;test if result > 7
; MOVWF INDF
; MOVLW 0x30
; ADDWF INDF,W
; MOVWF W_BFDT ;Save temp work
; BTFSC W_BFDT,7 ;test if result > 7
; MOVWF INDF
; RETURN
;
;===============================================================
; BCD_B2:Hexadecimal to Binary conversion
;===============================================================
; W_DSX5:W_DS43:W_DS21 --> W_BINH:W_BINL, temp:W_TMPH,W_TMPL
;---------------------------------------------------------------
;BCD_B2 CLRF W_BINH
; MOVF W_DSX5,W
; ANDLW 0x0F
; MOVWF W_BINL
; CALL MPY10A ;10a+b
;
; SWAPF W_DS43,W
; CALL MPY10B ;10(10a)+b)
;
; MOVF W_DS43,W
; CALL MPY10B ;10(10(10a)+b)+c)
;
; SWAPF W_DS21,W
; CALL MPY10B ;10(10(10(10a)+b)+c)+d)
;
; MOVF W_DS21,W
; ANDLW 0x0F
; ADDWF W_BINL,F
; BTFSC STATUS,C
; INCF W_BINH,F ;10(10(10(10a)+b)+c)+d)+e
; RETURN
;
;---------------------------------------------------------------
; MULTIPLY BY 10
;---------------------------------------------------------------
;MPY10B ANDLW 0x0F
; ADDWF W_BINL,F
; BTFSC STATUS,C
; INCF W_BINH,F
;
;MPY10A BCF STATUS,C ; *2
; RLF W_BINL,W
; MOVWF W_TMPL
; RLF W_BINH,W
; MOVWF W_TMPH
;
; BCF STATUS,C ; *2
; RLF W_BINL,F
; RLF W_BINH,F
; BCF STATUS,C ; *4
; RLF W_BINL,F
; RLF W_BINH,F
; BCF STATUS,C ; *8
; RLF W_BINL,F
; RLF W_BINH,F
;
; MOVF W_TMPL,W ;N*10 = N*8 + N*2
; ADDWF W_BINL,F
; BTFSC STATUS,C
; INCF W_BINH,F
; MOVF W_TMPH,W
; ADDWF W_BINH,F
; RETURN
;
;===============================================================
; EEPCT_:EEPROM カウンタ積算(+1)処理 (H:WEEPAD,L:WEEPAD+1)
;===============================================================
; (work) WEEPAD, WEEPDT, WEECTL,0(桁上がり指示)
;
EEPCT_ RETURN ;DEBUG [2014/06/24]
;
INCF WEEPAD,F ;(L)
CALL EEPRD_ ;EEPRD_:EEPROM Data ReaD
;
BCF WEECTL,0
MOVLW 1
ADDWF WEEPDT,F
BTFSC STATUS,C
BSF WEECTL,0 ;INC (H)
CALL EEPWR_ ;EEPWR_:EEPROM Data Write
;
BSF STATUS,RP0 ;BANK=1
BTFSC EECON1,1 ;wait for [WR] Write done ?
GOTO $-2
BCF STATUS,RP0 ;BANK=0
;
BTFSS WEECTL,0
RETURN ;桁上がりなし
; ;桁上がり処理 INC (H)
DECF WEEPAD,F ;(H)
CALL EEPRD_ ;EEPRD_:EEPROM Data ReaD
MOVLW 1
ADDWF WEEPDT,F
CALL EEPWR_ ;EEPWR_:EEPROM Data Write
RETURN
;
;===============================================================
; EEPWR_:EEPROM Data Write address:(WEEPAD),data:(WEEPDT)
;===============================================================
EEPWR_
; CLRWDT
BSF STATUS,RP0 ;BANK=1
BTFSC EECON1,1 ;wait for [WR] Write done ?
GOTO $-2
;
MOVF WEEPAD,W
MOVWF EEADR
MOVF WEEPDT,W
MOVWF EEDATA
;
BSF EECON1,2 ;WREN(Enable)
BCF INTCON,GIE ;Disable Interrupt**************
MOVLW 0x55
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BSF EECON1,1 ;WR
BSF INTCON,GIE ;Enable Interrupt***************
;
BCF EECON1,2 ;WREN(Disable)
;
BCF STATUS,RP0 ;BANK=0
;
RETURN
;
;===============================================================
; EEPRD_:EEPROM Data ReaD address:(WEEPAD),data:(WEEPDT)
;===============================================================
EEPRD_ MOVF WEEPAD,W
BSF STATUS,RP0 ;BANK=1
MOVWF EEADR
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
MOVWF WEEPDT
RETURN
;
;---------------------------------------------------------------
; Subroutine: DELY02 0.2S Loop Deley
;---------------------------------------------------------------
;DELY02 MOVLW 250
; MOVWF WDELY1
; MOVLW 200
; MOVWF WDELY2
;
;DELY_L NOP
; DECFSZ WDELY1,F ; 4 uS * 250 = 1 mS
; GOTO DELY_L
; MOVLW 250
; MOVWF WDELY1
;
; CLRWDT
;
; DECFSZ WDELY2,F ; 1 mS * 200 = 200 mS
; GOTO DELY_L
;
; RETURN
;
;-------------------------------;Loop Deley
;DELY1M CLRF W_DTCT
;DELY_L NOP
; NOP
; DECFSZ W_DTCT,F ;約 1 mS
; GOTO DELY_L
; RETURN
;===============================================================
; Subroutine: INIT Initialize
;===============================================================
; Preset Value
;===============================================================
; ;INTCON Initialize
S_INTC EQU B'10100000' ;TMR0 Onry
; |||||||+------ GPIF
; ||||||+------- INTF
; |||||+-------- T0IF TMR0 Over Flow Flag
; ||||+--------- GPIE 0:Disable
; |||+---------- INTE 0;Enable
; ||+----------- T0IE 1:Enable
; |+------------ PEIE 0:Disable
; +------------- GIE 1:Enable
;---------------------------------------------------------------
; ;TMR0 Pre Set Value 256-(T*F/P)=ccc
;S_TMR0 EQU 66 ;0x42 F:4MHz, P:2, T:416uS (256-208)+18=66
;S_TMR0 EQU 59 ;0x3B F:4MHz, P:2, T:416uS (256-208)+11=59
;S_TMR0 EQU 53 ;0x35 実験値(OK範囲:28〜35〜3C)
;---------------------------------------------------------------
; ;TMR0/WDT Control
;S_OPTF EQU B'00001000' ;Pre Scaler=WDT: 1/1
;S_OPTF EQU B'00000000' ;Pre Scaler=TMR0: 1/2 (4MHz) ;◆675
S_OPTF EQU B'00000001' ;Pre Scaler=TMR0: 1/4 (8MHz) ;■■■12F683
;S_OPTF EQU B'00000010' ;Pre Scaler=TMR0: 1/n (Test) ;■■■12F683
; |||||+++------ 1/nn=000:1/1, 001:1/2, 010:1/4
; ||||+--------- Pre Scaler 1:WDT
; |||+---------- T0SE 0:L-->H, H-->L
; ||+----------- T0SC 0:Int Clock
; |+------------ 0=INTEDG:falldown
; +------------- /GPIO Pul Up 0:Enable
;===============================================================
;
;---------------------------------------------------------------
; GPIO/TMR0/WDT Control (Watch Dog Timer 13mS)
;---------------------------------------------------------------
INIT CLRF INTCON
;-------------------------------; Oscillator Control ;■■■12F683
; MOVLW B'01010000' ;2MHz
; MOVLW B'01100000' ;4MHz
MOVLW B'01110000' ;8MHz
; ||||||+------;0:FOSC<2:0>
; |||+++-------;(Osc.Status)
; +++----------;111:IRCF<2:0>
;
BSF STATUS,RP0 ;BANK=1
MOVWF OSCCON ;
BCF STATUS,RP0 ;BANK=0
;---------------------------------------------------------------
;
;-------------------------------; I/O Port
BCF STATUS,RP0
MOVLW B'00101100' ;Init GPIO [2014/06/25]
MOVWF GPIO
MOVLW B'00000111' ;Comp NotUse
MOVWF CMCON0 ;■■■12F683
;■■■675 MOVWF CMCON
;
MOVLW B'00001101' ;GPIO(0:Out 1:In) [2014/06/21]
BSF STATUS,RP0
MOVWF TRISIO ;TRIS GPIO
;
; MOVLW B'00000000' ;WPU (1:Pull-Up)
; MOVWF WPU ;Week Pull Up
;
BCF STATUS,RP0
;-------------------------------; A/D Control
; MOVLW B'00000101'
; MOVLW B'10001001' ; [2010/02/22]
MOVLW B'10000001' ; [2014/06/21]
; || |||+------;1:ADON
; || ||+-------;0:GO/1:DONE
; || ++--------;00:AN0,01:AN1,10:AN2,11:AN3
; |+------------;0:VDD,1:VREF
; +-------------;0:LJst,1:RJst
MOVWF ADCON0
;
BSF STATUS,RP0
; MOVLW B'00110011'
; MOVLW B'01010100' ; [2010/02/22]
MOVLW B'01010001' ;AN0: [2014/06/21]
; |||++++------;ANS3:0 1:AN, 0:DI/O
; +++----------;ADCS 101=Fosc/16(8MHz 2.0uS)
MOVWF ANSEL
;
;-------------------------------; TMR0, WDT Control
; BSF STATUS,RP0
MOVLW S_OPTF ;TMR0 Pre Scaler / WDT Initialize
MOVWF OPTREG ;OPTION Register
BCF STATUS,RP0
;-------------------------------; Timer count work preset
;WT_02S EQU 0x27 ;Timer count 20mS
;WT_SEC EQU 0x28 ; // // 1 Sec
;WT010S EQU 0x29 ; // // 100mS [2014/06/26]
MOVLW 48
MOVWF WT_02S
MOVLW 50
MOVWF WT_SEC
; MOVLW 5 ; [2014/06/26]
; MOVWF WT010S ; [2014/06/26]
; MOVLW 60
; MOVWF WT_MIN
; MOVLW 60
; MOVWF WT_HUR
;
;---------------------------------------------------------------
; CCP[PWM mode] の設定 1kHz duty cycle 25%
;-------------------------------; PR2 preset [2014/06/21]
MOVLW 124 ;0x7C
BSF STATUS,RP0
MOVWF PR2 ;Period Register
BCF STATUS,RP0
;
;-------------------------------; CCP1CON preset [2014/06/21]
MOVLW B'00001110' ;CCPM<3:0> CCP Mode Select
; ||++++------; 110x:PWM mode active-high
; ||++++------; 111x:PWM mode active-low
; ++----------;DC1B<1:0> PWM Duty Cycle LS bits
MOVWF CCP1CON ;CCP1 Control
;
;-------------------------------; CCPR1L preset [2014/06/21]
;; DE 0x00 ;0x60:PWMPWH PWM Width
;; DE 0x7C ;0x61:PWMPWL 100% 50% 40% 30% 25% 20% 16% 10%
;; ; 1F0 F8 C7 95 7C 64 50 32
;;
;; ;100% Preset Data: 0x01F0
;; ; 0000000111110000 0x01F0
;; ;CCPR1L 01111100 0x7C
;; ;CCP1CO<4:5> 00
;
; MOVLW 0x61 ;
; BSF STATUS,RP0 ;BANK=1
; MOVWF EEADR
; BSF EECON1,0 ;RD
; MOVF EEDATA,W
; BCF STATUS,RP0 ;BANK=0
;
; MOVWF CCPR1L ;CCPR1L PWM duty cycle MS BYTE
; BCF STATUS,C
; RRF CCPR1L,F
; BTFSC STATUS,C
; BSF CCP1CON,4 ;PWM duty cycle MS bits
;
; BCF STATUS,C
; RRF CCPR1L,F
; BTFSC STATUS,C
; BSF CCP1CON,5 ;PWM duty cycle MS bits
;
;
BCF CCP1CON,4 ; PWM duty cycle LS bits
BCF CCP1CON,5
MOVLW 0x60 ;PWM100
BSF STATUS,RP0 ;BANK=1
MOVWF EEADR
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
;
MOVWF CCPR1L ;CCPR1L PWM duty cycle MS bits
;
; MOVLW 125 ;0x7D
; MOVWF CCPR1L ;CCPR1L PWM duty cycle MS BYTE
;
;-------------------------------; T2CON preset [2014/06/21]
MOVLW B'00000110' ; Prescaler
; |||||++------;T2CKPS:1:0 00:1/1 01:1/4 1x:1/16
; ||||+--------;TMR2ON 1:ON 0:OFF
; ++++---------;Postscaler 0000:1/1 1111:1/16
MOVWF T2CON ;TMR2 Control
;
MOVLW B'00001001' ;GPIO(1:In 0:Out) [2014/06/21]
BSF STATUS,RP0
MOVWF TRISIO ;TRIS GPIO
BCF STATUS,RP0
;
; BCF GPIO,5 ;LED:ON [DEBUG]2014/06/22
; BSF GPIO,5 ;LED:OFF [DEBUG]2014/06/22
;
;
;---------------------------------------------------------------
; Preset From EEPROM Data
;---------------------------------------------------------------
;CNTPCH EQU 0x3C ;0x62 未接続(>10.5V)
;CNTPCL EQU 0x3D ;0x63
;CNTPHH EQU 0x3E ;0x64 接続(9V)
;CNTPHL EQU 0x3F ;0x65
;CNTPLH EQU 0x40 ;0x66 充電(6V)
;CNTPLL EQU 0x41 ;0x67
;CNTPVH EQU 0x42 ;0x68 換気(3V)
;CNTPVL EQU 0x43 ;0x69 異常(<1.5V)
;CNTPHY EQU 0x44 ;0x6A 判定幅(Hysteresis)
;
;_DELAY EQU 0x55 ;0x6B:Relay On Delay(n*20mS後にPWM) 0x32=50:1Sec■
;_DTYCT EQU 0x57 ;0x6C:Relay PWM(ON:0.4mS, OFF:n*0.4mS) 0x02:33% ■
;
MOVLW 0x62 ;0x62 未接続(>10.5V)
BSF STATUS,RP0 ;BANK=1
MOVWF EEADR
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
MOVWF CNTPCH
;
BSF STATUS,RP0 ;BANK=1
INCF EEADR,F
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
MOVWF CNTPCL
;
BSF STATUS,RP0 ;BANK=1
INCF EEADR,F ;0x64 接続(9V)
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
MOVWF CNTPHH
;
BSF STATUS,RP0 ;BANK=1
INCF EEADR,F
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
MOVWF CNTPHL
;
BSF STATUS,RP0 ;BANK=1
INCF EEADR,F ;0x66 充電(6V)
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
MOVWF CNTPLH
;
BSF STATUS,RP0 ;BANK=1
INCF EEADR,F
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
MOVWF CNTPLL
;
BSF STATUS,RP0 ;BANK=1
INCF EEADR,F ;0x68 換気(3V)
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
MOVWF CNTPVH
;
BSF STATUS,RP0 ;BANK=1
INCF EEADR,F ;0x69 異常(<1.5V)
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
MOVWF CNTPVL
;
BSF STATUS,RP0 ;BANK=1
INCF EEADR,F ;0x6A 判定幅(Hysteresis)
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
MOVWF CNTPHY
;
BSF STATUS,RP0 ;BANK=1
INCF EEADR,F ;0x6B:Relay On Delay(n*20mS後にPWM)
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
MOVWF _DELAY
;
BSF STATUS,RP0 ;BANK=1
INCF EEADR,F ;x6C:Relay PWM(ON:0.4mS, OFF:n*0.4mS)
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
MOVWF _DTYCT
;
;---------------------------------------------------------------
DE 0x64 ;0x50:T1111T EQU 0X46;"1111" 周期
DE 0x01 ;0x51:T1111D EQU 0X47;"1111" デューティ
DE 0x32 ;0x52:T1110T EQU 0X48;"1110" 周期
DE 0x16 ;0x53:T1110D EQU 0X49;"1110" デューティ
DE 0x32 ;0x54:T1100T EQU 0X4A;"1100" 周期
DE 0x32 ;0x55:T1100D EQU 0X4B;"1100" デューティ
DE 0x32 ;0x56:T1000T EQU 0X4C;"1000" 周期
DE 0x2D ;0x57:T1000D EQU 0X4D;"1000" デューティ
DE 0x0A ;0x58:T0000T EQU 0X4E;"0000" 周期
DE 0x05 ;0x59:T0000D EQU 0X4F;"0000" デューティ
;
MOVLW 0x50 ;
BSF STATUS,RP0 ;BANK=1
MOVWF EEADR ;0x50
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
MOVWF T1111T
;
BSF STATUS,RP0 ;BANK=1
INCF EEADR,F ;0x51
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
MOVWF T1111D
;
BSF STATUS,RP0 ;BANK=1
INCF EEADR,F ;0x52
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
MOVWF T1110T
;
BSF STATUS,RP0 ;BANK=1
INCF EEADR,F ;0x53
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
MOVWF T1110D
;
BSF STATUS,RP0 ;BANK=1
INCF EEADR,F ;0x54
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
MOVWF T1100T
;
BSF STATUS,RP0 ;BANK=1
INCF EEADR,F ;0x55
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
MOVWF T1100D
;
BSF STATUS,RP0 ;BANK=1
INCF EEADR,F ;0x56
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
MOVWF T1000T
;
BSF STATUS,RP0 ;BANK=1
INCF EEADR,F ;0x57
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
MOVWF T1000D
;
BSF STATUS,RP0 ;BANK=1
INCF EEADR,F ;0x58
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
MOVWF T0000T
;
BSF STATUS,RP0 ;BANK=1
INCF EEADR,F ;0x59
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
MOVWF T0000D
;
; ;0x5F:_CHGDL 充電リレー オンディレー時間 ■2014/07/19■
MOVLW 0x5F ;
BSF STATUS,RP0 ;BANK=1
MOVWF EEADR
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
;
MOVWF _CHGDL
;
;-------------------------------; S_TMR0 Timer0 preset data
; DE 0x35 ;0x6F:TMR0 data(S_TMR0)実験値:0x35=55
; ; OK範囲:0x28〜(0x35)〜0x3C
MOVLW 0x6F ;
BSF STATUS,RP0 ;BANK=1
MOVWF EEADR
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
;
MOVWF S_TMR0
; ;調整範囲(28〜3C)のチェック
SUBLW 0x3C ;0x3C - S_TMR0
BTFSS STATUS,C
GOTO STMRER ; < 3D 以上
; OK ; >= 3C 以下
MOVF S_TMR0,W
SUBLW 0x27 ;0x27 - S_TMR0
BTFSS STATUS,C
GOTO STMROK ; < 28 以上
; ERR ; >= 27 以下
; ;異常値の場合初期値をセット
STMRER MOVLW 0x35 ;Default Val.
MOVWF S_TMR0 ;Temp Set
STMROK
; MOVF S_TMR0,W
; MOVWF TMR0
;
;-------------------------------; Startup timer0,timer1 (Sec)
DE 0x01 ;0x6D:Startup timer0 (Sec) ;W_SUT0 EQU 0x2B
DE 0x05 ;0x6E:Startup timer1 (Sec) ;W_SUT1 EQU 0x2C
MOVLW 0x6D
BSF STATUS,RP0 ;BANK=1
MOVWF EEADR
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
MOVWF W_SUT0 ;Output Timer work (Sec)
;
BSF STATUS,RP0 ;BANK=1
INCF EEADR,F ;EEADR = 0x6E
BSF EECON1,0 ;RD
MOVF EEDATA,W
BCF STATUS,RP0 ;BANK=0
MOVWF W_SUT1 ;Output Timer work (Sec)
;---------------------------------------------------------------
; Buffer,Work Initialize
;---------------------------------------------------------------
CLRF WTXMST
CLRF WCNTPL
CLRF WGP4CS
;-------------------------------;A/D work
CLRF WADR0H
CLRF WADR0L
CLRF WADTMP
;
;***** CLRF W_MIN_ ;timer work (Min)
;***** CLRF W_HUR_ ;timer work (Hur)
;
; CLRF WSWSTS
CLRF WTMSTS ;Timer control & status
;****** CLRF WRXDT_ ;
CLRF WRXDTB ;
;****** CLRF WRXCC_ ;
;****** CLRF WTRBC_ ;
CLRF WTXDT_ ;
;****** CLRF WTXCC_ ;
CLRF WTRSTS ;
BSF WTRSTS,5 ;TX Done flag set
;
;****** CLRF WRXD00
;****** CLRF WRXD01
;****** CLRF WRXD02
;****** CLRF WRXD03
;****** CLRF WRXD04
CLRF WRDTCT ;Data buffer & counter
;---------------------------------------------------------------
;
GOTO MAIN
;
;***************************************************************
END