метод по прерыванию переполнения таймера и определения направления счёта работает стабильно, но глючно, прерывания всё-же в нуле может быть очень много, может завалить МК и разрушить связь
Не пробовал проставить максимальный приоритет срабатывания?
Программирование ATMEL в BASCOM. |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » Программирование ATMEL в BASCOM. » Примеры применения Xmega в среде Баском » atXmega - Quadrature Decoder Channels
метод по прерыванию переполнения таймера и определения направления счёта работает стабильно, но глючно, прерывания всё-же в нуле может быть очень много, может завалить МК и разрушить связь
Не пробовал проставить максимальный приоритет срабатывания?
прерывания всё-же в нуле может быть очень много, может завалить МК
Теоретически такое может быть.
Возможно стоит подумать о внешнем контроллере энкодера, если не найдется другого решения.
Код:B = Low(tcc1_cnt) Bitch = Bitch + B Printbin #1 , B B = High(tcc1_cnt)
Между Low и High пройдет некоторое время, за которое содержимое счетчика может измениться. Лучше скопировать счетчик таймера в переменную после чего передавать данные.
X = tcc1_cnt
B = Low(X)
Bitch = Bitch + B
Printbin #1 , B
B = High(X)Да и такой вывод решается как обычно через оверлей или вообще напрямую из регистра брать. Нужно вообще забыть про этот анархизм (low/high).
Кстати говоря, можно ещё активировать буфер вывода print-а (в настройках), а то на время вывода может начать пропускать значения.
Отредактировано RDW (2017-11-30 14:38:00)
В BascomAvr почему-то не дают доступ к верхнему и нижнему регистру таймера, тут без вариантов через Low и High.
In the 32-bit counting mode, the subtraction does not work in the quadrature encoder.
Про доступ в баском к регистрам - этого не может быть. Фантастика.) Либо читаешь не тот адрес (напрямую), либо если через имена таймеров - возможно опять глюки конфига файла кристалла/проекта.
Я там в твоей теме отписал, может поможет, поглядим..
Ev3658, там чел желает видеть твой код на таймере2 для энкодера).
Ev3658, там чел желает видеть твой код на таймере2 для энкодера).
Я его выкладывал там. Сам косяк, надо было на картинке те Timer 1, а Timer №1 или Timer CCD0 CCF1 и т.д.
Ох... неужели настолько сложный языковый барьер или действительно очень мало людей полезли в квадратурную дешифрацию Xmega, а ведь ещё как-то надо понять как сбрасывать счётчик по индексной метке (QNDIX).
Видимо XMega при наращивании разрядности не поддерживает направление счета у второго таймера. Похожая ситуация http://www.avrfreaks.net/forum/atxbanned … pare-match
Решение программно-аппаратное с использованием прерываний.
Тогда остаётся понять как работает QDIx, как-то можно сбросить счёт по третьему импульсу энкодера, это необходимо если нужно знать абсолютный ноль без погрешностей.
Да, попробуй поиграться с событиями: https://wiki.mcselec.com/bavr/index.php … setlang=en
Там вроде бы не так много комбинаций.
Да, попробуй поиграться с событиями: https://wiki.mcselec.com/bavr/index.php … setlang=en
Там вроде бы не так много комбинаций.
Да и так всё ясно. При наличии сигнала по нулевой метке энкодера в QdirmX выбираем квадратурное совпадение.
То-есть нулевая метка может быть несколько раз и нам из нескольких раз надо выбрать подходящее под квадратуру - так повышается точность метки.
Но как зацепить это событие, чтоб хотя-бы вызвать прерывание или как-то обнулить таймер и опять прерывание.
Теоретически это возможно через регистр таймера TCCx_ERR, но оно срабатывает постоянно как и TCCx_OVF.
Прям дикость какае-то, неужели Atmel не продумали аппаратный механизм для этих целей.
Ещё не понял один параметр в конфигурации таймера: RESOLUTION = SPLIT - типа он для будущего или уже как-то для реализации 32bit?
RESOLUTION | Valid options : NORMAL, BYTE, SPLIT. Timer resolution is 16 by default (NORMAL). A value of BYTE will set the timer to 8 bit resolution. SPLIT is reserved for future use.(cascading 32 bit timers ). When WG mode TIMER2 is chosen, the timer will be set into BYTE mode automatically. |
Отредактировано Ev3658 (2017-12-04 15:22:03)
RESOLUTION именно для выбора режима работы таймеров (каскадное и насколько (разрядность).
А ты вот этот документик не читал?
Ещё, не пробовал таймер2 заменить на другие таймеры? Вообще поиграться с другими 3 > 4 и т.д.
Вы здесь » Программирование ATMEL в BASCOM. » Примеры применения Xmega в среде Баском » atXmega - Quadrature Decoder Channels