
; функция инициализации датчика
;---------------------------------------------------------------------------
RESET_PULSE:
	bcf	INTCON, GIE
	banksel	GPIO			; просаживаем шину на 500 мкСек	
	bcf	GPIO, ONEWIRE_PIN	; импульс сброса от мастера
	banksel	TRISIO	
	bcf	TRISIO, ONEWIRE_PIN
;---------------------------------------------------------------------------
	movlw	(.512-.500+.6)/.2	; [1]
	banksel	TMR0			; [1]	
	movwf	TMR0			; [1]
	bcf	INTCON, T0IF		; [1]
	
RESET_PULSE_LOOP_500:
	btfss	INTCON, T0IF
	goto	RESET_PULSE_LOOP_500		
;---------------------------------------------------------------------------

	banksel	TRISIO			; отпускаем шину	
	bsf	TRISIO, ONEWIRE_PIN

;---------------------------------------------------------------------------
	movlw	(.512-.50+.6)/.2
	banksel	TMR0	
	movwf	TMR0
	bcf	INTCON, T0IF
	
RESET_PULSE_LOOP_50:
	btfss	INTCON, T0IF		; заряжаем таймер на 50 мкСек
	goto	RESET_PULSE_LOOP_50		

	movlw	(.512-.500+.6)/.2
	movwf	TMR0
	bcf	INTCON, T0IF
	
RESET_PULSE_LOOP_500_:			; заряжаем таймер на 500 мкСек
					; и щупаем ответ от датчика
	banksel	GPIO
	btfss	GPIO, ONEWIRE_PIN 
	goto	RESET_PULSE_PRESENSE_OK
	btfss	INTCON, T0IF
	goto	RESET_PULSE_LOOP_500_	; ждем окончания отсчета		
	bcf	FLAG, DEVICE_OK		; флаг датчик не обнаружен
	return	

RESET_PULSE_PRESENSE_OK:
	btfss	INTCON, T0IF
	goto	RESET_PULSE_PRESENSE_OK	; ждем окончания отсчета		
	bsf	FLAG, DEVICE_OK		; флаг датчик обнаружен
	clrwdt
	return	                

; Передача мастером L уровня
;---------------------------------------------------------------------------
L_MASTER_TX:
	banksel	GPIO					
	bcf	GPIO, ONEWIRE_PIN	; порт на вывод	
	banksel	TRISIO	
	bcf	TRISIO, ONEWIRE_PIN

	movlw	(.512-.70+.6)/.2
	banksel	TMR0	
	movwf	TMR0
	bcf	INTCON, T0IF
	
RESET_PULSE_LOOP_70:
	btfss	INTCON, T0IF		; заряжаем таймер на 70 мкСек
	goto	RESET_PULSE_LOOP_70		

	banksel	TRISIO			; отпускаем шину	
	bsf	TRISIO, ONEWIRE_PIN	; подтяжка

	return
	
; Передача мастером H уровня
;---------------------------------------------------------------------------
H_MASTER_TX:
	banksel	GPIO					
	bcf	GPIO, ONEWIRE_PIN	; порт на вывод	
	banksel	TRISIO	
	bcf	TRISIO, ONEWIRE_PIN

	nop   				; pause 2 uSec
	nop

	banksel	TRISIO			; отпускаем шину	
	bsf	TRISIO, ONEWIRE_PIN	; подтяжка

	movlw	(.512-.75+.6)/.2
	banksel	TMR0	
	movwf	TMR0
	bcf	INTCON, T0IF
	
RESET_PULSE_LOOP_75:
	btfss	INTCON, T0IF		; заряжаем таймер на 70 мкСек
	goto	RESET_PULSE_LOOP_75	; ждем окончание отсчета	
	return

; Прием мастером бита
; выход: 	бит C регистра STATUS содержит принятый бит
;--------------------------------------------------------------------------
MASTER_RX:
	banksel	GPIO					
	bcf	GPIO, ONEWIRE_PIN	; порт на вывод	
	banksel	TRISIO	
	bcf	TRISIO, ONEWIRE_PIN

	nop   				; 2 uSec
	nop

	banksel	TRISIO			; отпускаем шину	
	bsf	TRISIO, ONEWIRE_PIN	; подтяжка

	nop
	nop
	nop
	nop
	nop
	nop				; 8 uSec
	nop

	banksel	GPIO
	btfsc	GPIO, ONEWIRE_PIN
	goto	H_L_MASTER_RX_1

	movlw	(.512-.70+.6)/.2
	banksel	TMR0	
	movwf	TMR0
	bcf	INTCON, T0IF

H_L_MASTER_RX_0:
	btfss	INTCON, T0IF		; заряжаем таймер на 70 мкСек
	goto	H_L_MASTER_RX_0		; ждем окончание отсчета

	bcf	STATUS, C
	return		

H_L_MASTER_RX_1:
	movlw	(.512-.70+.6)/.2
	banksel	TMR0	
	movwf	TMR0
	bcf	INTCON, T0IF

H_L_MASTER_RX_1_:
	btfss	INTCON, T0IF		; заряжаем таймер на 70 мкСек
	goto	H_L_MASTER_RX_1_	; ждем окончание отсчета
	
	bsf	STATUS, C
	return		


