Mikrokontrolery AVR XMEGA w praktyce, część 16. Enkoder obrotowy
// konfiguracja systemu zdarzeń
EVSYS.CH0MUX = EVSYS_CHMUX_PORTC_PIN0_gc; // pin C0 wywołuje zdarzenie
EVSYS.CH0CTRL = EVSYS_QDEN_bm| // włączenie dekodera w systemie zdarzeń
EVSYS_DIGFILT_8SAMPLES_gc; // filtr cyfrowy
Dekoder kwadraturowy jest nadajnikiem zdarzenia, a odbiornikiem musi być timer, który będzie zliczał odebrane impulsy. Wykorzystajmy do tego celu timer C0. W rejestrze CTRLA, jak pamiętamy z odcinka o timerach w XMEGA, musimy w nim zdefiniować źródło sygnału taktującego. Jest nim oczywiście kanał 0 systemu zdarzeń. W rejestrze CTRLD musimy tak skonfigurować timer, by był w stanie poprawnie odbierać impulsy z dekodera. W szczególności jest to ważne, by timer wiedział kiedy ma zwiększyć swoją wartość, a kiedy zmniejszyć, w zależności od kierunku obrotu enkodera.
// konfiguracja timera
TCC0.CTRLA = TC_CLKSEL_EVCH0_gc; // taktowanie zegarem 2MHz
TCC0.CTRLD = TC_EVACT_QDEC_gc | // włączenie dekodera kwadraturowego
TC_EVSEL_CH0_gc; // dekoder zlicza impulsy z kanału 0
I to wszystko! Wystarczy teraz dopisać prostą procedurę pokazującą stan licznika na wyświetlaczu LCD. Pamiętać trzeba, że pojedynczy impuls enkodera powoduje zwiększenie lub zmniejszenie wartości timera o 4 – dlatego przed wyświetleniem wartości rejestru TCC0.CNT, musimy ją podzielić najpierw podzielić przez 4.
#define F_CPU 2000000UL
#include <avr/io.h>
#include <util/delay.h>
#include "hd44780.h"
int main(void) {
// wejścia enkodera
PORTCFG.MPCMASK = 0b00000011; // wybór pinów 0 i 1 do konfiguracji
PORTC.PIN0CTRL = PORT_ISC_LEVEL_gc | // reagowanie na poziom niski
PORT_OPC_PULLUP_gc; // podciągnięcie do zasilania
// konfiguracja systemu zdarzeń
EVSYS.CH0MUX = EVSYS_CHMUX_PORTC_PIN0_gc; // pin C0 wywołuje zdarzenie
EVSYS.CH0CTRL = EVSYS_QDEN_bm| // włączenie dekodera w systemie zdarzeń
EVSYS_DIGFILT_8SAMPLES_gc; // filtr cyfrowy
// konfiguracja timera
TCC0.CTRLA = TC_CLKSEL_EVCH0_gc; // taktowanie systemem zdarzeń
TCC0.CTRLD = TC_EVACT_QDEC_gc | // włączenie dekodera kwadraturowego
TC_EVSEL_CH0_gc; // dekoder zlicza impulsy z kanału 0
// wyświetlacz
LcdInit();
while(1) {
// wyświetlenie aktualnej wartości licznika CNT
// CNT = ...
LcdClear();
Lcd("CNT = ");
LcdDec(TCC0.CNT / 4); // jeden przeskok to 4 impulsy
_delay_ms(100); // czekanie 100ms
}
}
Dominik Leon Bieczyński


Jak kompletować zamówienie w hurtowni elektrotechnicznej przed remontem?
Od wzmacniacza nieodwracającego do integratora i wzmacniacza ładunkowego, czyli historia z zaskakującą pointą jak w dobrym kryminale
Green czy smart? Jak decyzje ESG zaczynają optymalizować procesy produkcyjne 

![https://www.youtube.com/watch?v=BgxJVTwYJ-s Zapraszamy do obejrzenia filmu i wysłuchania krótkich wypowiedzi prelegentów Hardware Forum 2026 i organizatorów majowej konferencji dla inżynierów z branży elektronicznej: Konrad Bruliński z Lemontech, prof. Krzysztof Kulpa z Politechniki Warszawskiej, Zbigniew Huber z FLC, Ewa Załupska z firmy KROK, Jerzy Kozieł z MPTECH, Grzegorz Potyralski z VIGO Photonics, dr Krzysztof Czuba z Politechniki Warszawskiej, Anna Beata Kalisz Hedegaard z Quantum Security Defence, Adrian Cichosz z Elhurt Dystrybucja Anna Kamińska z Creotech Quantum, oraz Łukasz Jaeszke i Adam Jaeszke z TEK.day [materiał redakcyjny]](https://mikrokontroler.pl/wp-content/uploads/2026/05/tytulowe-film-1.png)


