X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=main.c;h=4ff369da10e373e3226c613615bb7c6b654833bc;hb=fe3e355d9a8cf8278c53cbb1ad4c375f76e4a38d;hp=53fd747dc8b45f40a82bc523c3e4045ec2901f97;hpb=e3f43b953a1103fa4e9f4f932a04e8ab51b3b884;p=protos%2Frc_servos.git diff --git a/main.c b/main.c index 53fd747..4ff369d 100644 --- a/main.c +++ b/main.c @@ -1,4 +1,5 @@ #include +#include struct servo { uint8_t bit; @@ -7,34 +8,122 @@ 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, }, }; - -static volatile uint8_t rxbuf[16]; -register uint8_t rxlen asm("r2"); -register uint8_t done asm("r3"); -register uint8_t portval asm("r4"); -register uint8_t bypass asm("r5"); +#define NB_SERVO (sizeof(servo_table)/sizeof(*servo_table)) + +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: + * + * A command is stored on 2 bytes. The first one has its msb to 0, and the + * second one to 1. The first received byte contains the command number, and the + * msb of the servo value. The second byte contains the lsb of the servo value. + * + * Commands 0 to NB_SERVO are to set the value of servo. + * Command 14 is to enable bypass mode. + * Command 15 is to disable bypass mode. + */ +static union { + uint8_t u8; + struct { + /* inverted: little endian */ + uint8_t val_msb:3; + uint8_t cmd_num:4; + uint8_t zero:1; + }; +} byte0; + +static union { + uint8_t u8; + struct { + /* 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; } static void poll_spi(void) { + uint8_t c; + + /* reception complete ? */ + if (!(SPSR & (1<