;##########################################################
;
; Thermometer v1.2
; 
; temperature sensor SMT160-30, powered only during measure
; cycle 50ms, every 5 seconds, XTAL 11.0592 MHz only
; only one sensor without not connected detection
; AT89C2051 using IDLE mode (energy saving)
; 
; (C) HELIUM  
; http://helium.webz.cz/
;
; compiled with MetaLink 8051 Cross-Assembler, Version 1.2k
;##########################################################

$MOD51

XTAL	EQU	11		; XTAL 11.0592 MHz
IDLE	EQU	1		; use IDLE power saving

	DSEG AT 040h
time1:	DS	4
time2:	DS	4
const1:	DS	4
const2:	DS	4
nas1:	DS	8
pod1:	DS	4
roz1:	DS	4
vysl:	DS	4
constK:	DS	4

znam	BIT	3H
wait5	BIT	4H

	CSEG
	ORG 	0H		;
	jmp	main		;

;##########################################################
; interrupt EXT. IE0		  (flag IE0)
	ORG	03H		;
	jb	TF1, merend	; po preteceni TF1 ukonci
	orl	TCON, #01010000B; spusti  CT0, CT1
	RETI			;
merend:	anl	TCON, #10101111B; vypne   CT0, CT1
	clr	EA		;
	anl	PCON, #0FEH	; IDLE OFF
	RETI			;
;##########################################################
; interrupt C/T0 TIMER0		  (flag TF0)
;	ORG	0BH		;
;	RETI			;
;##########################################################
; interrupt EXT. IE1		  (flag IE1)
;	ORG	013H		;
;	RETI
;##########################################################
; interrupt C/T1 TIMER1		  (flag TF1)
	ORG	01BH		;
	jmp	iCT0_0		;
;##########################################################
; interrupt SERIAL I/O		  (flag RI, TI)
	ORG	023H		;
	jb	RI, receive	; skoc na obsluhu prijmu
	clr	TI		;
	clr	EA		; obsluha po odeslani
	anl	PCON, #0FEH	; IDLE OFF
 	RETI  			; 
receive:clr	RI		; stejne neni povolen prijem
	clr	EA		;
	anl	PCON, #0FEH	; IDLE OFF
 	RETI  			; 
;##########################################################
; interrupt C/T1 TIMER1		  (flag TF1)
iCT0_0:	djnz	R2, iCT0_1	;
	clr	TR1		;
	clr	EA		;
	anl	PCON, #0FEH	; IDLE OFF
iCT0_1:	RETI			;
;##########################################################

$include(x51_UTL.a51)
$include(math.A51)
$include(math_mac.A51)

;==========================================================
; mereni teploty

mer_tep:mov	TCON, #00000101B; stop a nulovani CT
        mov	TMOD, #00011001B; Timer0 cita pri INT0=H  Timer1 cita 50ms
        clr	A		;
	mov 	TL0, A		;
	mov 	TH0, A		;
	mov 	TL1, A		;
	mov 	TH1, #4CH	; doplnek pro 50ms
	mov	IE, #10000001B	; povoleni ET1, EX0
	setb	TR1		; spustit CT1

mer_t2:	
IF IDLE=1	
	orl	PCON, #1	; IDLE ON
ENDIF
	jb	EA, mer_t2	; ceka se na dokonceni mereni		
	
; vypocet casu merene stridy
	mov	time1+0, TL0	;
	mov	time1+1, TH0	;
	;mov	time1+2, #0	; (doplneni 00xxH)
	;mov	time1+3, #0	;	
;	
	mov	time2+0, TL1	;
	mov	A, TH1		;
	add	A, #0B4H	; pricteni korekce po preteceni [50+ ms]
	mov	time2+1, A	;
	mov	time2+2, #0	; bude se delit 32bit (doplneni 00xxH)
	mov	time2+3, #0	;	
	RET

;----------------------------------------------------------
; vypocet teploty	

