aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/Makefile2
-rw-r--r--kernel/adc.c49
-rw-r--r--kernel/lcd3.c10
-rw-r--r--kernel/main.c8
-rw-r--r--kernel/tasks.h8
5 files changed, 73 insertions, 4 deletions
diff --git a/kernel/Makefile b/kernel/Makefile
index 1d5be25..0807a73 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -1,7 +1,7 @@
# $Id$
PROG = kernel
-SRCS = kernel.c main.c uart.c heartbeat.c rgb.c hsv.c lcd3.c
+SRCS = kernel.c main.c uart.c heartbeat.c rgb.c hsv.c lcd3.c adc.c
HEADERS = kernel.h stack.h
MCU_TARGET = atmega8
F_CPU = 16000000
diff --git a/kernel/adc.c b/kernel/adc.c
new file mode 100644
index 0000000..f48fccd
--- /dev/null
+++ b/kernel/adc.c
@@ -0,0 +1,49 @@
+/* $Id$ */
+/*
+ * Copyright (c) 2011 Dimitri Sokolyuk <demon@dim13.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <inttypes.h>
+#include <avr/io.h>
+#include "kernel.h"
+#include "tasks.h"
+
+uint16_t
+rdadc(uint8_t ch)
+{
+ ADMUX &= ~0x07;
+ ADMUX |= (ch & 0x07);
+ ADCSRA |= _BV(ADSC);
+ loop_until_bit_is_set(ADCSRA, ADSC);
+
+ return ADCW;
+}
+
+void
+adc(void *arg)
+{
+ struct adcarg *a = (struct adcarg *)arg;
+ a->r = release();
+ a->d = deadline();
+
+ /* prescale 8 */
+ ADCSRA |= (_BV(ADEN) | _BV(ADFR) | _BV(ADPS1) | _BV(ADPS0));
+
+ for (;;) {
+ *a->value = rdadc(a->channel);
+ a->r = a->d += MSEC(20);
+ update(a->r, a->d);
+ }
+}
diff --git a/kernel/lcd3.c b/kernel/lcd3.c
index 7ad82aa..2259da8 100644
--- a/kernel/lcd3.c
+++ b/kernel/lcd3.c
@@ -167,13 +167,19 @@ lcd(void *arg)
/* entry mode */
write_cmd(ENTRY_MODE_SET | INC_DDRAM, 39);
- mvputs(0, 0, "Task");
+ snooze(100);
+
+ mvputs(0, 0, "ADC0");
mvputs(1, 0, "Time");
for (;;) {
- t = previous() - 1; /* 0 is idle */
+ extern uint16_t adcval;
+ /*
+ t = previous() - 1; // 0 is idle
for (i = 0; i < TASKS; i++)
mvputch(0, 5 + i, t == i ? '1' + t : '-');
+ */
+ mvputs(0, 5, itohex(adcval));
mvputs(1, 5, itohex(now()));
diff --git a/kernel/main.c b/kernel/main.c
index 3a1921c..736975f 100644
--- a/kernel/main.c
+++ b/kernel/main.c
@@ -21,9 +21,10 @@
#include "tasks.h"
uint8_t red, green, blue;
+uint16_t adcval;
struct rgbarg rgbargs[] = {
- { &red, &green, &blue }
+ { &red, &green, &blue },
};
struct pwmarg pwmargs[] = {
@@ -32,6 +33,10 @@ struct pwmarg pwmargs[] = {
{ &blue, PB4, 0, 0 },
};
+struct adcarg adcarg[] = {
+ { 0, 0, 0, &adcval },
+};
+
int
main()
{
@@ -45,6 +50,7 @@ main()
task(pwm, STACK, SEC(0), MSEC(10), &pwmargs[1]);
task(pwm, STACK, SEC(0), MSEC(10), &pwmargs[2]);
task(lcd, STACK, MSEC(40), SEC(1), 0);
+ task(adc, STACK, MSEC(0), MSEC(20), &adcarg[0]);
for (;;);
diff --git a/kernel/tasks.h b/kernel/tasks.h
index aa7f992..ea7a20e 100644
--- a/kernel/tasks.h
+++ b/kernel/tasks.h
@@ -29,11 +29,19 @@ struct pwmarg {
uint32_t r;
};
+struct adcarg {
+ uint32_t d;
+ uint32_t r;
+ uint8_t channel;
+ uint16_t *value;
+};
+
void init_uart(void);
void heartbeat(void *);
void rgb(void *);
void pwm(void *);
void lcd(void *);
+void adc(void *);
#endif