;12/03/2010 блок управления для лампового приемника.
; версия 1.0
;adding@bigmir.net Сергей Пивоваров

;Блок управления передает информацию через UART.

;***** Specify Device
.device ATmega8535

;***** I/O Register Definitions
.equ	SREG	=$3f
.equ	SPH	=$3e
.equ	SPL	=$3d
.equ	OCR0	=$3c
.equ	GIMSK	=$3b
.equ	GICR	=$3b			;new name for GIMSK
.equ	GIFR	=$3a
.equ	TIMSK	=$39
.equ	TIFR	=$38
.equ	SPMCR	=$37
.equ    I2CR    =$36
.equ    TWCR    =$36
.equ    MCUCR   =$35
.equ    MCUSR   =$34			;For compatibility, 
.equ    MCUCSR  =$34			;keep both names until further
.equ	TCCR0	=$33
.equ	TCNT0	=$32
.equ    OSCCAL  =$31
.equ    SFIOR   =$30
.equ	TCCR1A	=$2f
.equ	TCCR1B	=$2e
.equ	TCNT1H	=$2d
.equ	TCNT1L	=$2c
.equ	OCR1AH	=$2b
.equ	OCR1AL	=$2a
.equ	OCR1BH	=$29
.equ	OCR1BL	=$28
.equ	ICR1H	=$27
.equ	ICR1L	=$26
.equ	TCCR2	=$25
.equ	TCNT2	=$24
.equ	OCR2	=$23
.equ	ASSR	=$22
.equ	WDTCR	=$21
.equ    UBRRH   =$20			;Note! UCSRC equals UBRRH
.equ	EEARH	=$1f
.equ	EEARL	=$1e
.equ	EEDR	=$1d
.equ	EECR	=$1c
.equ	PORTA	=$1b
.equ	DDRA	=$1a
.equ	PINA	=$19
.equ	PORTB	=$18
.equ	DDRB	=$17
.equ	PINB	=$16
.equ	PORTC	=$15
.equ	DDRC	=$14
.equ	PINC	=$13
.equ	PORTD	=$12
.equ	DDRD	=$11
.equ	PIND	=$10
.equ	SPDR	=$0f
.equ	SPSR	=$0e
.equ	SPCR	=$0d
.equ	UDR		=$0c
.equ	UCSRA	=$0b
.equ	UCSRB	=$0a
.equ	UCSRC	=$20			;Note! UCSRC equals UBRRH
.equ	UBRRL	=$09
.equ	ACSR	=$08
.equ    ADMUX   =$07
.equ    ADCSRA  =$06
.equ    ADCH    =$05
.equ    ADCL    =$04
.equ    I2DR    =$03
.equ    I2AR    =$02
.equ    I2SR    =$01
.equ    I2BR    =$00
.equ    TWDR    =$03
.equ    TWAR    =$02
.equ    TWSR    =$01
.equ    TWBR    =$00

;***** Bit definitions*****	  
;GICR
.equ	INT1	=7
.equ	INT0	=6
.equ	INT2	=5
.equ	IVSEL	=1		; interrupt vector select
.equ	IVCE	=0		; interrupt vector change enable

;GIFR
.equ	INTF1	=7
.equ	INTF0	=6
.equ	INTF2	=5

;TIMSK
.equ    TOIE0   =0
.equ    OCIE0   =1
.equ    TOIE1   =2
.equ    OCIE1B  =3
.equ    OCIE1A  =4
.equ    TICIE1  =5
.equ    TOIE2   =6
.equ    OCIE2   =7

;TIFR
.equ    TOV0    =0
.equ    OCF0    =1
.equ    TOV1    =2
.equ    OCF1B   =3
.equ    OCF1A   =4
.equ    ICF1    =5
.equ    TOV2    =6
.equ    OCF2    =7

;SPMCR
.equ	SPMIE	=7
.equ	RWWSB	=6
.equ	RWWSRE	=4
.equ	BLBSET	=3
.equ	PGWRT	=2
.equ	PGERS	=1
.equ	SPMEN	=0

;MCUCR
.equ    SM2     =7
.equ    SE      =6
.equ    SM1     =5
.equ    SM0     =4
.equ    ISC11   =3
.equ    ISC10   =2
.equ    ISC01   =1
.equ    ISC00   =0

