; 16F88_HygroMeter.asm								2004/10/11 12:14:34

; RA7 7SEG-G	output L		RB7 7SEG-MSB	output L
; RA6 7SEG-F	output L		RB6 7SEG-CSB	output L
; RA5 MCLR	input			RB5 TX		output
; RA4 7SEG-E	output L (A/D_LED-)	RB4 7SEG-LSB	output L
; RA3 7SEG-D	output L (A/D_LED+)	RB3 Temp/Hygro	input(L/H)
; RA2 7SEG-C	output L		RB2 RX		input
; RA1 AN1	analogVolt 湿度		RB1 7SEG-B	output L
; RA0 AN0	analogVolt 温度		RB0 7SEG-A	output L
; TRISA		b'00100011'		TRISB		b'00001100'

; 受信	LxxM：logging start メモリ xx分毎 LxxH：xx時間毎       ACK(06H)返信
;	RxxM：logging start 即通信 xx分毎 RxxH：xx時間毎       ACK(06H)返信
;	S   ：logging stop 停止       ACK(06H)返信
;	T   ：logging data 送信要求   下記の送信を行う

; 送信 	logging time : LxxMcrlf or LxxHcrlf  送信要求への最初のみ
;	温度データ   ：T23.5crlf
;	湿度データ   ：H68.0crlf

	list		p=PIC16F88
	#include	<P16F88.INC>

	__CONFIG	_CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_IO
	__CONFIG	_CONFIG2, _IESO_OFF & _FCMEN_OFF

	CBLOCK	20H
	work1			; 汎用
	work2
	work3
	trans_MSB		; A/D変換後データ(10進)
	trans_CSB
	trans_LSB
	trans_ad0L
	trans_ad0
	buf_mode_flg
	mode_flg		; 2^7 L受信 2^6 R受信 2^5 時間 2^4 分 2^3 7seg点滅(湿度) 2^2 7seg点滅(温度) 2^1 7seg 点灯 2^0 A/D_LED点滅(logging=0.8sec 測定=0.4sec)
	log_time		; logging time
	log_cnt
	log_rd_addr		; EEPROM用 A/D変換値読込アドレス
	log_wr_addr		; EEPROM 書込アドレス
	log_wr_cnt		; EEPROM 書込カウンタ
	log_wr_flg		; 2^7 EEPROM 書込中 2^6 logtime書込終了
	adbuf0L			; 温度 A/D変換値 下2桁
	adbuf0			; 温度 A/D変換値
	temp_MSB		; 温度表示データ(10進)
	temp_CSB
	temp_LSB
	adbuf1			; 湿度 A/D変換値
	humi_MSB		; 湿度表示データ(10進)
	humi_CSB
	humi_LSB
	temp_RB3		; RB3状態 温度/湿度を切替えた時のみ1分間7segを点灯する
	sseg_oncnt		; 7seg on カウンタ
	sseg_cnt		; MSB CSB LSB 切換(点滅)カウンタ
	msec_cnt		; 3.2msec/count 初期値9   (256-7)*3.2=796.8msec(誤差修正 実時間800msec)
	sec_cnt			; 0.8sec/count  初期値181 (256-181)*0.8=60sec
	min_cnt			; 1min/count max59
	cnt1
	W_temp
	FSR_temp
	STATUS_temp
	pclath_temp
	ENDC

#define sel_bank0	bcf     STATUS,RP0
#define sel_bank1	bsf     STATUS,RP0

	org	0
init	sel_bank1
	movlw	b'01110000'
	movwf	OSCCON		; 8MHz
	goto	start

	org	4
	movwf   W_temp		; save W
	movf	FSR,W
	movwf	FSR_temp	; save FSR
	movf	STATUS,W
	movwf	STATUS_temp	; save STATUS
	movf	PCLATH,W
	movwf	pclath_temp	; save PCLATH
	call	int
	movf	pclath_temp,W
	movwf	PCLATH		; restore PCLATH
	movf	STATUS_temp,W
	movwf	STATUS		; restore STATUS
	movf	FSR_temp,W
	movwf	FSR		; restore FSR
	swapf	W_temp,F
	swapf	W_temp,W	; restore W
	retfie

