aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2011-11-07 03:53:50 +0000
committerDimitri Sokolyuk <demon@dim13.org>2011-11-07 03:53:50 +0000
commitde97cb96726b26c5ae065b3f9d0a6638ab3075d5 (patch)
treebb75c4d2d9a0ba146ee8111e5468c50c0faeaa9b
parent90af55489c91d2b7d4e85a3c37c597b83fb65d4c (diff)
readd ppm module
-rw-r--r--kernel/dmx.c11
-rw-r--r--kernel/dmx/Makefile4
-rw-r--r--kernel/ppm.c37
-rw-r--r--kernel/tasks.h2
4 files changed, 36 insertions, 18 deletions
diff --git a/kernel/dmx.c b/kernel/dmx.c
index cb2ac44..8a27fd3 100644
--- a/kernel/dmx.c
+++ b/kernel/dmx.c
@@ -23,6 +23,8 @@
struct adcarg adcarg;
+struct ppmarg ppmarg = { adcarg.value };
+
struct lcdarg lcdarg;
struct clockarg clockarg = { &lcdarg, &adcarg };
@@ -50,18 +52,25 @@ main()
exec(pwm, STACK, &pwmargs[0]);
exec(pwm, STACK, &pwmargs[1]);
exec(pwm, STACK, &pwmargs[2]);
+#endif
+
+#if 1
exec(adc, STACK, &adcarg);
#endif
#if 1
exec(lcd, STACK, &lcdarg);
- exec(clock, STACK, &clockarg);
+ exec(clock, STACK + 48, &clockarg);
#endif
#if 0
exec(cmd, STACK, &rgbargs);
#endif
+#if 0
+ exec(ppm, STACK, &ppmarg);
+#endif
+
for (;;)
_NOP();
diff --git a/kernel/dmx/Makefile b/kernel/dmx/Makefile
index c18bc83..816cd82 100644
--- a/kernel/dmx/Makefile
+++ b/kernel/dmx/Makefile
@@ -9,12 +9,12 @@ PRESCALE= 8 # res 0.5usec cycle 32.7msec
#PRESCALE= 256 # res 16msec cycle 1 sec
#PRESCALE= 1024 # res 64msec cycle 4 sec
STACK= 64
-TASKS= 8
+TASKS= 9 # +1 idle
SEMAPHORES= 4
BAUD= 9600
PROG= dmx
-SRCS= dmx.c heartbeat.c rgb.c hsv.c clock.c lcd3.c uart.c adc.c
+SRCS= dmx.c heartbeat.c rgb.c hsv.c clock.c lcd3.c uart.c adc.c ppm.c
NOMAN=
.include <bsd.prog.mk>
diff --git a/kernel/ppm.c b/kernel/ppm.c
index dc855fc..bfbf109 100644
--- a/kernel/ppm.c
+++ b/kernel/ppm.c
@@ -23,44 +23,53 @@
#define ON do { PORTB |= _BV(PB1); } while (0)
#define OFF do { PORTB &= ~_BV(PB1); } while (0)
-#define ADCMAX (UINT16_MAX >> 6) /* 10 bit */
-#define DL SEC4(1)
-#define DELIM SEC4(3) /* 0.3ms */
+#define SWITCH do { PORTB ^= _BV(PB1); } while (0)
+
+#define ADCMAX 0x3ff /* 10 bit */
+#define DL SEC4(1) /* 0.1ms */
#define FRAME SEC2(2) /* 20ms */
+#define DELIM SEC4(3) /* 0.3ms */
#define SIGMIN SEC4(7) /* 0.7ms */
void
ppm(void *arg)
{
struct ppmarg *a = (struct ppmarg *)arg;
- uint32_t t, n;
+ uint32_t t, n, v;
uint8_t i;
DDRB |= _BV(DDB1);
- ON;
+ OFF;
+
+ update(0, DL);
/* frame length 20ms, channel 0.7-1.7ms, stop 0.3 ms */
for (;;) {
t = FRAME;
for (i = 0; i < ADCCHANNELS; i++) {
- n = SIGMIN + SEC3(a->value[i]) / ADCMAX;
+ cli();
+ v = SEC3(a->value[i]);
+ sei();
+
+ n = SIGMIN + v / ADCMAX;
t -= n + DELIM;
- /* channel frame 0.7..1.7ms high */
- OFF;
- update(n, DL);
-
/* start frame 0.3ms low */
- ON;
+ SWITCH;
update(DELIM, DL);
+
+ /* channel frame 0.7..1.7ms high */
+ SWITCH;
+ update(n, DL);
}
/* sync frame */
- OFF;
- update(t - DELIM, DL);
- ON;
+ SWITCH;
update(DELIM, DL);
+
+ SWITCH;
+ update(t - DELIM, DL);
}
}
diff --git a/kernel/tasks.h b/kernel/tasks.h
index eeb96f9..7787552 100644
--- a/kernel/tasks.h
+++ b/kernel/tasks.h
@@ -18,7 +18,7 @@
#ifndef __TASKS_H
#define __TASKS_H
-#define ADCCHANNELS 4 /* max 6 */
+#define ADCCHANNELS 6 /* max 6 */
#define ADCPRESCALE 128 /* 50-200 kHz for max resolution */
#if (ADCPRESCALE == 1)