Witam,
chciałem podłączyć pod ATmegę 4 enkodery z myszek PC. Znalazłem taki kod w sieci:
Kod wygląda ok.Problem stanowi dla mnie to, że oprócz obsługi tych enkoderów uP będzie miał robić jeszcze masę innych rzeczy. Dlatego pomyślałem, żeby obsługę enkoderów zrobić w przerwaniu zewnętrznym. Tylko jak to zrobić dla 4 enkoderów? Osobiście wymyśliłem coś takiego i chciałem zapytać czy to ma szanse zadziałać:
-podłączam wszystkie sygnały z enkoderów do sumatora, a jego wyjście pod PIN od wyzwalania przerwania zewnętrznego,
-konfiguruje przerwanie, żeby wyzwalała je zmiana stanu na tym pinie,
-wyprowadzenia z enkoderów podłączam też do multipleksera,
-i w obsłudze przerwania po kolei wybieram multiplekserem enkodery i używam tej funkcji co wyżej wrzuciłem "encoder(void)", dzięki temu wiem, który enkoder działa oraz w którą stronę był ruch.
Mam wątpliwości czy czasowo się wyrobię- czy np jeżeli będzie to ostatni enkoder to czy zdążę odczytać info czy już przestanie wysyłać te sygnały przesunięte w fazie.
Zależy mi na szybkim zareagowaniu na te enkodery. Czy to co wymyśliłem ma szanse zadziałać, a może ktoś z Forumowiczów ma lepszy pomysł. Czekam na propozycje i sugestie.
chciałem podłączyć pod ATmegę 4 enkodery z myszek PC. Znalazłem taki kod w sieci:
*
* ENCODER - Checks rotary encoder and returns the following:
*
* 0: no movement
* -1: ccw rotation
* 1: cw rotation
*
*------------------------------------------------------------------------*/
signed char
encoder(void)
{
static unsigned char a, b;
if (!a & !b) {
if (ENC_A) {
a = ENC_A;
return (-1);
}
if (ENC_B) {
b = ENC_B;
return (1);
}
}
if (a & !b) {
if (!ENC_A) {
a = ENC_A;
return (1);
}
if (ENC_B) {
b = ENC_B;
return (-1);
}
}
if (a & b) {
if (!ENC_A) {
a = ENC_A;
return (-1);
}
if (!ENC_B) {
b = ENC_B;
return (1);
}
}
if (!a & b) {
if (ENC_A) {
a = ENC_A;
return (1);
}
if (!ENC_B) {
b = ENC_B;
return (-1);
}
}
return (0);
}
Kod wygląda ok.Problem stanowi dla mnie to, że oprócz obsługi tych enkoderów uP będzie miał robić jeszcze masę innych rzeczy. Dlatego pomyślałem, żeby obsługę enkoderów zrobić w przerwaniu zewnętrznym. Tylko jak to zrobić dla 4 enkoderów? Osobiście wymyśliłem coś takiego i chciałem zapytać czy to ma szanse zadziałać:
-podłączam wszystkie sygnały z enkoderów do sumatora, a jego wyjście pod PIN od wyzwalania przerwania zewnętrznego,
-konfiguruje przerwanie, żeby wyzwalała je zmiana stanu na tym pinie,
-wyprowadzenia z enkoderów podłączam też do multipleksera,
-i w obsłudze przerwania po kolei wybieram multiplekserem enkodery i używam tej funkcji co wyżej wrzuciłem "encoder(void)", dzięki temu wiem, który enkoder działa oraz w którą stronę był ruch.
Mam wątpliwości czy czasowo się wyrobię- czy np jeżeli będzie to ostatni enkoder to czy zdążę odczytać info czy już przestanie wysyłać te sygnały przesunięte w fazie.
Zależy mi na szybkim zareagowaniu na te enkodery. Czy to co wymyśliłem ma szanse zadziałać, a może ktoś z Forumowiczów ma lepszy pomysł. Czekam na propozycje i sugestie.