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

📄 onewire.asm

📁 DALLAS 1 Wire 总线 SDK 支持多种高级语言
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	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 + -