Subversion Repositories HomeAutomation

Rev

Rev 793 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed

  1.  
  2. /*-----------------------------------------------
  3.  * Includes
  4.  * ---------------------------------------------*/
  5. #include <avr/io.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8.  
  9. #include "adc.h"
  10. #include <config.h>
  11. /*----------------------------------------------
  12.  * Functions
  13.  * --------------------------------------------*/
  14.  
  15. uint8_t ADC_Init(void)
  16. {
  17. #if ADCHAN == 0
  18.     /* Enable ADC0 */
  19.     ADMUX &= ~((1<<MUX0)|(1<<MUX1)|(1<<MUX2)|(1<<MUX3));
  20. #elif ADCHAN == 1
  21.     /* Enable ADC1 */
  22.     ADMUX |= (1<<MUX0);
  23.     ADMUX &= ~((1<<MUX1)|(1<<MUX2)|(1<<MUX3));
  24. #elif ADCHAN == 2
  25.     /* Enable ADC2 */
  26.     ADMUX |= (1<<MUX1)|;
  27.     ADMUX &= ~((1<<MUX0)|(1<<MUX2)|(1<<MUX3));
  28. #elif ADCHAN == 3
  29.     /* Enable ADC3 */
  30.     ADMUX |= (1<<MUX0)|(1<<MUX1);
  31.     ADMUX &= ~((1<<MUX2)|(1<<MUX3));
  32. #elif ADCHAN == 4
  33.     /* Enable ADC4 */
  34.     ADMUX |= (1<<MUX2);
  35.     ADMUX &= ~((1<<MUX0)|(1<<MUX1)|(1<<MUX3));
  36. #elif ADCHAN == 5
  37.     /* Enable ADC5 */
  38.     ADMUX |= (1<<MUX0)|(1<<MUX2);
  39.     ADMUX &= ~((1<<MUX1)|(1<<MUX3));
  40. #elif ADCHAN == 6
  41.     /* Enable ADC6 */
  42.     ADMUX |= (1<<MUX1)|(1<<MUX2);
  43.     ADMUX &= ~((1<<MUX0)|(1<<MUX3));
  44. #elif ADCHAN == 7
  45.     /* Enable ADC7 (only for TQFP package) */
  46.     ADMUX |= (1<<MUX0)|(1<<MUX1)|(1<<MUX2);
  47.     ADMUX &= ~(1<<MUX3);
  48. #else
  49.     #error No adc defined
  50. #endif
  51.  
  52.     /* Enable AVcc as Voltage Reference */
  53.     ADMUX |= (1<<REFS0);
  54.     ADMUX &= ~(1<<REFS1);
  55.  
  56.     /* Right adjust the result */
  57.     ADMUX &= ~(1<<ADLAR);
  58.  
  59.     /* Wake up ADC and enable it */
  60.     PRR &= ~(1<<PRADC);
  61.     ADCSRA |= (1<<ADEN);
  62.  
  63.     /* Make the first conversion (takes 25 ADC clock cycles) and throw away */
  64.     ADC_Get(0);
  65.    
  66.     return 0;
  67. }
  68.  
  69. /*
  70.  * Start reading adc value. Channel parameter is not implemented.
  71.  */
  72. uint16_t ADC_Get(uint8_t channel)
  73. {
  74.     uint16_t adcdata;
  75.  
  76.     /* Start measurement (takes 13 ADC clock cycles) */
  77.     ADCSRA |= (1<<ADSC);
  78.  
  79.     while( ADCSRA & (1<<ADSC) ){ /* Wait for conversion to complete */ }
  80.  
  81.     /* Get the result and return */
  82.     adcdata = ADCW; //>>2;
  83.  
  84.     return adcdata;
  85.    
  86. }
  87.