adc.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. //adc.c
  2. #include "adc.h"
  3. #include <avr/io.h>
  4. #include <stdio.h>
  5. uint8_t adc_state;
  6. uint8_t adc_count;
  7. uint16_t adc_values[ADC_CHAN_CNT];
  8. uint16_t adc_sim_mask;
  9. #ifdef ADC_CALLBACK
  10. extern void ADC_CALLBACK(void);
  11. #endif //ADC_CALLBACK
  12. void adc_init(void)
  13. {
  14. printf(("adc_init\n"));
  15. adc_sim_mask = 0x00;
  16. ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
  17. ADMUX |= (1 << REFS0);
  18. ADCSRA |= (1 << ADEN);
  19. // ADCSRA |= (1 << ADIF) | (1 << ADSC);
  20. DIDR0 = (ADC_CHAN_MSK & 0xff);
  21. DIDR2 = (ADC_CHAN_MSK >> 8);
  22. adc_reset();
  23. // adc_sim_mask = 0b0101;
  24. // adc_sim_mask = 0b100101;
  25. // adc_values[0] = 1023 * 16;
  26. // adc_values[2] = 1023 * 16;
  27. // adc_values[5] = 1002 * 16;
  28. }
  29. void adc_reset(void)
  30. {
  31. adc_state = 0;
  32. adc_count = 0;
  33. uint8_t i; for (i = 0; i < ADC_CHAN_CNT; i++)
  34. if ((adc_sim_mask & (1 << i)) == 0)
  35. adc_values[i] = 0;
  36. }
  37. void adc_setmux(uint8_t ch)
  38. {
  39. ch &= 0x0f;
  40. if (ch & 0x08) ADCSRB |= (1 << MUX5);
  41. else ADCSRB &= ~(1 << MUX5);
  42. ADMUX = (ADMUX & ~(0x07)) | (ch & 0x07);
  43. }
  44. uint8_t adc_chan(uint8_t index)
  45. {
  46. uint8_t chan = 0;
  47. uint16_t mask = 1;
  48. while (mask)
  49. {
  50. if ((mask & ADC_CHAN_MSK) && (index-- == 0)) break;
  51. mask <<= 1;
  52. chan++;
  53. }
  54. return chan;
  55. }
  56. void adc_cycle(void)
  57. {
  58. if (adc_state & 0x80)
  59. {
  60. uint8_t index = adc_state & 0x0f;
  61. if ((adc_sim_mask & (1 << index)) == 0)
  62. adc_values[index] += ADC;
  63. if (index++ >= ADC_CHAN_CNT)
  64. {
  65. index = 0;
  66. adc_count++;
  67. if (adc_count >= ADC_OVRSAMPL)
  68. {
  69. #ifdef ADC_CALLBACK
  70. ADC_CALLBACK();
  71. #endif //ADC_CALLBACK
  72. adc_reset();
  73. }
  74. }
  75. adc_setmux(adc_chan(index));
  76. adc_state = index;
  77. }
  78. else
  79. {
  80. ADCSRA |= (1 << ADSC); //start conversion
  81. adc_state |= 0x80;
  82. }
  83. }