Ciebie najbardziej powinien interesować kawałek:
uint8_t temp;
uint8_t loop;
PORTA = 0xff;//Rozpoczęcie sygnału sterującego
_delay_ms(0.6);//Odczekanie minimalnej długości sygnału strującego
temp = PORTA;
for(loop=0;loop<181;loop++)//Kończenie sygnałów sterujących dla odpowiedniego przemieszczenia ramienia
{
if(S0==loop){temp &= 0b11111110;}
if(S1==loop){temp &= 0b11111101;}
if(S2==loop){temp &= 0b11111011;}
if(S3==loop){temp &= 0b11110111;}
if(S4==loop){temp &= 0b11101111;}
if(S5==loop){temp &= 0b11011111;}
if(S6==loop){temp &= 0b10111111;}
if(S7==loop){temp &= 0b01111111;}
PORTA = temp;
_delay_us(10);//Odczekiwanie pomiędzy kolejnymi stopniami konta przemieszczenia ramienia
}
PORTA = 0x00;//Zakończenie wszystkich sygnałów(PEWNOŚĆ ZAKOŃCZENIA)
Mam trochę czasu, więc tłumaczę:
-PORTA = 0xff; - rozpoczynał impuls sterujący serwami na porcie A
-_delay_ms(0.6); - odczekiwało minimalną długość impulsu(u mnie 600us, ale zależne od czasu trwania do zakończenia impulsu o kącie 0 stopni)
-pętla for wykonywała kończenie impulsów dla odpowiednich wartości(zależne od wartości zmiennych S0..S7). W pętli zmiana stanów linii sterujących serwami jest synchroniczna(PORTA = temp).
-_delay_us(10); - odczekuje czas dla kolejnych stopni kąta przesunięcia ramienia serwa.
-PORTA = 0x00; - upewnienie, że wszystkie sygnały zakończone.
To pewnie działało, bo robiłem to na zlecenie. Poniżej są funkcje ruchu serwami(manualne i czytane z EEPROM'u) oraz zmiany wartości w czasie. U Ciebie zmiana może następować skokowo, ale robot nie mógł wykonywać sztywnych ruchów

Jak teraz po pewnym czasie na to patrzę, to całkiem logicznie jest w tym pliku, choć może nie optymalnie
