;/    ***********************
;/    *                     *
;/    *     ATTiny2313A	    *
;/    *       PODVAL    	*
;/    *                     *
;/    ***********************
ALARM_SEARCH:
		outi	UCSRB,0<<TXCIE|1<<TXEN		// Отключаем прерывания
		cbi		PORTD,LCD_1WIRE				// Включаем датчики
		rcall	USART_1WIRE					// USART настраиваем на работу с датчиками
		ldi		XL,PARAMETRs				// Достаём из памяти  
		ld		Count_SENS,X				// значение количества счётчиков
		ldi		XL,Found_ROM				// Указатель на память ID ROM
		ldi		YL,TERMO_CHWAY				// В TERMO значение температуры
;/    ***********************
NEXT_SENSORs:
		ldwi	Z,START_TERMO*2				// По привычке нужные команды обмена во FLASH
		rcall	SEND_to_SENSORS				// ПОСЫЛАЕМ КОД 0x55
		rcall	SEND_ID						// Посылаем ROM_ID датчика
		rcall	SEND_to_SENSORS				// ПОСЫЛАЕМ КОД 0x44
;/    ***********************
TEST_SENSORs:
		ser		SHIFT_REG					// Ждём конца преобразования 
		rcall	WAIT_UDRE
		cpse	SHIFT_REG,FULL				// опрашивая датчик
		rjmp	TEST_SENSORs
;/    ***********************
		subi	XL,8						// Возвращаем указатель на начало текущего ROM_ID
		rcall	SEND_to_SENSORS				// ПОСЫЛАЕМ КОД 0x55
		rcall	SEND_ID						// Посылаем ROM_ID датчика
		rcall	SEND_to_SENSORS				// Код  ЧТЕНИЕ ПАМЯТИ 0хВЕ
		clr		CRC8						// Очищаем CRC
		ldi		temp1,2						// TEMP1 в качестве счётчика т.к счётчик занят
SAVE_TERMO:
		ser		SHIFT_REG					// Посылаем два байта чтения, по битику
		rcall	WAIT_UDRE
		st		Y+,SHIFT_REG				// Записываем температуру датчиков
		rcall	Calcul_CRC
		dec		temp1
		brne	SAVE_TERMO
;/    ***********************
		ldi		temp1,6						// Ничего не запоминаем , просто считаем данные
EMPTY_LOOP:
		ser		SHIFT_REG
		rcall	WAIT_UDRE
		rcall	Calcul_CRC					// с датчика и вычисляем CRC
		dec		temp1
		brne	EMPTY_LOOP
;/    ***********************
		ser		SHIFT_REG					//	Считываем CRC c дачика
		rcall	WAIT_UDRE
		cpse	SHIFT_REG,CRC8				// Сравниваем 9- байт и посчит. CRC
;/    ***********************
		rjmp	NEW_FIND_or_OUT
		ld		SHIFT_REG,-Y				// Возвращаем в регистры 16-бит значение температуры
		ld		TERMO_REG,-Y
		sbrs	SHIFT_REG,MSB_REG			// Проверяем отрицательная темперратура или нет
		rjmp	PC+4
;/    ***********************
		com		SHIFT_REG					// Если да - переводим в положительное
		neg		TERMO_REG
;/    ***********************
		sbr		Flags,1<<fl_NEG_TERMO		// Но ставим маркер - получена отриц. температура
		ldi		count,4						// Разделяем значение температуры после запятой
		lsr		SHIFT_REG					// и значение текущей температуры т.е делим на 10
X1:		ror		TERMO_REG					// В TERMO_REG собираются значения температуры, в SHIFT_REG - значения после запятой
		ror		SHIFT_REG
		dec		count
		brne	X1
		swap	SHIFT_REG					// Значения собираются в старшей тетраде , готовим их к дальнейшему расчёту
;/    ***********************
		out		GPIOR0,SHIFT_REG			;= а пока запоминаем их
		eor		SHIFT_REG,SHIFT_REG			;= Обнуляем 
		rcall	Bin2_BCD					// И вычисляем значение температуры для вывода на дисплей
		or		temp,TERMO_REG				// Упаковываем и
