Using the DS1820 Digital Temperature Sensor (Thermometer) by Leo Nechaev
Introduction
The DS1820 is a digital temperature sensor (thermometer) from Dallas Semiconductor. These are its main features:
Interface
The three pins of the DS1820 are: GND, DQ (serial input/output - data line), VDD (optional +5VDC, this device can be powered from data line, but we shall use the standard power circuit). DQ may be connected to open drain (or open collector) output with input feature, and this output pin MUST have a pull-up resistor of approximately 5Kohm.
Programming
I use the MXASS 0.28 assembler . It is an excellent assembler with cool things like local labels and much more. If you use other assembler, take care when renaming local labels and/or long labels.
Registers defining:
rgConfig = $6000 ; Write: D7 - output open drain pin with inversion rgStatus = $6000 ; Read: D7 - input pin without inversionTemperature measuring:
tmpMeasure jsr tmpInit ; DS1820 initializing jsr tmpInitCRC ; CRC initializing lda #$CC ; "Skip ROM" command jsr tmpWrite ; write command to the DS1820 lda #$44 ; "Convert temperature" command jsr tmpWrite jsr tmpDelay ; small delay jsr tmpDelay jsr tmpDelay jsr tmpWaitForReady ; waiting for the end of conversion jsr tmpInit lda #$CC jsr tmpWrite lda #$BE ; "Read scratchpad" command jsr tmpWrite ldy #0 - jsr tmpRead ; read 9 bytes of data, sta tmpBuffer,y ; store them in buffer, jsr tmpUpdateCRC ; and calculate CRC iny cpy #9 bne - jsr tmpInit lda tmpCRC ; if CRC is wrong bne tmpMeasure ; then repeat process rts tmpBuffer .br 9,0 ; Our bufferUsed subroutines, all time delays are designed for clock frequency 2MHz :
tmpInit jsr tmpSetZero ; setting ZERO on data line ldx #0 - dex ; Delay for approx. ~640 microseconds. bne - jsr tmpSetOne ; recovering ONE on data line jsr tmpWaitForReady jsr tmpWaitForReply ; waiting for reply from DS1820 jsr tmpWaitForReady rts tmpSetOne lda #0 sta rgConfig rts tmpSetZero lda #$80 sta rgConfig rts tmpWaitForReady - bit rgStatus bpl - rts tmpWaitForReply - bit rgStatus bmi - rts tmpDelay nop ; time delay is less than 15 microseconds nop nop nop rts tmpWrite ; writting byte to the device ldx #8 ; 8 times - lsr ; bit-by-bit (in carry) pha jsr tmpWriteBit pla dex bne - rts tmpWriteBit php jsr tmpSetZero jsr tmpDelay plp bcc + jsr tmpSetOne + jsr tmpDelay jsr tmpDelay jsr tmpDelay jsr tmpSetOne jsr tmpWaitForReady rts tmpRead ; reading byte from the device ldx #8 ; 8 times - pha jsr tmpReadBit pla ror ; bit-by-bit (in carry) dex bne - rts tmpReadBit jsr tmpSetZero jsr tmpSetOne lda rgConfig asl php jsr tmpDelay jsr tmpDelay jsr tmpDelay jsr tmpWaitForReady plp rts tmpInitCRC lda #0 sta tmpCRC rts tmpUpdateCRC eor tmpCRC tax lda TableCRC,x sta tmpCRC rts tmpCRC .db 0 TableCRC .db 0, 94, 188, 226, 97, 63, 221, 131 .db 194, 156, 126, 32, 163, 253, 31, 65 .db 157, 195, 33, 127, 252, 162, 64, 30 .db 95, 1, 227, 189, 62, 96, 130, 220 .db 35, 125, 159, 193, 66, 28, 254, 160 .db 225, 191, 93, 3, 128, 222, 60, 98 .db 190, 224, 2, 92, 223, 129, 99, 61 .db 124, 34, 192, 158, 29, 67, 161, 255 .db 70, 24, 250, 164, 39, 121, 155, 197 .db 132, 218, 56, 102, 229, 187, 89, 7 .db 219, 133, 103, 57, 186, 228, 6, 88 .db 25, 71, 165, 251, 120, 38, 196, 154 .db 101, 59, 217, 135, 4, 90, 184, 230 .db 167, 249, 27, 69, 198, 152, 122, 36 .db 248, 166, 68, 26, 153, 199, 37, 123 .db 58, 100, 134, 216, 91, 5, 231, 185 .db 140, 210, 48, 110, 237, 179, 81, 15 .db 78, 16, 242, 172, 47, 113, 147, 205 .db 17, 79, 173, 243, 112, 46, 204, 146 .db 211, 141, 111, 49, 178, 236, 14, 80 .db 175, 241, 19, 77, 206, 144, 114, 44 .db 109, 51, 209, 143, 12, 82, 176, 238 .db 50, 108, 142, 208, 83, 13, 239, 177 .db 240, 174, 76, 18, 145, 207, 45, 115 .db 202, 148, 118, 40, 171, 245, 23, 73 .db 8, 86, 180, 234, 105, 55, 213, 139 .db 87, 9, 235, 181, 54, 104, 138, 212 .db 149, 203, 41, 119, 244, 170, 72, 22 .db 233, 183, 85, 11, 136, 214, 52, 106 .db 43, 117, 151, 201, 74, 20, 246, 168 .db 116, 42, 200, 150, 21, 75, 169, 247 .db 182, 232, 10, 84, 215, 137, 107, 53Next subroutine converts read raw binary data into text string with deleting non-significant zeros. The pointer to location of string must be in X (LSB) and Y(MSB), and string must have size of 7 bytes or more (1 symbol - sign, up to 3 symbols - before point, 1 symbol - decimal point, 1 symbols - after point, 1 byte - zero [end of string]) :
tcAdr = $F0 ; MUST be in zeropage tmpConvert stx tcAdr sty tcAdr+1 lda #0 sta tcIndex lda tmpBuffer+1 bpl + eor #$ff sta tmpBuffer+1 lda tmpBuffer eor #$ff clc adc #1 sta tmpBuffer lda tmpBuffer+1 adc #0 sta tmpBuffer+1 lda #"-" jsr tcPrint + lda #0 sta tmpTemp sta tmpTemp+1 lda tmpBuffer lsr tmpBuffer+1 ror tax beq + - sed clc lda tmpTemp adc #1 sta tmpTemp lda tmpTemp+1 adc #0 sta tmpTemp+1 cld dex bne - + lda tmpTemp+1 and #1 beq + inx ora #$30 jsr tcPrint + lda tmpTemp pha lsr lsr lsr lsr cmp #0 beq + - inx ora #$30 jsr tcPrint jmp *+7 + cpx #0 bne - pla and #$0f ora #$30 jsr tcPrint lda #"." jsr tcPrint lda #"0" lsr tmpBuffer bcc + lda #"5" + jsr tcPrint lda #0 jsr tcPrint rts tmpTemp .br 2,0 tcPrint ldy tcIndex sta (tcAdr),y inc tcIndex rts tcIndex .db 0
Last page update: November 14, 2000.