;	program pro cteni hodnot z obvodu Dallas

;	XTAL 11059200 Hz

; ***	In / Out declarations
DS_18	equ	090h		;pripojeni teplomeru

; ***	Registers processor AT89C51RD2
AUXR	equ	08Eh		;po resetu je nastaven na XX0X1000b-prepina Vnejsi a vnitrni RAM
AUX	equ	0A2h		;pro prepinani dvou dptr
TL2	equ	0CCh		;pamet registru TL2
TH2	equ	0CDh		;pamet registru TL2
TF2	equ	0CFh		;bit co signalizuje preteceni T2
T2CON	equ	0C8h		;registr T2CON-nastaveni casovace 2					
IPL1	equ	0B2h		;priority preruseni po resetu=XXXX X000b
IPH1	equ	0B3h		;priority preruseni po resetu=XXXX X111b
EETIM	equ	0D3h		;registr pro zapisovani do EEPROM
EECON	equ	0D2h		;registr pro zapisovani do EEPROM
CKCON	equ	08Fh		;rizeni rychlosti procesoru
WTDR	equ	0A6h		;registr pro reset watchdogu
WTDP	equ	0A7h		;registr pro nastaveni watchdogu

; ***	Private declarations 		****************
IN_H	equ	07Fh		;namerena teplota
IN_L	equ	07Eh		;namerena teplota
TAB_H	equ	07Dh		;tabulka pro prevod
TAB_M	equ	07Ch
TAB_L	equ	07Bh
OUT_H	equ	07Ah		;tabulka pro prevod
OUT_M	equ	079h
OUT_L	equ	078h
ZNAM	equ	000h
BIT_X0	equ	001h		;univerzalni bit
BIT_X1	equ	002h		;univerzalni bit

; ***	MASTER PROGRAM			****************
	org	0000h
	mov	SCON,#01010010b
	mov	TMOD,#00100001b
	mov	SP,#008h
	mov	TH1,#0FEh	;14400 baud
	setb	TR1
	setb	EA
	setb	ET0

START:	mov	DPTR,#TX_01
	lcall	SERxTX


	lcall	WAITx0
STx1:	lcall	DSxRES		;resetuje Dallas


	mov	a,#0CCh
	lcall	DSxWR

	mov	a,#0BEh
	lcall	DSxWR

	lcall	DSxRD9		;cte data 9 bajtu



	lcall	DSxRES

	mov	a,#0CCh
	lcall	DSxWR

	mov	a,#044h
	lcall	DSxWR
	lcall	WAITx1		;ceka na provedeni prevodu

	mov	IN_H,061h
	mov	IN_L,060h
	lcall	BINxD		;HEX > DEC
	lcall	SERxCL
	lcall	SERxWD
	ljmp	STx1


; ***	SUBROUTINES DS18B20		****************

; ----	Reading 9 bytes from DALLAS	----------------
DSxRD9:	push	07h
	mov	R7,#009h
	mov	R0,#060h
DSxR91:	lcall	DSxRD
	mov	@R0,a
	inc	R0
	djnz	R7,DSxR91
	pop	07h
	ret

; ----	Write out BYTE on DALLAS	----------------
DSxWR:	push	07h
	push	06h
	mov	R7,#008h
DSxW01:	rrc	a
	jnc	DSxW02
	mov	R6,#002h	;delka pro log.1 
	sjmp	DSxW03
DSxW02:	mov	R6,#018h	;delka pro log.0 40us
DSxW03:	clr	DS_18		;zacina puls
	djnz	R6,$		;ceka - puls
	setb	DS_18		;konec pulsu
	mov	R6,#040h
	djnz	R6,$		;cekani mezi bity
	djnz	R7,DSxW01	;konec smycky
	pop	06h
	pop	07h
	lcall	WAITx0		;cekani na zotaveni
	ret

; ----	Reading BYTE from DALLAS	----------------
DSxRD:	push	07h
	push	06h
	mov	R7,#008h
DSxR01:	clr	DS_18
	nop
	nop
	nop
	setb	DS_18
	mov	R6,#008h
	djnz	R6,$		;ceka na mereni
	mov	C,DS_18		;prenos stavu bitu
	rrc	a
	mov	R6,#000h	;ceka mezi bity
	djnz	R6,$
	djnz	R7,DSxR01
	pop	06h
	pop	07h
	lcall	WAITx0
	ret

; ----	Reset DALLAS			----------------
DSxRES:	push	ACC
DSxR16:	clr	DS_18		;nuluje bit	
	mov	a,#079h
DSxR11:	nop
	nop
	nop
	djnz	ACC,DSxR11	;ceka
	setb	DS_18		;nastavi bit
	clr	a
DSxR12:	jnb	DS_18,DSxR14	;ceka az bude 0
	inc	a
	jz	DSxR13
	sjmp	DSxR12
DSxR14:	jb	DS_18,DSxR15	;ceka az bude 1
	inc	a
	jz	DSxR13
	sjmp	DSxR14		;je ukonceno resetovani
DSxR13:	mov	R7,#020d
	mov	DPTR,#ERROR
	lcall	SERxTX
	sjmp	DSxR16
DSxR15:	pop	ACC
	ret
ERROR:	db	'HW ERROR ! ! ! ! ! ! '



