Witam mam problem z prawidłowym odczytywaniem stanów na INT0 i INT1. Napisałem program do dekodowania sygnałów z enkodera kwadraturowego, który działa prawidłowo ale tylko do pewnej prędkości obrotowej silnika. Tu fragment kodu:
Kod:
//INT0 interrupt
ISR(INT0_vect )
{
if(bit_is_set(PIND, PD3))
{ licznik1++;
kierunek = 0; } // prawo
if(bit_is_clear(PIND, PD3))
{ licznik1--;
kierunek = 1; } // lewo
}
//INT1 interrupt
ISR(INT1_vect )
{
if(bit_is_set(PIND, PD2))
{ licznik1++;
kierunek = 0; }
if(bit_is_clear(PIND,PD2))
{ licznik1--;
kierunek = 1; }
}
Jest to algorytm podwójnego dekodowania, gdzie INT0 wyzwalane jest zboczem opadającym a INT1 zboczem narastającym. Dodam jeszcze, że enkoder generuje 200 imp/obr a silnik obraca się maksymalnie z prędkością 3100 rpm czyli około 500 obr/sek co daje w przybliżeniu częstotliwość impulsu 10kHz. Wydaje mi się, że jeśli procesor jest taktowany czestotliwoscia 16MHz to na spokojnie te sygnały powinny być odczytywane, ale sie tak nie dzieje. Przy dużych predkosciach silnika w przerwanich wykonują sie zle warunki tzn pomimo że silnik obraca sie w prawo, algorytm raz na jakis czas wysyła sygnał, że silnik obraca sie w lewo. Czy jest to wina tego, że procesor nie wyrabia się z wykonaniem przerwania czy po prostu enkoder generuje czasem zle sygnały? Z góry dzieki za pomoc.