00001
00047 #include <ioavr.h>
00048 #include "config.h"
00049 #include "ccadc.h"
00050
00051
00052
00053
00054
00055
00056 volatile int32_t CCADC_accResult;
00057 volatile int16_t CCADC_iccResult;
00058
00059 union CCADC_conversionFlag_union{
00060 uint8_t allFlags;
00061 struct{
00062 uint8_t accResultReady : 1 ;
00063 uint8_t iccResultReady : 1 ;
00064 uint8_t regularCurrentDetected : 1 ;
00065 };
00066 } volatile CCADC_statusFlags = {0x00};
00067
00068
00069
00070
00071
00072
00073 static void CCADC_PolarityManager( void );
00074
00075
00088 void CCADC_Init( CCADC_AccConvPeriod_t accConversionTime, CCADC_RccConvPeriod_t rccSamplingInterval, uint16_t regularCurrentLevel )
00089 {
00090
00091 CADRC = ((regularCurrentLevel<<RCC_SCALE) / RCC_STEP_SIZE_mA_SCALED);
00092
00093
00094
00095
00096 while( CADCSRA & (1<<CADUB) ){
00097 }
00098
00099
00100
00101
00102
00103
00104 CADCSRA = (CADCSRA & ~( (1<<CADAS1)|(1<<CADAS0)|(1<<CADSI1)|(1<<CADSI0)|(1<<CADPOL) )) |
00105 ((uint8_t)accConversionTime | (uint8_t)rccSamplingInterval) |
00106 CCADC_POLARITY_POS;
00107 }
00108
00109
00127 void CCADC_SetMode( CCADC_modes_t mode )
00128 {
00130 while( CADCSRA & (1<<CADUB) ){
00131 };
00132
00133 switch( mode ){
00134 case CCADC_DISABLE:
00135
00136 CADCSRA = CADCSRA & ~( (1<<CADEN) | (1<<CADSE) );
00137 CADCSRB = (0<<CADACIE) | (0<<CADRCIE) | (0<<CADICIE) | (1<<CADACIF) | (1<<CADRCIF) | (1<<CADICIF);
00138 break;
00139
00140 case CCADC_IAC:
00141
00142 CADCSRA = ( CADCSRA & ~(1<<CADSE) ) | (1<<CADEN);
00143 CADCSRB = (1<<CADACIE) | (0<<CADRCIE) | (1<<CADICIE) | (1<<CADACIF) | (1<<CADRCIF) | (1<<CADICIF);
00144 break;
00145
00146 case CCADC_ICC:
00147
00148 CADCSRA = ( CADCSRA & ~(1<<CADSE) ) | (1<<CADEN);
00149 CADCSRB = (0<<CADACIE) | (0<<CADRCIE) | (1<<CADICIE) | (1<<CADACIF) | (1<<CADRCIF) | (1<<CADICIF);
00150 break;
00151
00152 case CCADC_ACC:
00153
00154 CADCSRA = ( CADCSRA & ~(1<<CADSE) ) | (1<<CADEN);
00155 CADCSRB = (1<<CADACIE) | (0<<CADRCIE) | (0<<CADICIE) | (1<<CADACIF) | (1<<CADRCIF) | (1<<CADICIF);
00156 break;
00157
00158 case CCADC_RCC:
00159
00160 CADCSRA = CADCSRA | (1<<CADSE) | (1<<CADEN);
00161 CADCSRB = (0<<CADACIE) | (1<<CADRCIE) | (1<<CADICIE) | (1<<CADACIF) | (1<<CADRCIF) | (1<<CADICIF);
00162 break;
00163
00164 default:
00165 break;
00166 }
00167 }
00168
00176 uint8_t CCADC_GetMode( void )
00177 {
00179 while( CADCSRA & (1<<CADUB) ){
00180 }
00181
00182 if( CADCSRA & (1<<CADSE) ){
00183 return CCADC_RCC;
00184 }else{
00185 return CCADC_IAC;
00186 }
00187 }
00188
00189
00201 int32_t CCADC_GetAccResult( void )
00202 {
00203 int32_t result;
00204 uint8_t interruptState = __save_interrupt();
00205
00206 __disable_interrupt();
00207 result = CCADC_accResult;
00208 __restore_interrupt(interruptState);
00209
00210 return result;
00211 }
00212
00213
00224 int32_t CCADC_GetIccResult( void )
00225 {
00226 int16_t result;
00227 uint8_t interruptState = __save_interrupt();
00228
00229 __disable_interrupt();
00230 result = CCADC_iccResult;
00231 __restore_interrupt(interruptState);
00232
00233
00234 return (int32_t)(result * (1<<5));
00235 }
00236
00237
00246 #pragma inline = forced
00247 static void CCADC_PolarityManager( void )
00248 {
00249 static uint8_t polarityCounter = CONVERSION_COUNT;
00250
00251 polarityCounter--;
00252 if(polarityCounter == 0){
00253 CADCSRA ^= (1<<CADPOL);
00254 polarityCounter = CONVERSION_COUNT;
00255 }
00256 }
00257
00258
00266 bool CCADC_isAccResultReady( void )
00267 {
00268 uint8_t interruptState = __save_interrupt();
00269 __disable_interrupt();
00270
00271 bool flagState = CCADC_statusFlags.accResultReady;
00272 CCADC_statusFlags.accResultReady = false;
00273
00274 __restore_interrupt( interruptState );
00275
00276 return flagState;
00277 }
00278
00279
00287 bool CCADC_isIccResultReady( void )
00288 {
00289 uint8_t interruptState = __save_interrupt();
00290 __disable_interrupt();
00291
00292 bool flagState = CCADC_statusFlags.iccResultReady;
00293 CCADC_statusFlags.iccResultReady = false;
00294
00295 __restore_interrupt( interruptState );
00296
00297 return flagState;
00298 }
00299
00300
00303 #pragma vector= CCADC_CONV_vect
00304 __interrupt void Ccadc_Icc_ISR( void )
00305 {
00306 if( CADCSRA & (1<<CADPOL) ){
00307 CCADC_iccResult = -CADIC;
00308 }else{
00309 CCADC_iccResult = CADIC;
00310 }
00311 CCADC_statusFlags.iccResultReady = true;
00312 }
00313
00314
00317 #pragma vector= CCADC_REG_CUR_vect
00318 __interrupt void Ccadc_Rcc_ISR( void )
00319 {
00320 CCADC_statusFlags.regularCurrentDetected = true;
00321 }
00322
00323
00326 #pragma vector= CCADC_ACC_vect
00327 __interrupt void Ccadc_Acc_ISR( void )
00328 {
00329 if( CADCSRA & (1<<CADPOL) ){
00330 CCADC_accResult = - CADAC;
00331 }else{
00332 CCADC_accResult = CADAC;
00333 }
00334 CCADC_PolarityManager();
00335 CCADC_statusFlags.accResultReady = true;
00336 }