;==========================================
; ОБРАБОТКА ПРЕРЫВАНИЯ ПРИ ПОЛУЧЕНИИ БАЙТА          
;==========================================
USART_RXC:					;Обработка прерывания получение символа
	in 		temp,UDR		;Полученный бит помещаем в рабочий регистр
	cbi 	UCSRB,RXCIE		;Запрещаем прерывание "Прием закончен"
	rcall	check_symbol	;Вызываем процедуру проверки символа
	sbi		UCSRB,RXCIE		;Разрешаем прерывание "Прием закончен"
	reti

;Процедура вывода символа в порт
Out_com:					
		sbis 	UCSRA, UDRE
		rjmp 	Out_com
		out 	UDR,temp
		ret

send_temperature:
	rcall	Stop_Timer0
	mov		temp, digit1
	rcall	out_com
	mov		temp, digit2
	rcall	out_com
	mov		temp, digit3
	rcall	out_com
	mov		temp, digit4
	rcall	out_com
	rcall	Start_Timer0
	ret

;==========================================
;ПОДПРОГРАММА  ИЗМЕРЕНИЯ ТЕМПЕРАТУРЫ
;==========================================
Read_ds:					;Считывание значения температуры
	rcall	Stop_Timer0
	rcall 	ds
	rcall 	bcd_convert
	rcall	send_temperature
	rcall	Start_Timer0
	ret

;==================================================
; ОБРАБОТКА ТЕМПЕРАТУРНОГО ДАТЧИКА DS 18B20
;==================================================
;********************* DS1820 *******************

Ds:

		rcall 	ds_reset 				; вызов обнуления линии
		ldi 	ds_command, 0xCC		; пропуск идентификации
		rcall 	ds_write
		ldi 	ds_command, 0x44 		; команда на преобразования
		rcall 	ds_write
		rcall	Delay800ms				; ожидание завершения преобразования
		rcall 	ds_reset 				; вызов обнуления линии
		ldi 	ds_command, 0xCC
		rcall 	ds_write
		ldi 	ds_command, 0xBE 		;чтение блокнота, получение результата
		rcall 	ds_write
		ldi		temp, 5
		rcall	ds_delay
		rcall 	ds18s20_read			; принять 8 бит

ret
		
ds_delay:

		ldi 	duration, 2				; 2,75uS*temp
	cycle:
		nop
		dec 	duration
		brne	cycle
		dec 	temp
		brne	ds_delay
ret

			
ds_longdelay:

		mov 	ds_counter, temp		; 0,7ms*temp
	Label:
		ldi 	temp,0xff
		rcall 	ds_delay
		dec 	ds_counter
		brne 	Label
ret

ds_reset:

		cbi	 	PORTD,	PD3
		ldi		temp, 0b11111010				; Portb выход
		out		DDRD, temp
		ldi 	temp, 	220						; обнуление 600мкс
		rcall 	ds_delay
		ldi		temp, 0b11110010				; PortD.3 вход
		out		DDRD, temp
		ldi 	temp, 	220 					; принятие импульса присутствия 600мкс
		rcall 	ds_delay
ret


ds_write:
		
		ldi 	wr_counter,8
	Label1:
		lsr 	ds_command			; лог сдвиг 0 бит -> CF
		brcs 	one_wr				; пререход если CF=1
		rjmp 	zero_wr

	
	one_wr:

		cbi 	PORTD, PD3
		ldi 	temp, 0b11111010
		out		DDRD, temp			; PORTD.3 - выход
		ldi 	temp, 1				; 2,7мкс
		rcall 	ds_delay 
		ldi		temp, 0b11110010	; PORTD.3 - вход
		out		DDRD, temp
		ldi 	temp,20 			; 60мкс - продление "1"
		rcall 	ds_delay	
		rjmp 	Label2

	zero_wr:
		
		cbi 	PORTD, PD3
		ldi 	temp, 0b11111010
		out		DDRD, temp			; PORTD.3 - выход
		ldi 	temp, 26			; 70мкс
		rcall 	ds_delay 
		ldi		temp, 0b11110010	; PORTD.3 - вход
		out		DDRD, temp

	Label2:
	ldi 	temp, 1				; задержки между посылками битов 2,7мкс
	rcall 	ds_delay
	dec 	wr_counter
	brne 	Label1				; проверка счетчика
