DS18S20

Dependencies:   mbed

Committer:
aitouares
Date:
Thu Apr 26 14:18:31 2012 +0000
Revision:
0:5b6520e71eb6

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aitouares 0:5b6520e71eb6 1 /*** D'apres : *********************************************************
aitouares 0:5b6520e71eb6 2 *
aitouares 0:5b6520e71eb6 3 * FILENAME: ds1820.h
aitouares 0:5b6520e71eb6 4 * DATE: 25.02.2005
aitouares 0:5b6520e71eb6 5 * AUTHOR: Christian Stadler
aitouares 0:5b6520e71eb6 6 *
aitouares 0:5b6520e71eb6 7 * DESCRIPTION: Driver for DS1820 1-Wire Temperature sensor (Dallas)
aitouares 0:5b6520e71eb6 8 *
aitouares 0:5b6520e71eb6 9 ******************************************************************************/
aitouares 0:5b6520e71eb6 10 #include "mbed.h"
aitouares 0:5b6520e71eb6 11 DigitalInOut DQ (p15); // broche DQ relie a la broche p15 du MBED
aitouares 0:5b6520e71eb6 12 DigitalOut G__MOS_P (p16);
aitouares 0:5b6520e71eb6 13 Serial pc(USBTX, USBRX); // tx, rx
aitouares 0:5b6520e71eb6 14 /* -------------------------------------------------------------------------- */
aitouares 0:5b6520e71eb6 15 /* DS1820 Timing Parameters */
aitouares 0:5b6520e71eb6 16 /* -------------------------------------------------------------------------- */
aitouares 0:5b6520e71eb6 17 #define DS1820_RST_PULSE 480 /* master reset pulse time in [us] */
aitouares 0:5b6520e71eb6 18 #define DS1820_MSTR_BITSTART 2 /* delay time for bit start by master */
aitouares 0:5b6520e71eb6 19 #define DS1820_PRESENCE_WAIT 40 /* delay after master reset pulse in [us] */
aitouares 0:5b6520e71eb6 20 #define DS1820_PRESENCE_FIN 480 /* dealy after reading of presence pulse [us] */
aitouares 0:5b6520e71eb6 21 #define DS1820_BITREAD_DLY 5 /* bit read delay */
aitouares 0:5b6520e71eb6 22 #define DS1820_BITWRITE_DLY 100 /* bit write delay */
aitouares 0:5b6520e71eb6 23
aitouares 0:5b6520e71eb6 24
aitouares 0:5b6520e71eb6 25 /* -------------------------------------------------------------------------- */
aitouares 0:5b6520e71eb6 26 /* DS1820 Registers */
aitouares 0:5b6520e71eb6 27 /* -------------------------------------------------------------------------- */
aitouares 0:5b6520e71eb6 28
aitouares 0:5b6520e71eb6 29 #define DS1820_REG_TEMPLSB 0
aitouares 0:5b6520e71eb6 30 #define DS1820_REG_TEMPMSB 1
aitouares 0:5b6520e71eb6 31 #define DS1820_REG_CNTREMAIN 6
aitouares 0:5b6520e71eb6 32 #define DS1820_REG_CNTPERSEC 7
aitouares 0:5b6520e71eb6 33 #define DS1820_SCRPADMEM_LEN 9 // length of scratchpad memory
aitouares 0:5b6520e71eb6 34
aitouares 0:5b6520e71eb6 35 #define DS1820_ADDR_LEN 8
aitouares 0:5b6520e71eb6 36
aitouares 0:5b6520e71eb6 37
aitouares 0:5b6520e71eb6 38 /* -------------------------------------------------------------------------- */
aitouares 0:5b6520e71eb6 39 /* DS1820 Commands */
aitouares 0:5b6520e71eb6 40 /* -------------------------------------------------------------------------- */
aitouares 0:5b6520e71eb6 41
aitouares 0:5b6520e71eb6 42 #define DS1820_CMD_SEARCHROM 0xF0 // recherche des differents DS1820 et de leur numROMs
aitouares 0:5b6520e71eb6 43 #define DS1820_CMD_READROM 0x33 // idem que SEARCHROM mais utilise pour 1 seul DS1820
aitouares 0:5b6520e71eb6 44 #define DS1820_CMD_MATCHROM 0x55 // permet de communiquer avec un DS1820 en particulier grace a son numROM
aitouares 0:5b6520e71eb6 45 #define DS1820_CMD_SKIPROM 0xCC // permet de communiquer avec tous les DS1820 en meme temps
aitouares 0:5b6520e71eb6 46 #define DS1820_CMD_ALARMSEARCH 0xEC // permet de dialoguer seulement avec les DS1820 qui ont un flag
aitouares 0:5b6520e71eb6 47 #define DS1820_CMD_CONVERTTEMP 0x44 // permet de lancer un convertion de la temperature, le resultat sera stocke dans le scratchpad
aitouares 0:5b6520e71eb6 48 #define DS1820_CMD_WRITESCRPAD 0x4E // permet au MBED d'ecrire deux octets dans le scratchpad dont un dans le registre TH et un dans le registre TL
aitouares 0:5b6520e71eb6 49 #define DS1820_CMD_READSCRPAD 0xBE // permet au MBED de lire le scratchpad
aitouares 0:5b6520e71eb6 50 #define DS1820_CMD_COPYSCRPAD 0x48 // permet de copier le scratchpad et les registres TH, TL stocke dans EEPROM
aitouares 0:5b6520e71eb6 51 #define DS1820_CMD_RECALLEE 0xB8 // rappel les valeur de declenchement de l'alarme
aitouares 0:5b6520e71eb6 52
aitouares 0:5b6520e71eb6 53
aitouares 0:5b6520e71eb6 54 #define DS1820_FAMILY_CODE_DS18B20 0x28
aitouares 0:5b6520e71eb6 55 #define DS1820_FAMILY_CODE_DS18S20 0x10
aitouares 0:5b6520e71eb6 56
aitouares 0:5b6520e71eb6 57 char dowcrc=0; // crc is accumulated in this variable
aitouares 0:5b6520e71eb6 58 // crc lookup table
aitouares 0:5b6520e71eb6 59 char const dscrc_table[] = {
aitouares 0:5b6520e71eb6 60 0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
aitouares 0:5b6520e71eb6 61 157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220,
aitouares 0:5b6520e71eb6 62 35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98,
aitouares 0:5b6520e71eb6 63 190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
aitouares 0:5b6520e71eb6 64 70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,
aitouares 0:5b6520e71eb6 65 219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154,
aitouares 0:5b6520e71eb6 66 101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36,
aitouares 0:5b6520e71eb6 67 248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185,
aitouares 0:5b6520e71eb6 68 140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
aitouares 0:5b6520e71eb6 69 17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
aitouares 0:5b6520e71eb6 70 175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
aitouares 0:5b6520e71eb6 71 50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
aitouares 0:5b6520e71eb6 72 202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139,
aitouares 0:5b6520e71eb6 73 87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
aitouares 0:5b6520e71eb6 74 233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
aitouares 0:5b6520e71eb6 75 116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53
aitouares 0:5b6520e71eb6 76 };
aitouares 0:5b6520e71eb6 77
aitouares 0:5b6520e71eb6 78 /* -------------------------------------------------------------------------- */
aitouares 0:5b6520e71eb6 79 bool doneFlag; // declaration d'une variable booleenne "doneFlag"
aitouares 0:5b6520e71eb6 80 char lastDiscrep,numROMs; // declaration des variables lastDiscrep et numROMs
aitouares 0:5b6520e71eb6 81 char RomBytes[DS1820_ADDR_LEN]; // declaration de la variable RomBytes[DS1820_ADDR_LEN]
aitouares 0:5b6520e71eb6 82 char FoundROM[9][8]; // Table of found ROM codes, 8 bytes for each
aitouares 0:5b6520e71eb6 83
aitouares 0:5b6520e71eb6 84
aitouares 0:5b6520e71eb6 85 /* -------------------------------------------------------------------------- */
aitouares 0:5b6520e71eb6 86 /* Low-Level Functions */
aitouares 0:5b6520e71eb6 87 /* -------------------------------------------------------------------------- */
aitouares 0:5b6520e71eb6 88 /*******************************************************************************
aitouares 0:5b6520e71eb6 89 * FUNCTION: ow_reset
aitouares 0:5b6520e71eb6 90 * PURPOSE: Initializes the DS1820 device.
aitouares 0:5b6520e71eb6 91 *
aitouares 0:5b6520e71eb6 92 * INPUT: -
aitouares 0:5b6520e71eb6 93 * OUTPUT: -
aitouares 0:5b6520e71eb6 94 * RETURN: FALSE if at least one device is on the 1-wire bus, TRUE otherwise
aitouares 0:5b6520e71eb6 95 ******************************************************************************/
aitouares 0:5b6520e71eb6 96 bool ow_reset(void)
aitouares 0:5b6520e71eb6 97 {
aitouares 0:5b6520e71eb6 98 bool presence;
aitouares 0:5b6520e71eb6 99
aitouares 0:5b6520e71eb6 100 /* reset pulse */
aitouares 0:5b6520e71eb6 101 DQ.output();
aitouares 0:5b6520e71eb6 102 DQ=0;
aitouares 0:5b6520e71eb6 103 wait_us(DS1820_RST_PULSE);
aitouares 0:5b6520e71eb6 104 DQ=1;
aitouares 0:5b6520e71eb6 105
aitouares 0:5b6520e71eb6 106 /* wait until pullup pull 1-wire bus to high */
aitouares 0:5b6520e71eb6 107 wait_us(DS1820_PRESENCE_WAIT);
aitouares 0:5b6520e71eb6 108
aitouares 0:5b6520e71eb6 109 /* get presence pulse */
aitouares 0:5b6520e71eb6 110 DQ.input();
aitouares 0:5b6520e71eb6 111 presence=DQ.read();
aitouares 0:5b6520e71eb6 112
aitouares 0:5b6520e71eb6 113 wait_us(424);
aitouares 0:5b6520e71eb6 114
aitouares 0:5b6520e71eb6 115 return presence;
aitouares 0:5b6520e71eb6 116 }
aitouares 0:5b6520e71eb6 117
aitouares 0:5b6520e71eb6 118 /*******************************************************************************
aitouares 0:5b6520e71eb6 119 * FUNCTION: read_bit
aitouares 0:5b6520e71eb6 120 * PURPOSE: Reads a single bit from the DS1820 device.
aitouares 0:5b6520e71eb6 121 *
aitouares 0:5b6520e71eb6 122 * INPUT: -
aitouares 0:5b6520e71eb6 123 * OUTPUT: -
aitouares 0:5b6520e71eb6 124 * RETURN: bool value of the bit which as been read form the DS1820
aitouares 0:5b6520e71eb6 125 ******************************************************************************/
aitouares 0:5b6520e71eb6 126 bool read_bit(void)
aitouares 0:5b6520e71eb6 127 {
aitouares 0:5b6520e71eb6 128 DQ.output();
aitouares 0:5b6520e71eb6 129 DQ=0;
aitouares 0:5b6520e71eb6 130 wait_us(DS1820_MSTR_BITSTART);
aitouares 0:5b6520e71eb6 131 DQ.input();
aitouares 0:5b6520e71eb6 132 DQ.read();
aitouares 0:5b6520e71eb6 133 wait_us(DS1820_BITREAD_DLY);
aitouares 0:5b6520e71eb6 134
aitouares 0:5b6520e71eb6 135 return (DQ);
aitouares 0:5b6520e71eb6 136 }
aitouares 0:5b6520e71eb6 137
aitouares 0:5b6520e71eb6 138 /*******************************************************************************
aitouares 0:5b6520e71eb6 139 * FUNCTION: write_bit
aitouares 0:5b6520e71eb6 140 * PURPOSE: Writes a single bit to the DS1820 device.
aitouares 0:5b6520e71eb6 141 *
aitouares 0:5b6520e71eb6 142 * INPUT: bBit value of bit to be written
aitouares 0:5b6520e71eb6 143 * OUTPUT: -
aitouares 0:5b6520e71eb6 144 * RETURN: -
aitouares 0:5b6520e71eb6 145 ******************************************************************************/
aitouares 0:5b6520e71eb6 146 void write_bit(bool bBit)
aitouares 0:5b6520e71eb6 147 {
aitouares 0:5b6520e71eb6 148 DQ.output();
aitouares 0:5b6520e71eb6 149 DQ=0;
aitouares 0:5b6520e71eb6 150 wait_us(DS1820_MSTR_BITSTART);
aitouares 0:5b6520e71eb6 151
aitouares 0:5b6520e71eb6 152 if (bBit != false) DQ=1;
aitouares 0:5b6520e71eb6 153
aitouares 0:5b6520e71eb6 154 wait_us(DS1820_BITWRITE_DLY);
aitouares 0:5b6520e71eb6 155 DQ=1;
aitouares 0:5b6520e71eb6 156
aitouares 0:5b6520e71eb6 157 }
aitouares 0:5b6520e71eb6 158
aitouares 0:5b6520e71eb6 159 /*******************************************************************************
aitouares 0:5b6520e71eb6 160 * FUNCTION: read_byte
aitouares 0:5b6520e71eb6 161 * PURPOSE: Reads a single byte from the DS1820 device.
aitouares 0:5b6520e71eb6 162 *
aitouares 0:5b6520e71eb6 163 * INPUT: -
aitouares 0:5b6520e71eb6 164 * OUTPUT: -
aitouares 0:5b6520e71eb6 165 * RETURN: uint8 byte which has been read from the DS1820
aitouares 0:5b6520e71eb6 166 ******************************************************************************/
aitouares 0:5b6520e71eb6 167 char read_byte(void)
aitouares 0:5b6520e71eb6 168 {
aitouares 0:5b6520e71eb6 169 char i;
aitouares 0:5b6520e71eb6 170 char value = 0;
aitouares 0:5b6520e71eb6 171
aitouares 0:5b6520e71eb6 172 for (i=0 ; i < 8; i++)
aitouares 0:5b6520e71eb6 173 {
aitouares 0:5b6520e71eb6 174 if ( read_bit() ) value |= (1 << i);
aitouares 0:5b6520e71eb6 175 wait_us(120);
aitouares 0:5b6520e71eb6 176 }
aitouares 0:5b6520e71eb6 177 return(value);
aitouares 0:5b6520e71eb6 178 }
aitouares 0:5b6520e71eb6 179
aitouares 0:5b6520e71eb6 180 /*******************************************************************************
aitouares 0:5b6520e71eb6 181 * FUNCTION: write_byte
aitouares 0:5b6520e71eb6 182 * PURPOSE: Writes a single byte to the DS1820 device.
aitouares 0:5b6520e71eb6 183 *
aitouares 0:5b6520e71eb6 184 * INPUT: val_u8 byte to be written
aitouares 0:5b6520e71eb6 185 * OUTPUT: -
aitouares 0:5b6520e71eb6 186 * RETURN: -
aitouares 0:5b6520e71eb6 187 ******************************************************************************/
aitouares 0:5b6520e71eb6 188 void write_byte(char val_u8)
aitouares 0:5b6520e71eb6 189 {
aitouares 0:5b6520e71eb6 190 char i;
aitouares 0:5b6520e71eb6 191 char temp;
aitouares 0:5b6520e71eb6 192
aitouares 0:5b6520e71eb6 193 for (i=0; i < 8; i++) /* writes byte, one bit at a time */
aitouares 0:5b6520e71eb6 194 {
aitouares 0:5b6520e71eb6 195 temp = val_u8 >> i; /* shifts val right 'i' spaces */
aitouares 0:5b6520e71eb6 196 temp &= 0x01; /* copy that bit to temp */
aitouares 0:5b6520e71eb6 197 write_bit(temp); /* write bit in temp into */
aitouares 0:5b6520e71eb6 198 }
aitouares 0:5b6520e71eb6 199
aitouares 0:5b6520e71eb6 200 wait_us(105);
aitouares 0:5b6520e71eb6 201 }
aitouares 0:5b6520e71eb6 202 /* -------------------------------------------------------------------------- */
aitouares 0:5b6520e71eb6 203 // One wire crc
aitouares 0:5b6520e71eb6 204 char ow_crc(char x)
aitouares 0:5b6520e71eb6 205 {
aitouares 0:5b6520e71eb6 206 dowcrc = dscrc_table[dowcrc^x];
aitouares 0:5b6520e71eb6 207 return dowcrc;
aitouares 0:5b6520e71eb6 208 }
aitouares 0:5b6520e71eb6 209 /* -------------------------------------------------------------------------- */
aitouares 0:5b6520e71eb6 210 /* API Interface */
aitouares 0:5b6520e71eb6 211 /* -------------------------------------------------------------------------- */
aitouares 0:5b6520e71eb6 212
aitouares 0:5b6520e71eb6 213 /*******************************************************************************
aitouares 0:5b6520e71eb6 214 * FUNCTION: DS1820_AddrDevice
aitouares 0:5b6520e71eb6 215 * PURPOSE: Addresses a single or all devices on the 1-wire bus.
aitouares 0:5b6520e71eb6 216 *
aitouares 0:5b6520e71eb6 217 * INPUT: nAddrMethod use DS1820_CMD_MATCHROM to select a single
aitouares 0:5b6520e71eb6 218 * device or DS1820_CMD_SKIPROM to select all
aitouares 0:5b6520e71eb6 219 * OUTPUT: -
aitouares 0:5b6520e71eb6 220 * RETURN: -
aitouares 0:5b6520e71eb6 221 ******************************************************************************/
aitouares 0:5b6520e71eb6 222 void DS1820_AddrDevice(char nAddrMethod)
aitouares 0:5b6520e71eb6 223 {
aitouares 0:5b6520e71eb6 224 char i;
aitouares 0:5b6520e71eb6 225
aitouares 0:5b6520e71eb6 226 if (nAddrMethod == DS1820_CMD_MATCHROM)
aitouares 0:5b6520e71eb6 227 {
aitouares 0:5b6520e71eb6 228 write_byte(DS1820_CMD_MATCHROM); /* address single devices on bus */
aitouares 0:5b6520e71eb6 229 for (i = 0; i < DS1820_ADDR_LEN; i ++)
aitouares 0:5b6520e71eb6 230 write_byte(RomBytes[i]);
aitouares 0:5b6520e71eb6 231 }
aitouares 0:5b6520e71eb6 232 else
aitouares 0:5b6520e71eb6 233 write_byte(DS1820_CMD_SKIPROM); /* address all devices on bus */
aitouares 0:5b6520e71eb6 234 }
aitouares 0:5b6520e71eb6 235
aitouares 0:5b6520e71eb6 236 /*******************************************************************************
aitouares 0:5b6520e71eb6 237 * FUNCTION: Next
aitouares 0:5b6520e71eb6 238 * PURPOSE: Finds next device connected to the 1-wire bus.
aitouares 0:5b6520e71eb6 239 *
aitouares 0:5b6520e71eb6 240 * INPUT: -
aitouares 0:5b6520e71eb6 241 * OUTPUT: RomBytes[] ROM code of the next device
aitouares 0:5b6520e71eb6 242 * RETURN: bool TRUE if there are more devices on the 1-wire
aitouares 0:5b6520e71eb6 243 * bus, FALSE otherwise
aitouares 0:5b6520e71eb6 244 ******************************************************************************/
aitouares 0:5b6520e71eb6 245 bool Next(void)
aitouares 0:5b6520e71eb6 246 {
aitouares 0:5b6520e71eb6 247 char x;
aitouares 0:5b6520e71eb6 248 char n;
aitouares 0:5b6520e71eb6 249 char k = 1;
aitouares 0:5b6520e71eb6 250 char m = 1;
aitouares 0:5b6520e71eb6 251 char discrepMarker = 0;
aitouares 0:5b6520e71eb6 252 bool g;
aitouares 0:5b6520e71eb6 253 bool flag;
aitouares 0:5b6520e71eb6 254 bool nxt = false;
aitouares 0:5b6520e71eb6 255
aitouares 0:5b6520e71eb6 256 /* init ROM address */
aitouares 0:5b6520e71eb6 257 for (n=0; n < 8; n ++)
aitouares 0:5b6520e71eb6 258 RomBytes[n] = 0x00;
aitouares 0:5b6520e71eb6 259
aitouares 0:5b6520e71eb6 260 flag = ow_reset(); /* reset the 1-wire */
aitouares 0:5b6520e71eb6 261
aitouares 0:5b6520e71eb6 262 if (flag || doneFlag) /* no device found */
aitouares 0:5b6520e71eb6 263 {
aitouares 0:5b6520e71eb6 264 lastDiscrep = 0; /* reset the search */
aitouares 0:5b6520e71eb6 265 return false;
aitouares 0:5b6520e71eb6 266 }
aitouares 0:5b6520e71eb6 267
aitouares 0:5b6520e71eb6 268 /* send search rom command */
aitouares 0:5b6520e71eb6 269 write_byte(DS1820_CMD_SEARCHROM);
aitouares 0:5b6520e71eb6 270
aitouares 0:5b6520e71eb6 271 n = 0;
aitouares 0:5b6520e71eb6 272 do
aitouares 0:5b6520e71eb6 273 {
aitouares 0:5b6520e71eb6 274 x = 0;
aitouares 0:5b6520e71eb6 275
aitouares 0:5b6520e71eb6 276 /* read bit */
aitouares 0:5b6520e71eb6 277 if ( read_bit() == 1 ) x = 2;
aitouares 0:5b6520e71eb6 278 wait_us(120);
aitouares 0:5b6520e71eb6 279
aitouares 0:5b6520e71eb6 280 /* read bit complement */
aitouares 0:5b6520e71eb6 281 if ( read_bit() == 1 ) x |= 1;
aitouares 0:5b6520e71eb6 282 wait_us(120);
aitouares 0:5b6520e71eb6 283
aitouares 0:5b6520e71eb6 284 /* description for values of x: */
aitouares 0:5b6520e71eb6 285 /* 00 There are devices connected to the bus which have conflicting */
aitouares 0:5b6520e71eb6 286 /* bits in the current ROM code bit position. */
aitouares 0:5b6520e71eb6 287 /* 01 All devices connected to the bus have a 0 in this bit position. */
aitouares 0:5b6520e71eb6 288 /* 10 All devices connected to the bus have a 1 in this bit position. */
aitouares 0:5b6520e71eb6 289 /* 11 There are no devices connected to the 1-wire bus. */
aitouares 0:5b6520e71eb6 290
aitouares 0:5b6520e71eb6 291 /* if there are no devices on the bus */
aitouares 0:5b6520e71eb6 292 if (x == 3) break;
aitouares 0:5b6520e71eb6 293 else
aitouares 0:5b6520e71eb6 294 {
aitouares 0:5b6520e71eb6 295 /* devices have the same logical value at this position */
aitouares 0:5b6520e71eb6 296 if (x > 0) g = (bool)(x >> 1);// get bit value
aitouares 0:5b6520e71eb6 297 /* devices have confilcting bits in the current ROM code */
aitouares 0:5b6520e71eb6 298 else
aitouares 0:5b6520e71eb6 299 {
aitouares 0:5b6520e71eb6 300 /* if there was a conflict on the last iteration */
aitouares 0:5b6520e71eb6 301 if (m < lastDiscrep)
aitouares 0:5b6520e71eb6 302 /* take same bit as in last iteration */
aitouares 0:5b6520e71eb6 303 g = ( (RomBytes[n] & k) > 0 );
aitouares 0:5b6520e71eb6 304 else
aitouares 0:5b6520e71eb6 305 g = (m == lastDiscrep);
aitouares 0:5b6520e71eb6 306
aitouares 0:5b6520e71eb6 307 if (g == 0)
aitouares 0:5b6520e71eb6 308 discrepMarker = m;
aitouares 0:5b6520e71eb6 309 }
aitouares 0:5b6520e71eb6 310
aitouares 0:5b6520e71eb6 311 /* store bit in ROM address */
aitouares 0:5b6520e71eb6 312 if (g ==1)
aitouares 0:5b6520e71eb6 313 RomBytes[n] |= k;
aitouares 0:5b6520e71eb6 314 else
aitouares 0:5b6520e71eb6 315 RomBytes[n] &= ~k;
aitouares 0:5b6520e71eb6 316
aitouares 0:5b6520e71eb6 317 write_bit(g);
aitouares 0:5b6520e71eb6 318
aitouares 0:5b6520e71eb6 319 /* increment bit position */
aitouares 0:5b6520e71eb6 320 m ++;
aitouares 0:5b6520e71eb6 321
aitouares 0:5b6520e71eb6 322 /* calculate next mask value */
aitouares 0:5b6520e71eb6 323 k = k << 1;
aitouares 0:5b6520e71eb6 324
aitouares 0:5b6520e71eb6 325 /* check if this byte has finished */
aitouares 0:5b6520e71eb6 326 if (k == 0)
aitouares 0:5b6520e71eb6 327 {
aitouares 0:5b6520e71eb6 328 ow_crc(RomBytes[n]); // Accumulate the crc
aitouares 0:5b6520e71eb6 329 n ++; /* advance to next byte of ROM mask */
aitouares 0:5b6520e71eb6 330 k = 1; /* update mask */
aitouares 0:5b6520e71eb6 331 }
aitouares 0:5b6520e71eb6 332 }
aitouares 0:5b6520e71eb6 333 } while (n < DS1820_ADDR_LEN);
aitouares 0:5b6520e71eb6 334
aitouares 0:5b6520e71eb6 335
aitouares 0:5b6520e71eb6 336 /* if search was unsuccessful then */
aitouares 0:5b6520e71eb6 337 if ((m < 65) ||dowcrc)
aitouares 0:5b6520e71eb6 338 // if (m < 65 )
aitouares 0:5b6520e71eb6 339 /* reset the last discrepancy to 0 */
aitouares 0:5b6520e71eb6 340 lastDiscrep = 0;
aitouares 0:5b6520e71eb6 341 else
aitouares 0:5b6520e71eb6 342 {
aitouares 0:5b6520e71eb6 343 /* search was successful */
aitouares 0:5b6520e71eb6 344 lastDiscrep = discrepMarker;
aitouares 0:5b6520e71eb6 345 doneFlag = (lastDiscrep == 0);
aitouares 0:5b6520e71eb6 346
aitouares 0:5b6520e71eb6 347 /* indicates search is not complete yet, more parts remain */
aitouares 0:5b6520e71eb6 348 nxt = true;
aitouares 0:5b6520e71eb6 349 }
aitouares 0:5b6520e71eb6 350 return nxt;
aitouares 0:5b6520e71eb6 351 }
aitouares 0:5b6520e71eb6 352
aitouares 0:5b6520e71eb6 353 /*******************************************************************************
aitouares 0:5b6520e71eb6 354 * FUNCTION: First
aitouares 0:5b6520e71eb6 355 * PURPOSE: Starts the device search on the 1-wire bus.
aitouares 0:5b6520e71eb6 356 *
aitouares 0:5b6520e71eb6 357 * INPUT: -
aitouares 0:5b6520e71eb6 358 * OUTPUT: RomBytes[] ROM code of the first device
aitouares 0:5b6520e71eb6 359 * RETURN: bool TRUE if there are more devices on the 1-wire
aitouares 0:5b6520e71eb6 360 * bus, FALSE otherwise
aitouares 0:5b6520e71eb6 361 ******************************************************************************/
aitouares 0:5b6520e71eb6 362 bool First(void)
aitouares 0:5b6520e71eb6 363 {
aitouares 0:5b6520e71eb6 364 lastDiscrep = 0;
aitouares 0:5b6520e71eb6 365 doneFlag = false;
aitouares 0:5b6520e71eb6 366
aitouares 0:5b6520e71eb6 367 return ( Next() );
aitouares 0:5b6520e71eb6 368 }
aitouares 0:5b6520e71eb6 369 /* -------------------------------------------------------------------------- */
aitouares 0:5b6520e71eb6 370 void FindDevices(void)
aitouares 0:5b6520e71eb6 371 {
aitouares 0:5b6520e71eb6 372 char m;
aitouares 0:5b6520e71eb6 373 if(!ow_reset())
aitouares 0:5b6520e71eb6 374 {
aitouares 0:5b6520e71eb6 375 if(First()) // Begins when at least one part found
aitouares 0:5b6520e71eb6 376 {
aitouares 0:5b6520e71eb6 377 numROMs = 0;
aitouares 0:5b6520e71eb6 378 do
aitouares 0:5b6520e71eb6 379 {
aitouares 0:5b6520e71eb6 380 numROMs++;
aitouares 0:5b6520e71eb6 381 for (m=0;m<8;m++)
aitouares 0:5b6520e71eb6 382 {
aitouares 0:5b6520e71eb6 383 FoundROM[numROMs-1][m] = RomBytes[m];
aitouares 0:5b6520e71eb6 384 }
aitouares 0:5b6520e71eb6 385 } while (Next()&&(numROMs<10)); // Continues until no additional
aitouares 0:5b6520e71eb6 386 }
aitouares 0:5b6520e71eb6 387 }
aitouares 0:5b6520e71eb6 388
aitouares 0:5b6520e71eb6 389 }
aitouares 0:5b6520e71eb6 390 //******************************************************************************
aitouares 0:5b6520e71eb6 391 // Sends Match ROM command to bus then device address
aitouares 0:5b6520e71eb6 392 char Send_MatchRom(char actNumROM)
aitouares 0:5b6520e71eb6 393 {
aitouares 0:5b6520e71eb6 394 char i;
aitouares 0:5b6520e71eb6 395 if (ow_reset()) return false; // 0 if device present
aitouares 0:5b6520e71eb6 396 write_byte(0x55); // Match ROM
aitouares 0:5b6520e71eb6 397
aitouares 0:5b6520e71eb6 398 for (i=0;i<8;i++)
aitouares 0:5b6520e71eb6 399 {
aitouares 0:5b6520e71eb6 400 write_byte(FoundROM[actNumROM][i]); // Send ROM code
aitouares 0:5b6520e71eb6 401 }
aitouares 0:5b6520e71eb6 402
aitouares 0:5b6520e71eb6 403 return true;
aitouares 0:5b6520e71eb6 404 }
aitouares 0:5b6520e71eb6 405 //******************************************************************************
aitouares 0:5b6520e71eb6 406 void Read_ROMCode(void)
aitouares 0:5b6520e71eb6 407 {
aitouares 0:5b6520e71eb6 408 char n;
aitouares 0:5b6520e71eb6 409 char dat[9];
aitouares 0:5b6520e71eb6 410
aitouares 0:5b6520e71eb6 411 ow_reset();
aitouares 0:5b6520e71eb6 412 write_byte(0x33);
aitouares 0:5b6520e71eb6 413 for (n=0;n<8;n++){dat[n]=read_byte();}
aitouares 0:5b6520e71eb6 414
aitouares 0:5b6520e71eb6 415 pc.printf("\f%X%X%X%X\n%X%X%X%X",dat[0],dat[1],dat[2],dat[3],dat[4],dat[5],
aitouares 0:5b6520e71eb6 416 dat[6],dat[7]);
aitouares 0:5b6520e71eb6 417
aitouares 0:5b6520e71eb6 418 wait_ms(5000);
aitouares 0:5b6520e71eb6 419 }
aitouares 0:5b6520e71eb6 420 /*******************************************************************************
aitouares 0:5b6520e71eb6 421 * FUNCTION: DS1820_WriteEEPROM
aitouares 0:5b6520e71eb6 422 * PURPOSE: Writes to the DS1820 EEPROM memory (2 bytes available).
aitouares 0:5b6520e71eb6 423 *
aitouares 0:5b6520e71eb6 424 * INPUT: nTHigh high byte of EEPROM
aitouares 0:5b6520e71eb6 425 * nTLow low byte of EEPROM
aitouares 0:5b6520e71eb6 426 * OUTPUT: -
aitouares 0:5b6520e71eb6 427 * RETURN: -
aitouares 0:5b6520e71eb6 428 ******************************************************************************/
aitouares 0:5b6520e71eb6 429 void DS1820_WriteEEPROM(char nTHigh, char nTLow)
aitouares 0:5b6520e71eb6 430 {
aitouares 0:5b6520e71eb6 431 /* --- write to scratchpad ----------------------------------------------- */
aitouares 0:5b6520e71eb6 432 ow_reset(); // appel de la fonction ow_reset
aitouares 0:5b6520e71eb6 433 DS1820_AddrDevice(DS1820_CMD_MATCHROM);
aitouares 0:5b6520e71eb6 434 write_byte(DS1820_CMD_WRITESCRPAD); // debut conversion
aitouares 0:5b6520e71eb6 435 write_byte(nTHigh);
aitouares 0:5b6520e71eb6 436 write_byte(nTLow);
aitouares 0:5b6520e71eb6 437 wait_us(10); // attendre 10ms
aitouares 0:5b6520e71eb6 438 ow_reset(); // appel de la fonction ow_reset
aitouares 0:5b6520e71eb6 439 DS1820_AddrDevice(DS1820_CMD_MATCHROM);
aitouares 0:5b6520e71eb6 440 write_byte(DS1820_CMD_COPYSCRPAD); // start conversion
aitouares 0:5b6520e71eb6 441 G__MOS_P=0; // "strong pullup"
aitouares 0:5b6520e71eb6 442 wait_ms(10); // attendre 10 ms
aitouares 0:5b6520e71eb6 443 G__MOS_P=1; // "strong pullup"
aitouares 0:5b6520e71eb6 444 }
aitouares 0:5b6520e71eb6 445
aitouares 0:5b6520e71eb6 446 /*******************************************************************************
aitouares 0:5b6520e71eb6 447 * FUNCTION: DS1820_GetTemp
aitouares 0:5b6520e71eb6 448 * PURPOSE: Get temperature value from single DS1820 device.
aitouares 0:5b6520e71eb6 449 *
aitouares 0:5b6520e71eb6 450 * Scratchpad Memory Layout
aitouares 0:5b6520e71eb6 451 * Byte Register
aitouares 0:5b6520e71eb6 452 * 0 Temperature_LSB
aitouares 0:5b6520e71eb6 453 * 1 Temperature_MSB
aitouares 0:5b6520e71eb6 454 * 2 Temp Alarm High / User Byte 1
aitouares 0:5b6520e71eb6 455 * 3 Temp Alarm Low / User Byte 2
aitouares 0:5b6520e71eb6 456 * 4 Reserved
aitouares 0:5b6520e71eb6 457 * 5 Reserved
aitouares 0:5b6520e71eb6 458 * 6 Count_Remain
aitouares 0:5b6520e71eb6 459 * 7 Count_per_C
aitouares 0:5b6520e71eb6 460 * 8 CRC
aitouares 0:5b6520e71eb6 461 *
aitouares 0:5b6520e71eb6 462 * Temperature calculation for DS18S20 (Family Code 0x10):
aitouares 0:5b6520e71eb6 463 * =======================================================
aitouares 0:5b6520e71eb6 464 * (Count_per_C - Count_Remain)
aitouares 0:5b6520e71eb6 465 * Temperature = temp_read - 0.25 + ----------------------------
aitouares 0:5b6520e71eb6 466 * Count_per_C
aitouares 0:5b6520e71eb6 467 *
aitouares 0:5b6520e71eb6 468 * Where temp_read is the value from the temp_MSB and temp_LSB with
aitouares 0:5b6520e71eb6 469 * the least significant bit removed (the 0.5C bit).
aitouares 0:5b6520e71eb6 470 *
aitouares 0:5b6520e71eb6 471 *
aitouares 0:5b6520e71eb6 472 * Temperature calculation for DS18B20 (Family Code 0x28):
aitouares 0:5b6520e71eb6 473 * =======================================================
aitouares 0:5b6520e71eb6 474 * bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
aitouares 0:5b6520e71eb6 475 * LSB 2^3 2^2 2^1 2^0 2^-1 2^-2 2^-3 2^-4
aitouares 0:5b6520e71eb6 476 * bit15 bit14 bit13 bit12 bit3 bit2 bit1 bit0
aitouares 0:5b6520e71eb6 477 * MSB S S S S S 2^6 2^5 2^4
aitouares 0:5b6520e71eb6 478 *
aitouares 0:5b6520e71eb6 479 * The temperature data is stored as a 16-bit sign-extended two&#65533;s
aitouares 0:5b6520e71eb6 480 * complement number in the temperature register. The sign bits (S)
aitouares 0:5b6520e71eb6 481 * indicate if the temperature is positive or negative: for
aitouares 0:5b6520e71eb6 482 * positive numbers S = 0 and for negative numbers S = 1.
aitouares 0:5b6520e71eb6 483 *
aitouares 0:5b6520e71eb6 484 * RETURN: float
aitouares 0:5b6520e71eb6 485 ******************************************************************************/
aitouares 0:5b6520e71eb6 486 float DS1820_GetTemp(void) //fonction capture de la temperature
aitouares 0:5b6520e71eb6 487 {
aitouares 0:5b6520e71eb6 488 char i; //declaration de la variable i
aitouares 0:5b6520e71eb6 489 char scrpad[DS1820_SCRPADMEM_LEN]; //declaration de la variable scrpad[DS1820_SCRPADMEM_LEN]
aitouares 0:5b6520e71eb6 490 signed char temp_read; //declaration de la variable signe temp_read
aitouares 0:5b6520e71eb6 491 float temperature; //declaration de la variable flotante temperature
aitouares 0:5b6520e71eb6 492
aitouares 0:5b6520e71eb6 493 /* --- start temperature conversion -------------------------------------- */
aitouares 0:5b6520e71eb6 494 ow_reset();
aitouares 0:5b6520e71eb6 495 DS1820_AddrDevice(DS1820_CMD_MATCHROM); /* address the device */
aitouares 0:5b6520e71eb6 496 DQ.output(); //DQ en sortie
aitouares 0:5b6520e71eb6 497 DQ=1; //DQ &#65533; 1
aitouares 0:5b6520e71eb6 498 write_byte(DS1820_CMD_CONVERTTEMP); /* start conversion */
aitouares 0:5b6520e71eb6 499 G__MOS_P=0; //"strong pullup"
aitouares 0:5b6520e71eb6 500 /* wait for temperature conversion */
aitouares 0:5b6520e71eb6 501 wait_ms(750); // attendre 0.75s
aitouares 0:5b6520e71eb6 502 G__MOS_P=1; //"strong pullup"
aitouares 0:5b6520e71eb6 503
aitouares 0:5b6520e71eb6 504 /* --- read sratchpad ---------------------------------------------------- */
aitouares 0:5b6520e71eb6 505 ow_reset();
aitouares 0:5b6520e71eb6 506 DS1820_AddrDevice(DS1820_CMD_MATCHROM); /* address the device */
aitouares 0:5b6520e71eb6 507 write_byte(DS1820_CMD_READSCRPAD); /* read scratch pad */
aitouares 0:5b6520e71eb6 508
aitouares 0:5b6520e71eb6 509 /* read scratch pad data */
aitouares 0:5b6520e71eb6 510 for (i=0; i < DS1820_SCRPADMEM_LEN; i++) // boucle for : i=0 puis on l'incremante jusqu'a i < DS1820_SCRPADMEM_LEN
aitouares 0:5b6520e71eb6 511 scrpad[i] = read_byte();
aitouares 0:5b6520e71eb6 512
aitouares 0:5b6520e71eb6 513 /* --- calculate temperature --------------------------------------------- */
aitouares 0:5b6520e71eb6 514
aitouares 0:5b6520e71eb6 515 if (RomBytes[0] == DS1820_FAMILY_CODE_DS18S20)
aitouares 0:5b6520e71eb6 516 {
aitouares 0:5b6520e71eb6 517 /////////////////////// precision O,5 degC //////////////////////////////////////
aitouares 0:5b6520e71eb6 518 /*// temp = (signed int) make16(scrpad[1],scrpad[0]);
aitouares 0:5b6520e71eb6 519 temp = (signed int) ((int)scrpad[1]<<8 | (int)scrpad[0]);
aitouares 0:5b6520e71eb6 520 temperature =(float)temp/2;*/
aitouares 0:5b6520e71eb6 521 /////////////////////////////////////////////////////////////////////////////////
aitouares 0:5b6520e71eb6 522
aitouares 0:5b6520e71eb6 523 ////////////////////// precision O,1 deg ////////////////////////////////////////
aitouares 0:5b6520e71eb6 524 //...calcul....
aitouares 0:5b6520e71eb6 525 temp_read=(signed char)(((int)scrpad[1]<<8 | (int)scrpad[0])>>1);
aitouares 0:5b6520e71eb6 526 temperature=(float)(temp_read);
aitouares 0:5b6520e71eb6 527 temperature = temperature + 0.75 - (float)(scrpad[6]/(float)scrpad[7]);
aitouares 0:5b6520e71eb6 528 ////////////////////////////////////////////////////////////////////////////////
aitouares 0:5b6520e71eb6 529 }
aitouares 0:5b6520e71eb6 530 else//ds18b20
aitouares 0:5b6520e71eb6 531 temperature =((float) (signed int)((int)scrpad[1]<<8 | (int)scrpad[0]))/16;
aitouares 0:5b6520e71eb6 532
aitouares 0:5b6520e71eb6 533 return (temperature);
aitouares 0:5b6520e71eb6 534 }
aitouares 0:5b6520e71eb6 535 //******************************************************************************