Witam,
Do INT0 ATmegi16 mam podłączone urządzenie dające impulsy - łączące masę. Dopisałem filtr na drganie styków, ale jedno rozwiązanie działa, a drugie nie. Wolałbym całkiem wyłączać przerwania tak jak w listingu 1, ale w tym przypadku po upłynięciu timeoutu przerwanie uruchamia się jeszcze raz. Czyli na każdy impuls na wejściu licznik zlicza dwa impulsy. Jeden na zboczu opadającym i drugi po upłynięciu timeoutu. Zna ktoś może wytłumaczenie ?
Listing 1.[Zlicza podwójnie] Wyłączenie obsługi przerwań przez czas timeoutu
Do INT0 ATmegi16 mam podłączone urządzenie dające impulsy - łączące masę. Dopisałem filtr na drganie styków, ale jedno rozwiązanie działa, a drugie nie. Wolałbym całkiem wyłączać przerwania tak jak w listingu 1, ale w tym przypadku po upłynięciu timeoutu przerwanie uruchamia się jeszcze raz. Czyli na każdy impuls na wejściu licznik zlicza dwa impulsy. Jeden na zboczu opadającym i drugi po upłynięciu timeoutu. Zna ktoś może wytłumaczenie ?
Listing 1.[Zlicza podwójnie] Wyłączenie obsługi przerwań przez czas timeoutu
SIGNAL(INT0_vect)
{
if(sensor_in.time_delay==0x00)
{
GICR &= ~_BV(INT0) ; //Wyłącz INT0
sensor_in.time_delay=150;
sensor_in.tick++;
}
}
SIGNAL(SIG_OVERFLOW0) //Timer Interrupt Vector
{
if (sensor_in.time_delay==0x01) GICR |= _BV(INT0); //włącz INT0
if (sensor_in.time_delay) sensor_in.time_delay--;
}
Listing 2.[Działa] Przerwanie działą, ale nie zliczam impulsu podczas timeoutu
SIGNAL(INT0_vect)
{
if(sensor_in.time_delay==0x00)
{
sensor_in.time_delay=150;
sensor_in.tick++;
}
}
SIGNAL(SIG_OVERFLOW0) //Timer Interrupt Vector
{
if(sensor_in.time_delay) sensor_in.time_delay--;
}