logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C] Debounce na INT0 - podwójne zliczanie

elonica 02 Sty 2010 19:34 1299 1
REKLAMA
  • #1 7473991
    elonica
    Poziom 12  
    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
    
    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--;
    }
    
  • REKLAMA
REKLAMA