start	movlw	b'00000011'	; AN1 AN0
	movwf	ANSEL
	movlw	b'01000000'	; 左詰め fosc/2 Vdd Vss
	movwf	ADCON1
	movlw	b'00100011'
	movwf	TRISA
	movlw	b'11010111'	; pullup off TMR0CLK=osc/4
	movwf	OPTION_REG	; prescaler=1/256  128us
	movlw	b'00001100'
	movwf	TRISB
	movlw	b'00100100'	; 許可 非同期 高速
	movwf	TXSTA
	movlw	d'25'		; 8MHz 25 at 19200bps
	movwf	SPBRG
	sel_bank0
	movlw	b'01000000'	; fosc/(8*(ADSC2=1))=fosc/16 turn off A/D
	movwf	ADCON0
	movlw	b'10010000'	; シリアル 連続
	movwf	RCSTA
	movlw	b'11111111'
	movwf	PORTA		; 7seg off
	movlw	b'11111111'	; 7seg off A/D_LED off
	movwf	PORTB
	movlw	work1
	movwf	FSR
start1	clrf	INDF		; clear memory
	incf	FSR,F
	movlw	pclath_temp+1
	subwf	FSR,W
	btfss	STATUS,Z
	goto	start1

	movlw	0FH
	btfss	PORTB,3		; RB3=High?(逆レベルにする)
	movwf	temp_RB3	; RB3レベル初期設定
	movlw	d'1'		; 各timer 初期値設定
	movwf	log_cnt
	movlw	d'255'
	movwf	sseg_cnt
	movwf	msec_cnt
	movwf	sec_cnt
	movlw	d'59'
	movwf	min_cnt
	movlw	d'231'		; set timer value 256-3.2ms/0.128ms = 231
	movwf	TMR0		; TMR0 = 3.2ms
	movlw	b'10100000'	; GIE=1,TMR0IE=1
	movwf	INTCON		; interrupt enable

main	btfss	PIR1,RCIF	; USART 受信割り込みフラグビットチェック
	goto	main
	btfsc	RCSTA,FERR	; フレーミングエラーのチェック（1:エラー,0:正常）
	goto	frame
	btfsc	RCSTA,OERR	; オーバーランエラーのチェック（1:エラー,0:正常）
	goto	over
	movf	RCREG,W		; rcregレジスタから受信データを読み込む
	movwf	work1	
	sublw	4CH		; L(メモリ)モード
	btfss	STATUS,Z
	goto	main1
	bsf	mode_flg,7
	bcf	mode_flg,6
	goto	main2

main1	movf	work1,W	
	sublw	52H		; R(即通信)モード
	btfss	STATUS,Z
	goto	main6
	bsf	mode_flg,6
	bcf	mode_flg,7
main2	btfss	PIR1,RCIF	; USART 受信割り込みフラグビットチェック
	goto	main2
	btfsc	RCSTA,FERR	; フレーミングエラーのチェック（1:エラー,0:正常）
	goto	frame
	btfsc	RCSTA,OERR	; オーバーランエラーのチェック（1:エラー,0:正常）
	goto	over
	movf	RCREG,W
	andlw	0FH
	movwf	work1
	bcf	STATUS,C
	rlf	work1,W		; *2
	movwf	work1
	rlf	work1,F
	rlf	work1,F		; *8
	addwf	work1,W
	movwf	log_time	; *10桁
main3	btfss	PIR1,RCIF	; USART 受信割り込みフラグビットチェック
	goto	main3
	btfsc	RCSTA,FERR	; フレーミングエラーのチェック（1:エラー,0:正常）
	goto	frame
	btfsc	RCSTA,OERR	; オーバーランエラーのチェック（1:エラー,0:正常）
	goto	over
	movf	RCREG,W
	andlw	0FH
	addwf	log_time,F	; *1桁
