Subversion Repositories FlightCtrl

Compare Revisions

Ignore whitespace Rev 1476 → Rev 1477

/branches/V0.76g-acid/servoboard/servoboard.c
16,7 → 16,6
uint8_t volatile pwm_position[6];
uint16_t volatile pwm_limit[6];
uint8_t pwm_active;
uint8_t pwm_status = 1;
#if DEBUG_SIGNAL
uint8_t volatile display_values = 0;
#endif
35,17 → 34,19
void set_pwm() {
 
for(uint8_t n = 0; n < 6; n++) {
pwm_signal[n] = pwm_position[n] - 127 + pwm_neutral_position[n];
if (pwm_limit[n] != 0) {
uint8_t l, h;
l = pwm_limit[n] & 0xff;
h = pwm_limit[n] >> 8;
if (pwm_signal[n] < l) {
pwm_signal[n] = l;
if (pwm_limit[0] != 0xffff) {
pwm_signal[n] = pwm_position[n] - 127 + pwm_neutral_position[n];
if (pwm_limit[n] != 0) {
uint8_t l, h;
l = pwm_limit[n] & 0xff;
h = pwm_limit[n] >> 8;
if (pwm_signal[n] < l) {
pwm_signal[n] = l;
}
if (pwm_signal[n] > h) {
pwm_signal[n] = h;
}
}
if (pwm_signal[n] > h) {
pwm_signal[n] = h;
}
}
}
 
60,28 → 61,27
 
}
 
void pwm_check_active() {
 
// check if pwm is configured
pwm_active = (pwm_limit[0] != 0xffff) ? (1<<SERVO1) : 0;
pwm_active |= (pwm_limit[1] != 0xffff) ? (1<<SERVO2) : 0;
pwm_active |= (pwm_limit[2] != 0xffff) ? (1<<SERVO3) : 0;
pwm_active |= (pwm_limit[3] != 0xffff) ? (1<<SERVO4) : 0;
pwm_active |= (pwm_limit[4] != 0xffff) ? (1<<SERVO5) : 0;
pwm_active |= (pwm_limit[5] != 0xffff) ? (1<<SERVO6) : 0;
 
}
 
 
void eeprom_init() {
 
eeprom_busy_wait();
eeprom_read_block(&pwm_neutral_position[0], &eeprom_neutral_pos, sizeof(pwm_neutral_position));
eeprom_read_block(&pwm_limit[0], &eeprom_pwm_limit, sizeof(pwm_limit));
pwm_check_active();
 
set_pwm_active();
}
 
void set_pwm_active() {
 
// check if pwm is configured
pwm_active = (pwm_limit[0] != 0xffff) ? (1 << SERVO1) : 0;
pwm_active |= (pwm_limit[1] != 0xffff) ? (1 << SERVO2) : 0;
pwm_active |= (pwm_limit[2] != 0xffff) ? (1 << SERVO3) : 0;
pwm_active |= (pwm_limit[3] != 0xffff) ? (1 << SERVO4) : 0;
pwm_active |= (pwm_limit[4] != 0xffff) ? (1 << SERVO5) : 0;
pwm_active |= (pwm_limit[5] != 0xffff) ? (1 << SERVO6) : 0;
 
}
 
void eeprom_write() {
 
cli();
91,7 → 91,6
 
}
 
/*
void delay(int ms) {
 
while(ms--) {
99,7 → 98,6
}
 
}
*/
 
int main(void) {
 
110,6 → 108,8
DDRD = (1<<PD7);
PORTD = (1<<PD7);
 
delay(1000);
 
cli();
uart_init();
eeprom_init();
131,25 → 131,21
// show status
blink_counter++;
 
if (pwm_active == 0) { // not configured
 
if (pwm_active == 0) {
blink = 50;
pwm_status = 1;
 
} else {
 
if (I2C_timeout) {
I2C_timeout--;
if (I2C_timeout == 0) { // no i2c signal
blink = 0;
pwm_status = 2;
set_pwm_neutral();
set_pwm();
} else {
blink = 5;
}
blink = 5;
pwm_status = 0;
} else {
blink = 0;
}
 
}
 
if (blink == 0) {
/branches/V0.76g-acid/servoboard/servoboard.h
1,7 → 1,7
 
 
#define VERSION "0.40"
#define DEBUG_SIGNAL 1
#define VERSION "0.45"
#define DEBUG_SIGNAL 0
 
extern volatile uint8_t pwm_position[6];
extern volatile uint8_t pwm_neutral_position[6];
12,7 → 12,7
 
void set_pwm();
void set_pwm_neutral();
void pwm_check_active();
void set_pwm_active();
 
 
void eeprom_init();
/branches/V0.76g-acid/servoboard/twislave.c
33,7 → 33,7
Byte_Counter = 0;
return;
case SR_PREV_ACK:
I2C_timeout = 3;
I2C_timeout = 5;
if (Byte_Counter < 32) {
I2C_RXBuffer[Byte_Counter++] = TWDR;
}
/branches/V0.76g-acid/servoboard/uart.c
135,7 → 135,7
servo--;
s = strtok_r(NULL, ",", &t);
if (s) {
uint8_t h = 0, l = 0;
uint8_t h = 0xff, l = 0;
pwm_neutral_position[servo] = atoi(s);
s = strtok_r(NULL, ",", &t);
if (s) {
143,12 → 143,10
s = strtok_r(NULL, "", &t);
if (s) {
h = atoi(s);
} else {
h = 0xff;
}
}
pwm_limit[servo] = (h << 8) | l;
pwm_check_active();
set_pwm_active();
i = servo;
printf("SERVO %d, NEUTRAL %d, LIMIT %d-%d\n",
(i + 1),