ret
;***********************************************************
;*********   ЧТЕНИЕ ДАТЧИКА DS1820/DS18S20   ***************
;***********************************************************
ds18s20_read:

	ldi 	wr_counter, 9
	ldi 	lbyte, 0x00

	label3_18s20:

	cbi 	PORTD,PD3
	
	ldi 	temp, 0b11111010		; PD3 - output
	out 	DDRD, temp

	ldi 	temp,2
	rcall 	ds_delay				; синхроимпульс 2,7мкс
	
	
	ldi 	temp, 0b11110010 		; PD3 - input
	out 	DDRD, temp 

	ldi 	temp, 3
	rcall 	ds_delay				; проверка через 8мкс

	cpi 	wr_counter, 1
	breq 	sign_18s20

	sbis 	PIND, PD3				; проп. след ком если PD3=1
	rjmp 	zero_r_18s20

		one_r_18s20:
			lsr 	lbyte
			ori 	lbyte,0x80
			rjmp 	label4_18s20

		zero_r_18s20:
			lsr 	lbyte
			nop

	label4_18s20:
	ldi 	temp, 22				; 60мкс
	rcall 	ds_delay

	dec 	wr_counter
	brne 	label3_18s20					; переход если ds_counter > 0
	
	
sign_18s20:

	ldi 	hbyte, 0b11111010
	sbis 	PIND, PD3				; проп. след ком если PB0=1
	ldi 	hbyte, 0x00

	nop
	ldi 	temp, 22				; 60мкс
	rcall 	ds_delay

	ldi 	digit1, -3				; отобразить "-"


ret
;************************** BCD ****************************

bcd_convert:

		clr 	digit1
		clr 	digit2
		clr 	digit3
		clr 	digit4


		cpi 	hbyte, 0x00
		breq 	plus
		
		com 	lbyte
		inc 	lbyte
		ldi 	digit1, -3

plus:
		mov 	temp, lbyte
		lsr 	temp

		M1:
		cpi 	temp, 0b01100100   			; проверка на 100
		brge 	M2

		rjmp 	M3

		M2:
		inc 	Digit1						;
		subi 	temp,0b01100100		
		rjmp 	M1


		M3:
		cpi 	temp, 0b00001010			; проверка на 10
		brge 	M4
		rjmp 	M5

		M4:
		inc 	Digit2
		subi 	temp, 0b00001010			;
		rjmp 	M3


		M5:
		cpi 	temp, 0b00000001			; проверка на 1
		brge 	M6
		rjmp 	M7

		M6:
		inc 	Digit3
		dec 	temp
		rjmp 	M5

;********************  десятые    ********************

		M7:
		mov 	temp, lbyte
		andi 	temp, 0b00000001

		sbrs 	temp, 0 					;проверка на 0,5
		rjmp 	M8
		subi 	Digit4, -5					;прибавляем 5

;***************** преобразования    ******************
	
		M8:							
		cpi 	Digit1, 0
		brne 	M9
		ldi 	Digit1, 0x60				; не печатаем 0
		cpi 	Digit2, 0
		brne 	M9
		;ldi 	Digit2, 0x60				; не печатаем 0
		ldi 	Digit2, 0x00				; не печатаем 0		
		
		M9:
		cpi 	Digit1, -3
		brne 	M10
		cpi 	Digit2, 0
		brne 	M10
		;ldi 	Digit2, 0x60				; не печатаем 0
		ldi 	Digit2, 0x00				; не печатаем 0		

		M10:
		subi 	Digit1, -48				; подготовка к пересылке
		subi 	Digit2, 0;-48
		subi 	Digit3, 0;-48
		subi 	Digit4, 0;-48
		

ret