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

📄 simp.lst

📁 温度测量
💻 LST
📖 第 1 页 / 共 4 页
字号:
         
         ;**** 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 + -