include "ds1820.inc"

;************************************
;*                                  *
;*                                  *
;*                                  *
;*                                  *
;************************************
PIN_HI
	bsf STATUS, RP0						; Banco 1
	bsf OWIRE_CONTROL_PORT, OWIRE_DQ0	; Alta impedancia (1)
	bcf STATUS, RP0						; Banco 0
	return

;************************************
;*                                  *
;*                                  *
;*                                  *
;*                                  *
;************************************
PIN_LO
	bcf OWIRE_CONTROL_PORT, OWIRE_DQ0	; A cero
	bsf STATUS, RP0						; Banco 1
	bcf OWIRE_CONTROL_PORT, OWIRE_DQ0	; Baja impedancia (0)
	bcf STATUS, RP0						; Banco 0
	return

;************************************
;*                                  *
;*                                  *
;*                                  *
;*                                  *
;************************************
OneWireWait
	call OneWireReadByte
	movlw 0xff
	subwf I_BYTE, W
	btfss STATUS, Z
	goto OneWireWait

	return

;************************************
;*                                  *
;*                                  *
;*                                  *
;*                                  *
;************************************
OneWireResetBus2
	call PIN_HI
	call PIN_LO

	movlw .50
	call DELAY_10USEC	; 500 us

	call PIN_HI
	movlw .50
	call DELAY_10USEC	; 500 us

	return

;************************************
;*                                  *
;*                                  *
;*                                  *
;*                                  *
;************************************
OneWireResetBus
	bcf RX_STATE, RX_PRES_BIT			; Suponemos que no hay nadie en el bus
	bcf OWIRE_CONTROL_PORT, OWIRE_DQ0	; Ponemos la linea a cero

	bsf STATUS, RP0						; Banco 1

	bcf STATUS, RP0						; Banco 0

	call PIN_HI
	call PIN_LO

	movlw .50
	call DELAY_10USEC	; 500 us

	call PIN_HI
	movlw .50
	call DELAY_10USEC	; 500 us

	return

;************************************
;*                                  *
;*                                  *
;*                                  *
;*                                  *
;************************************
OneWireReadByte
	movlw .8
	movwf TMP1
	clrf I_BYTE

nextreadbit
	call PIN_LO     ; momentary low on DATA_PIN
	nop
	call PIN_HI
	nop
	nop
	nop
	nop
	nop
	nop
	movf OWIRE_CONTROL_PORT, W			; 7 usecs later, fetch from DATA_PIN
	movwf TMP2
	btfss TMP2, OWIRE_DQ0
	bcf STATUS, C						; its a zero
	btfsc TMP2, OWIRE_DQ0
	bsf STATUS, C						; its a one

	rrf I_BYTE, F
	movlw .6							; now delay 60 usecs
	call DELAY_10USEC
	decfsz TMP1, F
	goto nextreadbit

	movfw I_BYTE						; return the result in W
	return

;************************************
;*                                  *
;*                                  *
;*                                  *
;*                                  *
;************************************
OneWireWriteByte
	movwf O_BYTE						; O_BYTE = W

	movlw .8			
	movwf TMP1
nextwritebit
	rrf O_BYTE, F
	btfss STATUS, C						; ż0 o 1?
	goto write0
	goto write1
siguiente
	decfsz TMP1, F						; żya van 8 bits?
	goto nextwritebit			
	return

write0
	call PIN_LO
	movlw .6
	call DELAY_10USEC					; Delay de 60usec
	call PIN_HI
	goto siguiente

write1
	call PIN_LO
	call PIN_HI
	movlw .6
	call DELAY_10USEC					; Delay de 60usec
	call PIN_HI
	goto siguiente

;************************************
;*                                  *
;*                                  *
;*                                  *
;*                                  *
;************************************
OneWireReadRom
	movlw READ_ROM
	call OneWireWriteByte

	movlw LASEREDROM					; Inicio del buffer
	movwf FSR

	movlw .8							; 8 bytes a leer
	movwf TMP1

read_rom1								; Leemos y lo vamos metiendo en el buffer
	call OneWireReadByte
	movwf INDF
	incf FSR, F
	decfsz TMP1, F
	goto read_rom1

	return

;************************************
;*                                  *
;*                                  *
;*                                  *
;*                                  *
;************************************
OneWireMatchRom
	movlw MATCH_ROM
	call OneWireWriteByte

	movlw LASEREDROM					; Inicio del buffer
	movwf FSR

	movlw .8							; 8 bytes a escribir
	movwf TMP1

match_rom1								; Vamos escribiendo byte a byte
	movf INDF, W
	call OneWireWriteByte
	incf FSR, F
	decfsz TMP1, F
	goto match_rom1

	return

;************************************
;*                                  *
;*                                  *
;*                                  *
;*                                  *
;************************************
DS1820ConvertT
	movlw CONVERT_T
	call OneWireWriteByte

	return

;************************************
;*                                  *
;*                                  *
;*                                  *
;*                                  *
;************************************
DS1820ReadTemperature
	movlw READ_SCRATCHPAD
	call OneWireWriteByte

	call OneWireReadByte
	movwf TEMPERATURA_LSB

	call OneWireReadByte
	movwf TEMPERATURA_MSB

	call OneWireReadByte
	;movwf TH

	call OneWireReadByte
	;movwf TL

	call OneWireReadByte
	;movwf RESERVED1

	call OneWireReadByte
	;movwf RESERVED2

	call OneWireReadByte
	;movwf COUNT_REMAIN

	call OneWireReadByte
	;movwf COUNT_PERC

	return

;************************************
;*                                  *
;*  rellena las variables:			*
;*                                  *
;*  Scratchpad:                     *
;*		TEMPERATURA_LSB				*
;*		TEMPERATURA_MSB				*
;* 		TH							*
;* 		TL							*
;*		RESERVED1					*
;*		RESERVED2					*
;*		COUNT_REMAIN				*
;*		COUNT_PERC					*
;*                                  *
;*  Variables:						*
;*		TEMPERATURA_SIGNO			*
;*		TEMPERATURA					*
;*		TEMPERATURA_RESTO			*
;*                                  *
;************************************
DS1820GetTemperature
	call OneWireResetBus
	call OneWireReadRom

	call OneWireResetBus
	call OneWireMatchRom
	call DS1820ConvertT
	call OneWireWait

	call OneWireResetBus
	call OneWireMatchRom
	call DS1820ReadTemperature

	movlw '+'
	movfw TEMPERATURA_SIGNO					; Suponemos una lectura positiva

	movlw 0xff
	andwf TEMPERATURA_MSB, F
	btfsc STATUS, Z						; Si es cero la temperatura es positiva
	goto sobrecero

	movlw '-'
	movfw TEMPERATURA_SIGNO

sobrecero
	clrf TEMPERATURA_RESTO
	movfw TEMPERATURA_LSB
	movwf TEMPERATURA					; TEMPERATURA = TEMPERATURA_LSB

	rrf TEMPERATURA, F
	bcf TEMPERATURA, 7
	btfsc STATUS, C						; Si es uno tenemos un .5, si es 0 un .0
	incf TEMPERATURA_RESTO, F					
	bcf TEMPERATURA, 7

	return