;MCUCSR
.equ    ISC2    =6
.equ    WDRF    =3
.equ    BORF    =2
.equ    EXTRF   =1
.equ    PORF    =0

;TCCR0
.equ    FOC0    =7
.equ    PWM0    =6		; OBSOLETE! Use WGM00
.equ	WGM00	=6
.equ	COM01	=5
.equ	COM00	=4
.equ	CTC0	=3		; OBSOLETE! Use WGM01
.equ	WGM01	=3	
.equ	CS02	=2
.equ	CS01	=1
.equ	CS00	=0

;TCCR1A
.equ	COM1A1	=7
.equ	COM1A0	=6
.equ	COM1B1	=5
.equ	COM1B0	=4
.equ	FOC1A	=3
.equ	FOC1B	=2
.equ	PWM11	=1		; OBSOLETE! Use WGM11
.equ	PWM10	=0		; OBSOLETE! Use WGM10
.equ	WGM11	=1
.equ	WGM10	=0

;TCCR1B
.equ	ICNC1	=7
.equ	ICES1	=6
.equ	CTC1	=3		; OBSOLETE! Use WGM12
.equ	CTC11	=4		; OBSOLETE! Use WGM13
.equ	CTC10	=3		; OBSOLETE! Use WGM12
.equ	WGM13	=4
.equ	WGM12	=3
.equ	CS12	=2
.equ	CS11	=1
.equ	CS10	=0

;TCCR2
.equ	FOC2	=7
.equ    PWM2    =6		; OBSOLETE! Use WGM20
.equ	WGM20	=6
.equ    COM21   =5
.equ    COM20   =4
.equ    CTC2    =3		; OBSOLETE! Use WGM21
.equ	WGM21	=3		
.equ    CS22    =2
.equ    CS21    =1
.equ    CS20    =0

;SFIOR
.equ    ADTS2   =7
.equ    ADTS1   =6
.equ    ADTS0   =5
.equ    ADHSM   =4
.equ    ACME    =3
.equ    PUD     =2
.equ	PSR2	=1
.equ	PSR10	=0

;WDTCR
.equ	WDCE	=4
.equ	WDTOE	=4
.equ	WDE	=3
.equ	WDP2	=2
.equ	WDP1	=1
.equ	WDP0	=0

;EECR
.equ    EERIE   =3
.equ	EEMWE	=2
.equ	EEWE	=1
.equ	EERE	=0

;PORTA
.equ	PA7	=7
.equ	PA6	=6
.equ	PA5	=5
.equ	PA4	=4
.equ	PA3	=3
.equ	PA2	=2
.equ	PA1	=1
.equ	PA0	=0

;DDRA
.equ	DDA7	=7
.equ	DDA6	=6
.equ	DDA5	=5
.equ	DDA4	=4
.equ	DDA3	=3
.equ	DDA2	=2
.equ	DDA1	=1
.equ	DDA0	=0

;PINA
.equ	PINA7	=7
.equ	PINA6	=6
.equ	PINA5	=5
.equ	PINA4	=4
.equ	PINA3	=3
.equ	PINA2	=2
.equ	PINA1	=1
.equ	PINA0	=0

;PORTB
.equ	PB7	=7
.equ	PB6	=6
.equ	PB5	=5
.equ	PB4	=4
.equ	PB3	=3
.equ	PB2	=2
.equ	PB1	=1
.equ	PB0	=0

;DDRB
.equ	DDB7	=7
.equ	DDB6	=6
.equ	DDB5	=5
.equ	DDB4	=4
.equ	DDB3	=3
.equ	DDB2	=2
.equ	DDB1	=1
.equ	DDB0	=0

;PINB
.equ	PINB7	=7
.equ	PINB6	=6
.equ	PINB5	=5
.equ	PINB4	=4
.equ	PINB3	=3
.equ	PINB2	=2
.equ	PINB1	=1
.equ	PINB0	=0

;PORTC
.equ	PC7	=7
.equ	PC6	=6
.equ	PC5	=5
.equ	PC4	=4
.equ	PC3	=3
.equ	PC2	=2
.equ	PC1	=1
.equ	PC0	=0

;DDRC
.equ	DDC7	=7
.equ	DDC6	=6
.equ	DDC5	=5
.equ	DDC4	=4
.equ	DDC3	=3
.equ	DDC2	=2
.equ	DDC1	=1
.equ	DDC0	=0