main4	btfss	PIR1,RCIF	; USART 受信割り込みフラグビットチェック
	goto	main4
	btfsc	RCSTA,FERR	; フレーミングエラーのチェック（1:エラー,0:正常）
	goto	frame
	btfsc	RCSTA,OERR	; オーバーランエラーのチェック（1:エラー,0:正常）
	goto	over
	movf	RCREG,W
	movwf	work1	
	sublw	4DH		; M(xx分)
	btfss	STATUS,Z
	goto	main5
	movlw	d'6'		; ACK
	call	txd
	bcf	mode_flg,5
	bsf	mode_flg,4
	movlw	d'1'
	movwf	log_cnt
	clrf	log_wr_addr
	clrf	log_wr_cnt
	clrf	log_wr_flg
	movlw	d'254'
	movwf	sec_cnt
	goto	main

main5	movf	work1,W	
	sublw	48H		; H(xx時間)
	btfss	STATUS,Z
	goto	main8
	movlw	d'6'		; ACK
	call	txd
	bcf	mode_flg,4
	bsf	mode_flg,5
	movlw	d'1'
	movwf	log_cnt
	clrf	log_wr_addr
	clrf	log_wr_cnt
	clrf	log_wr_flg
	movlw	d'254'
	movwf	sec_cnt
	movlw	d'59'
	movwf	min_cnt
	goto	main

main6	movf	work1,W	
	sublw	54H		; T(送信要求)モード
	btfss	STATUS,Z
	goto	main7
	movf	mode_flg,W
	movwf	buf_mode_flg
	andlw	0FH
	movwf	mode_flg
	goto	trnslog		; データ送信

main7	movf	work1,W	
	sublw	53H		; S(停止)モード
	btfss	STATUS,Z
	goto	main
	movlw	d'6'		; ACK
	call	txd
main8	movlw	0FH
	andwf	mode_flg,F	; モードフラグクリア
	goto	main

frame
over	movf	RCREG,W
	bcf	RCSTA,CREN
	bsf	RCSTA,CREN
	movlw	0FH
	andwf	mode_flg,F
	goto	main

trnslog	btfsc	log_wr_flg,7	; EEPROM 書込中でない?
	goto	trnslog
	clrf	log_rd_addr
	call	rderom
	movwf	trans_ad0L
	clrf	trans_ad0
trnslg1	movlw	d'10'
	subwf	trans_ad0L,W
	btfss	STATUS,C	; log_time=>10?
	goto	trnslg2
	movwf	trans_ad0L
	incf	trans_ad0,F	; 10位+1
	goto	trnslg1

trnslg2	movlw	4CH		; L
	call	txd
	movf	trans_ad0,W
	addlw	30H
	call	txd
	movf	trans_ad0L,W
	addlw	30H
	call	txd
	movlw	48H		; H
	btfss	buf_mode_flg,5	; logging?(xx時間)
	movlw	4DH		; M
	call	txd
	movlw	0DH		; cr
	call	txd
	movlw	0AH		; lf
	call	txd
trnslg3	call	rderom
	movwf	trans_ad0L
	call	rderom
	movwf	trans_ad0
	movlw	trans_ad0L
	call	tmplog
	call	rderom
	movwf	trans_ad0
	movlw	trans_ad0
	call	humlog
	decfsz	log_wr_cnt	; データ終了?
	goto	trnslg3
	movlw	d'6'		; ACK
	call	txd
	goto	main

; -------------------------------interrupt routine--------------------------------

svn_dat andlw	0FH
	addwf	PCL,F
	DT	0A0H		; 0
	DT	0F9H		; 1
	DT	064H		; 2
	DT	070H		; 3
	DT	039H		; 4
	DT	032H		; 5
	DT	022H		; 6
	DT	0F8H		; 7
	DT	020H		; 8
	DT	038H		; 9
	DT	07FH		; - データは10
;	DT	028H		; a(10)
	DT	023H		; b(11)
	DT	067H		; c(12)
	DT	061H		; d(13)
	DT	026H		; E(14)
	DT	02EH		; F(15)

