
	;================= THERMO SET PROGRAMM ===========================


TRMSET:	clr	Points
TRMSET0:
	andi	Points,0x11	;Clear Points,1...3 pos.
	;---------------- SYNCHRONIZATION -----------------------
	rcall	SYNCHRO		;Synchronization with INTERRUPTS	
	;---------------------------------------------------------
	;------------ Read stored Termo Threshold ---------------
	ldi	r17,61		;Set 1/2 1-st EEAddr termo threshold
	rcall	RD_EE0		;Read 2*Data EEPROM (NOT Corrected)
	mov	TMPR_L,EETMP_L	;Mov data to temp location
	mov	TMPR_H,EETMP_H	;Mov data to temp location
	;---------------------------------------------------------
	rcall	TERMOIND_	;Show temperature
	;---------------------------------------------------------
	cpi	KeyD,0x08	;IF KeyD=K0 or K1 or K2 ("+"or"-"or"Set")
	brsh	tms2		;Then TimeDelay 4Sec
	;------------------ Wait 4 Sec --------------------------
	ldi 	DL1,200		;set delay 4 Sec  
	rcall	delay		;Wait 
	;------ I don't know where we are going -------------------
tms2:	cpi	KeyD,0x4	;KeyD=K0 or K1 ("+"or"-")
	brlo	TMSE		;go OUT
	;---------------------------------------------------------
tms1:	rcall	TERMOIND_	;Show temperature
	;---------------------------------------------------------
	;-------------- Wait Key Pressed -------------------
tms4:	tst 	KeyD		;IF NO KEY pressed
	breq	tms4		;then Wait
	;---------------------------------------------------
	;------------ Pressed Key Analys -------------------

	cpi	KeyD,0x01	;KeyD=K0 "+"
	breq	TMS01		;goto SUB 

	cpi	KeyD,0x02	;KeyD=K1 "-"
	breq	TMS02		;goto SUB 

	cpi	KeyD,0x04	;KeyD=K2 ("Set")
	breq	TMS_WR		;GOTO Write EEPROM & GO MAIN programm

	cpi	KeyD,0x08	;KeyD=K3 "Mode"
	breq	TMS_WR		;GOTO Write EEPROM & GO MAIN programm
	
tms3:	clr	KeyD
	rjmp	tms1		;LOOP Show temperature
	;---------------------------------------------------
	;======= DISPLAY/SET Key handlers ================== 

TMS01:	ldi	r16,26*9	;Load const=0,9oC
	cp	TMPR_L,r16	;Compare const (LOW)
	ldi	r16,99		;Load const=99oC
	cpc	TMPR_H,r16	;Compare const (HIGH)
	brge	tms3		;IF Value>99oC THEN GO OVER	

	ldi	r16,26		;Load const=0,1oC
	add	TMPR_L,r16	;Add const
	brcc	tms011		;Rounding correction
	clr	TMPR_L		;Clear XX,0 oC
	inc	TMPR_H		;Add carry
tms011:	rjmp	tms3		;
	;------------------------------------

TMS02:	ldi	r16,-56		;Load const=-55oC
	cp	TMPR_H,r16	;Compare const (HIGH)
	breq	tms3		;IF Value<-55oC THEN GO OVER	
	
	ldi	r16,26		;Load const=0,1oC
	sub	TMPR_L,r16	;Sub const
	brcc	tms021		;Rounding correction
	ldi	r16,234		;
	mov	TMPR_L,r16	;Set XX,9oŃ
	dec	TMPR_H		;Substract 1oC from Integer oC
tms021:	rjmp	tms3
	;------------------------------------

	;--------- SET "Activity Flag" ------------------	
TMS_WR:	ldi	r16,0x01	;
	swap	Points		;
	eor	Points,r16	;Set/Clear Points,0
	andi	Points,0x01	;Clear Points 1...7 
	ldi	r16,0xFE	;Load const
	and	TMPR_L,r16	;Clr LSB TMPR_L
	or	TMPR_L,Points	;ADD "Activity Flag" 

	;--------- WRITE EEPROM -------------------------	
	ldi	r17,122		;122=>PGM ADDR
	mov	TIME_L,TMPR_L	;Move Data
	rcall	WR_EE0		;Write 1 byte
	inc	r17		;PGM_ADDR=PGM_ADDR+1
	mov	TIME_L,TMPR_H	;Move Data
	rcall	WR_EE0		;Write 1 byte
	;------------------------------------------------
TMSE:	rjmp	TMPR0		;GOTO Begin Temperature section.

;=================== E N D ==============================================



;==================== S U B R O U T I N E S ===============================

