From de97cb96726b26c5ae065b3f9d0a6638ab3075d5 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Mon, 7 Nov 2011 03:53:50 +0000 Subject: readd ppm module --- kernel/dmx.c | 11 ++++++++++- kernel/dmx/Makefile | 4 ++-- kernel/ppm.c | 37 +++++++++++++++++++++++-------------- kernel/tasks.h | 2 +- 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 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) -- cgit v1.2.3