No więc jak to się robi?
Kluczem jest właściwe oprogramowanie pinu GPIO na który podajemy zliczane impulsy.
Korzystając z funkcji biblioteki wiringPi programujemy wybrany przez nas pin jako wejściowy:
pinMode(28, INPUT);
I programujemy przerwania. W chwili zmiany stanu sygnału na tym pinie wygenerowane zostanie przerwanie, które zostanie obsłużone przez wskazaną procedurę, w tym przypadku int_impuls.
Przerwanie może zostać wygenerowane przy opadającym zboczu sygnału, jak w tym przykładzie, przy narastającym (INT_EDGE_RISING), lub narastającym i opadającym (INT_EDGE_BOTH).
wiringPiISR (28, INT_EDGE_FALLING, &int_impuls);
Jeśli źródłem impulsów jest mechaniczny wyłącznik lub czujnik z wyjściem otwarty kolektor włączamy opornik zwierający pin z napięciem zasilającym. W naszym przykładzie linia ta opatrzona jest komentarzem, bo źródłem impulsów będzie inny pin GPIO:
// pullUpDnControl (28, PUD_UP) ;
Procedura obsługująca przerwania w naszym przypadku jest prosta, po każdym przerwaniu zwieksza o jeden wartość zmiennej globalnej impulsow i co dziesięć impulsów wyświetla aktualny jej stan, tak żeby nam się nie nudziło podczas eksperymentów:
int impulsow; void int_impuls(void) { impulsow++; if(impulsow%10 == 0) { printf ("Bieżący stan licznika: %d\r", impulsow); fflush(0); } }