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

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

Ответ:

Отправлено 1111 01 ноября 2007 г. 12:14
В ответ на: Подскажите какой нибудь алгорим для защиты от дребезга кнопки (программно) отправлено <font color=gray>Aleksei </font> 01 ноября 2007 г. 12:03


//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Входы
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void Inputs_Processor(void/*u8_t* sel_port, u8_t sel_pin*/)
{
unsigned char i;
unsigned char tmp;

//*sel_port &= ~(1 << sel_pin);

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) != ((DIG_IN_PIN & (1 << (DIG_IN_1 + i))) == 0))
{
if((DIG_IN_PIN & (1 << (DIG_IN_1 + 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) != ((DIG_IN_PIN & (1 << (DIG_IN_1 + i))) == 0))
{
if((DIG_IN_PIN & (1 << (DIG_IN_1 + 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) != ((DIG_IN_PIN & (1 << (DIG_IN_1 + i))) == 0))
{
//Запомним новое значение
if((DIG_IN_PIN & (1 << (DIG_IN_1 + 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);

//*sel_port |= (1 << sel_pin);
}



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

Ответы


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

Сообщение:

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

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

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

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