optimize the bypass mode
[protos/rc_servos.git] / main.c
diff --git a/main.c b/main.c
index d390554..5d449de 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1,4 +1,5 @@
 #include <aversive.h>
+#include <aversive/wait.h>
 
 struct servo {
        uint8_t bit;
@@ -7,28 +8,43 @@ struct servo {
 
 static struct servo servo_table[] = {
        {
-               .bit = 0,
-               .command = 0,
+               .bit = 2,
+               .command = 300,
+       },
+       {
+               .bit = 3,
+               .command = 700,
        },
        {
-               .bit = 1,
+               .bit = 4,
                .command = 512,
        },
        {
-               .bit = 2,
-               .command = 1023,
+               .bit = 5,
+               .command = 512,
+       },
+       {
+               .bit = 6,
+               .command = 512,
+       },
+       {
+               .bit = 7,
+               .command = 512,
        },
 };
 #define NB_SERVO (sizeof(servo_table)/sizeof(*servo_table))
 
-static volatile uint8_t bypass;
+static uint8_t bypass;
 static volatile uint8_t done;
-static volatile uint8_t portval;
-static volatile uint8_t rxidx;
+static uint8_t portval;
+static uint8_t rxidx;
 
 #define BYPASS_ENABLE 14
 #define BYPASS_DISABLE 15
 
+#define LED_ON() do { PORTB |= 0x02; } while(0)
+#define LED_OFF() do { PORTB &= ~0x02; } while(0)
+
 /*
  * SPI protocol:
  *
@@ -40,26 +56,28 @@ static volatile uint8_t rxidx;
  * Command 14 is to enable bypass mode.
  * Command 15 is to disable bypass mode.
  */
-static volatile union {
+static union {
        uint8_t u8;
        struct {
-               uint8_t zero:1;
-               uint8_t cmd_num:4;
+               /* inverted: little endian */
                uint8_t val_msb:3;
+               uint8_t cmd_num:4;
+               uint8_t zero:1;
        };
 } byte0;
 
-static volatile union {
+static union {
        uint8_t u8;
        struct {
-               uint8_t one:1;
+               /* inverted: little endian */
                uint8_t val_lsb:7;
+               uint8_t one:1;
        };
 } byte1;
 
 SIGNAL(TIMER1_COMPA_vect)
 {
-       PORTC = portval;
+       PORTD = portval;
        TIMSK1 &= ~_BV(OCIE1A);
        done = 1;
 }
@@ -140,12 +158,22 @@ int main(void)
 {
        uint8_t i;
        uint8_t t, diff;
+       uint8_t tmp;
 
        /* LED */
-       DDRB = 0x20;
+       DDRB = 0x02;
+
+#if 0 /* LED debug */
+       while (1) {
+               LED_ON();
+               wait_ms(100);
+               LED_OFF();
+               wait_ms(100);
+       }
+#endif
 
-       /* servo outputs */
-       DDRC = 0x7;
+       /* servo outputs PD2-PD7 */
+       DDRD = 0xfc;
 
        /* start timer1 at clk/1 (8Mhz) */
        TCNT1 = 0;
@@ -174,8 +202,17 @@ int main(void)
                        poll_spi();
                }
                /* bypass mode */
-               while (bypass == 1) {
-                       PORTC = PORTB;
+               if (bypass == 1) {
+                       LED_ON();
+
+                       while (bypass == 1) {
+                               tmp = PINC;
+                               tmp &= 0x3f;
+                               tmp <<= 2;
+                               PORTD = tmp;
+                               poll_spi();
+                       }
+                       LED_OFF();
                }
        }