aboutsummaryrefslogtreecommitdiff
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
parent8f3692ab517b7cc7108c4dd27ded31db55adb025 (diff)
re-add adc
-rw-r--r--kernel/adc.c32
-rw-r--r--kernel/clock.c6
-rw-r--r--kernel/dmx.c17
-rw-r--r--kernel/dmx/Makefile7
-rw-r--r--kernel/heartbeat.c2
-rw-r--r--kernel/kernel.c19
-rw-r--r--kernel/kernel.h7
-rw-r--r--kernel/lcd3.c2
-rw-r--r--kernel/rgb.c9
-rw-r--r--kernel/tasks.h10
10 files changed, 59 insertions, 52 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);
}
}
diff --git a/kernel/clock.c b/kernel/clock.c
index 790391e..d788548 100644
--- a/kernel/clock.c
+++ b/kernel/clock.c
@@ -25,7 +25,7 @@
void
clock(void *arg)
{
- struct lcdarg *a = arg;
+ struct clockarg *a = arg;
uint8_t d, h, m, s;
d = h = m = s = 0;
@@ -47,8 +47,8 @@ clock(void *arg)
d += 1;
}
- sprintf(a->first, "%8lx", now());
- sprintf(a->second, "%4d:%.2d:%.2d:%.2d", d, h, m, s);
+ sprintf(a->lcd->first, "%8lx%8x", now(), a->adc->value[0]);
+ sprintf(a->lcd->second, "%4d:%.2d:%.2d:%.2d", d, h, m, s);
update(SEC(1), MSEC(500));
}
diff --git a/kernel/dmx.c b/kernel/dmx.c
index 4b30f1e..0cd641a 100644
--- a/kernel/dmx.c
+++ b/kernel/dmx.c
@@ -20,7 +20,9 @@
#include "kernel.h"
#include "tasks.h"
-struct rgbarg rgbargs;
+uint16_t adcval[ADCCHANNELS];
+
+struct rgbarg rgbargs = { 0, 0, 0, 0, &adcval[0] };
struct pwmarg pwmargs[] = {
{ &rgbargs.r, PB2, &rgbargs.m },
@@ -28,7 +30,10 @@ struct pwmarg pwmargs[] = {
{ &rgbargs.b, PB4, &rgbargs.m }
};
+struct adcarg adcarg = { adcval };
+
struct lcdarg lcdarg;
+struct clockarg clockarg = { &lcdarg, &adcarg };
int
main()
@@ -41,7 +46,7 @@ main()
#endif
#if 1
- exec(rgb, STACK + 16, &rgbargs);
+ exec(rgb, STACK, &rgbargs);
exec(pwm, STACK, &pwmargs[0]);
exec(pwm, STACK, &pwmargs[1]);
exec(pwm, STACK, &pwmargs[2]);
@@ -52,10 +57,14 @@ main()
#endif
#if 1
+ exec(adc, STACK, &adcarg);
+#endif
+
+#if 1
exec(lcd, STACK, &lcdarg);
- exec(clock, STACK, &lcdarg);
+ exec(clock, STACK, &clockarg);
#endif
- idle();
+ IDLE();
return 0;
}
diff --git a/kernel/dmx/Makefile b/kernel/dmx/Makefile
index 72cbd27..0117776 100644
--- a/kernel/dmx/Makefile
+++ b/kernel/dmx/Makefile
@@ -8,13 +8,14 @@ PRESCALE= 8 # res 0.5usec cycle 32.7msec
#PRESCALE= 64 # res 4usec cycle 262msec
#PRESCALE= 256 # res 16msec cycle 1 sec
#PRESCALE= 1024 # res 64msec cycle 4 sec
-STACK= 48
+#STACK= 48
+STACK= 64
TASKS= 8
-SEMAPHORES= 8
+SEMAPHORES= 4
BAUD= 9600
PROG= dmx
-SRCS= dmx.c heartbeat.c rgb.c hsv.c clock.c lcd3.c uart.c
+SRCS= dmx.c heartbeat.c rgb.c hsv.c clock.c lcd3.c uart.c adc.c
NOMAN=
.include <bsd.prog.mk>
diff --git a/kernel/heartbeat.c b/kernel/heartbeat.c
index 7ae97ae..edd1cee 100644
--- a/kernel/heartbeat.c
+++ b/kernel/heartbeat.c
@@ -32,7 +32,7 @@ heartbeat(void *arg)
#define DL MSEC(5)
- update(now(), DL);
+ update(0, DL);
for (;;) {
PORTB |= _BV(PIN);
diff --git a/kernel/kernel.c b/kernel/kernel.c
index bf8fee9..44395d7 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -35,19 +35,19 @@ enum State { TERMINATED, RUNQ, TIMEQ, WAITQOFFSET };
#define NOW(hi, lo) (((uint32_t)(hi) << 0x10) | (lo))
struct task {
- uint8_t state;
- uint16_t sp; /* stack pointer */
uint32_t release;
uint32_t deadline;
+ uint16_t sp; /* stack pointer */
+ uint8_t state;
};
struct kernel {
struct task *running;
struct task *last;
struct task task[TASKS + 1];
- uint8_t semaphore[SEMAPHORES];
- uint8_t *freemem;
uint16_t cycles;
+ uint8_t *freemem;
+ uint8_t semaphore[SEMAPHORES];
} kernel;
ISR(TIMER1_OVF_vect)
@@ -100,7 +100,7 @@ ISR(TIMER1_COMPA_vect, ISR_NAKED)
}
void
-init(int stack)
+init(uint8_t stack)
{
cli();
@@ -123,7 +123,7 @@ init(int stack)
}
void
-exec(void (*fun)(void *), uint16_t stack, void *args)
+exec(void (*fun)(void *), uint8_t stack, void *args)
{
struct task *t;
uint8_t *sp;
@@ -287,10 +287,3 @@ running(void)
return ret;
}
-
-void
-idle(void)
-{
- for (;;)
- asm volatile ("nop");
-}
diff --git a/kernel/kernel.h b/kernel/kernel.h
index cadef22..d4c699c 100644
--- a/kernel/kernel.h
+++ b/kernel/kernel.h
@@ -89,10 +89,12 @@
#define SEC1(T) ((uint32_t)(T) * ((F_CPU / 10) / PRESCALE))
#define SEC0(T) ((uint32_t)(T) * ((F_CPU / 1) / PRESCALE))
+#define IDLE() do { asm volatile ("nop"); } while (1)
+
/* __BEGIN_DECLS */
-void init(int stack);
-void exec(void (*fun)(void *), uint16_t stack, void *args);
+void init(uint8_t stack);
+void exec(void (*fun)(void *), uint8_t stack, void *args);
void semaphore(uint8_t semnbr, uint8_t initVal);
void wait(uint8_t semnbr);
@@ -109,7 +111,6 @@ uint32_t now(void);
uint32_t release(void);
uint32_t deadline(void);
uint8_t running(void);
-void idle(void);
/* __END_DECLS */
diff --git a/kernel/lcd3.c b/kernel/lcd3.c
index b7bbb10..b6e2f1e 100644
--- a/kernel/lcd3.c
+++ b/kernel/lcd3.c
@@ -106,7 +106,7 @@ lcd(void *arg)
PORTDIR |= (_BV(DATA) | _BV(CLOCK) | _BV(E));
/* task init: wait >40ms */
- update(now() + MSEC(40), MSEC(500));
+ update(MSEC(40), MSEC(500));
/* 8 bit, 2 line, 5x8 font */
write_cmd(FUNCTION_SET | DATA_LENGTH_8BIT | TWO_LINES, 39);
diff --git a/kernel/rgb.c b/kernel/rgb.c
index 5684456..9adfdfb 100644
--- a/kernel/rgb.c
+++ b/kernel/rgb.c
@@ -28,22 +28,23 @@ rgb(void *arg)
{
struct rgbarg *a = (struct rgbarg *)arg;
uint16_t i = 0;
- uint8_t r, g, b;
+ uint8_t r, g, b, v;
cli();
a->m = 255 >> 4;
sei();
- update(now(), MSEC(500));
+ update(0, MSEC(500));
for (;;) {
i = (i + 1) % 360;
- hsv(&r, &g, &b, i, 255, 255);
+ hsv(&r, &g, &b, i, 255, v);
cli();
a->r = r >> 4;
a->g = g >> 4;
a->b = b >> 4;
+ v = *a->v >> 2;
sei();
update(MSEC(500), MSEC(500));
@@ -64,7 +65,7 @@ pwm(void *arg)
cli();
maxval = *a->mval;
sei();
- update(now(), DL);
+ update(0, DL);
for (;;) {
cli();
diff --git a/kernel/tasks.h b/kernel/tasks.h
index 9fb27da..8b798d1 100644
--- a/kernel/tasks.h
+++ b/kernel/tasks.h
@@ -18,8 +18,8 @@
#ifndef __TASKS_H
#define __TASKS_H
-#define ADCCHANNELS 6
-#define ADCPRESCALE 128
+#define ADCCHANNELS 4 /* max 6 */
+#define ADCPRESCALE 128 /* 50-200 kHz for max resolution */
#if (ADCPRESCALE == 1)
#define ADC_FLAGS 0
@@ -46,6 +46,7 @@ struct rgbarg {
uint8_t g;
uint8_t b;
uint8_t m;
+ uint16_t *v;
};
struct pwmarg {
@@ -66,6 +67,11 @@ struct lcdarg {
uint8_t x, y;
};
+struct clockarg {
+ struct lcdarg *lcd;
+ struct adcarg *adc;
+};
+
struct ppmarg {
uint16_t *value;
};