irbis12 napisał: Witam
Przepraszam was, że znów zatruwam życie, ale dzisiaj sprawdziłem jeszcze raz działanie przerobionego powyższego programu od Kuniarz i jest taki mały problem. Kiedy uC dostaje zmienny sygnał, wtedy jest dobrze, kiedy nie dostaje sygnału wgl, wtedy po ok 10 sek na ekranie ustawia się jedynka, czyli też jest dobrze, jednak kiedy dostaje ciągły sygnał (ramie ustawione w polu widzenia czujnika), to nic się nie dzieje, na ekranie 0 nie zmienia się na 1 czyli dla układu koło dalej się obraca. Bardzo bym prosił o pomoc jeszcze tylko w tym aspekcie.
Pozdrawiam
Nie jest łatwo interpretowac wyniki z konceptu czterech niezaleznych liczników.
Osobiście przjąłbym inny koncept .
Projekt ten jest w zasadzie prosty w realizacji, nie wymagający żadnych liczników i wielu innych zbędnych elementów wprowadzonych bez potrzeby.
Wyjaśnimy sobie pewne założenia: Masz w systemie cztery koła obracające się powiedzmy nawet z różną prędkością co jest tu bez większego znaczenia. Każde koło ma jakiś sensor wysyłajacy impulsy/ (sygnalizujący) podczas obrotu; -to wystarczy.
Głównym zadaniem jest wykrycie zablokowania któregoś z kół.
Po co ci więc liczenie obrotów? Ważne jest tylko obserwacja : ‘Czy koła się kręcą?’
Realizacja tego konceptu jest prosta.
W tym koncepcie, te wysyłane impulsy z kół nie będą zliczane do żadnych liczników, lecz tylko ‘obserwowane i rejestrowane w specyficzny sposób do tylko jednej zmiennej ‘wynik’ , którą póżniej byłoby łatwo interpretowac.
Specyfika tej rejestracji polegałaby na zróznicowaniu sygnałów z poszczególnych czujników. Każde koło rejestruje swój sygnał do zmiennej ‘wynik’ w odmienny unikalny sposób za pomoca swojego wskaźnika.
Dla przykładu:
czujnik Koła1 ma wskaźnik 1 – albo: &b0001
czujnik Koła2 ma wskaźnik 2 – albo: &b0010
czujnik Koła3 ma wskaźnik 4 – albo: &b0100
czujnik Koła4 ma wskaźnik 8 – albo: &b1000
Zarejestrowane wszystkie dają wartośc 15 – albo: &b1111
Do tego wykorzystaj dowolny interrupt; może to byc INT0, INT1 albo PCINT.
Wykorzystując na przykład INT0 bedzie wymagane podłaczenie wszystkich (4) sensorów do pinu PD.2 poprzez diody spełniające izolację ‘kanałów’, oraz funkcję „OR” ,oprócz podłaczenia ich do odpowiednich wejśc processora.
Wykorzystując natomiast PCINT, ta kombinacja z diodami nie jest wymagana lecz musiałbyś zmienic układ podłączeń sensorów do innych pinów. Programowo nie będzie zasadniczej różnicy. W tym processorze jest tylko jeden PCINT, na różnych pinach i process jego interpretacji jest analogiczny.
Kręcace koła wysyłają impulsy do pinu INT0 (w tym wypadku jest to stan niski), a takze wystawiaja stan niski na swoim porcie wejściowym.
W obsłudze interruptu odczytujesz który sensor spowodował interrupt i wykorzystujesz jego wskażnik do rejestracji tego impulsu do zmiennej wynik stosując operator „OR”. zamiast dodawania, przez co uzyskany wynik nie będzie zależał od ilości nadesłanych impulsów i będzie miał ograniczoną ilosc możliwych wartości (maxymalnie 15 -wszystkie zarejestrowane).
W tym koncepcie nie potrzeba ci czterech różnych alarmów; - wystarczy tylko jeden z interpretacją wyniku, które koło je powoduje co jest trywialnie łatwe. Jeżeli wartośc wyniku jest inna niż 0 albo 15 to masz alarm (brak impulsu od któregoś koła).
Kiedy należałoby sprawdzac wynik?
Odpowiedź nasuwa się sama; - wtedy gdy uznamy że wszystkie koła powinny zarejestrowac przynajmniej jeden sygnał. Może to byc ustawione timerem (krotnośc przedziału czasu pomiędzy impulsami najwolniej kręcącego się kola), albo tymczasowy licznik impulsów również najwolniejszego koła, co gwarantowałoby że nie przoczymy żadnego ważnego impulsu.
Poźniej, w miarę czasu napiszę ci kawalek przykładowego kodu.
e marcus