;PINC
.equ	PINC7	=7
.equ	PINC6	=6
.equ	PINC5	=5
.equ	PINC4	=4
.equ	PINC3	=3
.equ	PINC2	=2
.equ	PINC1	=1
.equ	PINC0	=0

;PORTD
.equ	PD7	=7
.equ	PD6	=6
.equ	PD5	=5
.equ	PD4	=4
.equ	PD3	=3
.equ	PD2	=2
.equ	PD1	=1
.equ	PD0	=0

;DDRD
.equ	DDD7	=7
.equ	DDD6	=6
.equ	DDD5	=5
.equ	DDD4	=4
.equ	DDD3	=3
.equ	DDD2	=2
.equ	DDD1	=1
.equ	DDD0	=0

;PIND
.equ	PIND7	=7
.equ	PIND6	=6
.equ	PIND5	=5
.equ	PIND4	=4
.equ	PIND3	=3
.equ	PIND2	=2
.equ	PIND1	=1
.equ	PIND0	=0

;UCSRA
.equ	RXC	=7
.equ	TXC	=6
.equ	UDRE	=5
.equ	FE	=4
.equ	ORW	=3		; old name kept for compatibilty
.equ	DOR	=3
.equ	PE	=2		; old name kept for compatibilty
.equ	UPE	=2
.equ	U2X	=1
.equ	MPCM	=0

;UCSRB
.equ	RXCIE	=7
.equ	TXCIE	=6
.equ	UDRIE	=5
.equ	RXEN	=4
.equ	TXEN	=3
.equ	CHR9	=2		; old name kept for compatibilty
.equ	UCSZ2	=2
.equ	RXB8	=1
.equ	TXB8	=0

;UCSRC
.equ	URSEL	=7
.equ	UMSEL	=6
.equ	UPM1	=5
.equ	UPM0	=4
.equ	USBS	=3
.equ	UCSZ1	=2
.equ	UCSZ0	=1
.equ	UCPOL	=0
		
;SPCR
.equ	SPIE	=7
.equ	SPE	=6
.equ	DORD	=5
.equ	MSTR	=4
.equ	CPOL	=3
.equ	CPHA	=2
.equ	SPR1	=1
.equ	SPR0	=0

;SPSR
.equ	SPIF	=7
.equ	WCOL	=6
.equ	SPI2X	=0

;ACSR
.equ	ACD	=7
.equ    ACBG    =6
.equ	ACO	=5
.equ	ACI	=4
.equ	ACIE	=3
.equ	ACIC	=2
.equ	ACIS1	=1
.equ	ACIS0	=0

;ADMUX
.equ    REFS1   =7
.equ    REFS0   =6
.equ    ADLAR   =5
.equ    MUX4    =4
.equ    MUX3    =3
.equ    MUX2    =2
.equ    MUX1    =1
.equ    MUX0    =0

;ADCSRA
.equ    ADEN    =7
.equ    ADSC    =6
.equ	ADATE	=5	
.equ    ADFR    =5
.equ    ADIF    =4
.equ    ADIE    =3
.equ    ADPS2   =2
.equ    ADPS1   =1
.equ    ADPS0   =0

;I2CR
.equ    I2INT   =7
.equ    I2EA    =6
.equ    I2STA   =5
.equ    I2STO   =4
.equ    I2WC    =3
.equ    ENI2C   =2
.equ    I2EN    =2
.equ    I2C_TST =1  ;Present in core test mode only. Write Only.
.equ    I2IE    =0

; TWCR
.equ    TWINT   =7
.equ    TWEA    =6
.equ    TWSTA   =5
.equ    TWSTO   =4
.equ    TWWC    =3
.equ    TWEN    =2
.equ    TWI_TST =1  ;Present in core test mode only. Write Only.
.equ    TWIE    =0

;I2AR
.equ    I2GCE   =0

; TWAR
.equ	TWA6	=7
.equ	TWA5	=6
.equ	TWA4	=5
.equ	TWA3	=4
.equ	TWA2	=3
.equ	TWA1	=2
.equ	TWA0	=1
.equ    TWGCE   =0

