aboutsummaryrefslogtreecommitdiff
path: root/kernel/adc.c
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2011-11-02 18:21:08 +0000
committerDimitri Sokolyuk <demon@dim13.org>2011-11-02 18:21:08 +0000
commit25a00477652beed65cb818d8708f032bfa2f0fb0 (patch)
tree2ce07626c6ea11899799ef8d6f25c687433382cd /kernel/adc.c
parent8f3692ab517b7cc7108c4dd27ded31db55adb025 (diff)
re-add adc
Diffstat (limited to 'kernel/adc.c')
-rw-r--r--kernel/adc.c32
1 files changed, 14 insertions, 18 deletions
diff --git a/kernel/adc.c b/kernel/adc.c
index cde31ff..d431564 100644
--- a/kernel/adc.c
+++ b/kernel/adc.c
@@ -17,36 +17,32 @@
#include <inttypes.h>
#include <avr/io.h>
+#include <avr/interrupt.h>
#include "kernel.h"
#include "tasks.h"
#define MUXMASK 0x07
-
-uint16_t
-rdadc(uint8_t ch)
-{
- ADMUX &= ~MUXMASK;
- ADMUX |= (ch & MUXMASK);
- ADCSRA |= _BV(ADSC);
- loop_until_bit_is_clear(ADCSRA, ADSC);
-
- return ADCW;
-}
+#define DL MSEC(20)
void
adc(void *arg)
{
struct adcarg *a = (struct adcarg *)arg;
- uint8_t i;
+ uint8_t i = 0;
ADCSRA |= (_BV(ADEN) | ADC_FLAGS);
-// ADMUX |= _BV(REFS0);
+
+ update(0, DL);
for (;;) {
- wait(0);
- for (i = 0; i < ADCCHANNELS; i++)
- a->value[i] = rdadc(i);
- signal(0);
- period(MSEC(8 * ADCCHANNELS));
+ if (bit_is_clear(ADCSRA, ADSC)) {
+ cli();
+ a->value[i] = ADCW;
+ sei();
+ ADMUX = i;
+ ADCSRA |= _BV(ADSC);
+ i = (i + 1) % ADCCHANNELS;
+ }
+ update(MSEC(40), DL);
}
}