git.droids-corp.org
/
protos
/
rc_servos.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
change prescaler of timer1 from 1 to 8
[protos/rc_servos.git]
/
main.c
diff --git
a/main.c
b/main.c
index
dd98345
..
5849b8b
100644
(file)
--- a/
main.c
+++ b/
main.c
@@
-1,4
+1,5
@@
#include <aversive.h>
#include <aversive.h>
+#include <aversive/wait.h>
struct servo {
uint8_t bit;
struct servo {
uint8_t bit;
@@
-6,9
+7,13
@@
struct servo {
};
static struct servo servo_table[] = {
};
static struct servo servo_table[] = {
+ {
+ .bit = 2,
+ .command = 300,
+ },
{
.bit = 3,
{
.bit = 3,
- .command = 0,
+ .command =
70
0,
},
{
.bit = 4,
},
{
.bit = 4,
@@
-29,14
+34,17
@@
static struct servo servo_table[] = {
};
#define NB_SERVO (sizeof(servo_table)/sizeof(*servo_table))
};
#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 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 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:
*
/*
* SPI protocol:
*
@@
-48,7
+56,7
@@
static volatile uint8_t rxidx;
* Command 14 is to enable bypass mode.
* Command 15 is to disable bypass mode.
*/
* Command 14 is to enable bypass mode.
* Command 15 is to disable bypass mode.
*/
-static
volatile
union {
+static union {
uint8_t u8;
struct {
/* inverted: little endian */
uint8_t u8;
struct {
/* inverted: little endian */
@@
-58,7
+66,7
@@
static volatile union {
};
} byte0;
};
} byte0;
-static
volatile
union {
+static union {
uint8_t u8;
struct {
/* inverted: little endian */
uint8_t u8;
struct {
/* inverted: little endian */
@@
-133,7
+141,7
@@
static void do_one_servo(struct servo *s)
//portval = PORTC | (1 << s->bit);
portval = (1 << s->bit);
t = TCNT1;
//portval = PORTC | (1 << s->bit);
portval = (1 << s->bit);
t = TCNT1;
- load_timer_at(t +
15
0);
+ load_timer_at(t +
2
0);
while (done == 0)
poll_spi();
while (done == 0)
poll_spi();
@@
-141,7
+149,7
@@
static void do_one_servo(struct servo *s)
done = 0;
portval = 0;
//portval = PORTC & (~(1 << s->bit));
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();
}
while (done == 0)
poll_spi();
}
@@
-150,17
+158,26
@@
int main(void)
{
uint8_t i;
uint8_t t, diff;
{
uint8_t i;
uint8_t t, diff;
+ uint8_t tmp;
/* LED */
/* LED */
- DDRB = 0x
20
;
+ DDRB = 0x
02
;
- /* servo outputs */
- DDRD = 0xf8;
- DDRB |= 0x01;
+#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 (8
Mhz) */
+ /* start timer1 at clk/
8 (1
Mhz) */
TCNT1 = 0;
TCNT1 = 0;
- TCCR1B = _BV(CS1
0
);
+ TCCR1B = _BV(CS1
1
);
/* start timer0 at clk/1024 (~8Khz) */
TCNT0 = 0;
/* start timer0 at clk/1024 (~8Khz) */
TCNT0 = 0;
@@
-171,7
+188,7
@@
int main(void)
sei();
sei();
- bypass =
1
;
+ bypass =
0
;
while (1) {
t = TCNT0;
for (i = 0; i < NB_SERVO; i++) {
while (1) {
t = TCNT0;
for (i = 0; i < NB_SERVO; i++) {
@@
-185,9
+202,17
@@
int main(void)
poll_spi();
}
/* bypass mode */
poll_spi();
}
/* bypass mode */
- while (bypass == 1) {
- PORTD = ((PINC & 0x0f) << 3) | ((PINB & 0x01) << 7);
- poll_spi();
+ if (bypass == 1) {
+ LED_ON();
+
+ while (bypass == 1) {
+ tmp = PINC;
+ tmp &= 0x3f;
+ tmp <<= 2;
+ PORTD = tmp;
+ poll_spi();
+ }
+ LED_OFF();
}
}
}
}