; TWSR
.equ	TWS7	=7
.equ	TWS6	=6
.equ	TWS5	=5
.equ	TWS4	=4
.equ	TWS3	=3
.equ	TWS2	=2
.equ	TWS1	=1
.equ	TWS0	=0

;ASSR
.equ    AS2     =3
.equ    TCN2UB  =2
.equ    OCR2UB  =1
.equ    TCR2UB  =0

;********** flags ***********

;.equ	SW2	=7
;.equ	SW1	=6
;.equ	V_DOWN	=5
;.equ	V_UP	=4
;.equ	T_DOWN	=3
;.equ	T_UP	=2
;.equ	TERM	=1
;.equ	FM	=0

;****************************

.def	XL	=r26
.def	XH	=r27
.def	YL	=r28
.def	YH	=r29
.def	ZL	=r30
.def	ZH	=r31

.equ 	RAMEND	=$25F
			;  byte groups
			;  /\/--\/--\/--\ 
.equ 	SMALLBOOTSTART	=0b00111110000000  ;($0F80) smallest boot block is 128W
.equ 	SECONDBOOTSTART	=0b00111100000000  ;($0F00) 2'nd boot block size is 256W
.equ 	THIRDBOOTSTART	=0b00111000000000  ;($0E00) third boot block size is 512W
.equ 	LARGEBOOTSTART	=0b00110000000000  ;($0C00) largest boot block is 1KW
.equ 	BOOTSTART	=THIRDBOOTSTART  ;OBSOLETE!!! kept for compatibility
.equ	PAGESIZE	=32     ;number of WORDS in a page
.equ 	FLASHEND	=$fff

.equ	INT0addr=$001	;External Interrupt0 Vector Address
.equ	INT1addr=$002	;External Interrupt1 Vector Address
.equ	OC2addr	=$003	;Output Compare2 Interrupt Vector Address
.equ	OVF2addr=$004	;Overflow2 Interrupt Vector Address
.equ	ICP1addr=$005	;Input Capture1 Interrupt Vector Address
.equ	OC1Aaddr=$006	;Output Compare1A Interrupt Vector Address
.equ	OC1Baddr=$007	;Output Compare1B Interrupt Vector Address
.equ	OVF1addr=$008	;Overflow1 Interrupt Vector Address
.equ	OVF0addr=$009	;Overflow0 Interrupt Vector Address
.equ	SPIaddr =$00a	;SPI Interrupt Vector Address
.equ	URXCaddr=$00b	;UART Receive Complete Interrupt Vector Address
.equ	UDREaddr=$00c	;UART Data Register Empty Interrupt Vector Address
.equ	UTXCaddr=$00d	;UART Transmit Complete Interrupt Vector Address
.equ	ADCCaddr=$00e	;ADC Interrupt Vector Address
.equ	ERDYaddr=$00f	;EEPROM Interrupt Vector Address
.equ	ACIaddr =$010	;Analog Comparator Interrupt Vector Address
.equ    TWIaddr =$011   ;Irq. vector address for Two-Wire Interface
.equ    I2Caddr =$011   ; Irq. vector address for Inter Intergrated Circuit interface
.equ	INT2addr=$012   ;External Interrupt2 Vector Address
.equ	OC0addr =$013   ;Output Compare0 Interrupt Vector Address
.equ	SPMRaddr=$014   ;Store Program Memory Ready Interrupt Vector Address


;*****************************************************************************

.def     temp   	=R16
.def     temp1   	=R17
.def     temp2	   	=R18
.def     temp3   	=R19
.def     temp4  	=R20
.def     temp5	   	=R21
.def     temp6		=R22
.def     temp7		=R23
.def     temp8		=R24
.def     temp9		=R25
.def     temp10		=R26
.def     temp11		=R27
.def     temp12		=R28
.def     temp13		=R29
.def     temp14		=R30
.def     flags		=R31

.dseg

contr:   .byte 2

.cseg
.org 0

;вектора прерываний

rjmp	reset		
rjmp	INT0addr	
rjmp	INT1addr		
rjmp	OC2addr
rjmp	OVF2addr
rjmp	ICP1addr
rjmp	OC1Aaddr
rjmp	OC1Baddr
rjmp	OVF1addr
rjmp	OVF0addr
rjmp	SPIaddr
rjmp	URXCaddr
rjmp	UDREaddr
rjmp	UTXCaddr
rjmp	ADCCaddr
rjmp	ERDYaddr
rjmp	ACIaddr
rjmp	TWIaddr
rjmp	INT2addr
rjmp	OC0addr
rjmp	SPMRaddr

