Subversion Repositories HomeAutomation

Rev

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

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