dc2tep: ;mov	const1+3, #0	;
	;mov	const1+2, #0	;
	mov	const1+1, #053h	;	531Ch
	mov	const1+0, #01Ch	;
	
	;mov	const2+3, #0	;
	;mov	const2+2, #0	;
	mov	const2+1, #050h	;	501Ah
	mov	const2+0, #01Ah	;

	;mov	constK+3, #0	;
	;mov	constK+2, #0	;
	mov	constK+1, #06Ah	;	6AB3h ~ 273.15 K
	mov	constK+0, #0B3h	;
	
	SOUCIN16 const1, time1, nas1;
	PODIL	4, nas1, time2, pod1;
	SOUCET	2, pod1, const2	;	Teplota v [K x 100]
	
; urceni znamenka	
	mov	R0, #pod1	;
 	mov	R1, #constK	;
	mov	R2, #2		;
	call	cmp		;
	cpl	C		;
	mov	znam, C		;
; prevod z Kelvinu na Celsius
	jb	znam, zap0	;
	ROZDIL3	2, pod1, constK, roz1 ;	Teplota v [C x 100], jen pro +
	jmp	klad0		;
zap0:	ROZDIL3	2, constK, pod1, roz1 ;	Teplota v [C x 100], jen pro -
klad0:	BINBCD	2, roz1, vysl	;
	RET			;

;----------------------------------------------------------
; vyslani seriovym portem	

b2ascii:anl	A, #0Fh		;
	add	A, #48		;
 	call	TXi_ACC		; vyuziva se IDLE power saving
 	RET			; (zatim vnitrni odkaz na TX_ACC)

TX_tep:	call	SetSerial	;
; znamenko nebo stovky
	jnb	znam, stovky	;
	mov	A, #'-'		; "-"
	call	TXi_ACC		;
	jmp	desitky		;
; stovky
stovky:	mov	A, vysl+2	;
 	call	b2ascii		;
; desitky
desitky:mov	A, vysl+1	;
	swap	A		;
 	call	b2ascii		;
; jednotky
	mov	A, vysl+1	;
 	call	b2ascii		;
; des. tecka	
	mov	A, #'.'		; "."
	call	TXi_ACC		;
; desetiny
	mov	A, vysl+0	;
	swap	A		;
 	call	b2ascii		;
; setiny
;	mov	A, vysl+0	;
; 	call	b2ascii		;
; ENTER	
	mov	A, #13		; 
	call	TXi_ACC		;
	RET			;

;----------------------------------------------------------
; cekani 5 vterin

delay:	mov	TCON, #00000101B; stop a nulovani CT
        mov	TMOD, #00010001B; Timer1 mod 1
        mov	IE, #10001000B	; EA & ET1
IF XTAL=24
;	mov	R2, #10		; n krat 32.768 ms (XTAL 24 MHz)
	mov	R2, #152	; 5 vterin
ELSE
;	mov	R2, #10		; n krat 71.1'  ms (XTAL 11.05 MHz)
	mov	R2, #70		; 5 vterin
ENDIF	
	clr	A		; 
	mov	TH1, A		;
	mov	TL1, A		;
	jb	wait5, delay_2	;
	mov	TH1, #0DCh	;
	mov	R2, #1		;
delay_2:setb	TR1		;

delay_3:
IF IDLE=1	
	orl	PCON, #1	; IDLE ON
ENDIF
	jb	EA, delay_3	;
	RET			;
 	
;##########################################################
;
; MAIN PROGRAM LOOP
;
;##########################################################

main:   clr	EA		; 
	mov	SP, #7		; nastaveni dna zasobniku
	clr	RS0		;
	clr	RS1		; pouzivat Banku Registru 0

loop:	nop			;

; zmereni stridy signalu cidla 
	clr	T0		; zapnout napajeni cidla
	clr	wait5		; pockat 10 ms na nabeh
	call	delay		;
	call	mer_tep		;
	setb	T0		; vypnout napajeni cidla
; vypocet a prevod stridy na teplotu
	call	dc2tep		;
; vyslani seriovym portem	
	call	TX_tep		;
; cekani 5 vterin	
	setb	wait5		;
	call	delay		;

	jmp	loop		;
	
;##########################################################

	END			; end asm directive