Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Моя реализация:

Отправлено Леонид Иванович 16 сентября 2008 г. 13:39
В ответ на: Алгоритм работы с инкрементальным энкодером. отправлено dshabrov 16 сентября 2008 г. 13:10


//----------------------------------------------------------------------------

//Модуль поддержки энкодера

//Энкодер подключается к портам
//ENC_F1 (фаза 1) и ENC_F2 (фаза 2).
//Функция Encoder_Exe() вызывается в основном цикле.
//Результат обработки энкодера передается
//в модуль обработки клавиатуры через
//функцию Keyboard_SetCode.

//----------------------------------------------------------------------------

#include <Main.h>
#include <Encoder.h>
#include <Keyboard.h>

//----------------------------- Константы: -----------------------------------

#define ENCDEB 300 //encoder debounce delay, uS

#define EF1 0x01 //encoder F1 mask
#define EF2 0x02 //encoder F2 mask

//----------------------------- Переменные: ----------------------------------

static char EncPre; //предыдущее состояние энкодера

//-------------------------- Прототипы функций: ------------------------------

char Enc_Scan(void); //сканирование энкодера

//----------------------- Инициализация энкодера: ----------------------------

void Encoder_Init(void)
{
EncPre = Enc_Scan(); //сканируем энкодер и запоминаем состояние
}

//------------------------ Сканирование энкодера: ----------------------------

char Enc_Scan(void)
{
char n = 0;
if(Pin_ENC_F1) n |= EF1; //проверка линии F1
if(Pin_ENC_F2) n |= EF2; //проверка линии F2
return(n);
}

//-------------------------- Обработка энкодера: -----------------------------

void Encoder_Exe(void)
{
char EncTmp = Enc_Scan(); //сканируем энкодер и запоминаем результат
char EncChg = EncTmp ^ EncPre; //разница текущего и предыдущего значений
if(!EncChg) return; //ели нет изменений, выход

Delay_us(ENCDEB); //антидребезговая задержка для энкодера

char EncNew = Enc_Scan(); //сканируем энкодер еще раз
if(EncNew != EncTmp) return; //дребезг не закончился, выход
EncTmp = EncPre; //запоминаем предыдущее значение
EncPre = EncNew; //обновляем предыдущее значение

if(!(EncTmp & EF1) && (EncNew & EF1) && !(EncNew & EF2))
{ Keyboard_SetCode(ENC_DN); return; } //вращение против часовой стрелки
if((EncTmp & EF1) && !(EncNew & EF1) && !(EncNew & EF2))
{ Keyboard_SetCode(ENC_UP); return; } //вращение по часовой стрелке
}

//----------------------------------------------------------------------------


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
скольким Омам равен эквивалент двух резисторов по 10 Ом, соединённых параллельно?:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru