Wpis z mikrobloga

Próbował ktoś kiedyś walczyć z przerwaniami w #arduino? Mam trochę kodu i nie mogę sobie poradzić z inkrementem zmiennej poprzez przerwanie. Funkcja licz() wywoływana przerwaniem czasami podbija mi licznik o 2, czasami o 1. Coś źle kombinuję?

volatile int licznik = 0;

int limit = 5;

void setup(void)

{

attachInterrupt(0, licz, RISING);

}

void loop(void)

{

if (licznik==limit)

{

//zapis do SD itp.

licznik = 0;

}

}

void licz()

{

licznik++;

}
  • 12
@Analityk: attachInterrupt(0, licz, RISING); - przerwanie nr 0, czyli wejście cyfrowe nr 2 na płytce arduino uno r3, wywołuje ISR "licz" przy zboczu narastającym, gdzie teoretycznie powinno inkrementować zmienną licznik o 1, a tak się nie zawsze dzieje, bo czasami dodaje 2.

To jest tylko wycinek kodu, ale w Arduino IDE się kompiluje.
@Analityk: Wywoła się dwa razy? Mógłbyś jaśniej? Wygląda na to że nie do końca rozumiem działanie przerwań. Wyzwalaczem będzie docelowo krótki impuls z licznika energii elektrycznej, a teraz testowo mam podłączony mikroswitch. Stan zmiennej sprawdzany jest w "loop" - główna funkcja w arduino.
@Analityk: pullup nie pomógł, ale jeszcze spróbuję z kondensatorem.

EDIT: zmieniłem też na wykrywanie zbocza opadającego, bo podłączyłem stan wysoki do przerwania, a mikroswitch rozłącza. Niestety też źle inkrementuje.
@Analityk: Wszystko działa, dzięki :). Do przerwania mam podłączony transoptor, więc kondensator nie był potrzebny, a pullup jest w arduino automatyczny jak się ustawi port jako wejście, chociaż dodałem też zewnętrzny :). Troszkę nowej wiedzy przyswojone :).