[/code]




tim0_int: ; *****Прерывание по переполнению timer0
		push tmp2_r
        in tmp1_r, sreg
        push tmp1_r

		inc tim_reg
		cpi tim_reg,45			;если достигнуто значение 45(1 секунда прошла), то читаем температуру
		brne tim0exit			;иначе выходим из прерывания
		clr tim_reg				;сбрасываем регистр-счетчик таймера
		rcall ds1621_gettemp	;считываем температуру с термометра
		rcall ds2bcd			;преобразуем ее в BCD и вычисляем значение Temperature
		rcall bcd2reg			;и выводим на экран
		lds tmp2_r,Temperature
		rcall HEX2ASCII	
		rcall ds1621_gettemp	;считываем температуру с термометра еще раз :E
tim0exit:pop tmp1_r
		out sreg,tmp1_r
		pop tmp2_r
tim0_int_end: reti

; *******ИНИЦИАЛИЗАЦИЯ DS1621***********************

start_ds1621: ;процедура запускает термометр

rcall i2c_start
ldi   i2c_tr1, 144			; 1001 стартовая последовательность, 000-адрес устройства, 0-запись
						; ( 144 = запись , 145 = чтение)
rcall putbyte
ldi   i2c_tr1, 0xEE 		;EE - старт замеров ттемпературы
rcall putbyte			
						
rcall i2c_stop

start_ds1621_end: ret
; *******ОПРОС DS1621***************************
ds1621_gettemp:
push tmp1_r
clr tmp1_r
rcall i2c_start

ldi   i2c_tr1, 144			; 1001 стартовая последовательность, 000-адрес устройства, 0-запись
							; ( 144 = запись , 145 = чтение)
rcall putbyte
ldi   i2c_tr1, 0xAA			; 0хАА - команда на выборку значения термометра
rcall putbyte			

rcall i2c_start

ldi   i2c_tr1, 145			; 1001 стартовая последовательность, 000-адрес устройства, 0-запись
							; ( 144 = запись , 145 = чтение)
rcall putbyte

rcall getbyte			; Берем старший байт
mov tmp1_r, i2c_tr1
rcall getbyte			; Берем младший байи, несмотря на то, что он нам не нужен
clr i2c_tr1
clc
rol tmp1_r
rol i2c_tr1
sts ds1620data, i2c_tr1
sts ds1620data+1, tmp1_r
rcall i2c_stop

pop tmp1_r
ds1621_gettemp_end: ret


; *******ИНИЦИАЛИЗАЦИЯ ОБМЕНА**************************
i2c_start:
    sbi	I2C_PORT, sda
	sbi	I2C_PORT, scl

	cbi	I2C_PORT, sda
	cbi	I2C_PORT, scl
	ret	

; *******ЗАВЕРШЕНИЕ ОБМЕНА*******************
i2c_stop:			; Остановка активности на I2C шине
	cbi	I2C_PORT, sda	; делаем ACK
	sbi	I2C_PORT, scl	; устанавливаем высокий уровень в SCL
	nop
	sbi	I2C_PORT, sda	; и в SDA тоже
	ret
	

; *******ПЕРЕДАЧА БАЙТА по I2C ************
putbyte:			; посылаем байт устройству i2c
	push	i2c_tr2
	ldi 	i2c_tr2, 0x08
putbyte_:	
	clc			; очистить флаг переноса
	adc	i2c_tr1, i2c_tr1	; если переполнение, устанавливается бит переноса
	brcc	carry_set	; переходим, если установлен
	sbi	I2C_PORT, sda	; Setzte Datenleitung
	rjmp	put_out
carry_set:	
	cbi	I2C_PORT, sda	; Lo"sche Datenleitung
put_out:
	rcall pause
	sbi	I2C_PORT, scl	; Signalpuls erzeugen
	rcall pause
	cbi	I2C_PORT, scl
	rcall pause
	dec	i2c_tr2
	brne putbyte_

	cbi	I2C_DDR, sda	
	sbi	I2C_PORT, sda	; Acknowledge Puls Abwarten
	rcall pause
	sbi	I2C_PORT, scl
	rcall pause
	sbi	I2C_DDR, sda
	cbi	I2C_PORT, scl
	rcall pause	
	pop	i2c_tr2
	ret
	
; ******ПРИЕМ БАЙТА по I2C
getbyte:			; принимает байт от устройства и сохраняем 
	push	i2c_tr2
	clr	i2c_tr1
	sbi  	I2C_PORT, sda	
	cbi	I2C_DDR, sda	; Datenpin hochohmig schalten 
				;   (=Eingang)
	ldi 	i2c_tr2, 0x08	;устанавливаем счетчик бит
	clc
getbyte_:	
	sbi	I2C_PORT, scl	; Signalpuls erzeugen
	rcall pause
	sbic	I2C_PIN, sda	; Datenleitung auslesen
	rjmp data_set
	clc			; убираем перенос
	rjmp get_data
data_set:
	sec			; устанавливаем флаг переноса
get_data:
	adc	i2c_tr1,i2c_tr1		; Register u"ber das Carrybit um 
				; eins nach rechts verschieben
	cbi	I2C_PORT, scl	; ( c -> r7 , r(n + 1) -> r(n) , 
				;   r0 -> c )
	rcall pause
	dec	i2c_tr2
	brne getbyte_
	sbi	I2C_DDR, sda
	rcall pause

	cbi	I2C_PORT, sda	; даем ACK ведомому
	rcall pause
	sbi	I2C_PORT, scl
	rcall pause
	cbi	I2C_PORT, scl
	rcall pause
	mov tmp2_r, i2c_tr1
;	rcall HEX2ASCII	
	pop	i2c_tr2
		
		
get_data_end:	ret
	

pause:				; задержка при работе по i2c
	push 	i2c_tr1		; для 10МГц значение счетчика должно быть около 24
	ldi	i2c_tr1, 0x18	
pause_:
	nop
	dec	i2c_tr1
	brne	pause_
	pop	i2c_tr1
	ret
[/code]