📄 onewire.asm
字号:
sbr r16, 32
sbrs search_direction, 0
cbr r16, 32
jmp end_setting
bit6:
sbrs serial_byte_mask, 6
jmp bit7
sbr r16, 64
sbrs search_direction, 0
cbr r16, 64
jmp end_setting
bit7:
sbr r16, 128
sbrs search_direction, 0
cbr r16, 128
end_setting:
ret
; **********************************************
; get_serial_num: Gets the current byte of the
; serial number into r16. r24
; is used for the counter and
; gets number from
; serial_byte_number location.
; **********************************************
get_serial_num:
ldi r16, 0
mov r24, serial_byte_num
cp r24, r16
breq zero_serial_num2
lds r16, var1
dec r24
breq return2
lds r16, var2
dec r24
breq return2
lds r16, var3
dec r24
breq return2
lds r16, var4
dec r24
breq return2
lds r16, var5
dec r24
breq return2
lds r16, var6
dec r24
breq return2
lds r16, var7
dec r24
breq return2
zero_serial_num2:
lds r16, var0
return2:
ret
; **********************************************
; load_serial_num: Loads the current byte of the
; serial number from r16. r24
; is used for a counter and
; gets number from
; serial_byte_number location.
; **********************************************
load_serial_num:
push r18
ldi r18, 0
mov r24, serial_byte_num
cp r24, r18
brne byte1
jmp zero_serial_num1
byte1:
dec r24
brne byte2
sts var1, r16
jmp return1
byte2:
dec r24
brne byte3
sts var2, r16
jmp return1
byte3:
dec r24
brne byte4
sts var3, r16
jmp return1
byte4:
dec r24
brne byte5
sts var4, r16
jmp return1
byte5:
dec r24
brne byte6
sts var5, r16
jmp return1
byte6:
dec r24
brne byte7
sts var6, r16
jmp return1
byte7:
sts var7, r16
jmp return1
zero_serial_num1:
sts var0, r16
return1:
pop r18
ret
; **********************************************
; ow_read_bit: Reads a bit of data from the 1-Wire
; The T flag will be set on what is
; read
; **********************************************
ow_read_bit:
set
; **********************************************
; ow_write_bit: Writes a bit of data to the 1-Wire
; Set the T flag for writing a 1,
; or clear for a 0.
; **********************************************
ow_write_bit:
push r16
push r18
brts bitset
ldi r16, $00
jmp done_bit_set
bitset:
ldi r16, $FF
done_bit_set:
ldi r18, $05
sbi PORTE, 7
usdelay1: ; delay of 5 us
nop
dec r18
brne usdelay1
ldi r18, $09
; put bit into carry
ror r16
brcc zero
cbi PORTE, 7
zero: ; delay of 10 us
nop
dec r18
brne zero
; total time before read 16 us
clt
sbic PINE, 6
set
ldi r18, $2D ; delay 45 us for write 0
usdelay2: ; delay
nop
dec r18
brne usdelay2
; leave I/O pin high for recovery
ldi r18, $0A
cbi PORTE, 7
usdelay3: ; delay for 10 us to recover
nop
dec r18
brne usdelay3
pop r18
pop r16
ret
; **********************************************
; ow_read_byte: Reads a byte of data from the 1-Wire
; r16 will be set to the read in
; byte.
; **********************************************
ow_read_byte:
ldi r16, $FF
; **********************************************
; ow_write_byte: Writes a byte of data to the 1-Wire
; Set r16 to the value you want
; to write.
; **********************************************
ow_write_byte:
push r17
push r18
push r19
ldi r17, 8
rwloop:
ldi r18, $04
sbi PORTE, 7
us4delay1:
nop
dec r18
brne us4delay1
ldi r18, $0A
; put bit into carry
ror r16
brcc zero_bit
cbi PORTE, 7
zero_bit:
nop
dec r18
brne zero_bit
clc
sbic PINE, 6
sec
ror r19
ldi r18, $3C
us50delay:
nop
dec r18
brne us50delay
; leave I/O pin high for recovery
ldi r18, 5
cbi PORTE, 7
us4delay2:
nop
dec r18
brne us4delay2
dec r17
brne rwloop
mov r16, r19
pop r19
pop r18
pop r17
ret
; **********************************************
; ow_reset: A reset of the 1-Wire Net
; **********************************************
ow_reset:
push r20
push r21
push r22
ldi r21, 120
ldi r20, $40
sbi PORTE, 7 ; start of a reset pulse
; delay 480us
loop1:
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
dec r21
brne loop1
cli ; disable all interrupts
cbi PORTE, 7 ; end the reset pulse
; wait for 16us
ldi r21, 16
loop2:
nop
dec r21
brne loop2
; read sensor pin for 368us
ldi r21, $FF
loop3:
nop
nop
nop
nop
nop
nop
nop
clt
sbis PINE, 6
jmp done_reset
dec r21
brne loop3
pop r22
pop r21
pop r20
ret
done_reset:
ldi r21, $FF
set
presence_loop:
sbis PINE, 6
jmp presence_loop
; wait 336us after presence pulse
done_loop:
nop
nop
nop
nop
nop
nop
dec r21
brne done_loop
pop r22
pop r21
pop r20
ret
; **********************************************
; msDelay: A micro second delay up to 256.
; r16 should be set to the number of
; ms to delay.
; **********************************************
msDelay:
push r21
msDelay_loop_0:
ldi r21, 250
msDelay_loop_1:
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
dec r21
brne msDelay_loop_1
dec r16
brne msDelay_loop_0
pop r21
ret
; **********************************************
; NEWCRC8: Initializing the crc to perform CRC
; check on the Serial Num.
; **********************************************
newcrc8:
push r16
ldi r16, 0
sts crc1, r16
pop r16
ret
; **********************************************
; CRC8: After initializing the crc call this
; to perform CRC check on the Serial Num.
; r24 should be set to the next crc byte.
; **********************************************
crc8:
push r17
; printing out to the serial port
; what the serial number received
; from the search
mov r17, r24
call txcomp
lds r17, crc1
eor r24, r17
mov r17, r24
andi r17, $F0
swap r24
eor r17, r24
clc
sbrc r24, 0
sec
ror r24
eor r17, r24
clc
sbrc r24, 0
sec
ror r24
swap r24
andi r24, $C7
sbrc r24, 2
call complimentbit3
eor r17, r24
swap r24
andi r24, $0C
eor r17, r24
clc
sbrc r24, 0
sec
ror r24
eor r17, r24
sts crc1, r17
pop r17
ret
complimentbit3:
sbrs r24, 3
jmp set_bit_3
jmp clear_bit_3
return:
ret
set_bit_3:
ori r24, $08
jmp return
clear_bit_3:
andi r24, $F7
jmp return
; **********************************************
; TXCOMP: Transmit a byte from the serial port
; polls to see if the UDRE flag is '1'.
; If '1' then a byte is written to the
; UDR to be transmitted.
; **********************************************
txcomp:
push r18
push r19
push r20
push r21
ldi r18, $F0
ldi r19, $0A
and r18, r17
swap r18
cp r18, r19
brlt num_print1
ldi r20, 'A' - 10
add r20, r18
out UDR, r20
loop_print1:
sbis USR, UDRE ; check end of transmission
jmp loop_print1
jmp next4bits
num_print1:
ldi r20, '0'
add r20, r18
out UDR, r20
loop_print2:
sbis USR, UDRE ; check end of transmission
jmp loop_print2
next4bits:
ldi r18, $0F
ldi r19, $0A
and r18, r17
cp r18, r19
brlt num_print2
ldi r20, 'A' - 10
add r20, r18
out UDR, r20
loop_print3:
sbis USR, UDRE ; check end of transmission
jmp loop_print3
ldi r20, $20
call print
jmp exit_txcomp
num_print2:
ldi r20, '0'
add r20, r18
out UDR, r20
loop_print4:
sbis USR, UDRE ; check end of transmission
jmp loop_print4
ldi r20, $20
out UDR, r20
loop_print5:
sbis USR, UDRE ; check end of transmission
jmp loop_print5
exit_txcomp:
pop r21
pop r20
pop r19
pop r18
ret
print:
out UDR, r20
loop_print:
sbis USR, UDRE ; check end of transmission
jmp loop_print
ret
.EXIT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -