⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 onewire.asm

📁 DALLAS 1 Wire 总线 SDK 支持多种高级语言
💻 ASM
📖 第 1 页 / 共 2 页
字号:

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