please dont rip this site

Microchip Davidtait DS1820.ASM

;  --------------------------------------------------------
;
; The Dallas Semi DS1820 digital Thermometer
;
; This part is *the* answer for 90% of all temperature
; measurement problems.  It comes in a 3 pin transistor
; style package (that's Vcc, Gnd & DataI/O), it's very low
; power, accurate, has half a degree C resolution, is easy
; to use, reads out directly in 9 bit binary degrees C
; and is extendable to any number of sensors on a
; 2 or 3-wire bus.  Its not a cheap part but then it isn't
; expensive either and if you talk nicely to Dallas they'll
; give you a sample.
;
; The interface is half-duplex serial and uses only *one*
; of your PIC's valuable IO pins.  The code that follows
; is a minimal implementation for just reading the temp-
; erature from a single DS1820 device.  More complex code
; would be required to read from multiple devices on a
; 2/3 wire bus, but this will get you started.
;
; BTW the chip also includes a little dollup of EEPROM.
;
; The part's data sheet is available from the Dallas web
; page: http://www.dalsemi.com
;
; Enjoy.  (As they say)
;
; Steve.Marchant@Nottingham.ac.uk
;
; --------------------------------------------------------

	;	DS1820 support for PIC16C84

	;	Requires DS1820 DQ pin connected to PORTA
	;	on pin DSBIT (DSBIT may be in the range 0..4)
	;	My hardware runs with DSBIT EQU 3
	;	Requires TMP0,1 & 2 temporary working files.
	;	Results are stored in DSSIGN and DSMAG files.
	;	DSSIGN is 0 if temp is +ve, FF if temp -ve.
	;	DSMAG contains the 8 bit temperature reading
	;	LSB = .5 degrees C, see Dallas Data Sheet.
	;	Just call NEWTEMP every time round in your
	;	main loop and test the W reg to see if
	;	new data is available.
	;	NOTE parts of this code are timing critical
	;	and must be run with INTERRUPTS turned OFF!
	;	see the INTSON and INTSOFF macros below.

NEWTEMP:

	;	Returns W<>0 if no new data ready yet
	;	or W=0 if a new measurement has been made
	;	Data will be saved to DSSIGN & DSMAG
	;	TMP0..2 will be destroyed
	;	Return W=0 if reading is OK
	;	or W=1 if an error is encountered.
	;	NOTE in this case DSMAG and DSSIGN will
	;	     be in an undefined state
	;
	CALL	DSRX8		; CHECK DS1820 STATUS
	ADDLW	1		; 255=READY => 0=READY
	BTFSS	STATUS,Z	; Z set = READY
	RETURN			; W non zero = not ready

	;	Get current temperature reading
	;	and start the next conversion

GETEMP:	CALL	DSRESET
	BTFSS	STATUS,Z	; Z BIT SET MEANS RESP. OK
	GOTO	BADTMP
	MOVLW	H'CC'		; SKIP PROM
	CALL	DSTX8
	MOVLW	H'BE'		; READ SCRATCH PAD
	CALL	DSTX8
	CALL	DSRX8		; MAGNITUDE
	MOVWF	DSMAG
	CALL	DSRX8		; SIGN (FF=-VE, 00=+VE)
	MOVWF	DSSIGN
	CALL	DSRESET		; SEEN ENOUGH, RESTART
	MOVLW	H'CC'		; SKIP PROM
	CALL	DSTX8
	MOVLW	H'44'		; START CONVERT
	CALL	DSTX8

	;
	;	IF DSSIGN NOT 255 OR 0 THEN ERROR
	;

	MOVF	DSSIGN,W
	BTFSC	STATUS,Z
	GOTO	OKTMP
	ADDLW	1
	BTFSS	STATUS,Z
	GOTO	BADTMP
OKTMP:
	CLRW			; W = 0 : DATA READY
	RETURN
BADTMP:
	MOVLW	1		; W <> 0 : ERROR
	RETURN
	

; ---------------------------------------------------------

	;	DS1820 MACROS


INTSON:	MACRO
	;
	;	TURN YOUR INTERRUPTS OFF HERE
	;
	ENDM


INTSOFF:MACRO
	;
	;	TURN YOUR INTERRUPTS BACK ON HERE
	;
	ENDM


DQLOW:	MACRO
	BCF	PORTA,DSBIT	; DQ BIT READY LO
	BSF	STATUS,RP0
	BCF	TRISA,DSBIT	; DQ BIT NOW O/P
	BCF	STATUS,RP0
	ENDM


DQHIZ:	MACRO
	BSF	STATUS,RP0
	BSF	TRISA,DSBIT	; DQ BIT NOW I/P
	BCF	STATUS,RP0
	ENDM


PAUSE:	MACRO	DLYF
	MOVLW	(DLYF / 5) - 1
	MOVWF	TMP0
	CALL	DLY5N
	ENDM


; ------------------------------------------------------------

	;	DS1820 SUBROUTINES


DLY5N:	NOP
	NOP
	DECFSZ	TMP0
	GOTO	DLY5N
	RETURN



DSRESET:
	;	DESTROYS TMP0,1
	;	RETURNS 0 IN W IF VALID RESPONSE
	;
	DQLOW
	PAUSE	600
	INTSOFF
	DQHIZ
	PAUSE	65		; WAIT 67us FOR RESP BIT
	NOP
	NOP
	MOVF	PORTA,W
	INTSON
	ANDLW	1 << DSBIT
	MOVWF	TMP1
	PAUSE	300
	MOVF	TMP1,W		; RESPONSE IN W
	RETURN



DSTX8:	MOVWF	TMP2		; DATA TO TX
	MOVLW	8
	MOVWF	TMP1		; LOOP COUNTER
DSTXLP:	INTSOFF
	DQLOW
	PAUSE	10
	RRF	TMP2
	BTFSC	STATUS,C
	BSF	PORTA,DSBIT	; DQ HI IF BIT WAS 1
	INTSON
	PAUSE	70
	DQHIZ
	NOP
	DECFSZ	TMP1
	GOTO	DSTXLP
	RETURN


DSRX8:	MOVLW	8
	MOVWF	TMP1
DSRXLP:	INTSOFF
	DQLOW
	PAUSE	10
	DQHIZ
	NOP
	NOP
	MOVF	PORTA,W
	INTSON
	ANDLW	1 << DSBIT	; ->0 IF DATA BIT LOW
	ADDLW	255		; C IF W > 0
	RRF	TMP2
	PAUSE	60
	DECFSZ	TMP1
	GOTO	DSRXLP
	MOVF	TMP2,W
	RETURN


; ---------------------------------------------------------


file: /Techref/microchip/davidtait/ds1820.asm, 4KB, , updated: 1996/7/12 03:00, local time: 2024/4/15 23:20,
TOP NEW HELP FIND: 
3.145.23.123:LOG IN

 ©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions?
Please DO link to this page! Digg it! / MAKE!

<A HREF="http://massmind.org/Techref/microchip/davidtait/ds1820.asm"> microchip davidtait ds1820</A>

Did you find what you needed?

 

Welcome to massmind.org!

 

Welcome to massmind.org!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  .