frederic blanc / Mbed 2 deprecated OneWireDrv

Dependencies:   mbed

Committer:
fblanc
Date:
Thu Jun 30 13:18:22 2011 +0000
Revision:
0:df0e3c8895f4
2011_06_30

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fblanc 0:df0e3c8895f4 1 #include "mbed.h"
fblanc 0:df0e3c8895f4 2 #include "onewire.h"
fblanc 0:df0e3c8895f4 3 #include "DS2450.h"
fblanc 0:df0e3c8895f4 4 #include "DS18X20.h"
fblanc 0:df0e3c8895f4 5
fblanc 0:df0e3c8895f4 6 uint8_t gSensorIDs[MAXSENSORS][OW_ROMCODE_SIZE];
fblanc 0:df0e3c8895f4 7 uint8_t nSensors;
fblanc 0:df0e3c8895f4 8 uint32_t nErreur;
fblanc 0:df0e3c8895f4 9 uint32_t nErreur_DS18X20;
fblanc 0:df0e3c8895f4 10 uint32_t nErreur_DS2450;
fblanc 0:df0e3c8895f4 11 uint32_t nErreur_CRC;
fblanc 0:df0e3c8895f4 12 uint32_t nErreur_BUS;
fblanc 0:df0e3c8895f4 13 uint32_t nErreur_DS2450_START;
fblanc 0:df0e3c8895f4 14 uint32_t nErreur_BUSY;
fblanc 0:df0e3c8895f4 15 uint32_t nErreur_RESET;
fblanc 0:df0e3c8895f4 16 uint32_t nMesure;
fblanc 0:df0e3c8895f4 17 uint32_t micro_seconds;
fblanc 0:df0e3c8895f4 18 Serial pc(USBTX, USBRX); // tx, rx
fblanc 0:df0e3c8895f4 19 BusOut bugleds(LED1, LED2, LED3, LED4);
fblanc 0:df0e3c8895f4 20
fblanc 0:df0e3c8895f4 21 /**
fblanc 0:df0e3c8895f4 22 * @brief DS18X20_show_temp
fblanc 0:df0e3c8895f4 23 * @param [in] id[] = rom_code
fblanc 0:df0e3c8895f4 24 * @param [in] n number of id[n]
fblanc 0:df0e3c8895f4 25 * @param [out] text temp in degre celsius
fblanc 0:df0e3c8895f4 26
fblanc 0:df0e3c8895f4 27 * @date 20/06/2011
fblanc 0:df0e3c8895f4 28 */
fblanc 0:df0e3c8895f4 29 void DS18X20_show_temp(uint8_t subzero, uint8_t cel, uint8_t cel_frac_bits,char *text) {
fblanc 0:df0e3c8895f4 30 uint16_t decicelsius;
fblanc 0:df0e3c8895f4 31 char s[10];
fblanc 0:df0e3c8895f4 32 float temperature;
fblanc 0:df0e3c8895f4 33 sprintf(text,"");
fblanc 0:df0e3c8895f4 34 sprintf(s,"%s", (subzero)?"-":"+");
fblanc 0:df0e3c8895f4 35 strcat(text,s);
fblanc 0:df0e3c8895f4 36 decicelsius = DS18X20_temp_to_decicel(subzero, cel, cel_frac_bits);
fblanc 0:df0e3c8895f4 37 temperature = decicelsius;
fblanc 0:df0e3c8895f4 38 temperature = temperature/10;
fblanc 0:df0e3c8895f4 39 sprintf(s,"%4.1f", temperature);
fblanc 0:df0e3c8895f4 40 strcat(text,s);
fblanc 0:df0e3c8895f4 41
fblanc 0:df0e3c8895f4 42 }
fblanc 0:df0e3c8895f4 43
fblanc 0:df0e3c8895f4 44 int main(void) {
fblanc 0:df0e3c8895f4 45 uint8_t sp[25];
fblanc 0:df0e3c8895f4 46 uint8_t num_sensor;
fblanc 0:df0e3c8895f4 47 uint8_t subzero, cel, cel_frac_bits;
fblanc 0:df0e3c8895f4 48 Timer timer;
fblanc 0:df0e3c8895f4 49
fblanc 0:df0e3c8895f4 50 pc.printf("version 2011-06-27\n");
fblanc 0:df0e3c8895f4 51 pc.printf("Qantum 1 wire interface test!\n");
fblanc 0:df0e3c8895f4 52
fblanc 0:df0e3c8895f4 53
fblanc 0:df0e3c8895f4 54
fblanc 0:df0e3c8895f4 55 // ow_PullUp();
fblanc 0:df0e3c8895f4 56 if (search_sensors(&nSensors,&gSensorIDs[0][0])) {
fblanc 0:df0e3c8895f4 57 pc.printf("no Sensors found\n");
fblanc 0:df0e3c8895f4 58 return -1;
fblanc 0:df0e3c8895f4 59 } else {
fblanc 0:df0e3c8895f4 60 pc.printf("Sensors found : %d\n", nSensors);
fblanc 0:df0e3c8895f4 61
fblanc 0:df0e3c8895f4 62 for (num_sensor=0; num_sensor<nSensors; ++num_sensor) {
fblanc 0:df0e3c8895f4 63 char text_id[25];
fblanc 0:df0e3c8895f4 64 ow_show_id( &gSensorIDs[num_sensor][0], OW_ROMCODE_SIZE,text_id );
fblanc 0:df0e3c8895f4 65 pc.printf("%s Sensor # %d is a ",text_id, num_sensor+1);
fblanc 0:df0e3c8895f4 66 //DS18X20
fblanc 0:df0e3c8895f4 67 if (( gSensorIDs[num_sensor][0] == DS18S20_ID) || ( gSensorIDs[num_sensor][0] == DS18B20_ID)) {
fblanc 0:df0e3c8895f4 68 if ( gSensorIDs[num_sensor][0] == DS18S20_ID)
fblanc 0:df0e3c8895f4 69 pc.printf("DS18S20/DS1820 ");
fblanc 0:df0e3c8895f4 70 if ( gSensorIDs[num_sensor][0] == DS18B20_ID)
fblanc 0:df0e3c8895f4 71 pc.printf("DS18B20 ");
fblanc 0:df0e3c8895f4 72 if ( DS18X20_get_power_status( &gSensorIDs[num_sensor][0] ) ==
fblanc 0:df0e3c8895f4 73 DS18X20_POWER_PARASITE )
fblanc 0:df0e3c8895f4 74 pc.printf( "parasite" );
fblanc 0:df0e3c8895f4 75 else pc.printf( "externally" );
fblanc 0:df0e3c8895f4 76 pc.printf( " powered\n" );
fblanc 0:df0e3c8895f4 77 }
fblanc 0:df0e3c8895f4 78 //DS2450
fblanc 0:df0e3c8895f4 79 if ( gSensorIDs[num_sensor][0] == DS2450_ID) {
fblanc 0:df0e3c8895f4 80 pc.printf("DS2450 ");
fblanc 0:df0e3c8895f4 81 for (uint8_t i=0 ; i< DS2450_SP_SIZE; i++ ) // DS2450 POWER extern
fblanc 0:df0e3c8895f4 82 sp[i]=0;
fblanc 0:df0e3c8895f4 83 sp[4]=0x40;
fblanc 0:df0e3c8895f4 84 if (DS2450_configure_page(&gSensorIDs[num_sensor][0], DS2450_PAGE3,&sp[0]))
fblanc 0:df0e3c8895f4 85 pc.printf("CRC Error conf page \n");
fblanc 0:df0e3c8895f4 86 if (DS2450_read_page(&gSensorIDs[num_sensor][0], DS2450_PAGE3,&sp[0]))
fblanc 0:df0e3c8895f4 87 ;
fblanc 0:df0e3c8895f4 88 else
fblanc 0:df0e3c8895f4 89 printf( "\n" );
fblanc 0:df0e3c8895f4 90 for ( char i=0 ; i< DS2450_SP_SIZE; i++ )
fblanc 0:df0e3c8895f4 91 printf(":%2.2X",sp[i]);
fblanc 0:df0e3c8895f4 92 printf( "\n" );
fblanc 0:df0e3c8895f4 93 if (DS2450_configure_channel_ADC(&gSensorIDs[num_sensor][0],DS2450_ADCA,DS2450_12_BIT ,DS2450_IR_5V1))
fblanc 0:df0e3c8895f4 94 pc.printf("CRC Error conf ADC\n");
fblanc 0:df0e3c8895f4 95 if (DS2450_configure_channel_ADC(&gSensorIDs[num_sensor][0],DS2450_ADCB,DS2450_1_BIT ,DS2450_IR_5V1))
fblanc 0:df0e3c8895f4 96 pc.printf("CRC Error conf ADC\n");
fblanc 0:df0e3c8895f4 97 if (DS2450_configure_channel_ADC(&gSensorIDs[num_sensor][0],DS2450_ADCC,DS2450_1_BIT,DS2450_IR_5V1))
fblanc 0:df0e3c8895f4 98 pc.printf("CRC Error conf ADC\n");
fblanc 0:df0e3c8895f4 99 if (DS2450_configure_channel_ADC(&gSensorIDs[num_sensor][0],DS2450_ADCD,DS2450_1_BIT,DS2450_IR_5V1))
fblanc 0:df0e3c8895f4 100 pc.printf("CRC Error conf ADC\n");
fblanc 0:df0e3c8895f4 101 uint16_t adc[4];
fblanc 0:df0e3c8895f4 102 if (DS2450_start_and_read_ADC(&gSensorIDs[num_sensor][0], &adc[0]))
fblanc 0:df0e3c8895f4 103 pc.printf("CRC Error read ADC\n");
fblanc 0:df0e3c8895f4 104 for (uint8_t i=0; i<4; ++i )
fblanc 0:df0e3c8895f4 105 pc.printf(" adc%d:%X %f |",i,adc[i],adc[i]*5.1/65535);
fblanc 0:df0e3c8895f4 106 pc.printf("\n");
fblanc 0:df0e3c8895f4 107 }
fblanc 0:df0e3c8895f4 108
fblanc 0:df0e3c8895f4 109 }
fblanc 0:df0e3c8895f4 110 nErreur=0;
fblanc 0:df0e3c8895f4 111 nErreur_CRC=0;
fblanc 0:df0e3c8895f4 112 nErreur_BUS=0;
fblanc 0:df0e3c8895f4 113 nErreur_DS18X20=0;
fblanc 0:df0e3c8895f4 114 nErreur_DS2450=0;
fblanc 0:df0e3c8895f4 115 nErreur_DS2450_START=0;
fblanc 0:df0e3c8895f4 116 nErreur_BUSY=0;
fblanc 0:df0e3c8895f4 117 nErreur_RESET=0;
fblanc 0:df0e3c8895f4 118 nMesure=0;
fblanc 0:df0e3c8895f4 119 timer.start();
fblanc 0:df0e3c8895f4 120
fblanc 0:df0e3c8895f4 121 while (1) {
fblanc 0:df0e3c8895f4 122 wait(1); // temps attente
fblanc 0:df0e3c8895f4 123 nMesure++;
fblanc 0:df0e3c8895f4 124 pc.printf("Mesure:%d erreur%d\n",nMesure,nErreur);
fblanc 0:df0e3c8895f4 125 bugleds=nErreur;
fblanc 0:df0e3c8895f4 126 switch (DS18X20_start_meas(DS18X20_POWER_EXTERN, 0 )) { // start measure ALL DS18X20
fblanc 0:df0e3c8895f4 127 case DS18X20_OK :
fblanc 0:df0e3c8895f4 128 wait_ms(DS18B20_TCONV_12BIT);
fblanc 0:df0e3c8895f4 129 break;
fblanc 0:df0e3c8895f4 130 case DS18X20_START_FAIL:
fblanc 0:df0e3c8895f4 131 nErreur++;
fblanc 0:df0e3c8895f4 132 nErreur_DS18X20++;
fblanc 0:df0e3c8895f4 133 pc.printf("sensor DS18X20 : Start meas. failed \n");
fblanc 0:df0e3c8895f4 134 break;
fblanc 0:df0e3c8895f4 135 }
fblanc 0:df0e3c8895f4 136
fblanc 0:df0e3c8895f4 137 for (num_sensor=0; num_sensor<nSensors; ++num_sensor) {
fblanc 0:df0e3c8895f4 138 //DS2450
fblanc 0:df0e3c8895f4 139 if (gSensorIDs[num_sensor][0] == DS2450_ID) {
fblanc 0:df0e3c8895f4 140 micro_seconds=timer.read_us();
fblanc 0:df0e3c8895f4 141 uint16_t adc[4];
fblanc 0:df0e3c8895f4 142 if (DS2450_start_and_read_ADC(&gSensorIDs[num_sensor][0], &adc[0])) // 3 essais avant erreur
fblanc 0:df0e3c8895f4 143 if (DS2450_start_and_read_ADC(&gSensorIDs[num_sensor][0], &adc[0]))
fblanc 0:df0e3c8895f4 144 switch (DS2450_start_and_read_ADC(&gSensorIDs[num_sensor][0], &adc[0])) {
fblanc 0:df0e3c8895f4 145 case OW_OK:
fblanc 0:df0e3c8895f4 146
fblanc 0:df0e3c8895f4 147 break;
fblanc 0:df0e3c8895f4 148 case OW_BUSY:
fblanc 0:df0e3c8895f4 149 nErreur++;
fblanc 0:df0e3c8895f4 150 nErreur_DS2450++;
fblanc 0:df0e3c8895f4 151 nErreur_BUSY++;
fblanc 0:df0e3c8895f4 152
fblanc 0:df0e3c8895f4 153 break;
fblanc 0:df0e3c8895f4 154 case OW_ERROR:
fblanc 0:df0e3c8895f4 155 nErreur++;
fblanc 0:df0e3c8895f4 156 nErreur_DS2450++;
fblanc 0:df0e3c8895f4 157 nErreur_BUS++;
fblanc 0:df0e3c8895f4 158
fblanc 0:df0e3c8895f4 159 break;
fblanc 0:df0e3c8895f4 160 case OW_ERROR_CRC:
fblanc 0:df0e3c8895f4 161 nErreur++;
fblanc 0:df0e3c8895f4 162 nErreur_DS2450++;
fblanc 0:df0e3c8895f4 163 nErreur_CRC++;
fblanc 0:df0e3c8895f4 164 pc.printf("Error:%d\n",nErreur);
fblanc 0:df0e3c8895f4 165 pc.printf("ErrorDS2450_busy:%d\n",nErreur_BUSY);
fblanc 0:df0e3c8895f4 166 pc.printf("ErrorDS2450_start:%d\n",nErreur_DS2450_START);
fblanc 0:df0e3c8895f4 167 pc.printf("ErrorDS2450:%d\n",nErreur_DS2450);
fblanc 0:df0e3c8895f4 168 pc.printf("ErrorDS18X20:%d\n",nErreur_DS18X20);
fblanc 0:df0e3c8895f4 169 pc.printf("ErrorCRC:%d\n",nErreur_CRC);
fblanc 0:df0e3c8895f4 170 pc.printf("ErrorBUS:%d\n",nErreur_BUS);
fblanc 0:df0e3c8895f4 171 pc.printf("ErrorRESET:%d\n",nErreur_RESET);
fblanc 0:df0e3c8895f4 172 pc.printf("Mesure:%d\n",nMesure);
fblanc 0:df0e3c8895f4 173 break;
fblanc 0:df0e3c8895f4 174 case OW_SHORT_CIRCUIT:
fblanc 0:df0e3c8895f4 175 nErreur++;
fblanc 0:df0e3c8895f4 176 nErreur_DS2450++;
fblanc 0:df0e3c8895f4 177 nErreur_RESET++;
fblanc 0:df0e3c8895f4 178 break;
fblanc 0:df0e3c8895f4 179 case OW_ERROR_BAD_ID:
fblanc 0:df0e3c8895f4 180
fblanc 0:df0e3c8895f4 181 break;
fblanc 0:df0e3c8895f4 182 }
fblanc 0:df0e3c8895f4 183 micro_seconds = timer.read_us()- micro_seconds; // duree lecture DS2450
fblanc 0:df0e3c8895f4 184 pc.printf("sensor %d : time:%umicros\n",num_sensor+1,micro_seconds);
fblanc 0:df0e3c8895f4 185 for (uint8_t i=0; i<4; ++i )
fblanc 0:df0e3c8895f4 186 pc.printf(" adc%d:%X %f |",i,adc[i],adc[i]*5.1/65535);
fblanc 0:df0e3c8895f4 187 pc.printf("\n");
fblanc 0:df0e3c8895f4 188 }
fblanc 0:df0e3c8895f4 189
fblanc 0:df0e3c8895f4 190 //TEMP DS1820
fblanc 0:df0e3c8895f4 191 if ( (gSensorIDs[num_sensor][0] == DS18S20_ID) ||( gSensorIDs[num_sensor][0] == DS18B20_ID))
fblanc 0:df0e3c8895f4 192 switch (DS18X20_read_meas( &gSensorIDs[num_sensor][0], &subzero, &cel, &cel_frac_bits)) {
fblanc 0:df0e3c8895f4 193 case DS18X20_OK :
fblanc 0:df0e3c8895f4 194 char text[25];
fblanc 0:df0e3c8895f4 195 DS18X20_show_temp(subzero, cel, cel_frac_bits,text);
fblanc 0:df0e3c8895f4 196 pc.printf("sensor %d : %s\n",num_sensor+1,text);
fblanc 0:df0e3c8895f4 197 break;
fblanc 0:df0e3c8895f4 198 case OW_ERROR:
fblanc 0:df0e3c8895f4 199 nErreur++;
fblanc 0:df0e3c8895f4 200 nErreur_BUS++;
fblanc 0:df0e3c8895f4 201 nErreur_DS18X20++;
fblanc 0:df0e3c8895f4 202 pc.printf("sensor %d : BUS Error\n",num_sensor+1);
fblanc 0:df0e3c8895f4 203 break;
fblanc 0:df0e3c8895f4 204 case DS18X20_ERROR_CRC:
fblanc 0:df0e3c8895f4 205 nErreur++;
fblanc 0:df0e3c8895f4 206 nErreur_DS18X20++;
fblanc 0:df0e3c8895f4 207 nErreur_CRC++;
fblanc 0:df0e3c8895f4 208 pc.printf("sensor %d : CRC Error\n",num_sensor+1);
fblanc 0:df0e3c8895f4 209 break;
fblanc 0:df0e3c8895f4 210 }
fblanc 0:df0e3c8895f4 211 }
fblanc 0:df0e3c8895f4 212 }
fblanc 0:df0e3c8895f4 213 }
fblanc 0:df0e3c8895f4 214 }