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/ppm.c | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) (limited to 'kernel/ppm.c') 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); } } -- cgit v1.2.3