Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
03/13/08 14:52
Read: times


 
#152235 - Comments
Responding to: ???'s previous message
Personally I would declare sum as a global and then you don't have to do 8 additions every time, this is how I implement moving average filters when I use them. You subtract the oldest value from the sum and add the newest value to the sum then calculate the average. I would also suggest using a size of 8 allowing the compiler the opportunity to do a shift instead of divide(as mentioned in other posts). Using your variable names and general format:


#define ADC_BUFFER_SIZE 8

static volatile unsigned char __adc_buffer[ADC_BUFFER_SIZE];
static volatile unsigned char __adc_buffer_ptr;
static volatile unsigned int  __adc_sum;

extern void InitAdcReader() {
    for ( __adc_buffer_ptr = 0;
          __adc_buffer_ptr < ADC_BUFFER_SIZE;
          __adc_buffer_ptr++ ) {
        __adc_buffer[__adc_buffer_ptr] = 0;
    }
    __adc_buffer_ptr = 0;
}

extern unsigned char  ReadAdc(unsigned char adc_value) {
    __adc_sum -= __adc_sum[__adc_buffer_ptr]; // Subtract the oldest value
    __adc_buffer[__adc_buffer_ptr] = adc_value; // Insert the newest value
    __adc_sum += __adc_buffer[__adc_buffer_ptr]; // Add the newest value
    __adc_buffer_ptr++; // Advance the pointer
    if (__adc_buffer_ptr >= ADC_BUFFER_SIZE ) {
        __adc_buffer_ptr = 0;
    }

    adc_value = __adc_sum / ADC_BUFFER_SIZE; // Calculate the average

    return (adc_value);
}





List of 26 messages in thread
TopicAuthorDate
Math not functioning with proper headers?            01/01/70 00:00      
   horrible method            01/01/70 00:00      
   Lots of issues            01/01/70 00:00      
      Code Op at level 8            01/01/70 00:00      
         Try multiple steps            01/01/70 00:00      
            ah hah moment arrived......omg            01/01/70 00:00      
                           01/01/70 00:00      
                  Here is the block which now works 100%            01/01/70 00:00      
                     Operation question in C            01/01/70 00:00      
                        Because            01/01/70 00:00      
                     Simplify            01/01/70 00:00      
                        what's the point ?            01/01/70 00:00      
                           What's the point            01/01/70 00:00      
                              simpler, but            01/01/70 00:00      
               Not right            01/01/70 00:00      
   use shift right instead of divide            01/01/70 00:00      
      If you're lucky...            01/01/70 00:00      
   Use a rount trip buffer            01/01/70 00:00      
      Bad names            01/01/70 00:00      
         System use names ????            01/01/70 00:00      
         Common naming convention ?            01/01/70 00:00      
            ISO/IEC 9899:1990...            01/01/70 00:00      
      Comments            01/01/70 00:00      
         same effect as a "circular array"            01/01/70 00:00      
         think I like this the best            01/01/70 00:00      
   Use a loop with deglitching and averaging            01/01/70 00:00      

Back to Subject List