int	btfss	INTCON,TMR0IF	; time out interruption ?
	return			; return at illegal interrupt
	movlw	d'231'		; set timer value 256-3.2ms/0.128ms = 231
	movwf	TMR0		; TMR0 = 3.2ms
	bcf	INTCON,TMR0IF	; clear timer int flag
	movlw	0FFH
	movwf	PORTB		; 7seg off
	movlw	0FFH
	movwf	PORTA
	incf	sseg_cnt,F	; 7segカウンタ +1
	movf	sseg_cnt,W
	andlw	d'3'
	btfss	STATUS,Z	; sseg_cnt=0?
	goto	int1
	movlw	0EFH
	btfsc	mode_flg,0	; A/D_LED off?
	movwf	PORTA		; A/D_LED on
	goto	int6

int1	btfss	mode_flg,1	; 7seg点灯?
	goto	int6
	btfsc	PORTB,3		; 温度表示?
	goto	int2
	btfsc	mode_flg,2	; 7seg点滅でない?
	btfss	sseg_cnt,6	; 消灯期間?
	goto	int3
	goto	int6

int2	btfss	mode_flg,3	; 7seg点滅?
	goto	int3
	btfsc	sseg_cnt,6	; 点灯期間?
	goto	int6
int3	movwf	work2
	decf	work2,F
	movlw	temp_MSB
	btfsc	PORTB,3		; 温度表示?
	movlw	humi_MSB
	addwf	work2,W
	movwf	FSR
	movf	INDF,W
	call	svn_dat		; load 7seg data
	movwf	PORTA		; output 7seg(c～g)
	movwf	work2
	btfss	work2,1
	bcf	PORTB,1		; output 7seg(b)
	btfss	work2,0
	bcf	PORTB,0		; output 7seg(a)

	movf	sseg_cnt,W
	andlw	d'3'
	movwf	work2
	decf	work2,F
	btfss	STATUS,Z
	goto	int4
	bcf	PORTB,7		; MSB on
	goto	int6

int4	decfsz	work2,F
	goto	int5
	bcf	PORTB,6		; CSB on
	goto	int6

int5	bcf	PORTB,4		; LSB on

int6	btfss	log_wr_flg,7	; EEPROM 書込中?
	goto	int7
	BANKSEL	EECON1
	btfsc	EECON1,WR	; 前の書込み終了?
	goto	int7
	bcf	EECON1,WREN	; reset wr enable
	BANKSEL	STATUS
	movf	log_rd_addr,W
	movwf	FSR
	movf	INDF,W
	BANKSEL	EEDATA
	movwf	EEDATA		; 書込データ set
	BANKSEL	STATUS
	movf	log_wr_addr,W	; 書込アドレス設定
	BANKSEL	EEADR
	movwf	EEADR
	BANKSEL	EECON1
	bcf	EECON1,EEPGD	; Point to Data memory
	bsf	EECON1,WREN	; set wr enable
	movlw	55H		; write sequence
	movwf	EECON2		; start write
	movlw	0AAH
	movwf	EECON2
	bsf	EECON1,WR	; go write
	BANKSEL	STATUS
	incf	log_wr_addr
	movlw	d'1'
	btfsc	log_wr_flg,6	; logtime 書込終了していない?
	movlw	d'4'
	addwf	log_rd_addr,F
	bsf	log_wr_flg,6	; logtime 書込終了フラグセット
	movf	log_rd_addr,W
	sublw	adbuf1+4
	btfss	STATUS,Z	; 読込終了?
	goto	int7
	bcf	log_wr_flg,7	; 書込中フラグ クリア
	incf	log_wr_cnt
	movf	log_wr_cnt,W
	sublw	d'85'
	btfss	STATUS,Z	; 書込み終了?
	goto	int7
	movlw	0FH
	andwf	mode_flg,F	; モードフラグクリア

