ASM18b20AvecLCD/ibutton-numberSample/1-wire.asm

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
;------------------------------------------------------------------------------
;
;------------------------------------------------------------------------------