;********** FUSE **********
;CKSEL0 - 0
;CKSEL1 - 1
;CKSEL2 - 1 
;CKSEL3 - 1 
;SUT0	- 0
;SUT1	- 1
;BODEN	- 1
;BODLEV	- 1
;01110011
;****** чтение значений от LC7265 *******
;A0 - B&C1

;A1 - A2
;A2 - F2
;A3 - E2
;A4 - G2
;A5 - B2

;A6 - A3
;A7 - F3
;C7 - E3
;C6 - G3
;C5 - B3

;C4 - A4
;C3 - F4
;C2 - E4
;C1 - G4
;C0 - B4

;D7 - B&E5
;****** енкодер *******
;B0 - +
;B1 - -
;B2 - кнопка енкодера
;****** программатор ******
;B5 - MOSI
;B6 - MISO
;B7 - SCK
;**** входы/выходы управления ****
;B3 - мотор громкости +
;B4 - мотор громкости -
;D0 - кнопка на плате
;D1 - TX передатчик UART
;D2 - ИК-приемник
;D3 - standby on/off
;D4 - АПЧ,
;D5 - выход ШИМ
;D6 - шина для DS18B20

;******************************  соответствие кодов  ********************************

;	1	2	3	4	5	6	7	8	9	0

;A	0	1	1	0	1	1	1	1	1	1
;B	1	1	1	1	0	0	1	1	1	1
;E	0	1	0	0	0	1	0	1	0	1
;F	0	0	0	1	1	1	0	1	1	1
;G	0	1	1	1	1	1	0	1	1	0

;	2	23	19	26	25	29	3	31	27	15

;************************************************************************************

Reset:	ldi  temp,high(RAMEND)	;инициализация стека
	out  SPH,temp
	ldi  temp,low(RAMEND)
	out  SPL,temp

	ldi Temp,0b00000000    	;настройка портов
	out DDRA,Temp
          
	ldi Temp,0b00000000    	;настройка портов
	out DDRC,Temp

	ldi Temp,0b11111111    	;настройка портов
	out DDRB,Temp

	ldi Temp,0b00111010    	;настройка портов
	out DDRD,Temp
          
;*************************** настройка передатчика ********************

	ldi temp,0
	out UBRRH,temp		; Set baud rate
	ldi temp,4
	out UBRRL,temp
	
	ldi temp,0b00001001	; Enable Transmitter
	out UCSRB,temp

	ldi temp,0b10000110	; Set frame format: 8data, 2stop bit
	out UCSRC,temp

;******************************* настройка DS18B20 *******************

	sbi portb,0		;88888888888888888888888888888888888888888888888

	rcall ds_18		;сбросить термометр

	ldi temp,$CC		;пропустить ROM
	rcall tx		;вызвать подпрограмму		

	ldi temp,$4E		;записать служебные регистры
	rcall tx		;вызвать подпрограмму	

	ldi temp,0		;запись регистра TH
	rcall tx		;вызвать подпрограмму	

	ldi temp,0		;запись регистра TL
	rcall tx		;вызвать подпрограмму	
	
	ldi temp,0		;запись регистра CONFIG
	rcall tx		;вызвать подпрограмму	

	ldi temp,$48		;запись RAM в EEPROM
	rcall tx		;вызвать подпрограмму	
	
	rcall ds_18		;сбросить термометр
	
	sbi portb,1		;88888888888888888888888888888888888888888888888
	
;******************************* настройка ШИМ ************************

	ldi Temp,0b11100010	;настройка PWM 
	out TCCR1a,Temp

	ldi Temp,0b00000001	;тактовый сигнал = CK/1
	out TCCR1B,Temp
	
;	ldi Temp,0		;начальное значение PWM
;	out OCR1AH,Temp
;	inc temp5
;	out OCR1AL,Temp5	;начальное значение PWMR

	ldi flags,0
	
;****************************************************************************** 
	sbi portb,0		;88888888888888888888888888888888888888888888888

