📄 simp.lst
字号:
;**** A P P L I C A T I O N N O T E A V R 2 0 0 ************************
;*
;* Title: Multiply and Divide Routines
;* Version: 1.1
;* Last updated: 97.07.04
;* Target: AT90Sxxxx (All AVR Devices)
;*
;* Support E-mail: avr@atmel.com
;*
;* DESCRIPTION
;* This Application Note lists subroutines for the following
;* Muliply/Divide applications:
;*
;* 8x8 bit unsigned
;* 8x8 bit signed
;* 16x16 bit unsigned
;* 16x16 bit signed
;* 8/8 bit unsigned
;* 8/8 bit signed
;* 16/16 bit unsigned
;* 16/16 bit signed
;*
;* All routines are Code Size optimized implementations
;*
;***************************************************************************
;Registers common to all
;.def temp = r16
;.def data = r17
;.def loopcnt = r18
;.def crc = r1
; **** Pin Consignments ****
.equ WIRE = 4
.set WIREPORT = PORTB
.set WIREDIR = DDRB
.set WIREIN = PINB
.def templsb = r2
.def tempmsb = r3
.def userb1 = r4
.def userb2 = r5
.def crap1 = r6
.def crap2 = r7
.def count_remain = r8
.def count_per_c = r9
.def scratch_crc = r10
.def crc = r11
.def templ = r12 ; Converted result
.def temph = r13
.def vallow = r22
.def valhigh = r23
;************************************************
;* DS1820 Init (4 Mhz) *
;************************************************
DS1820_init:
0000cd 98c4 cbi WIREPORT, WIRE ; Bit always low
0000ce 98bc cbi WIREDIR, WIRE ; Set pin up as open drain
0000cf 9508 ret
;************************************************
;* DS1820 Reset (4 Mhz) *
;* *
;* T clear if Presence *
;* Requires: temp *
;* count1 (timer) *
;************************************************
.equ T = 6 ; STATUS REG
DS1820_reset:
; Reset Pulse
0000d0 9abc sbi WIREDIR, WIRE ; Bus Low
0000d1 e8a9 ldi count1, 137
0000d2 dff2 rcall delayX5us ; Wait 720us
0000d3 98bc cbi WIREDIR, WIRE ; Bus High
; Delay
0000d4 e0ad ldi count1, 13
0000d5 dfef rcall delayX5us ; Wait 67.5us
; Check for Presence signal
0000d6 b306 in temp, WIREIN
0000d7 fb04 bst temp, WIRE ; Store bus status
; Delay
0000d8 ebae ldi count1, 190
0000d9 dfeb rcall delayX5us ; Wait 1ms
0000da 9508 ret
;************************************************
;* DS1820 Write Byte (4 Mhz) *
;* *
;* Input: data *
;* Requires: temp (bit count) *
;* count1 (timer) *
;************************************************
DS1820_Write:
0000db e008 ldi temp, 8 ; 8 bits to write
DS1820_wloop:
0000dc 9abc sbi WIREDIR, WIRE ; [1] Bus low ( 1us to 15us )
0000dd 0000 nop
0000de 0000 nop
0000df 0000 nop
0000e0 0000 nop
0000e1 0000 nop
0000e2 9517 ror data ; [1]
0000e3 f408 brcc DS1820_w0 ; [1] Write 0
DS1820_w1:
0000e4 98bc cbi WIREDIR, WIRE ; Data = high
DS1820_w0:
; Data alread low
0000e5 e0ad ldi count1, 13 ; Just wait >60us
0000e6 dfde rcall delayX5us
0000e7 98bc cbi WIREDIR, WIRE ; Bus high
0000e8 e0a1 ldi count1, 1 ; Recovery time >1us
0000e9 dfdb rcall delayX5us ; 5us delay!
0000ea 950a dec temp
0000eb f781 brne DS1820_wloop
0000ec 9508 ret
;************************************************
;* DS1820 Read Byte (4 Mhz) *
;* *
;* Output: data *
;* Requires: temp (bit count) *
;* count1 (timer) *
;************************************************
DS1820_read:
0000ed e008 ldi temp, 8 ; 8 bits to write
0000ee 2711 clr data
DS1820_rloop:
0000ef 9abc sbi WIREDIR, WIRE ; [1] Bus low ( 1us to 15us )
0000f0 e0a1 ldi count1, 1 ; Recovery time >1us
0000f1 dfd3 rcall delayX5us ; 5us delay!
0000f2 98bc cbi WIREDIR, WIRE ; Bus high
0000f3 e0a1 ldi count1, 1 ; Recovery time >1us
0000f4 dfd0 rcall delayX5us ; 5us delay!
; Get Data Now
0000f5 9516 lsr data
0000f6 99b4 sbic WIREIN, WIRE ; check bit
0000f7 6810 sbr data, 0x80
; Data alread inactive
0000f8 e0ad ldi count1, 13 ; Just wait >60us
0000f9 dfcb rcall delayX5us
0000fa 950a dec temp
0000fb f799 brne DS1820_rloop
0000fc 9508 ret
;************************************************
;* DS1820 Do Temp Conversion *
;* *
;* Requires: DS1820_Write *
;************************************************
DS1820_conv:
0000fd ec1c ldi data, 0xcc ; Skip ROM check
0000fe dfdc rcall DS1820_Write
0000ff e414 ldi data, 0x44 ; Start Temp Conversion
000100 dfda rcall DS1820_Write
wait_con:
000101 9bb4 sbis WIREIN, WIRE ; Conversion Done!
000102 cffe rjmp wait_con
000103 9508 ret
;************************************************
;* DS1820 Read Scratch Pad *
;* Requires DS1820 ROM ID subroutine *
;* *
;************************************************
DS1820_Scr:
000104 ec1c ldi data, 0xcc ; Skip ROM check
000105 dfd5 rcall DS1820_Write
000106 eb1e ldi data, 0xbe ; read Scratch Pad
000107 dfd3 rcall DS1820_Write
; Byte 0
000108 dfe4 rcall DS1820_Read ; Read a byte
000109 2e21 mov templsb, data ; store data
;rcall onechar
; Byte 1
00010a dfe2 rcall DS1820_Read ; Read a byte
00010b 2e31 mov tempmsb, data ; store data
;rcall onechar
; Byte 2
00010c dfe0 rcall DS1820_Read ; Read a byte
00010d 2e41 mov userb1, data ; store data
;rcall onechar
; Byte 3
00010e dfde rcall DS1820_Read ; Read a byte
00010f 2e51 mov userb2, data ; store data
;rcall onechar
; Byte 4
000110 dfdc rcall DS1820_Read ; Read a byte
000111 2e61 mov crap1, data ; store data
;rcall onechar
; Byte 5
000112 dfda rcall DS1820_Read ; Read a byte
000113 2e71 mov crap2, data ; store data
;rcall onechar
; Byte 6
000114 dfd8 rcall DS1820_Read ; Read a byte
000115 2e81 mov count_remain, data ; store data
;rcall onechar
; Byte 7
000116 dfd6 rcall DS1820_Read ; Read a byte
000117 2e91 mov count_per_c, data ; store data
;rcall onechar
; Byte CRC
000118 dfd4 rcall DS1820_Read ; Read a byte
000119 2ea1 mov scratch_crc, data ; store data
;rcall onechar
00011a 9508 ret
;************************************************
;* Dump Temp from SRAM to RS232 (real value) *
;* Resolution 0.5 deg C negative works *
;* *
;* Input: templsb (SRAM) *
;* Output: RS232 *
;* Requires: data *
;* *
;************************************************
dump_temp:
; Check for positive or negative temp!
00011b 2033 tst tempmsb
00011c f031 breq postemp ; Temp is Positive!
; Display a negative number!!
00011d e21d ldi data, '-'
00011e df71 rcall onechar
00011f e000 ldi temp, 0x00
000120 1902 sub temp, templsb
000121 2f90 mov hex, temp
000122 c003 rjmp distemp
postemp:
000123 e210 ldi data, ' '
000124 df6b rcall onechar
000125 2d92 mov hex, templsb ; Get LSB
distemp:
000126 9596 lsr hex
000127 d0ae rcall hexdec ; Convert to decimal
; display now
;mov data, templsb
000128 2f18 mov data, hund
000129 df66 rcall onechar
00012a 2f17 mov data, tens
;mov data, tempmsb
00012b df64 rcall onechar
00012c 2f16 mov data, unit
00012d df62 rcall onechar
; decimal place
00012e e21e ldi data, '.'
00012f df60 rcall onechar
000130 2d92 mov hex, templsb
000131 e310 ldi data, '0'
000132 fd90 sbrc hex, 0
000133 e315 ldi data, '5'
000134 df5b rcall onechar
000135 e413 ldi data, 'C'
000136 df59 rcall onechar
000137 9508 ret
;************************************************
;* DS1820 Temp Calculate *
;* High Resolution *
;* *
;* Input: SRAM *
;* Output: SRAM *
;* Requires: r12 *
;* r13 *
;* r14 *
;* r15 *
;* r16 *
;* r17 *
;* r18 *
;* Fully Functional at 21th Sept 2002 *
;* Tested with Positive and negative temperature*
;* Quick fix added for negative conversion *
;************************************************
dump_temp2:
;***** Register Variables
.def valuel = r16
.def valueh = r17
.def result = r15
.def count = r18
.def valuem = r19
; Result Registers
000138 2766 clr vallow
000139 2777 clr valhigh
00013a 2d72 mov valhigh, templsb ; Put DS1820 value in
00013b 9576 lsr valhigh ; Remove 0.5C Bit
00013c fc30 sbrc tempmsb, 0 ; Check if negative number
00013d 6870 sbr valhigh, 0x80
; Subract the 0.25C
00013e 5460 subi vallow,0x40 ;Subtract low bytes (0.25C)
00013f 4070 sbci valhigh,0x00 ;Subtract high byte with carry
; Calulate remaining counts
; Temp = countperc - countremain
000140 2d19 mov valueh, count_per_c
000141 2d08 mov valuel, count_remain
000142 1b10 sub valueh, valuel ;Subract remainder from countperc
;***** Divide Two Unsigned 16-Bit Numbers
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -