Go to the documentation of this file.00001
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 #include "config.h"
00048 #include "structs.h"
00049 #include "main.h"
00050
00051 #ifdef __GNUC__
00052 #include "lib_mcu/adc/adc.h"
00053 #include "lib_mcu/adc/adc_drv.h"
00054 #elif __ICCAVR__
00055 #include "adc.h"
00056 #include "adc_drv.h"
00057 #else
00058 #error Current COMPILER not supported
00059 #endif
00060
00061
00062
00063
00064
00066 volatile ADC_Status_t ADCS;
00067
00068
00069
00070
00110 #ifdef __GNUC__
00111 ISR(ADC_vect)
00112 #else
00113 #pragma vector = ADC_vect
00114 __interrupt void ADC_ISR(void)
00115 #endif
00116 {
00117 static unsigned char avgIndex = 0;
00118 unsigned char i, Next;
00119 signed int temp = 0;
00120 unsigned long temp_buffer;
00121
00122
00123
00124 switch (ADCS.MUX){
00125
00126
00127 case 0x01:
00128 case 0x05:
00129
00130
00131 if(ADCS.MUX == 0x01)
00132 {
00133 Next=0x05;
00134 }
00135 else
00136 {
00137
00138
00139
00140 if (ADC > 511) {
00141
00142 temp_buffer = (I_SCALE_1 * (1024 -ADC)) / I_SCALE_2;
00143 ADCS.IBAT = -(signed int)temp_buffer;
00144
00145
00146 ADCS.IBAT = 0;
00147 }
00148 else if (ADC > 0){
00149
00150 temp_buffer = (I_SCALE_1 * ADC) / I_SCALE_2;
00151 ADCS.IBAT = (signed int)temp_buffer;
00152 }
00153 else{
00154 ADCS.IBAT = 0;
00155 }
00156
00157
00158
00159
00160
00161 ADCS.discIBAT[(avgIndex++ & 0x03)] = ADCS.IBAT;
00162 for (i = 0; i < 4 ; i++) {
00163 temp += ADCS.discIBAT[i];
00164 }
00165
00166 ADCS.avgIBAT = (temp / 4);
00167
00168 Next=0x02;
00169
00170
00171 Clear_adc_mux();
00172 }
00173 break;
00174
00175
00176 case 0x02:
00177 temp_buffer = (VBAT_SCALE_1 * ADC )/VBAT_SCALE_2;
00178
00179 ADCS.rawVBAT = (unsigned int)temp_buffer;
00180 ADCS.rawVBAT = ADCS.rawVBAT;
00181
00182
00183 ADCS.VBAT = (ADCS.VBAT + ADCS.rawVBAT)>>1;
00184
00185
00186 #if(TARGET_BOARD == MEGAU4EK)
00187
00188 ADCS.rawNTC = 671;
00189 ADCS.rawRID = 300;
00190
00191 ADCS.Flag = TRUE;
00192 Next=0x01;
00193
00194
00195 Clear_adc_mux();
00196 Select_adc_channel(0x09);
00197
00198 #else
00199 Next=0x03;
00200
00201
00202
00203 Clear_adc_mux();
00204 Select_adc_channel(0x23);
00205 #endif
00206
00207 break;
00208
00209
00210 case 0x03:
00211 #ifdef TRUSTFIRE
00212 ADCS.rawNTC = 671;
00213 #else
00214 ADCS.rawNTC = ADC;
00215 #endif
00216
00217 Next=0x04;
00218
00219
00220 Clear_adc_mux();
00221 Select_adc_channel(0x24);
00222 break;
00223
00224
00225 case 0x04:
00226 #ifdef TRUSTFIRE
00227 ADCS.rawRID = 300;
00228 #else
00229 ADCS.rawRID = ADC;
00230 #endif
00231 ADCS.Flag = TRUE;
00232 Next=0x01;
00233
00234
00235 Clear_adc_mux();
00236 Select_adc_channel(0x09);
00237 break;
00238
00239 default:
00240 Next=0x01;
00241
00242
00243 Clear_adc_mux();
00244 Select_adc_channel(0x09);
00245 break;
00246 }
00247
00248
00249
00250 ADCS.MUX = Next;
00251
00252
00253
00254 if (!(ADCS.Flag))
00255 {
00256 Start_conv();
00257 }
00258
00259 }
00260
00261
00268 void ADC_Wait(void)
00269 {
00270
00271
00272 ADCS.Flag = FALSE;
00273
00274
00275 Start_conv();
00276
00277
00278 do {
00279 } while (ADCS.Flag == FALSE);
00280
00281
00282
00283 ADCS.Flag = FALSE;
00284
00285
00286 Start_conv();
00287
00288
00289 do {
00290 } while (ADCS.Flag == FALSE);
00291
00292
00293
00294 }
00295
00296
00303 void ADC_Init(void)
00304 {
00305 unsigned char i;
00306
00307 #ifdef __GNUC__
00308 Disable_interrupt();
00309 #else
00310 __disable_interrupt();
00311 #endif
00312
00313 ADCS.Halt = FALSE;
00314
00315
00316
00317 DDRF &= ~((1<<DDF1)|(1<<DDF0));
00318 PORTF &= ~((1<<PORTF1)|(1<<PORTF0));
00319
00320
00321
00322 DIDR0 |= ((1<<ADC1D)|(1<<ADC0D));
00323
00324 #if(TARGET_BOARD != MEGAU4EK)
00325
00326 DDRB &= ~((1<<DDB5)|(1<<DDB4));
00327 PORTB &= ~((1<<PORTB5)|(1<<PORTB4));
00328
00329
00330
00331 DIDR2 |= ((1<<ADC12D)|(1<<ADC11D));
00332 #endif
00333
00334
00335 ADCS.Flag = FALSE;
00336 ADCS.MUX = 0x01;
00337
00338
00339
00340
00341 Clear_adc_mux();
00342 Enable_internal_vref();
00343 Select_adc_channel(0x09);
00344
00345 Enable_adc_high_speed_mode();
00346
00347 #if(TARGET_BOARD == MEGAU4EK)
00348
00349 Set_adc_prescaler(7);
00350 #else
00351
00352 Set_adc_prescaler(6);
00353 #endif
00354
00355
00356 ADCS.avgIBAT = 0;
00357
00358 for (i = 0; i < 4; i++) {
00359 ADCS.discIBAT[i] = 0;
00360 }
00361
00362
00363 Enable_adc_it();
00364 Enable_adc();
00365
00366 #ifdef __GNUC__
00367 Enable_interrupt();
00368 #else
00369 __enable_interrupt();
00370 #endif
00371
00372
00373 ADC_Wait();
00374 }