Вот код Bascom, позволяющий организовать 16 битный квадратурный счёт:
Настраиваем входы:
Код:
Config Pina.0 = Input 'A
Config Pina.1 = Input 'B
Определяем событие входов по падению сигнала:
Код:
Config Xpin = Pina.0 , Sense = Rising
Config Xpin = Pina.1 , Sense = Rising
Берём канал события поддерживающий QDEC- это 0,2,4, к примеру канал события №0:
Код:
Config Event_system = Dummy , Mux0 = Porta.0 , Qd0 = Enabled , Digflt0 = 2
Обратите внимание на выбор пина порта, надо выбрать первым по порядку пин, на 1 порт можно повесить точно два энкодера (0,1 - А и В энкодера 1 и 4,5- А и В энкодера 2). Так-же параметр Digflt (фильтр) лучше не ставить 1, считать не будет.
Таймер конфигурируем любой свободный, в Xmega A3 их 7 штук.
Код:
Config Tcc1 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec
Чтоб ограничить счёт для таймера, записываем нужное значение в его регистра Tcxx_PER так:
Значение энкодера можно выдрать из регистра Tcxx_CNT:
Код:
DIM EN1 As Word
..
..
..
En1= Tcc1_CNT
Вот, что у нас получилось:
Код:
Config Pina.0 = Input 'A
Config Pina.1 = Input 'B
Config Xpin = Pina.0 , Sense = Rising
Config Xpin = Pina.1 , Sense = Rising
Config Event_system = Dummy , Mux0 = Porta.0 , Qd0 = Enabled , Digflt0 = 2
Config Tcc1 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec
Tcc1_per = 9999
Do
Print Tcc1_cnt
Waitms 300
Loop

Но и тут мы не на коне
16 бит счёта - это мало, минимум бы 24, а лучше 32.
Аппаратно расширить счёт можно, но нигде и никто не может подсказать как это сделать так, чтоб второй таймер считал не только в плюс, но и в минус.
Так-же неизвестно как работать с QDIRM, а без него никак, ведь надо знать эталонное начало счёта.
По поводу расширения счёта таймера, делается это тоже через канал события. Берём к примеру канал №1 и настраиваем событие на переполнения таймера который подсчитывает квадратурную дешифрацию:
Код:
Config Event_system = Dummy , Mux1 = Tcс1_ovf
После берём любой свободный таймер и указываем ему такты и событие от канала события:
Код:
Config Tce1 = Normal , Prescale = E1 , Event_source = E1
Всё, готово, таймер Tce1 будет считать но к сожалению убавлять он не будет - может кто подскажет по этому поводу.

А, да, если чего, первый таймер по которому будет расширятся второй таймер, там предусмотрена задержка сигнала, это для того, чтоб второй таймер успел среагировать, задержку можно включить так (Event_delay = Enabled) :
Код:
Config Tcc1 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec , Event_delay = Enabled
По поводу Qdirm и

коня.
Подскажите, как сбросить счёт по Qdirm?
Код:
Config Porta.3 = Input 'A
Config Porta.4 = Input 'B
Config Porta.5 = Input 'Z
Config Xpin = Porta.3 , Sense = Rising
Config Xpin = Porta.4 , Sense = Rising
Config Xpin = Porta.5 , Sense = Both
Config Event_system = Dummy , Mux0 = Porta.0 , Qd0 = Enabled , Qdi0 = Enabled , Qdirm0 = 1 , Digflt0 = 2
Config Tcc1 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec , Event_delay = Enabled
Подведём итог:
Плюсы: Считать квадратурные импульсы оказывается легко, скорость счёта очень быстрая и без ошибочная.
Минусы: Неизвестно как раширить двунаправленный счёт до 32 бит, неизвестно как работать с QDIx.