По поводу антидребезга. Вот мой монструозный код, который в фоне контролирует и антидребезг и отпускание..
Отправлено
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>