; ***	SUBROUTINES ARITHMETIC		****************

; ----	HEX > DEC			----------------
BINxD:	push	ACC
	push	07h
	mov	a,IN_H
	rlc	a		;nastaveni znamenka
	mov	ZNAM,C
	jnc	BINx01		;cislo je kladne
	clr	C
	clr	a
	subb	a,IN_L
	mov	IN_L,a	
	clr	a
	subb	a,IN_H
	mov	IN_H,a	
BINx01:	mov	TAB_H,#000h	;Prevede binar na dec
	mov	TAB_M,#006h
	mov	TAB_L,#025h	;nastaveni tabulky
	mov	OUT_H,#000h
	mov	OUT_M,#000h
	mov	OUT_L,#000h	;vynulovani vstupu
	mov	R7,#008h	;pojede 1 bajt
	mov	a,IN_L
BINx10:	rrc	a
	jnc	BINx11		;nebude se pricitat
	mov	R0,#TAB_L	;ukazuje na spodek tabulky
	mov	R1,#OUT_L	;ukazuje na spodek vysledku
	lcall	ADDxDC		;secte tabulku a vysledek
BINx11:	mov	R0,#TAB_L
	mov	R1,#TAB_L
	lcall	ADDxDC
	djnz	R7,BINx10
	mov	R7,#008h	;pojede 2 bajt
	mov	a,IN_H
BINx20:	rrc	a
	jnc	BINx21		;nebude se pricitat
	mov	R0,#TAB_L	;ukazuje na spodek tabulky
	mov	R1,#OUT_L	;ukazuje na spodek vysledku
	lcall	ADDxDC		;secte tabulku a vysledek
BINx21:	mov	R0,#TAB_L
	mov	R1,#TAB_L
	lcall	ADDxDC
	djnz	R7,BINx20
	pop	07h
	pop	ACC
	ret

; ----	Addition 3 bytes		----------------
ADDxDC:	push	ACC
	push	07h
	mov	R7,#003h	;bude scitat 3bajtova cisla
	clr	C
ADDx01:	mov	a,@R1
	addc	a,@R0
	da	a
	mov	@R1,a
	inc	R1
	inc	R0
	djnz	R7,ADDx01
	pop	07h
	pop	ACC
	ret

; ***	SUBROUTINES SERIAL PORT		****************

; ----	Write out BACK on serial port	----------------
SERxCL:	mov	R0,#011d
	mov	a,#008h
SERxC1:	mov	SBUF,a
	jnb	TI,$
	clr	TI
	djnz	R0,SERxC1
	ret

; ----	Write out TEXT on serial port	----------------
SERxTX:	clr	a
	movc	a,@A+DPTR
	cjne	a,#000h,SERx01
	ret
SERx01:	mov	SBUF,a
	jnb	TI,$
	clr	TI
	inc	DPTR
	sjmp	SERxTX
TX_01:	db	'AT89C51ED2...Dallas 18B20',0Dh,08h,00h


; ----	Write out temperature on serial port	----------------
SERxWD:	mov	a,#' '
	mov	SBUF,a
	jnb	TI,$
	clr	TI	
	mov	a,#'-'		;vypise to na displej
	jb	ZNAM,SERx81
	mov	a,#'+'
SERx81:	mov	SBUF,a		;vyhodnoti znamenko
	jnb	TI,$
	clr	TI
	mov	a,OUT_H		;vypise vystup
	lcall	INTxHX
	mov	a,#','
	mov	SBUF,a
	jnb	TI,$
	clr	TI
	mov	a,OUT_M
	lcall	INTxHX
	mov	a,OUT_L
	lcall	INTxHX
	mov	a,#'°'
	mov	SBUF,a
	jnb	TI,$
	clr	TI
	mov	a,#'C'
	mov	SBUF,a
	jnb	TI,$
	clr	TI
	ret


; ----	Write out 9 HEX byte on serial port	----------------
INTxH9:	push	07h
	push	00h
	mov	R7,#009h
	mov	R0,#060h
INTx11:	mov	a,@R0
	swap	a
	lcall	INTxHX
	mov	a,@R0
	lcall	INTxHX
	inc	R0
	djnz	R7,INTx11
	pop	00h
	pop	07h
	ret

; ----	Write out HEX byte on serial port	----------------
INTxHX:	push	ACC
	setb	BIT_X0
	swap	a
INTx01:	anl	a,#00Fh
	clr	C
	subb	a,#00Ah
	mov	BIT_X1,C
	add	a,#03Ah
	jb	BIT_X1,INTx02
	add	a,#007h
INTx02:	mov	SBUF,a
	jnb	TI,$
	clr	TI
	jb	BIT_X0,INTx03
	ret
INTx03:	pop	ACC
	clr	BIT_X0
	sjmp	INTx01




; ***	SUBROUTINES UNIVERSAL		****************

; ----	Wait				----------------
WAITx1:	push	06h
	push	07h
	mov	R7,#010d
	mov	R6,#000h
Wx01:	lcall	WAITx0
	djnz	R6,Wx01
	djnz	R7,Wx01
	pop	07h
	pop	06h
	ret

; ----	Wait 300us			----------------
WAITx0:	push	07h
	mov	R7,#138d
	djnz	R7,$
	pop	07h
	ret
	end

