aboutsummaryrefslogtreecommitdiff
path: root/kernel/adc.c
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2011-03-13 23:50:49 +0000
committerDimitri Sokolyuk <demon@dim13.org>2011-03-13 23:50:49 +0000
commit577488e08517172c1e926b6f3fb15a4ca9f6633f (patch)
tree66b3c07488fb3b69d8088b5d9a2856582e5501a5 /kernel/adc.c
parentb4f72c586c36539fab69a6613ff40858b501a16d (diff)
admux
Diffstat (limited to 'kernel/adc.c')
-rw-r--r--kernel/adc.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/kernel/adc.c b/kernel/adc.c
index 8f2164d..0037756 100644
--- a/kernel/adc.c
+++ b/kernel/adc.c
@@ -20,13 +20,15 @@
#include "kernel.h"
#include "tasks.h"
+#define MUXMASK 0x07
+
uint16_t
rdadc(uint8_t ch)
{
- ADMUX &= ~0x07;
- ADMUX |= (ch & 0x07);
+ ADMUX &= ~MUXMASK;
+ ADMUX |= (ch & MUXMASK);
ADCSRA |= _BV(ADSC);
- loop_until_bit_is_set(ADCSRA, ADSC);
+ loop_until_bit_is_clear(ADCSRA, ADSC);
return ADCW;
}
@@ -35,14 +37,17 @@ void
adc(void *arg)
{
struct adcarg *a = (struct adcarg *)arg;
- a->r = release();
- a->d = deadline();
+ uint32_t r = release();
+ uint32_t d = deadline();
+ uint8_t i;
- ADCSRA |= (_BV(ADEN) | _BV(ADFR) | ADC_FLAGS);
+ ADCSRA |= (_BV(ADEN) | ADC_FLAGS);
+ /* ADMUX |= _BV(REFS0); */
for (;;) {
- *a->value = rdadc(a->channel);
- a->r = a->d += MSEC(20);
- update(a->r, a->d);
+ for (i = 0; i < ADCCHANNELS; i++)
+ a->value[i] = rdadc(i);
+ r = d += MSEC(1);
+ update(r, d);
}
}