int7
	BANKSEL	STATUS
	movf	sseg_cnt,W
	andlw	7FH
	btfss	STATUS,Z	; 409.6msec?
	goto	intA
	call	ad_conv
	movlw	adbuf0L
	movwf	FSR
	call	exDtmp		; 温度変換
	bcf	mode_flg,2
	btfsc	trans_MSB,7	; 温度点滅ではない？
	bsf	mode_flg,2	; set 点滅フラグ
	movlw	0FH
	andwf	trans_MSB,W
	movwf	temp_MSB
	movf	trans_CSB,W
	movwf	temp_CSB
	movf	trans_LSB,W
	movwf	temp_LSB

	movlw	adbuf1
	movwf	FSR
	call	exDhum		; 湿度変換
	bcf	mode_flg,3
	btfsc	trans_MSB,7	; 湿度点滅ではない？
	bsf	mode_flg,3	; set 点滅フラグ
	movlw	0FH
	andwf	trans_MSB,W
	movwf	humi_MSB
	movf	trans_CSB,W
	movwf	humi_CSB
	movf	trans_LSB,W
	movwf	humi_LSB

	swapf	temp_RB3,F
	movlw	0FH
	iorwf	temp_RB3,F
	movlw	0F0H
	btfss	PORTB,3		; RB3=Higt?
	andwf	temp_RB3,F
	swapf	temp_RB3,W
	xorwf	temp_RB3,W
	btfsc	STATUS,Z	; RB3 change?
	goto	int8
	bsf	mode_flg,1	; 7seg on
	movlw	d'148'
	movwf	sseg_oncnt	; 7seg onカウンタ設定(147*0.4096sec=60.2112sec)
int8	decfsz	sseg_oncnt,F	; 7seg on 終了?
	goto	int9
	incf	sseg_oncnt,F
	bcf	mode_flg,1	; 7seg off
int9	movf	mode_flg,W
	andlw	0C0H
	btfss	STATUS,Z	; not logging mode?
	bcf	mode_flg,0	; A/D_LED off
intA	incfsz	msec_cnt,F	; 0.8sec?
	return

	movlw	d'7'
	movwf	msec_cnt	; 初期値設定
	movf	mode_flg,W
	andlw	0C0H
	movlw	b'00000001'
	btfsc	STATUS,Z	; logging mode?
	xorwf	mode_flg,F	; A/D_LED 点滅
	incfsz	sec_cnt,F	; 60sec?
	return
	movlw	d'181'
	movwf	sec_cnt		; 初期値設定
	btfsc	mode_flg,4	; not logging?(xx分)
	decfsz	log_cnt,F	; xx分?
	goto	intB
	movf	log_time,W
	movwf	log_cnt		; logtime 初期値設定
	call	outlog
intB	incf	min_cnt,F
	movlw	d'60'
	subwf	min_cnt,W
	btfss	STATUS,Z	; 60min?
	return
	clrf	min_cnt		; 初期値設定
	btfsc	mode_flg,5	; not logging?(xx時間)
	decfsz	log_cnt,F	; xx時間?
	return
	movf	log_time,W
	movwf	log_cnt		; logtime 初期値設定
	call	outlog
	return

; -------------------------------sub routine--------------------------------

;	温度変換 for S8100B

exDtmp	clrf	trans_MSB	; clear 点滅フラグ
	clrf	trans_LSB
	movf	INDF,W		; adbuf0L 読込
	movwf	work3
	incf	FSR,F		; adbuf0 指定
	movf	INDF,W
	sublw	d'230'
	movwf	trans_CSB
	btfsc	STATUS,C	; 0℃以下?
	goto	exDtmp3
	xorlw	d'255'
	addlw	d'1'
	movwf	trans_CSB
	sublw	d'9'
	btfss	STATUS,C	; -10℃以上?
	goto	exDtmp2
