2015-04-20 34 views
5

Mam kod od mojego studenta, który niedawno zaczął z arduino.Arduino AttachInterrupt() wydaje się działać dwukrotnie

Próbował wykonać przerwę i to działało. Chodziło o to, że uruchomił się dwa razy (funkcja, którą nazwał), więc booleans zostały zresetowane.

Próbowałem znaleźć odpowiedzi, ale nie mogłem znaleźć żadnych, więc oto jestem.

Proszę, pomóż mi.

boolean state = 1 ; 
void setup() 

{ 
pinMode (2 , INPUT); 
pinMode (8 , OUTPUT); 
Serial.begin(38400);   
attachInterrupt(0 , ngt, RISING); 


} 


void loop() 

{ 

Serial.println (digitalRead(2)); 
digitalWrite (8 , state); 
delay(50); 

} 

void ngt() 
{ 

state = !state ; 


} 
+0

Co jest przerwane przez Arduino? Czy używasz przycisku? Dowolny czujnik? – eventHandler

+0

Tak dokładnie konfiguracja rozwijana przycisku fikcji –

Odpowiedz

8

Problem masz dlatego przycisk usterki produkuje wiele przerwań na każdym naciśnięciu przycisku. Możesz znaleźć dobry opis i sposób jego rozwiązania za pomocą sprzętu here.

Pozwól mi wyjaśnić, po naciśnięciu przycisku, kontakt mechaniczny będzie miał stan przejściowy, w którym będzie wahać się ON-OFF przez krótki okres czasu. Ten sam efekt może się zdarzyć po zwolnieniu przycisku.

Jednym ze sposobów rozwiązania tego problemu jest użycie kondensatora równolegle do obciążenia. Innym "łatwiejszym" sposobem byłoby oprogramowanie. Chodzi o to, aby ustawić ustalony arbitralny czas, w którym nie dopuszczasz nowych przerwań. Możesz użyć biblioteki millis() lub micros(), aby ustawić tę godzinę. Kod wyglądałby mniej więcej tak.

unsigned long lastInterrupt; 

void ngt() 
{ 

    if(millis() - lastInterrupt > 10) // we set a 10ms no-interrupts window 
    {  

    state = !state; 

    lastInterrupt = millis(); 

    } 
} 

W ten sposób nie przetwarza się nowych przerwań do upływu 10 ms.

Uwaga: dostosuj czas do swoich wymagań.

+0

ta odpowiedź jest w rzeczywistości o wiele bardziej upvotes niż to, co jest podane. Chociaż wydaje się to banalne i ludzie z doświadczeniem po prostu to wiedzą, ale w rzeczywistości nie jest łatwo dowiedzieć się, kiedy pierwszy raz się z tym zmierzysz. Szczególnie jeśli masz już doświadczenie w układach i Arduino, ale nigdy nie próbowałeś używać przełączników z szybkimi reakcjami, takimi jak przerywniki. – himura

+0

ta odpowiedź była bardzo pomocna. rozwiązał problem dla mnie! –