; Передача байта данных мастером
; Вход: 	WREG - передаваемый байт. 
;--------------------------------------------------------------------------
MASTER_TX_BYTE:
	movwf	SEND_BYTE

	movlw	.8
	movwf	BIT_COUNTER
	
MASTER_TX_BYTE_LOOP:	
	clrwdt
	bcf	STATUS, C
	rrf	SEND_BYTE, F	
	btfsc	STATUS, C	
	goto	MASTER_TX_BYTE_1

MASTER_TX_BYTE_0:
	call	L_MASTER_TX	
	goto	MASTER_TX_BYTE_2

MASTER_TX_BYTE_1:	
	call	H_MASTER_TX	

MASTER_TX_BYTE_2:
	decfsz	BIT_COUNTER, F
	goto	MASTER_TX_BYTE_LOOP
	return	
	
; Прием байта данных мастером
; Выход: 	WREG - принятый байт. 
;--------------------------------------------------------------------------
MASTER_RX_BYTE:
	clrwdt
	movlw	.8
	movwf	BIT_COUNTER

MASTER_RX_BYTE_LOOP:	
	clrwdt
	call	MASTER_RX	
	rrf	RECIVE_BYTE, F
	
	decfsz	BIT_COUNTER, F
	goto	MASTER_RX_BYTE_LOOP

	movf	RECIVE_BYTE, W	
	return	

; Прием буфера данны 1wire
; Вход:		WREG - количество принимаемых байт
;--------------------------------------------------------------------------
LOOP_RX_BUFER:
	movwf	BYTE_COUNT

	movlw	RECIVE_BUFER	; указатель на начало буфера
	movwf	FSR
		

LOOP_RX_BUFER_LOOP:
	call	MASTER_RX_BYTE
	movwf	INDF

	incf	FSR, F
	decfsz	BYTE_COUNT, F	
	goto	LOOP_RX_BUFER_LOOP

	return
		
	
; Вычисление контрольной суммы 
; выход:	CRC - контрольная сумма
;--------------------------------------------------------------------------
CRC_8:
	clrf	CRC       		
	movlw	.8           		
	movwf	BYTE_COUNT 		
	movlw	RECIVE_BUFER    	
	movwf	FSR         		

CRC_:      
	movlw	.8           		
	movwf	BIT_COUNTER		
	movf	INDF, W      		
	movwf	REG_1			
CRC__:      
	clrwdt
	xorwf	CRC, W     		
	movwf	REG_0			
	rrf	REG_0, W		
	movf	CRC, W     		
	btfsc	STATUS, C    		
	xorlw	b'00011000' 		
	movwf	REG_0			
	rrf	REG_0, W		 
	movwf	CRC       		
	bcf	STATUS, C    		
	rrf	REG_1, F		
	movf	REG_1, W		

	decfsz	BIT_COUNTER, F	   	
	goto	CRC__     		
                                   	
	incf	FSR, F       		
                                   	
	decfsz	BYTE_COUNT, F		
	goto	CRC_     		
                                   		    
	return	

; калибровка датчика температуры DS18B20
;--------------------------------------------------------------------------
SAVE_EEPROM_CALIB:
	call	RESET_PULSE
	btfss	FLAG, DEVICE_OK
	goto	PROGRAMM

	movlw 	0xCC			; Skip ROM пропускаем адресацию
	call	MASTER_TX_BYTE
		
	movlw	0x4E			; Write Scratchpad. 
	call	MASTER_TX_BYTE

	movlw 	0x4B			; TH 
	call	MASTER_TX_BYTE

	movlw 	0x46			; TL		
	call	MASTER_TX_BYTE

	movlw	0x1F			; Config Temp 9 bit  
	call	MASTER_TX_BYTE
	
	call	RESET_PULSE
	btfss	FLAG, DEVICE_OK
	goto	PROGRAMM

	movlw	0xCC			; Skip ROM пропускаем адресацию
	call	MASTER_TX_BYTE

	movlw 	0xBE			; read Scratchpad
	call	MASTER_TX_BYTE

	movlw 	.9			; принимаем 9 байт
	call	LOOP_RX_BUFER

	call	CRC_8

; проверяем контрольную сумму
	movf	RECIVE_BUFER+8, W	; байт CRC считаный с датчика
	subwf	CRC, W			; проверка на соответствие 
	btfss	STATUS, Z
	goto	PROGRAMM		

	movf	RECIVE_BUFER+4, W	; считываем Config регистр
	sublw	0x1F			; 9 бит прописано или нет?
	btfss	STATUS, Z
	goto	SAVE_EEPROM_CALIB	; если не соответствует, калибруем датчик

; сохраняем Scratchpad в еепром датчика 
NEXT_LOOP_0:
	call	RESET_PULSE
	btfss	FLAG, DEVICE_OK
	goto	PROGRAMM
	
	movlw	0xCC			; Skip ROM пропускаем адресацию
	call	MASTER_TX_BYTE

	movlw 	0x48			; Copy Scratchpad
	call	MASTER_TX_BYTE

	goto	LED_MAYAK		; пауза 1 сек для прошивки EEPROM датчика	
					; калибровка завершина		

