Witam.
Dziś biblioteka do obsługi enkodera obrotowego. Znów uniwersalna (inicjalizacja i odczyt sprzętu po stronie użytkownika). Możliwości biblioteki:
- Nieblokująca.
- Reakcja na zdarzenia z enkodera (użytkownik musi zdefiniować).
- Obsługa przycisku enkodera z rozróżnieniem długości wciśnięcia - 3 poziomy.
Poniżej kod.
encoder.h:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
encoder.c:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Przykład znów dla Atmega2560.
main.h:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
main.c:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Timer wywołuje przerwanie co 1 ms dla F_CPU 16000000UL. Dla innego zegara MCU trzeba policzyć na nowo.
Proszę o niekopiowanie kodu w innych miejscach bez mojej zgody. Kod udostępniam do użytku niekomercyjnego.
Jak ktoś ma uwagi z chęcią się zastosuję do nich.
EDYTA1:
Zmiany w kodzie:
- Dodałem możliwość wyłączenia obsługi przycisku przez bibliotekę.
- Dodałem obsługę podzielnika impulsów enkodera. Moje wszystkie enkodery pomiędzy stabilnymi pozycjami dają po 4 impulsy.
- Podzieliłem funkcję encPool na kilka aby poprawić czytelność kodu.
EDYTA2:
Kolejne zmiany w kodzie:
- Poprawiłem funkcje odczytu kierunku obrotu enkodera (działała odwrotnie, bo miałem odwrotnie podłączony enkoder).
- Dodano więcej komentarzy w kodzie.
- Trochę optymalizacji w celu zmniejszenia kodu wynikowego - każdy bajt w AVR się liczy
- Zmiana działania bardzo długiego wciśnięcia przycisku - teraz reaguje dopiero po puszczeniu.
- Bardziej restrykcyjne przekazywanie zmiennych do funkcji (również callback). Dodałem const wszędzie gdzie funkcja nie powinna zmieniać wartości ani wskaźnika.
- Małe zmiany w kodzie w main.c.