exDtmp1	movlw	d'100'		; -記号
	addwf	trans_CSB,F
	movf	work3,F		; Zフラグ設定
	btfsc	STATUS,Z	; 下2桁<>0?
	goto	exDtmp6
	swapf	work3,F
	bcf	STATUS,C
	rrf	work3,W
	addlw	d'1'		; 下2桁 0C0H→7 080H→5 040H→3
	movwf	trans_LSB
	goto	exDtmp6

exDtmp2	bsf	trans_MSB,7	; set 点滅フラグ
	movlw	d'100'		; -0.0
	movwf	trans_CSB
	goto	exDtmp6

exDtmp3	sublw	d'99'
	btfss	STATUS,C	; 100℃以下?
	goto	exDtmp5
	movf	work3,F		; Zフラグ設定
	btfsc	STATUS,Z	; 下2桁<>0?
	goto	exDtmp6
	movf	trans_CSB,F	; Zフラグ設定
	btfsc	STATUS,Z	; 0℃でない?
	goto	exDtmp1
exDtmp4	swapf	work3,F
	bcf	STATUS,C
	rrf	work3,W
	sublw	d'9'		; 下2桁 0C0H→3 080H→5 040H→7
	movwf	trans_LSB
	decf	trans_CSB,F	; temp=temp-1
	goto	exDtmp6

exDtmp5	movf	trans_CSB,W
	sublw	d'100'
	btfss	STATUS,Z	; 100℃?
	clrf	work3		; 100℃以上は下2桁=0
	movlw	d'100'		; 最大値 100℃設定
	movwf	trans_CSB
	movf	work3,F		; Zフラグ設定
	btfss	STATUS,Z	; 下2桁=0?
	goto	exDtmp4
	bsf	trans_MSB,7	; set 点滅フラグ
	clrf	trans_CSB



;	温度変換 for LM35DZ
;
;exDtmp	clrf	trans_MSB	; clear 点滅フラグ
;	clrf	trans_LSB
;	incf	FSR		; adbuf0 指定
;	movf	INDF,W
;	andlw	03H
;	btfsc	STATUS,Z	; mod<>0?
;	goto	exDtmp1
;	movwf	trans_CSB
;	bcf	STATUS,C
;	rlf	trans_CSB,W
;	addlw	d'1'		; mod*2+1
;	movwf	trans_LSB	; mod 3→7 2→5 1→3

;exDtmp1	rrf	INDF,W
;	movwf	trans_CSB
;	rrf	trans_CSB,W	; temp=(A/D値)/4
;	andlw	3FH
;	movwf	trans_CSB



exDtmp6	movlw	d'10'
	subwf	trans_CSB,W
	btfss	STATUS,C	; temp=>10?
	return
	movwf	trans_CSB
	incf	trans_MSB,F	; 10位+1
	goto	exDtmp6

;	湿度変換

exDhum	clrf	trans_MSB	; clear 点滅フラグ
	movlw	d'200'
	subwf	INDF,W
	btfss	STATUS,C	; humi>=100%
	goto	exDhum1
	bsf	trans_MSB,7	; set 点滅フラグ
	clrf	trans_CSB
	clrf	trans_LSB
	return

exDhum1	bcf	STATUS,C
	rrf	INDF,W		; humi=(A/D値)/2
	movwf	trans_CSB
	movlw	d'0'
	btfsc	STATUS,C	; mod=0?
	movlw	d'5'
	movwf	trans_LSB
exDhum2	movlw	d'10'
	subwf	trans_CSB,W
	btfss	STATUS,C	; humi=>10?
	return
	movwf	trans_CSB
	incf	trans_MSB,F	; 10位+1
	goto	exDhum2

;	logging