;=================== DISPLAY TEMPERATURE ===================================
TERMOIND:;----------- TMPR_L/TMPR_H=>DISPLAY (+correction) ----------------

	;---------------- SYNCHRONIZATION -----------------------
	rcall	SYNCHRO		;Synchronization with INTERRUPTS	
	;---------------------------------------------------------
	;------------- Convert BIN=> DDEC ----------------
	mov	r17,TMPR_L		;move LOW byte BIN
	mov	r18,TMPR_H		;move HIGH byte BIN

	ldi	XL,BIND0		;Set first pos in BIND0
	andi	Points,0x99		;Clear 1,2 positions in Points
	ori	Points,0x44		;set permanent point in BINDx+1 
	;------------- SIGN Correction --------------
	tst	TMPR_H			;IF DIGIT<0	
	brpl	TrInd5			;
	neg	r17			;THEN
	adc	r18,r31			;DIGIT=|DIGIT|
	neg	r18			;
	;-------- NEGATIVE Value Correction ----------
	cpi	r18,10			;IF Value >=10 then next position
	brlo	TrInd5
	inc	XL
	andi	Points,0x99		;Clear 1,2 positions in Points
	ori	Points,0x22		;set permanent point in BINDx+2 
	;---------------------------------------------
TrInd5:ldi	r16,14			;
	add	r17,r16			;Add const=0,05oC (For Rounding correction) 
	adc	r18,r31			;Add carry "Rounding	correction"
	ldi	ZL,low(trmconst*2)	;set Z pointer to DECconst in FLASH
	rcall	bdd

	;============ INDICATION on Display ============

	lds	r16,ddec+1		;load msb bdd
	rcall	BDD_BIND		;Sent BDD (low nibble in R16) to BIND0+0/BIND1+3
	;------------ First SYM control ----------------
	tst	r16			;IF FIRST DIGIT=+0
	brne	TrInd3
	sts	bind0,r31		;" "=> first position
	sts	bind1,r31		;" "=> first position
TrInd3:
	;--------------- Indication -------------------	
	lds	r16,ddec+2		;load ... bdd
	rcall	BDD_BIND		;Sent BDD (low nibble in R16) to BIND0+1/BIND1+3

	lds	r16,ddec+3		;load ... bdd
	rcall	BDD_BIND		;Sent BDD (low nibble in R16) to BIND0+2/BIND1+3

	lds	r16,ddec+4		;load lsb bdd
	rcall	BDD_BIND		;Sent BDD (low nibble in R16) to BIND0+3/BIND1+3

	cpi	XL,BIND1		;IF before was endpositon
	brne	TrInd6			;THEN NO "oC"
	ldi	r16,0xF0		;oC=>r16
	sts	bind0+3,r16
	sts	bind1+3,r16
TrInd6:	;--------------- Show SIGN ----------------------
	tst	TMPR_H			;IF DIGIT<0
	brpl	TrInd4			;
	ldi	r16,0x20		;"-"=>r16
	sts	bind0,r16		;"-"=> first position
	sts	bind1,r16		;"-"=> first position
TrInd4:;	ser	RST25			;SET WDT Reset max

	RET
;===========================================================================


TERMOIND_:;------- TMPR_L/TMPR_H=>DISPLAY (+correction)+[FLASHING] ---------
	rcall	TERMOIND	;Show temperature
	;--------- Set FLASHING -----------
	ldi	XL,BIND0	;load BIND0
TrInd7:	st	X+,r31		;" " =>BIND (X)
	cpi	XL,BIND0+4	;?X=BIND0+4?
	brne	TrInd7		;IF NO then repit
	RET
;===========================================================================



;==================== Read/Write byte MkLan (R18=>MkLan=>R16) =============
BLNOUT:
	ldi	r17,8		;8=>counter
BLO:	;------ Read/Write 1 MkLan timeslot (R18=>MkLan=>R16) -------
	cli			;disable interrupts
	push	r16
	sbi	ddrd,MkLan	;0=>MicroLAN

	ldi	r16,1		;set time delay=3.5 mkS 
	rcall	dl		;WAIT

	asr	r18		;data bit => C, 1=>MSB data
	brcc	lno2		;if C=0 then let 0 in MicroLAN 
	cbi	ddrd,MkLan	;1=>MicroLAN

lno2:	ldi	r16,4		;WAIT 9.5mkSec
	rcall	dl	

	clr	r0		;
	sbic	pind,MkLan	;
	dec	r0		;READ data => r0/0...7

	ldi	r16,21		;WAIT 43.5 mkSec	
	rcall	dl	
	
	cbi	ddrd,MkLan	;1=>MicroLAN

	ldi	r16,1		;set time delay=3.5 mkS 
	rcall	dl		;WAIT
	pop	r16
	sei			;enable interrupts
	;---------- END Timeslot --------------------------------
	asr	r0		;DATA => registers
	ror	r16		;DATA => registers 
	dec	r17
	brne	BLO		;if count>0 then loop
	RET
;=========================================================================


;========= Reset Pulse 514 mkSec,T=(r16*2 +1.5)mkSec ===================== 
RSTPULS:
	sbi	ddrd,MkLan	;0=>MicroLAN
	ser	r16		;256=>R16
	rcall	dl	
	cbi	ddrd,MkLan	;1=>MicroLAN
	RET
;=========================================================================

;===== Time delay programm, T=(r16*2 +1.5)mkSec,r16=1...255(0=256)========
DL:	tst	r16
	rjmp	dl1
dl1:	rjmp	dl2
dl2:	dec	r16
	brne	dl
	RET 
;=========================================================================


