X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=main.c;h=4ff369da10e373e3226c613615bb7c6b654833bc;hb=fe3e355d9a8cf8278c53cbb1ad4c375f76e4a38d;hp=d3905545135790ea965c69045cadfe423202ec96;hpb=90919fb720235d8f3551cbc31b81e70078498f20;p=protos%2Frc_servos.git diff --git a/main.c b/main.c index d390554..4ff369d 100644 --- a/main.c +++ b/main.c @@ -1,4 +1,5 @@ #include +#include 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; } @@ -142,10 +160,19 @@ int main(void) uint8_t t, diff; /* LED */ - DDRB = 0x20; + DDRB = 0x02; - /* servo outputs */ - DDRC = 0x7; +#if 0 /* LED debug */ + while (1) { + LED_ON(); + wait_ms(100); + LED_OFF(); + wait_ms(100); + } +#endif + + /* servo outputs PD2-PD7 */ + DDRD = 0xfc; /* start timer1 at clk/1 (8Mhz) */ TCNT1 = 0; @@ -175,8 +202,11 @@ int main(void) } /* bypass mode */ while (bypass == 1) { - PORTC = PORTB; + LED_ON(); + PORTD = (PINC & 0x3f) << 2; + poll_spi(); } + LED_OFF(); } return 0;