start:	rcall ds_18

	ldi temp,$CC
	rcall tx		

	ldi temp,$44
	rcall tx

	rcall delay3
		
	rcall rx
	mov temp5,temp1

	rcall rx
	mov temp6,temp1

	rcall ds_18

	rcall change
	
	rcall compa

	sbi portb,1		;88888888888888888888888888888888888888888888888
	
	rjmp start
	
;******************* подпрограмма сравнения и передачи данных *************

compa:	lds temp,contr
	
	cp temp1,temp
	brne _075
	
	lds temp,contr+1
	
	cp temp3,temp
	brne _075	 
	ret	

_075:	sts contr,temp1
	sts contr+1,temp3
	
	out UDR,temp1
	
_076:	sbis UCSRA,UDRE
	rjmp _076

	out UDR,temp3
	
_077:	sbis UCSRA,UDRE		;
	rjmp _077

	ldi temp,0
	ldi temp1,0
	ldi temp2,0
	ldi temp3,0

	ret
;********************** подпрограмма пересчета данных ***********************

calc:	cpi temp,2
	brne _060
	ldi temp,1
	ret 

_060:	cpi temp,23
	brne _061
	ldi temp,2
	ret 
	
_061:	cpi temp,19
	brne _062
	ldi temp,3
	ret 

_062:	cpi temp,26
	brne _063
	ldi temp,4
	ret 

_063:	cpi temp,25
	brne _064
	ldi temp,5
	ret 

_064:	cpi temp,29
	brne _065
	ldi temp,6
	ret 

_065:	cpi temp,3
	brne _066
	ldi temp,7
	ret 

_066:	cpi temp,31
	brne _067
	ldi temp,8
	ret 

_067:	cpi temp,27
	brne _068
	ldi temp,9
	ret 

_068:	cpi temp,15
	ret
	ldi temp,0
	ret 
	
;******************** программа пересчета данных термометра ******************

change:	sbrs temp5,3		;проверка значения температуры после запятой
	rjmp ch_1
	ldi temp3,0b00000101	;=1,прописать 5 для 3 разряда индикатора
	rjmp ch_2

ch_1:	ldi temp3,0		;=0,прописать 0 для 3 разряда индикатора

ch_2:	sbrs temp6,7		;проверить наличие отрицательной температуры
	rjmp ch_3		;температура положительная, перейти
	sbr temp3,64		;температура отрицательная, записать 1(-) в 6-й разряд

ch_3:	swap temp5
	andi temp5,0b00001111
	swap temp6
	andi temp6,0b11110000
	or temp6,temp5

	cpi temp6,0
	brne zer 
	ori temp3,0b01000000

zer:	sbrs temp6,7		;проверить наличие отрицательной температуры
	rjmp ch_18		;температура положительная, перейти

	mov temp5,temp6

	ldi temp6,0
		
	sbrs temp5,6
	rjmp ch_5	
	cbr temp6,64
	rjmp ch_6
	
ch_5:	sbr temp6,64

ch_6:	sbrs temp5,5
	rjmp ch_7	
	cbr temp6,32
	rjmp ch_8
	
ch_7:	sbr temp6,32

ch_8:	sbrs temp5,4
	rjmp ch_9	
	cbr temp6,16
	rjmp ch_10
	
ch_9:	sbr temp6,16

ch_10:	sbrs temp5,3
	rjmp ch_11	
	cbr temp6,8
	rjmp ch_12
	
ch_11:	sbr temp6,8

ch_12:	sbrs temp5,2
	rjmp ch_13	
	cbr temp6,4
	rjmp ch_14
	
ch_13:	sbr temp6,4

ch_14:	sbrs temp5,1
	rjmp ch_15	
	cbr temp6,2
	rjmp ch_16
	
ch_15:	sbr temp6,2

ch_16:	sbrs temp5,0
	rjmp ch_17	
	cbr temp6,1
	rjmp ch_18
	
ch_17:	sbr temp6,1


ch_18:	mov temp5,temp6

	subi temp5,100
	brmi ch_20 
	ldi temp1,0b10011001
	ret		

ch_20:	ldi temp,0
	
	mov temp5,temp6
	mov temp2,temp5

ch_21:	subi temp5,10
	brmi ch_22

	mov temp2,temp5	
	inc temp
	rjmp ch_21

