Thank you all for your responses.
Here is my code if it could help.
/* affectation des broches */# define channelT 7 /**< broche pour la mesure de température : PTA6 */# define channelV 5 /**< broche pour la mesure de tension : PTA4 */# define channelI 6 /**< broche pour la mesure de courant : PTA5 *//*** ===================================================================** Method : AD_Init (component ADC)**** Description :** Initializes the associated peripheral(s) and the bean's ** internal variables. The method is called automatically as a ** part of the application initialization code.** This method is internal. It is used by Processor Expert only.** ===================================================================*//*! \fn void AD_Init(void) \brief fonction d'initialisation du convertisseur analogique numérique*/void AD_Init(void){ /* ADCSC1: COCO=0,AIEN=0,ADCO=0,ADCH4=1,ADCH3=1,ADCH2=1,ADCH1=1,ADCH0=1 */ setReg8(ADCSC1, 0x1F); /* Disable the module */ /* ADCSC2: ADACT=0,ADTRG=0,ACFE=0,ACFGT=0,??=0,??=0,??=0,??=0 */ setReg8(ADCSC2, 0x00); /* Disable HW trigger and autocompare */ OutFlg = 0; /* No measured value */ SumChan = 0; ModeFlg = STOP; /* Device isn't running */ /* ADCCFG: ADLPC=1,ADIV1=0,ADIV0=1,ADLSMP=0,MODE1=0,MODE0=1,ADICLK1=0,ADICLK0=0 */ setReg8(ADCCFG, 0xA4); /* Set prescaler bits */ }void AD_MeasureChan(byte Channel, byte *Result){ ModeFlg = SINGLE; /* Set state of device to the measure mode */ SumChan = Channel; /* Set required channel */ if (ModeFlg) { /* Start or stop measurement? */ OutFlg &= ~Table[SumChan]; /* Output value isn't available */ ADCSC1 = Channels[SumChan]; /* Start measurement of next channel */ while (!ADCSC1_COCO) {} /* Wait for AD conversion complete */ ((TWREG*)(&AD_OutV[SumChan]))->b.high = ADCRH; /* Save measured value */ ((TWREG*)(&AD_OutV[SumChan]))->b.low = ADCRL; /* Save measured value */ OutFlg |= Table[SumChan]; /* Value of measured channel is available */ ADCSC1 = 0x1F; /* Stop the device */ ModeFlg = STOP; /* Set the device to the stop mode */ Result[0] = (AD_OutV[Channel]) & (0xFF); /* Save measured values to the output buffer */ Result[1] = ((AD_OutV[Channel]) & (0xF00)) >> 8; /* Save measured values to the output buffer */ }}/*! \fn void mesT (byte *dataT) \brief fonction de mesure de température \param dataT pointeur vers le résultat de la mesure*/void mesT (byte *dataT){ AD_MeasureChan (channelT, dataT); }/*! \fn void mesV (byte *dataV) \brief fonction de mesure de tension \param dataV pointeur vers le résultat de la mesure*/void mesV (byte *dataV){ AD_MeasureChan (channelV, dataV);} interrupt void RTC_Interrupt (void) { byte dataV[2], dataT[2], dataI[2]; byte mesure[3]; // tableau contenant les mesures RTCSC_RTIF = 1; // efface le flag mesV(&dataV); // mesure de tension mesure[0] = (branche<<5) + module ; mesure[1] = dataV[0]; mesure[2] = dataV[1]; send (&mesure, 3, mesures); mesT(&dataT); // mesure de température mesure[0] = (branche<<5) + module ; mesure[1] = dataT[0]; mesure[2] = dataT[1]; send (&mesure, 3, temperature); /* dans le cas d'un module qui mesure le courant */ //# ifdef COURANT if (module_courant == num_module) { mesI(&dataI); mesure[0] = (branche<<5) + module ; mesure[1] = dataI[0]; mesure[2] = dataI[1]; send (&mesure, 3, courant);} }
The problem is with dataT and dataV. The measure of dataI is always 0xFFF.
I tried some changes and somes tests (I put an input voltage on the channel mesured by mesV). Here are my observations.
the same code with short sample time :
0V 1V 2V 3V 4V 5V
mesV 0x000 3A3 718 A83 DED FFF
mesT 0x1AB 31F 4BC 67B 827 991
the same code with long sample time :
0V 1V 2V 3V 4V 5V
mesV 0x000 3A5 6DF A47 DCA FFF
mesT 0x1A7 31C 4A2 65F 823 99B
with short sample time but I do mesV, then mesI and then mesT:
0V 1V 2V 3V 4V 5V
mesV 0x000 35F 6DD A59 DB7 FFF
mesT 0x9C7 9BF 9B5 9AF 9B4 9B7
(here the value measured for temperature is -90°C with 9B5)
with short sample time and two readings in succession for each channel :
0V 1V 2V 3V 4V 5V
mesV 0x000 3AF 6DD A9F DCD FFF
mesT 0x3F2 409 5C7 75A 8F7 A97
with short sample time and two readings in succession for each channel but I do mesV, then mesI and then mesT:
0V 1V 2V 3V 4V 5V
mesV 0x000 360 715 A43 DBF FFF
mesT 0x9E5 AAF AE5 A29 A2F A72
mesV gives the voltage, so it seems to be right.
Please, is there something that I'm doing wrong ??
I don't understand why I have those values.
Sorry for my english, I am french...
Thank you very much for your help.