Wpis z mikrobloga

#mikrokontrolery #atmega #programowanie #elektronika

Mam problem tym razem z obsługą przycisku. Problem jest tej natury, że jedno przyciśnięcie czasami powoduje mi dwukrotne wywołanie przerwania (tak jakby pamiętał drganie styku).

ooo hehe idioto nie dodałeś funkcji opóźniającej i masz drgania styków beka z cb xD


Oczywiście że dodałem. Elementarz.

ooo zapomniałeś pewnie zdezaktywować to przerwanie. XD


Dezaktywuję przy każdym wywołaniu przerwania, aktywuję dopiero na samym końcu. Naciśnięcie przycisku jest bardzo krótkie. Wejście jest podciągnięte do logicznej jedynki (pull-up). Naciśnięcie przycisku zwiera do masy (bez rezystora). Przerwanie ustawione jest na opadające zbocze. Obsługa przerwania wygląda w następujący sposób:

// Obsługa przerwania przycisku

ISR(INT0_vect)

{

CLEAR(EIMSK, INT0); // dezaktywuj przerwanie

```TOGGLE(PORTRELAY, RELAY_OUT); // zmień stan wyjścia_delay_ms(500);SET(EIMSK, INT0); // aktywuj przerwaniesei();```

}

Programowany układ to ATmega128A.
  • 14
@bartoneczek: zwiększ czas czekania jeśli jeszcze tego nie robiłeś i zobacz czy nadal się tak zachowuje układ to może nada nam właściwy trop bo podejrzewam ze naciskasz on czeka te 500 ms i znowu zaskakuje bo trzymasz przycisk jeszcze ale to tylko dywagacje
Bardzo dziwnie wygląda twoja procedura obsługi przerwania - zwykle przerwania włącza się w funkcji głównej. Nie musisz deaktywować przerwania, wyrzuć CLEAR i SET, a sei() wrzuć do funkcji głównej. Niech zostanie tylko funkcja toggle(). Tak na przyszłość - w procedurze obsługi przerwania nie stosuje się opóźnień.
@Zdzichoslaw: spotkalem sie kiedys z problemem, ze uC pamietal przerwanie (np z drgan stykow) i wywolywal je po pierwszy skonczonym. Wtedy bodajze na avrfreaks poradzili mu za kazdym wywolaniem przerwanie, wylaczac to przerwanie.