aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2011-11-06 00:29:26 +0000
committerDimitri Sokolyuk <demon@dim13.org>2011-11-06 00:29:26 +0000
commitbcb773b7a736c661bad142cc1374c879a236ca9d (patch)
treefd65862d071d99bc46b3b07c0ce5d70d25ba52d8
parent3f75c2dcc03aaebc3eda844590c881da1e527f21 (diff)
reorder ppm function, not tested
-rw-r--r--kernel/ppm.c76
1 files changed, 24 insertions, 52 deletions
diff --git a/kernel/ppm.c b/kernel/ppm.c
index 3af03a2..f3e5fc2 100644
--- a/kernel/ppm.c
+++ b/kernel/ppm.c
@@ -17,80 +17,52 @@
#include <inttypes.h>
#include <avr/io.h>
+#include <avr/interrupt.h>
#include "kernel.h"
#include "tasks.h"
-#define ON PORTB |= _BV(PB1)
-#define OFF PORTB &= ~_BV(PB1)
-
-#if 0
-uint32_t buffer[ADCCHANNELS];
+#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 FRAME SEC2(2) /* 20ms */
+#define SIGMIN SEC4(7) /* 0.7ms */
void
ppm(void *arg)
{
struct ppmarg *a = (struct ppmarg *)arg;
- uint32_t r = release();
- uint32_t d = deadline();
- uint32_t t;
+ uint32_t t, n;
uint8_t i;
DDRB |= _BV(DDB1);
- PORTB &= ~_BV(PB1); /* high is low */
+ ON;
/* frame length 20ms, channel 0.7-1.7ms, stop 0.3 ms */
-
for (;;) {
- /* start frame 0.3ms low */
- ON;
- r = d += USEC(300);
- update(r, d);
-
- wait(0);
- for (i = 0, t = 0; i < ADCCHANNELS; i++) {
- buffer[i] = a->value[i];
- t += buffer[i];
- }
- signal(0);
-
- /* sync frame */
- OFF;
- r = d += MSEC(20) - MSEC(t) / 0x3ff - MSEC(ADCCHANNELS) - USEC(300);
- update(r, d);
+ t = FRAME;
for (i = 0; i < ADCCHANNELS; i++) {
- /* start frame 0.3ms low */
- ON;
- r = d += USEC(300);
- update(r, d);
+ n = SIGMIN + SEC3(a->value[i]) / ADCMAX;
/* channel frame 0.7..1.7ms high */
OFF;
- r = d += USEC(700) + MSEC(buffer[i]) / 0x3ff;
- update(r, d);
- }
+ update(n, DL);
- }
-}
-#else
-void
-ppm(void *arg)
-{
- struct ppmarg *a = (struct ppmarg *)arg;
- uint32_t t;
+ /* start frame 0.3ms low */
+ ON;
+ update(DELIM, DL);
+ t -= n + DELIM;
+ }
- DDRB |= _BV(DDB1);
- PORTB &= ~_BV(PB1);
+ t -= DELIM;
- for (;;) {
- wait(0);
- t = MSEC(1) + MSEC(a->value[0]) / 0x3ff;
- signal(0);
+ /* sync frame */
+ OFF;
+ update(t, DL);
- period(MSEC(20));
- PORTB ^= _BV(PB1);
- snooze(t);
- PORTB ^= _BV(PB1);
+ ON;
+ update(DELIM, DL);
}
}
-#endif