EVSE Control Software (Old Car)
元に戻るにはこの窓を閉じて下さい (検索エンジンから直接こられた方はこちら  Home  Old Car) 
   (一部未完成) 鋭意製作中です しばらくお待ち下さい
 
0.ソフトの概要
1.TMR0割込の設定
2.CCP、PWMの設定
3.A/Dコンバータ
4.リレー駆動
5.LED駆動
6.ソフトUARTの動作
7.簡易モニター
8.ソースリスト
   
   
  頁最後尾
 


 0.ソフトの概要
8ピンの PIC12F683 を用いて EVSE の制御を行います

このプログラムはタイマー割込みを使い、一定時間毎に処理を行う構造とします

主な機能は
(1)CPLT信号(1kHz PWM)の生成
(2)CPLT信号レベルの測定・判定(A/D変換)
(3)充電電流の ON/OFF制御(リレー駆動・簡易PWM)
(4)動作状態の LED点滅パターン表示
(5)パラメータの設定変更機能(パソコンとの通信)
(6)その他
  簡易モニター機能
  ソフトUART機能(パソコンとの通信用)
PageTop

 1.TMR0割込の設定
(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)フォアグランドとバックグランド

  タイマー割込処理の中で行う処理をバックグランドとします
  時間に制約される処理(リアルタイム処理)を行います

  タイマー割込処理以外での処理をフォアグランドとします
  時間に制約されるない処理を行います
  ここでは、実行に時間がかかる処理(主にモニター機能)を実行します
PageTop

 2.CCP、PWMの設定
(1)初期設定、周波数設定

(2)デューティ比設定


PageTop

 3.A/Dコンバータ
(1)初期設定

(2)A/D変換、平均化

(3)電圧判定


PageTop

 4.リレー駆動
  リレーは動作電圧電流とも大きいのでトランジスタを介して駆動します
  正論理で出力します
  今回、小型の筐体に密閉状態で押し込みましたので、温度上昇を抑えるため
  極力消費電力を減らす対策をしました

  具体的には、リレー駆動時には正規の電圧(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になり、リレーはほとんど発熱しなくなりました
PageTop

 5.LED駆動
  今回、パソコンを接続できる様にしていますが、これはデバッグや設定のためで
  通常の使用時には 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になった時
  点灯・消灯を行います
PageTop

 6.ソフトUARTの動作
(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個だけです)
  モニタタスクが受信データを取り出した時、受信完了フラグを降ろします
PageTop

 7.簡易モニター
(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
PageTop

 8.ソースリスト
PageBotm
	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

ItemTop


検索エンジンから直接こられた方はこちら  Home  Old Car)   ↑ PageTop