X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=main.c;h=5849b8bfe4b73f5a952d35c22bb69a6f9d8535c3;hb=7113aed0018e08706cf5fbfeb58a96ba87a84ef4;hp=657e54d35fe67c4279924b24e83a2f8564d61f3e;hpb=face7352ff4e497c17590266455bda126f35d842;p=protos%2Frc_servos.git diff --git a/main.c b/main.c index 657e54d..5849b8b 100644 --- a/main.c +++ b/main.c @@ -1,4 +1,5 @@ #include +#include struct servo { uint8_t bit; @@ -7,24 +8,42 @@ 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)) -register uint8_t bypass asm("r2"); -register uint8_t done asm("r3"); -register uint8_t portval asm("r4"); -register uint8_t rxidx asm("r5"); +static uint8_t bypass; +static volatile uint8_t done; +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: @@ -37,26 +56,28 @@ register uint8_t rxidx asm("r5"); * Command 14 is to enable bypass mode. * Command 15 is to disable bypass mode. */ -register union { +static union { uint8_t u8; struct { - uint16_t zero:1; - uint16_t cmd_num:4; - uint16_t val_msb:3; + /* inverted: little endian */ + uint8_t val_msb:3; + uint8_t cmd_num:4; + uint8_t zero:1; }; -} byte0 asm("r6"); +} byte0; -register union { +static union { uint8_t u8; struct { - uint8_t one:1; + /* inverted: little endian */ uint8_t val_lsb:7; + uint8_t one:1; }; -} byte1 asm("r7"); +} byte1; SIGNAL(TIMER1_COMPA_vect) { - PORTC = portval; + PORTD = portval; TIMSK1 &= ~_BV(OCIE1A); done = 1; } @@ -94,10 +115,10 @@ static void poll_spi(void) val += byte1.val_lsb; servo_table[byte0.cmd_num].command = val; } - else if (byte0.cmd_num == 14) { + else if (byte0.cmd_num == BYPASS_ENABLE) { bypass = 1; } - else if (byte0.cmd_num == 15) { + else if (byte0.cmd_num == BYPASS_DISABLE) { bypass = 0; } } @@ -120,7 +141,7 @@ static void do_one_servo(struct servo *s) //portval = PORTC | (1 << s->bit); portval = (1 << s->bit); t = TCNT1; - load_timer_at(t + 150); + load_timer_at(t + 20); while (done == 0) poll_spi(); @@ -128,7 +149,7 @@ static void do_one_servo(struct servo *s) done = 0; portval = 0; //portval = PORTC & (~(1 << s->bit)); - load_timer_at(t + 150 + 8000 + s->command * 8); + load_timer_at(t + 20 + 1000 + s->command); while (done == 0) poll_spi(); } @@ -137,16 +158,26 @@ 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) */ + /* start timer1 at clk/8 (1Mhz) */ TCNT1 = 0; - TCCR1B = _BV(CS10); + TCCR1B = _BV(CS11); /* start timer0 at clk/1024 (~8Khz) */ TCNT0 = 0; @@ -157,6 +188,7 @@ int main(void) sei(); + bypass = 0; while (1) { t = TCNT0; for (i = 0; i < NB_SERVO; i++) { @@ -170,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(); } }