ch_22:	andi temp2,0b00001111

	cpi temp,0
	brne ch_23

	ldi temp,0b00001111

ch_23:	andi temp,0b00001111
	swap temp2
	or temp2,temp
	mov temp1,temp2

	ret
;********************** RESET термометра **************************	

ds_18:	sbi ddrd,6		;сделать порт выходом
	cbi portd,6		;выставить 0 на 480 мкс

	rcall ms60
	rcall ms60
	rcall ms60
	rcall ms60
	rcall ms60
	rcall ms60
	rcall ms60
	rcall ms60

	rcall ms15

	cbi ddrd,6		;сделать порт входом
	
	ldi temp12,70		;записать величину интервала ожижания
	
nal_1:	dec temp12		;-1 из интервала
	breq oblom		;если =0, НЕУДАЧА, перейти
	sbic pind,6		;если не =0, проверить, отклик был?
	rjmp nal_1		;отклика небыло, ждать

	ldi temp12,240		;записать величину интервала ожижания
	
nal_2:	dec temp12		;-1 из интервала
	breq oblom		;если =0, НЕУДАЧА, перейти
	sbis pind,6		;если не =0, проверить, отклик был?
	rjmp nal_2		;отклика небыло, ждать

	rcall ms15

	ret

oblom:	ret	

;************************* команда передачи 1-WARE **************************

TX:	sbi ddrd,6		;сделать порт выходом

	mov temp1,temp		;байт temp является входным
	ldi temp,8		;количество передаваемых бит 
	
trans3:	sbrc temp1,0		;определения состояния бита 0
	rjmp trans2		;если не =0 перейти

	cbi portd,6		;если =0, передать 0
	rcall ms45		;выставить 0 на 45 мкс
	rcall ms45		;выставить 0 на 45 мкс
	sbi portd,6
	rjmp trans1		;перейти

trans2:	cbi portd,6		;если =1, передать 1
	rcall ms5
	rcall ms5
	sbi portd,6
	rcall ms45
	rcall ms5
		
trans1:	ror temp1		;сдвинуть вправо

	dec temp		;-1
	brne trans3		;если не =0, вернуться в начало

	cbi ddrd,6		;сделать порт входом

	rcall ms15

	ret			;выйти	

;************************** команда чтения 1-WARE ***************************

RX:	ldi temp1,0		;обнулить регистр хранения входных данных

	ldi temp,8		;количество приниманмых бит
	
rx_3:	sbi ddrd,6		;сделать порт выходом
	cbi portd,6		;выставить 0 
	rcall ms5		;выставить 0 на 5 мкс
	rcall ms5		;выставить 0 на 5 мкс
	cbi ddrd,6		;сделать порт входом

	rcall ms15		;ожидание 15 мкс
	rcall ms5		;выставить 0 на 5 мкс		
			
	sbic pind,6		;определение состояния шины
	rjmp rx_1		;если =1 перейти	
	cbr temp1,128		;если =0, записать 0		
	rjmp rx_2		;перейти	
rx_1:	sbr temp1,128		;если =1, записать		

rx_2:	rcall ms45
	ror temp1		;сдвинуть вправо
	
	dec temp		;-1
	brne rx_3		;если не=0 перейти

	cbi ddrd,6		;сделать порт входом

	rcall ms15
		
	ret			;если =0, выйти, результат лежит в temp1  	

;****************************************************************************** 

;******************************** задержки  **********************************

ms15:	ldi Temp14,17
Loop:   dec Temp14
        brne Loop
        ret
;****************************************************************************** 

ms45:	ldi Temp14,57
Loop1:  dec Temp14
        brne Loop1
        ret
;******************************************************************************     	
ms60:	ldi Temp14,79
Loop2:  dec Temp14
        brne Loop2
        ret
;****************************************************************************** 
ms5:	ldi Temp14,6
Loop3:   dec Temp14
        brne Loop3
        ret
;******************************************************************************         
Delay3: ldi temp13,0
	ldi Temp14,0
        ldi Temp12,3

Loop4:  dec temp13
	brne loop4

	dec Temp14
        brne Loop4

        dec Temp12
        brne Loop4
        ret	
;****************************************************************************** 
Delay:  ldi Temp14,6
Loop5:  dec Temp14
        brne Loop5
        ret
;******************************************************************************   