outlog	btfss	mode_flg,7	; L(メモリ)モード?
	goto	outlog2
	BANKSEL	EECON1
	bcf	EECON1,WREN	; reset wr enable
	BANKSEL	STATUS
	movf	log_wr_addr,W	; 書込アドレス設定
	BANKSEL	EEADR
	movwf	EEADR
	BANKSEL	STATUS
	movf	log_time,W
	btfsc	log_wr_flg,6	; logtime 書込終了していない?
	movf	adbuf0L,W
	BANKSEL	EEDATA
	movwf	EEDATA		; 書込データ set
	BANKSEL	EECON1
	bcf	EECON1,EEPGD	; Point to Data memory
	bsf	EECON1,WREN	; set wr enable
	movlw	55H		; write sequence
	movwf	EECON2		; start write
	movlw	0AAH
	movwf	EECON2
	bsf	EECON1,WR	; go write
	BANKSEL	STATUS
	bsf	log_wr_flg,7	; 書込中フラグset
	incf	log_wr_addr
	movlw	adbuf0L
	btfsc	log_wr_flg,6	; logtime 書込終了していない?
	movlw	adbuf0
	movwf	log_rd_addr	; 読込アドレス設定
	bsf	mode_flg,0	; A/D_LED on
	return

outlog2	btfss	mode_flg,6	; R(即通信)モード?
	return
	bsf	mode_flg,0	; A/D_LED on
	movlw	adbuf0L
	call	tmplog
	movlw	adbuf1

humlog	movwf	FSR
	call	exDhum		; 湿度変換
	movlw	48H		; H
	call	txd
	movf	trans_MSB,W
	addlw	30H
	call	txd
	movf	trans_CSB,W
	addlw	30H
	call	txd
	movlw	2EH		; .
	call	txd
	movf	trans_LSB,W
	addlw	30H
	call	txd
	movlw	0DH		; cr
	call	txd
	movlw	0AH		; lf
	call	txd
	return
	
tmplog	movwf	FSR
	call	exDtmp		; 温度変換
	movlw	54H		; T
	call	txd
	movf	trans_MSB,W
	addlw	30H
	call	txd
	movf	trans_CSB,W
	addlw	30H
	call	txd
	movlw	2EH		; .
	call	txd
	movf	trans_LSB,W
	addlw	30H
	call	txd
	movlw	0DH		; cr
	call	txd
	movlw	0AH		; lf
	call	txd
	return

;	Read to EEPROM

rderom	
	BANKSEL	EECON1
	bcf	EECON1,WREN	; reset wr enable
	BANKSEL	STATUS
	movf	log_rd_addr,W	; データエリアのアドレス指定
	BANKSEL	EEADR
	movwf	EEADR		; set address register
	BANKSEL	EECON1
	bcf	EECON1,EEPGD	; Point to Data memory
	bsf	EECON1,RD	; start read
	BANKSEL	EEDATA
	movf	EEDATA,W	; データ取り出し
	BANKSEL	STATUS
	incf	log_rd_addr
	return 

ad_conv	movlw	b'01000001'	; select AN0
	movwf	ADCON0
	call	wait2u		; 20μsec wait
	bsf	ADCON0,GO	; A/D start
adlop1	btfsc	ADCON0,GO	; A/D done?
	goto	adlop1
	movf	ADRESH,W	; get A/D data
	movwf	adbuf0		; A/D -> adbuf0
	sel_bank1
	movf	ADRESL,W
	sel_bank0
	andlw	0C0H
	movwf	adbuf0L		; A/D下2桁 -> adbuf0L

	movlw	b'01001001'	; select AN1
	movwf	ADCON0
	call	wait2u		; 20μsec wait
	bsf	ADCON0,GO	; A/D start
adlop2	btfsc	ADCON0,GO	; A/D done?
	goto	adlop2
	movf	ADRESH,W	; get A/D data
	movwf	adbuf1		; A/D -> adbuf1
	return

txd	bcf	INTCON,7	; 割り込み禁止
	sel_bank1
txd1	btfss	TXSTA,TRMT
	goto	txd1
	sel_bank0
	movwf	TXREG
	bsf	INTCON,7	; 割り込み許可
	return

wait2u	movlw	d'8'		; (4n+6)*1サイクル時間(4/fosc)
	movwf	cnt1		;	8mHz 4/8=0.5μsec
wloop2	nop			;	19μsec
	decfsz	cnt1,F
	goto	wloop2
	nop
	nop
	return

	end
