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

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

По поводу антидребезга. Вот мой монструозный код, который в фоне контролирует и антидребезг и отпускание..

Отправлено 1111 20 августа 2009, г. 10:12
В ответ на: Ответ: + отправлено пользователем Харизмат 20 августа 2009, г. 10:01


<code>
#define DIG_INPUT_DEBOUNCE_TIME (0.05*(1000ul/SYSTEM_TICK))

typedef struct dig_inputs_data
{
u8_t state;
u8_t tmp_state;
u8_t debounce_timeout;
u8_t hold;
u8_t debounce_timer[DIG_INPUTS_NUMBER];
}dig_inputs_t;

//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Коррекция таймеров
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void Correct_Inputs_Timers(void)
{
u8_t i;

i = 0;
do
{
if(dig_inputs.debounce_timer[i] != 0) dig_inputs.debounce_timer[i]--;
i++;
}while(i<DIG_INPUTS_NUMBER);
}

//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Входы
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void Inputs_Processor(void)
{
unsigned char i;
unsigned char tmp;

i = 0;
do
{
//Если таймер антидребезга пустой
if(dig_inputs.debounce_timer[i] == 0)
{
//Если процедура антидребезга не проводилась
if((dig_inputs.debounce_timeout & (1<<i)) == 0)
{
//Если значение на пине изменилось
tmp = dig_inputs.state;
if(((tmp & (1<<i)) == 0) != ((DIGIN_PIN & (1<<(DIN0 + i))) == 0))
{
if((DIGIN_PIN & (1<<(DIN0 + i))) != 0)
{
dig_inputs.tmp_state |= (1<<i);
}
else
{
dig_inputs.tmp_state &= ~(1<<i);
}

dig_inputs.debounce_timer[i] = DIG_INPUT_DEBOUNCE_TIME; //Запустим антидребезг
dig_inputs.debounce_timeout |= (1<<i);
}
}
else
{
//Если процедура антидребезга проводилась
//Если значение на пине снова изменилось
tmp = dig_inputs.tmp_state;
if(((tmp & (1<<i)) == 0) != ((DIGIN_PIN & (1<<(DIN0 + i))) == 0))
{
if((DIGIN_PIN & (1<<(DIN0 + i))) != 0)
{
dig_inputs.tmp_state |= (1<<i);
}
else
{
dig_inputs.tmp_state &= ~(1<<i);
}
dig_inputs.debounce_timer[i] = DIG_INPUT_DEBOUNCE_TIME; //Запустим антидребезг
}
else
{
//Если в теч. времени антидребезга значение на пине не менялось
//запомним новое значение
if(((dig_inputs.state & (1<<i)) == 0) != ((dig_inputs.tmp_state & (1<<i)) == 0))
{
if((dig_inputs.tmp_state & (1<<i)) != 0)
{
dig_inputs.state |= (1<<i);
}
else
{
dig_inputs.state &= ~(1<<i);
}
dig_inputs.hold &= ~(1<<i); //Сбросим флаг удержания
}
dig_inputs.debounce_timeout &= ~(1<<i);
}
}
}
else
{
//Если процедура антидребезга в процессе
//Если значение на пине снова изменилось
tmp = dig_inputs.tmp_state;
if(((tmp & (1<<i)) == 0) != ((DIGIN_PIN & (1<<(DIN0 + i))) == 0))
{
//Запомним новое значение
if((DIGIN_PIN & (1<<(DIN0 + i))) != 0)
{
dig_inputs.tmp_state |= (1<<i);
}
else
{
dig_inputs.tmp_state &= ~(1<<i);
}
dig_inputs.debounce_timer[i] = DIG_INPUT_DEBOUNCE_TIME; //Перезарядим таймер антидребезга
}
}
i++;
}while(i<DIG_INPUTS_NUMBER);
}
</code>


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

Ответы


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

Сообщение:

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

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 47:

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

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