;-----------------------------------------------------------------------------
;  Podprogramy pro DS18B20
;-----------------------------------------------------------------------------
;**************************************************************
; Odstartování převodu
;............................
; pokud nepřijde presenc puls, ukončí se podprogram
;**************************************************************
convt	call	resds		;reset/presence
		btfss	PRESEN
		return			;nepřišel presence puls
;............................
		movlw	0cch		;skip rom
		call	wrds
;............................
		movlw	44h		;convert temperature
		call	wrds
		return
;**************************************************************
; Čtení teploty z čidla
;.......................................
; teplota se uloží do LS_Byte a MS_Byte
; správnost čtení je kontrolována výpočtem CRC
; Pokud nepřijde PRESENC puls ukončí se podprogram a do W se
; uloží 01h
; Jsou-li data správně přečtená, nastaví se do W hodnota 00h
; nejsou-li data správně přečtená, nastaví se do W hodnota 01h
;**************************************************************
rdt		call	resds		;reset/presence
		btfss	PRESEN
		retlw	01h		;nepřišel presence puls od čidla
;............................
		movlw	0cch		;skip rom
		call	wrds
;............................
		movlw	0beh		;read scratchpad
		call	wrds
;............................
		clrf	CRC		;inicializace CRC
		call	rdds		;temperature LSB
		movfw	T_RDAT		;do TEMPL
		movwf	LS_Byte
;		call	vypcrc
		call	rdds		;temperature MSB
		movfw	T_RDAT		;do TEMPH
		movwf	MS_Byte
;		call	vypcrc
		goto	TEPLOTA1
;.............................
		movlw	07h		;data slouží pouze pro
		movwf	CTBYTE		;výpočet CRC
;.............................
rdt1		call	rdds
	;	call	vypcrc
		decfsz CTBYTE,f
		goto	rdt1
;.............................
		movfw	CRC		;kontrola CRC=0?
		btfss	SWR,Z
		retlw	01h		;špatně přečtená data
		retlw	00h		;přečtená data jsou OK


;**************************************************************
; Cekaci smycky pro casovani DALLAS sbernice
;**************************************************************
; cekej min. 480 mikrosekund  
; konstanta 9eh pro fosc = 4 MHz RESET pulz (482 mikrosekund)
;**************************************************************
cek480	movlw	0xa5	
	goto	cek
;**************************************************************
; cekej 405 mikrosekund - po teto dobe mohou byt po PRESENC 
; vysilana data 
; konstanta 83h pro fosc = 4 MHz (406 mikrosekund)
;**************************************************************
cek405	movlw	88h	
	goto	cek
;**************************************************************
; cekej 60 mikrosekund - cekani na PRESENC pulz
; Presenc pulz testuj v dobe 15 mikrosekund po tomto cekani
; konstanta 11h pro fosc = 4 MHz (cteni za 61 mikrosekund)
;**************************************************************
cek60	movlw	11h
	goto	cek
;**************************************************************
; cekej 46 mikrosekund - cekani na dalsi cteni dat
; konstanta 0eh pro fosc = 4 MHz (46 mikrosekund)
;**************************************************************
cek46	movlw	0eh
;..............................................................
cek	movwf	TMP1
cek1	decfsz	TMP1,f
	goto	cek1
	return

;**************************************************************
; Vyslani RESET a cteni PRESENCE pulzu po jednovodicove DALLAS
; sbernici
; Pokud PRESENCE pulz prisel, nastavi se ve stavovem slovu programu PSW
; bit PRESEN
;.......................................
; vysle reset, ktery tva 487 mikrosekund
; ceka 65 mikrosekund a po te precte datovou linku 
; (PRESENC pulz = 0) 
;**************************************************************
resds	bcf	STATUS,RP0		;prace s TRIS registry
		bcf	DS		;vysli reset pulz
	call	cek480
	bsf	DS		;ukonci reset pulz
	bsf	STATUS,RP0		;prace s datovymi registry
	call	cek60		;cekej 60 mikrosekund
	bsf	PRESEN		;precti presence pulz
	btfsc	DS
	bcf	PRESEN
;................................
	call	cek405		;pockej 405 mikrosekund
;................................
	return
;**************************************************************
; Precti byte z DSxxxx do T_RDS registru
; po jednovodicove DALLAS sbernici
;.................................
; odstartuje se cteni pulzem dlouhym 5 mikrosekund
; pote se uvolni sbernice a po deseti mikrosekundach se precte
; datova sbernice (bit dat)
; data se ctou po bytech vzdy od LSB
;**************************************************************
rdds	movlw	08h		;nastav pocet ctenych bitu
	movwf	BITSDS
;...............................	
rdb1	bsf	STATUS,RP0
	bcf	DS		;nastav vystup do nuly
;...............................
	goto	rdb2		;cekej 5 mikrosekund
rdb2	goto	rdb20		;!!!pro fosc = 4 MHz!!!
rdb20	nop
	bsf	DS		;uvolni datovou linku
	bcf	STATUS,RP0
;...............................
	goto	rdb3		;cekej 10 mikrosekund
rdb3	goto	rdb4
rdb4	goto	rdb40		;!!!pro fosc = 4 MHz!!!
rdb40	bcf	CARRY
;...............................
	btfsc	DS		;datovy bit do C bitu
	bsf	CARRY
;................................
	rrf	T_RDS,f		;presun datovy bit do T_RDS
	call	cek46		;cekej, az bude mozne cist dalsi bit
	decfsz	BITSDS,f	
	goto	rdb1
;...............................
	movfw	T_RDS
	return
;***************************************************************
; Vysli byte dat ulozeny v T_RDS registru
; po jednovodicove DALLAS sbernici
;...................................
; zapis jednicky - pulz dlouhy 5 mikrosekund
; zapis nuly - pulz dlouhy 60 mikrosekund
; data jsou zapisovana po bytech vzdy od LSB
;**************************************************************
wrds	movwf	T_RDS
;................................
	movlw	08		;nastav pocet vysilanych bitu
	movwf	BITSDS	
	bsf	STATUS,RP0		;vyber TRIS registry
wrb1	rrf	T_RDS,f		;jako prvni je vysilany LSB
	bcf	DS		;nastav vystup do nuly
	btfss	CARRY		;vysilani jednicky
	call	cek60
	goto	wrb10		;!!!pro fosc = 4 MHz!!!
wrb10	bsf	DS		;nastav vystup do jednicky
	btfsc	CARRY
	call	cek60
	decfsz	BITSDS,f
	goto	wrb1
	bcf	STATUS,RP0		;nastav banku 0
;...............................
	return