;------------------------------------------------------------------------------ ; ;------------------------------------------------------------------------------ .equ OW_PORT = PORTD .equ OW_PIN = PIND .equ OW_DDR = DDRD .equ OW_DQ = PD6 .def OWCount = r17 ;------------------------------------------------------------------------------ ; ;------------------------------------------------------------------------------ .cseg ;------------------------------------------------------------------------------ ; Output : T - presence bit ;------------------------------------------------------------------------------ OWReset: cbi OW_PORT,OW_DQ sbi OW_DDR,OW_DQ ldi XH, HIGH(DVUS(470)) ldi XL, LOW(DVUS(470)) rcall Wait4xCycles cbi OW_DDR,OW_DQ ldi XH, HIGH(DVUS(70)) ldi XL, LOW(DVUS(70)) rcall Wait4xCycles set sbis OW_PIN,OW_DQ clt ldi XH, HIGH(DVUS(240)) ldi XL, LOW(DVUS(240)) rcall Wait4xCycles ret ;------------------------------------------------------------------------------ ; Input : C - bit to write ;------------------------------------------------------------------------------ OWWriteBit: brcc OWWriteZero ldi XH, HIGH(DVUS(1)) ldi XL, LOW(DVUS(1)) rjmp OWWriteOne OWWriteZero: ldi XH, HIGH(DVUS(120)) ldi XL, LOW(DVUS(120)) OWWriteOne: sbi OW_DDR, OW_DQ rcall Wait4xCycles cbi OW_DDR, OW_DQ ldi XH, HIGH(DVUS(60)) ldi XL, LOW(DVUS(60)) rcall Wait4xCycles ret ;------------------------------------------------------------------------------ ; Input : r16 - byte to write ;------------------------------------------------------------------------------ OWWriteByte: push OWCount ldi OWCount,0 OWWriteLoop: ror r16 rcall OWWriteBit inc OWCount cpi OWCount,8 brne OWWriteLoop pop OWCount ret ;------------------------------------------------------------------------------ ; Output : C - bit from slave ;------------------------------------------------------------------------------ OWReadBit: ldi XH, HIGH(DVUS(1)) ldi XL, LOW(DVUS(1)) sbi OW_DDR, OW_DQ rcall Wait4xCycles cbi OW_DDR, OW_DQ ldi XH, HIGH(DVUS(5)) ldi XL, LOW(DVUS(5)) rcall Wait4xCycles clt sbic OW_PIN,OW_DQ set ldi XH, HIGH(DVUS(50)) ldi XL, LOW(DVUS(50)) rcall Wait4xCycles sec brts OWReadBitEnd clc OWReadBitEnd: ret ;------------------------------------------------------------------------------ ; Output : r16 - byte from slave ;------------------------------------------------------------------------------ OWReadByte: push OWCount ldi OWCount,0 OWReadLoop: rcall OWReadBit ror r16 inc OWCount cpi OWCount,8 brne OWReadLoop pop OWCount ret ;------------------------------------------------------------------------------ ; ;------------------------------------------------------------------------------