Rose-Hulman Robotics Team

Changeset 576 for trunk/electronics/avr

Show
Ignore:
Timestamp:
10/16/09 04:06:37 (2 years ago)
Author:
kleinjt
Message:

slowed ADC clock, taking 10 bit samples

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/electronics/avr/i2c_irboard/i2c_slave/twi_slave.c

    r575 r576  
    1414 
    1515uint16_t ADCIN(void); 
     16 
    1617uint8_t EEMEM slaveaddr = 0x26; 
    1718uint16_t EEMEM EE_m = 6787; 
     
    1920uint8_t EEMEM EE_k = 4; 
    2021 
    21 uint8_t distance(uint16_t k, uint8_t m, uint8_t b) { 
     22uint8_t distance(uint16_t k, uint8_t m, uint8_t b)  
     23{ 
    2224  uint16_t analog = ADCIN(); 
    2325  uint16_t distance = (m / (analog - b)) - k; 
     
    3133void adc_init(void) 
    3234{ 
    33   // enable ADC 
    34   ADCSRA  = _BV(ADEN); 
    35    
    36   // set prescalers 1 and 2, 125KHz ADC clock 
    37   ADCSRA |= _BV(ADPS1); 
    38   ADCSRA |= _BV(ADPS2); 
    39    
    40   // use internal 2.56v ref, no external bypass cap (pin needed for I2C) 
    41   ADMUX  = _BV(REFS2) | _BV(REFS1); 
    42   // use ADC2, pb4, pin 3, no gain 
    43   ADMUX |= _BV(MUX1); 
     35  // enable adc, 62.5KHz ADC clock 
     36  ADCSRA  = _BV(ADEN) 
     37         | _BV(ADPS0) 
     38         | _BV(ADPS1) 
     39         | _BV(ADPS2); 
    4440} 
    4541 
     
    4844{ 
    4945  uint8_t twi_in, twi_out; 
    50   sei(); 
    5146  adc_init(); 
     47  sei(); // enable interrupts, needed for twi 
    5248   
    5349  // read in stored fitting constants for IR sensor  
     
    6561     twi_out = 1; 
    6662         twi_in = usiTwiReceiveByte(); 
    67       switch (twi_in) 
    68       { 
     63        switch (twi_in) 
     64        { 
    6965           case RAW_ADC: 
    7066             twi_out = ADCIN() > 2; 
     
    9389         k = usiTwiReceiveByte(); 
    9490         eeprom_write_byte(&EE_k, k); 
     91         break; 
    9592       default: 
    9693         twi_out = ERROR; 
    9794         break; 
    98       } 
    99  
     95     } 
    10096     usiTwiTransmitByte(twi_out); 
    10197    } 
    10298    asm volatile ("NOP" ::); 
    103  
    10499  }     
    105100} 
    106101 
    107  
    108102uint16_t ADCIN(void) 
    109103{ 
     104  uint16_t value; 
    110105  // enable single shot ADC conversion  
     106   
     107    // use internal 2.56v ref, no external bypass cap (pin needed for I2C) 
     108  ADMUX  = _BV(REFS2)  
     109        | _BV(REFS1) 
     110        | _BV(MUX1); // use ADC2, pb4, pin 3, no gain 
     111   
    111112  ADCSRA |= _BV(ADSC);  
    112113   
    113   while ( ADCSRA & ( 1 << ADSC ) ); 
     114  while ( ADCSRA & ( 1 << ADSC ) ); // wait for conversion to complete 
    114115   
     116  value = ADCL; 
     117  value += ADCH << 8; 
    115118  return ADCH; 
    116119}