Проблема вот в чём по rs-232 отравляю три байтика. 1байт- номер функции мк(серва), 2байт- номер сервы, 3байт позиция.
Например отправляю: 4,1,210 - 1 серву в крайние положение
отправляю: 4,0,0. - отключить управление сервами.
отправляю: 4,1,210 - может начать "шорохоться" другая серва.
Да и вообще при каждом новом включении сервы встают в разные позиции.
- Код: Выделить всё • Развернуть
unsigned char rx_buffer[3];
unsigned int servo_position[9]={1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382};//среднее положение для кварца 7.372800
interrupt [TIM3_COMPC] void timer3_compc_isr(void)
{
static char current_servo=1;
static unsigned int pause = 18432;
static unsigned int OCR33;
TCCR3C|=(1<<FOC3C);
if (current_servo == 9)
{
current_servo = 0;
OCR33 += pause;
OCR3C=OCR33;
pause = 18432;
}
else
{
OCR33+=servo_position[current_servo];
OCR3C=OCR33;
pause -= servo_position[current_servo];
current_servo++;
}
}
void servo (unsigned char servo, unsigned int pos)//передаю в функцию оба значения char
{
if ((servo&&pos)==0)
{
servo_off();
return;
}
else if(SERV==OFF){servo_on();}
if (servo>8){servo=8;}
if (servo<1){servo=1;}
if (pos<90){pos=90;}
if (pos>210){pos=210;}
servo_position[servo]=((pos*74/8)-6); //Может здесь что нибудь не так с приведением
} //типов?
void servo_on (void)
{
DDRE|=((1<<DDE5)|(1<<DDE2));
PORTE&=~((1<<PORTE5)|(1<<PORTE2));
PORTE.2=1;
OCR3C=2000;
TCCR3A=0x04;
TCCR3B=0x02;
ETIMSK|=(1<<OCIE3C);
PORTE.2=0;
}
void servo_off (void)
{
DDRE&=~((1<<DDE5)|(1<<DDE2));
TCCR3A=0x00;
TCCR3B=0x00;
ETIMSK&=~(1<<OCIE3C);
}
void main(void)
{
servo(rx_buf[1],rx_buf[2]);
}
Где здесь подвох?