W akcie desperacji zwracam się do Was z problemem, nad którym siedzę już dosyć długo.
Muszę zmierzyć prędkości obrotową obracającego się koła. Koło może obracać się w dwóch kierunkach. Jednocześnie muszę zmierzyć drogę, jaką pokonało - coś w stylu "jojo".
Całość zbudowana jest na Atmega32, kwarc 16000000, uart i parę innych bzdetów takich jak LCD 16x2. Do obsługi enkodera (rozdzielczość 1600 imp na obrót) wykorzystuje przerwanie INT0.
Obsługa enkodera:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i to działa bez problemu - nie myli się nawet przy dużej prędkości koła.
Do odmierzania czasu wykorzystuję Timer1 (prescaler 64, i ICR1 = 249 tryb CTC). "Próbkuję" co 100ms - do takich założeń muszę się dostosować... (timer programowy z kodów Kolegi Mirka - kurcze jak prawie 90% innych kodów których używam).
Problem jest w monecie pomiaru prędkości obrotowej koła.
Niby proste - w przerwaniu enkodera inkrementujemy zmienną i resetujemy ja co 100ms, ale niestety nie jest tak słodko.
W momencie, w którym pojawia się przerwanie od enkodera, wstrzymywane jest przerwanie od Timera1 i wyniki sypia się...
Próbowałem kodów do obsługi enkodera z Forum i umieszczałem je w jednym przerwaniu "globalnym" (sprawdzałem stan enkodera nawet z częstotliwością ok 50kHz - wtedy uart poszedł w krzaki), ale niestety gubił kroki. Próbowałem też, liczyć czas, między jednym przerwaniem enkodera a drugim i też lipa. W kodzie nie ma ani jednego "delay..."
Czy jest jakiś inny sposób na obliczanie prędkości ew. obsługę w jednym przerwaniu?