Napisalem sobie funkcje, ktorej zadaniem jest wystawienie na PIN_OUT ustalonego sygnalu wejscioweo (w przykladzie ponizej jest to pin 3 portu A ustalony przez 100ms).
Funkcja jest wywolywana w glownej petli programu co 1ms, zwraca stabilny stan (0 lub 1) jezeli wewnetrzny licznik (zmienna static) zliczy zadana wartosc, np. 100). Wszystko dziala tak jak powinno, pytanie moje brzmi: czy jest mozliwe w ANSI C aby jedna funkcja - ta wlasnie debounce() - byla wywolywana w programie kilka razy z roznymi argumentami i zeby dzialala na trzech osobnych zestawach zestawach parametrow wewnetrznych. Inaczej mowiac: chce ta funkcja sprawdzac 3 rozne piny wejsciowe i wystawiac stabilny stan na 3 innych pinach wyjsciowych, czyli:
Poniewaz funkcje te wywolywane sa co milisekunde i kazde z tych wywolan zmienia wewnetrzne liczniki funkcji, sposob ten nie bedzie dzialal prawidlowo, Czy jedynym sposobem jest stworzenie trzech identycznych, lecz osobnych funkcji robiacych tak naprawde to samo, czyli powiedzmy debounce1(), debounce2() i debounce3()? Czy istnieje jakis sposob by powiedziec kompilatorowi, ze moje 3 wywolania maja odnosic sie do trzech roznych zestawow zmiennych wewnetrznych funkcji?
Sama funkcja wyglada tak:
BF
while(1){
...
PIN_OUT = debounce(&PORTA,3, 100);
...
}Funkcja jest wywolywana w glownej petli programu co 1ms, zwraca stabilny stan (0 lub 1) jezeli wewnetrzny licznik (zmienna static) zliczy zadana wartosc, np. 100). Wszystko dziala tak jak powinno, pytanie moje brzmi: czy jest mozliwe w ANSI C aby jedna funkcja - ta wlasnie debounce() - byla wywolywana w programie kilka razy z roznymi argumentami i zeby dzialala na trzech osobnych zestawach zestawach parametrow wewnetrznych. Inaczej mowiac: chce ta funkcja sprawdzac 3 rozne piny wejsciowe i wystawiac stabilny stan na 3 innych pinach wyjsciowych, czyli:
PIN_OUT_1 = debounce(&PORTA,3, 100);
PIN_OUT_2 = debounce(&PORTA,4, 100);
PIN_OUT_3 = debounce(&PORTA,5, 100);Poniewaz funkcje te wywolywane sa co milisekunde i kazde z tych wywolan zmienia wewnetrzne liczniki funkcji, sposob ten nie bedzie dzialal prawidlowo, Czy jedynym sposobem jest stworzenie trzech identycznych, lecz osobnych funkcji robiacych tak naprawde to samo, czyli powiedzmy debounce1(), debounce2() i debounce3()? Czy istnieje jakis sposob by powiedziec kompilatorowi, ze moje 3 wywolania maja odnosic sie do trzech roznych zestawow zmiennych wewnetrznych funkcji?
Sama funkcja wyglada tak:
unsigned char debounce2(volatile unsigned char *PORT, unsigned char pin, unsigned int cycles){
static unsigned int cnt;
static unsigned char OUT;
if (OUT==0){
cnt = check_bit(*PORT, pin) ? (cnt + 1) : 0 ;
if (cnt > cycles) { cnt = 0; OUT = 1;}
}
else {
cnt = check_bit(*PORT, pin) ? 0 : (cnt + 1);
if (cnt > cycles) { cnt = 0; OUT = 0; }
}
return OUT;
}BF