; -------------------------------------------------------- ; ; 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/8/14 22:56,
18.117.184.144: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? <A HREF="http://techref.massmind.org/Techref/microchip/davidtait/ds1820.asm"> microchip davidtait ds1820</A> |
Did you find what you needed? |
Welcome to massmind.org! |
Welcome to techref.massmind.org! |
.