Пытаюсь нарулить на ассемблере код обработки энкодера, оно вроде функционирует, но с большими глюками.
Вкратце: энкодер подключен к D1, D2. 4 светодиода подключены к PC0-PC3 (первые 2 подключены к -, вторые - к плюсу; так сделано на отладочной плате), поэтому в регистре перед выводом в порт инвертируются 2 последних бита с помощью. EOR.
Задача программы: при повороте вправо увеличиваем счетчик (если насчитываем 15, то ничего не делаем) и выводим в PortC. При движении влево уменьшаем счетчик (при достижении 0 ничего не делаем). Задержка по переполнению Таймера0 (с делителем 256 получается 16 мс при 4 МГц).
Дело не в дребезге, посмотрел осциллографом - фронты почти идеальные. Пробовал уменьшать/увеличивать величину задержки - не помогает.
При быстром вращении глючит (моргают ненужные светодиоды), при вращении назад ситуация такая же плюс вообще начинает инкременировать счетчик если быстро крутить.
Алгоритм:
Зашли в обработчик INT0
Запретили локально INT0
Пощупали второй канал
+1 или -1 (если 1, то проверяем счетчик на равенство 0b00001111, если равно, то выходим из прерывания, если нет, то увеличиваем счетчик; если 0, то проверяем счетчик на 0b00000000, если равно, то выходим, если нет, то уменьшаем на 1)
Запускаем Т0 с предделителем 256
Вышли из обработчика
вошли в обработчик прерывания Т0.
останавливаем таймер
разрешаем INT0
выходим из прерывания
Прерывание запрещаем сразу после входа в процедуру обработки прерывания.
Пробовал сбрасывать флаги внешних прерываний и в обработчике INT0, и в обработчике таймера перед разрешением INT0. Не помогает.
В аттаче проект студии.
- Вложения
-
- encoder_test.zip
- (7.27 КБ) 288 скачиваний


