114 lines
2.7 KiB
NASM
114 lines
2.7 KiB
NASM
;------------------------------------------------------------------------------
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
.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
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
;------------------------------------------------------------------------------
|