Проблема с опросом энкодера на внешних прерываниях
Вложений: 1
Такая тема уже была кажется, но с такой проблемой вроде никто не сталкивался. Задание следующее:Отобразить номер своего варианта на ЖКИ индикатор с возможностью
изменения значения энкодером в большую (до 999) или меньшую сторону. Опрос энкодера реализовать на внешних прерываниях. Вот код: Вложение 286909 Алгоритм стандартный, но при повороте ручки энкодера влево-вправо он либо в обе стороны прибавляет, либо в обе стороны отнимает. В чем может быть дело? |
Скажите, а зачем там вообще таймер?
Вы разрешили прерывание по спаду INT0, объявили обработчик - что еще надо? Флаг прерывания сам сбросится при входе в обработчик. Или же у вас дребезг контактов? Но тогда лучше вообще все по таймеру, а внешнее прерывание запретить. Читать по таймеру, сравнивать с предыдущим. |
Недавно боролся с похожей проблемой. Поборол. Суть в следующем.При инициализации:1. Привязываем прерывание к срезу импульса на выходе А энкодера.Обработчик прерываний:1. Запрещает прерывания.2. Взводит глобальный флаг.Основной код программы:1. Если взведен флаг, выполняем последующий код, иначе - пропускаем.2. Задержка 3 мс для завершения возможного переходного процесса.3. Читаем выход А энкодера. Если высокий - прерывание ложное, сбрасываем глобальный флаг, разрешаем прерывания, пропуск последующего кода.4. Читаем выход В энкодера - если высокий, добавляем нужную величину, низкий - убавляем и т.д., вобщем стандартный вариант. Перед завершением обработки сбрасываем глобальный флаг и разрешаем прерывания
Выше предложенный алгоритм заработал, однако программа работает не оптимально: иногда при повороте энкодера возникает осечка, либо прибавляет/отнимает 2, вместо 1. Пробовал перебрать частоту тиков таймера, ничего не помогает. Код:
#include "hd44780.h" |
|
Часовой пояс GMT +4, время: 15:26. |
Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.