;/    ***********************
		sbrc	Flags,fl_NEG_TERMO			// Проверяем к какой части градусника принадлежит температура
		sbr		temp,1<<MSB_REG				// Отрицательной - ставим маркер для вывода минуса на экран,
		st		Y+,temp						// запоминаем
;/    ***********************
		ldwi	Z,Accuracy					// В Accuracy значение с которой вычисляется температура после запятой
		in		count,GPIOR0				// Вот и потребовалось значение которое мы запомнили
		cpse	count,zero					// Если оно вдруг 0х00 то пропускаем вычисление
		rjmp	Add_Thousandths				// Иначе вычисляем
		st		Y+,zero						// Но и записываем 0х00 для вывода на дисплей
NEW_FIND_or_OUT:
		dec		Count_SENS					// Если прочитали все датчики 
		breq	ALARM_OUT					// - ВЫХОДИМ
		cbr		Flags,1<<fl_NEG_TERMO		// сбрасываем флаг секунд и флаг отриц. температуры
		rjmp	NEXT_SENSORs
ALARM_OUT:
		cbr		Flags,1<<fl_NEG_TERMO|1<<fl_Second
		sbi		PIND,LCD_1WIRE				// Отключаем датчики
		rcall	USART_SPI
		rcall	OUT_TERMO
		lds		count,TIME
		ldi		temp,TimeOutSens
X2:
		add		R8,temp
		dec		count
		brne	X2
		dec		R8
		ldi		SHIFT_REG,0xEF				;- Переходим к опросу кнопок , там и будем торчать - выходя для опроса дачиков и в МЕНЮ
		rjmp	START_FIND_KNOB
;/	Вычисляем значение после запятой
Add_Thousandths:
		eor		SHIFT_REG,SHIFT_REG			;= Обнуляем
		mov		TERMO_REG,SHIFT_REG			;= Обнуляем
;- Всё сводится к вычислению суммы коэффициента заданым преобразованием
;- поэтому и участвует ZH в котором при точности 0,0625 находится старшее значение 625
X5:		
		add		TERMO_REG,ZL
		adc		SHIFT_REG,ZH
		dec		count
		brne	X5
		rcall	Bin2_BCD					; И вычисляем значение после запятой для вывода на дисплей
		st		Y+,temp1					; Запоминаем
		rjmp	NEW_FIND_or_OUT
;|*************************************************
;|        		 ;;/ Subroutines ;;|		  	  *
;|*************************************************
SEND_ID:
		ldi		temp1,8						// Постепенно пересылаем ID ROM каждого датчика
SEND_ROM:
		ld		SHIFT_REG,X+			
		rcall	WAIT_UDRE
		dec		temp1
		brne	SEND_ROM
		ret
;*****************************************************
;* 	;;/Bin2BCD == 16-bit Binary to BCD conversion;;* *
;*****************************************************
Bin2_BCD:
;=initialize digit 4
		ldi		count,0xff
binbcd_4:
		inc		count
		subi	TERMO_REG,low(10000)		;subiw fbin,10000
		sbci	SHIFT_REG,high(10000)
		brcc	binbcd_4		
;=initialize digits 3 and 2
		ldi		temp1,0x9F
binbcd_3:	
		subi	temp1,0x10
		subi	TERMO_REG,low(-1000)		;addiw fbin,10
		sbci	SHIFT_REG,high(-1000)
		brcs	binbcd_3
binbcd_2:
		inc		temp1
		subi	TERMO_REG,low(100)			;subiw fbin,100
		sbci	SHIFT_REG,high(100)
		brcc	binbcd_2
;=itialize digits 1
		ldi		temp,0xA0
binbcd_1:
		subi	temp,0x10
		subi	TERMO_REG,-10				;addi fbin,10
		brcs	binbcd_1
		ret
;|************************************************
;*      	 	  ;;/ Tables ;;*		  		 *
;|************************************************

START_TERMO: .db 0xF0,0X55,0x00,0x44,0x00,0xF0,0x55,0x00,0xBE
			 .db 0x00
