📄 onewire.asm
字号:
; ** ATmega103(L) Assembly Language - AVRASM Syntax
.INCLUDE "M103def.inc" ; Add required path to IAR Directory
.def bit_test = r17
.def search_direction = r18
.def bit_number = r19
.def last_zero = r21
.def serial_byte_num = r22
.def serial_byte_mask = r23
.DSEG
var0:.BYTE 1
var1:.BYTE 1
var2:.BYTE 1
var3:.BYTE 1
var4:.BYTE 1
var5:.BYTE 1
var6:.BYTE 1
var7:.BYTE 1
crc1:.BYTE 1
LastDiscrepancy:.BYTE 1
LastDevice:.BYTE 1
.CSEG
.ORG 0
; ************* Stack Pointer Setup Code
ldi r16, $0F ; Stack Pointer Setup
out SPH,r16 ; Stack Pointer High Byte
ldi r16, $FF ; Stack Pointer Setup
out SPL,r16 ; Stack Pointer Low Byte
; ******* RAMPZ Setup Code ****
ldi r16, $00 ; 1 = EPLM acts on upper 64K
out RAMPZ, r16 ; 0 = EPLM acts on lower 64K
; ******* Comparator Setup Code ****
ldi r16,$80 ; Comparator Disabled, Input Capture Disabled
out ACSR, r16 ; Comparator Settings
; ******* Port B Setup Code ****
ldi r16, $FF ;
out DDRB , r16 ; Port B Direction Register
ldi r16, $00 ; Init value
out PORTB, r16 ; Port B value
; ******* Port E Setup Code ****
ldi r16, $80 ; I/O:
out DDRE, r16 ; Port E Direction Register
ldi r16, $40 ; Init value
out PORTE, r16 ; Port E value
; ******* Port D Setup Code ****
ldi r16, $00 ; I/O:
out DDRD, r16 ; Port D Direction Register
ldi r16, $00 ; Init value
out PORTD, r16 ; Port D value
MAIN:
; ********************************************************
; INI_UART: Initialize the UART for 9600 bits per second
; 8 data bits, 1 stop bit, no parity
; ********************************************************
init_uart:
ldi r16, $19 ; set baud rate
out UBRR, r16
ldi r16, $18 ; init UART control register
out UCR, r16
MAIN_loop:
call ow_first
brts present
jmp MAIN_loop
search:
call ow_search
brts present
; delay for last device
; found
ldi r16, $AA
out DDRB, r16,
ldi r16, $FF
call msDelay
ldi r16, $FF
call msDelay
ldi r16, $55
out DDRB, r16,
ldi r16, $FF
call msDelay
ldi r16, $FF
call msDelay
ldi r16, $AA
out DDRB, r16,
ldi r16, $FF
call msDelay
ldi r16, $FF
call msDelay
ldi r16, $55
out DDRB, r16,
ldi r16, $FF
call msDelay
ldi r16, $FF
call msDelay
jmp MAIN_loop
present: ; out puts the serial number to the
; LEDs
lds r20, var0
out DDRB, r20
call get_switch
lds r20, var1
out DDRB, r20
call get_switch
lds r20, var2
out DDRB, r20
call get_switch
lds r20, var3
out DDRB, r20
call get_switch
lds r20, var4
out DDRB, r20
call get_switch
lds r20, var5
out DDRB, r20
call get_switch
lds r20, var6
out DDRB, r20
call get_switch
lds r20, var7
out DDRB, r20
call get_switch
jmp search
; **********************************************
; get_switch: Gets a switch activity. The
; routine will wait for a button
; push and then delay for debounce.
; **********************************************
get_switch:
push r16
push r18
push r19
inside_get_switch:
in r18, PIND
andi r18, $FF
cpi r18, $FF
breq inside_get_switch
cpi r18, $FE
brne not_0
jmp found
not_0:
cpi r18, $FD
brne not_1
jmp found
not_1:
cpi r18, $FB
brne not_2
jmp found
not_2:
cpi r18, $F7
brne not_3
jmp found
not_3:
cpi r18, $EF
brne not_4
jmp found
not_4:
cpi r18, $DF
brne not_5
jmp found
not_5:
cpi r18, $BF
brne not_6
jmp found
not_6:
cpi r18, $7F
found:
ldi r16, 20
call msDelay
release:
in r19, PIND
andi r19, $FF
cpi r19, $FF
breq release
ldi r16, $FF
call msDelay
pop r19
pop r18
pop r16
ret
; **********************************************
; ow_first: Reinitializes the search values
; and calls ow_search to get the
; first device found on the 1-Wire Net.
; **********************************************
ow_first:
push r16
ldi r16, 0
sts LastDiscrepancy, r16
sts LastDevice, r16
pop r16
call ow_search
ret
; **********************************************
; ow_search: Searches the 1-Wire Net for iButtons.
; The T flag is set for a success and
; cleared if an error, no devices on
; the 1-Wire Net or the last device
; was found.
; **********************************************
ow_search:
push r16
push r17
push r18
push r19
push r20
push r21
push r22
push r23
next:
ldi bit_number, 1
ldi last_zero, 0
ldi serial_byte_num, 0
ldi serial_byte_mask, 1
lds r16, LastDevice
sbrc r16, 0
jmp no_devices
call ow_reset
brts presence_pulse
jmp no_devices
call00:
call set_bit00
jmp return00
call01:
call set_bit01
jmp return01
no_devices:
clt
jmp exit_search
presence_pulse:
ldi r16, $F0
call ow_write_byte
call get_serial_num
serial_num:
ldi r17, $00
; read first bit of response
call ow_read_bit
brts call01
return01:
; read second compliment response
call ow_read_bit
brts call00
return00:
; choosing the bit values
cpi r17, 3
breq no_devices
cpi r17, 0
breq conflict
bit_set:
ldi search_direction, 0
sbrs r17, 1
jmp end_bit_set
ldi search_direction, 1
end_bit_set:
call setting_bit
jmp writebit
conflict:
lds r20, LastDiscrepancy
cp bit_number, r20
brlt same
ldi search_direction, 0
cpse bit_number, r20
jmp skip
ldi search_direction, 1
jmp skip
same:
ldi search_direction, 0
sbrs serial_byte_mask, 0
brne bitone
sbrc r16, 0
ldi search_direction, 1
sbr r16, 1
sbrs search_direction, 0
cbr r16, 1
jmp skip
bitone:
sbrs serial_byte_mask, 1
brne bittwo
sbrc r16, 1
ldi search_direction, 1
sbr r16, 2
sbrs search_direction, 0
cbr r16, 2
jmp skip
bittwo:
sbrs serial_byte_mask, 2
brne bitthr
sbrc r16, 2
ldi search_direction, 1
sbr r16, 4
sbrs search_direction, 0
cbr r16, 4
jmp skip
bitthr:
sbrs serial_byte_mask, 3
brne bitfour
sbrc r16, 3
ldi search_direction, 1
sbr r16, 8
sbrs search_direction, 0
cbr r16, 8
jmp skip
bitfour:
sbrs serial_byte_mask, 4
brne bitfive
sbrc r16, 4
ldi search_direction, 1
sbr r16, 16
sbrs search_direction, 0
cbr r16, 16
jmp skip
bitfive:
sbrs serial_byte_mask, 5
brne bitsix
sbrc r16, 5
ldi search_direction, 1
sbr r16, 32
sbrs search_direction, 0
cbr r16, 32
jmp skip
bitsix:
sbrs serial_byte_mask, 6
brne bitsev
sbrc r16, 6
ldi search_direction, 1
sbr r16, 64
sbrs search_direction, 0
cbr r16, 64
jmp skip
bitsev:
sbrs serial_byte_mask, 7
brne skip
sbrc r16, 7
ldi search_direction, 1
sbr r16, 128
sbrs search_direction, 0
cbr r16, 128
jmp skip
skip:
call setting_bit
sbrs search_direction, 0
mov last_zero, bit_number
writebit:
; serial number search direction write bit
sbrs search_direction, 0
clt
sbrc search_direction, 0
set
call ow_write_bit
; increment the byte counter bit_number
; and shift the mask serial_byte_mask
inc bit_number
clc
lsl serial_byte_mask
brcc loop
call load_serial_num
inc serial_byte_num
ldi serial_byte_mask, 1
call get_serial_num
loop:
ldi r25, 8
cp serial_byte_num, r25
brlt looping
call newcrc8
lds r24, var0
call crc8
lds r24, var1
call crc8
lds r24, var2
call crc8
lds r24, var3
call crc8
lds r24, var4
call crc8
lds r24, var5
call crc8
lds r24, var6
call crc8
lds r24, var7
call crc8
ldi r16, 0
lds r24, crc1
cp r16, r24
breq good_crc
bad_crc:
clt
jmp exit_search
good_crc:
sts LastDiscrepancy, last_zero
cp r16, last_zero
breq set_lastDevice
set
exit_search:
pop r23
pop r22
pop r21
pop r20
pop r19
pop r18
pop r17
pop r16
ret
looping:
jmp serial_num
set_lastDevice:
ldi r16, 1
sts LastDevice, r16
set
jmp exit_search
; **********************************************
; set_bit01: Sets the 2nd bit for the compliment
; bit in reading for the search.
; **********************************************
set_bit01:
ori r17, $02
ret
; **********************************************
; set_bit00: Sets the 1st bit for the value of
; the serial number in doing the search.
; **********************************************
set_bit00:
ori r17, $01
ret
; **********************************************
; setting_bit: Sets of clears the proper bit
; for the serial number byte in
; r16.
; **********************************************
setting_bit:
sbrs serial_byte_mask, 0
jmp bit1
sbr r16, 1
sbrs search_direction, 0
cbr r16, 1
jmp end_setting
bit1:
sbrs serial_byte_mask, 1
jmp bit2
sbr r16, 2
sbrs search_direction, 0
cbr r16, 2
jmp end_setting
bit2:
sbrs serial_byte_mask, 2
jmp bit3
sbr r16, 4
sbrs search_direction, 0
cbr r16, 4
jmp end_setting
bit3:
sbrs serial_byte_mask, 3
jmp bit4
sbr r16, 8
sbrs search_direction, 0
cbr r16, 8
jmp end_setting
bit4:
sbrs serial_byte_mask, 4
jmp bit5
sbr r16, 16
sbrs search_direction, 0
cbr r16, 16
jmp end_setting
bit5:
sbrs serial_byte_mask, 5
jmp bit6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -