Majski Napisano Kwiecień 11, 2011 Udostępnij Napisano Kwiecień 11, 2011 Mam taki prosty kod: $regfile = "m88def.dat" '$crystal = 16000000 Config Pinc.5 = Input Config Pind.0 = Output Set Portc.5 Do Debounce Pinc.5 , 0 , Prawo , Sub Loop End Prawo: If Pind.0 = 0 Then Portd.0 = 1 If Pind.0 = 1 Then Portd.0 = 0 Return według podręcznika program powinien przy wciśnięciu przycisku na pinc.5 przełączyć stan na portd.0. Niestety program tylko za pierwszym razem przełącza, a pozniej pozostaje w stanie właczonym. Sprawdzilem na symulatorze i program identycznie się zachowuje:/ probowałem tez z funkcja toggle ale ten sam efekt:/ Wie moze co robie zle? Cytuj Link do komentarza Share on other sites More sharing options...
slawko_k Kwiecień 11, 2011 Udostępnij Kwiecień 11, 2011 spróbuj: prawo: portd.0=not portd.0 return reszta wygląda ok Cytuj Link do komentarza Share on other sites More sharing options...
Majski Kwiecień 11, 2011 Autor tematu Udostępnij Kwiecień 11, 2011 dziala:) ale moze mi ktos powiedziec czemu moj sposob nie dziala? Cytuj Link do komentarza Share on other sites More sharing options...
slawko_k Kwiecień 11, 2011 Udostępnij Kwiecień 11, 2011 Twój jest wyjątkowo nielogiczny dlatego ze w linijce If Pind.0 = 0 Then Portd.0 = 1 ustawiasz na wyjściu 1 a w linijce następnej If Pind.0 = 1 Then Portd.0 = 0 sprawdzasz i wynosi 1 bo sam przed chwila ustawles wiec ustawiasz na 0 i wychodzi z obslugi. mogles to zrobic tak If Pind.0 = 0 Then Portd.0 = 1 else Portd.0 = 0 end if wtedy dziala albo jedna linijka albo druga a nie 2 naraz Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
matrix Kwiecień 11, 2011 Udostępnij Kwiecień 11, 2011 Jeśli już chcesz używać debounce co jest równoznaczne z wait to może inaczej? config pinc.5 = input config portd.0 = output set pinc .5 set portd.0 do if pinc.5=0 then gosub prawo loop prawo: toggle portd.0 waitms 100 return Cytuj Link do komentarza Share on other sites More sharing options...
slawko_k Kwiecień 11, 2011 Udostępnij Kwiecień 11, 2011 Martix w tym przykładzie przycisk musi puścić zanim 100ms minie. Po to sie właśnie debounce stosuje żeby sobie ułatwić obsługę klawiszy Cytuj Link do komentarza Share on other sites More sharing options...
matrix Kwiecień 11, 2011 Udostępnij Kwiecień 11, 2011 Martix w tym przykładzie przycisk musi puścić zanim 100ms minie. Po to sie właśnie debounce stosuje żeby sobie ułatwić obsługę klawiszy Tylko że rodzą się co najmniej dwa pytania: 1 - Co kryje się pod pojęciem debounce? A co się kryje? A no kryje się waitms 25 i ponowne sprawdzanie stanu przycisku. 2 - Kto chcąc raz nacisnąć przycisk trzyma go dłużej niż 100ms? Chyba że zamierza trzymać go długo. W moim przykładzie ma się gdzieś drgania styków bo po wykryciu stanu niskiego na pinc.5 od razu skoczy do wykonywania zmiany stanu portd.0 i tam sobie poczeka 100ms, styki drgać przestaną a program wróci do pętli głównej. Cytuj Link do komentarza Share on other sites More sharing options...
slawko_k Kwiecień 11, 2011 Udostępnij Kwiecień 11, 2011 Tyko zanim puścisz to jeszcze kilak razy zmieni stan. W debounce jedno nacisniecie to jedna zmiana Cytuj Link do komentarza Share on other sites More sharing options...
matrix Kwiecień 11, 2011 Udostępnij Kwiecień 11, 2011 Tyko zanim puścisz to jeszcze kilak razy zmieni stan.W debounce jedno nacisniecie to jedna zmiana Albo ja źle rozumuję, albo Ty szanowny kolego slawko_k Trzeba się zastanowić co robi program w takim przypadku? 'tu się kręci bezczynnie do momentu sprawdzenia stanu na pinc.5 do if pinc.5=0 then gosub prawo loop naciskamy przycisk na pinie c.5 i mamy skok do podprogramu prawo prawo: toggle portd.0 'zmieni stan portd.0 na przeciwny waitms 100 'czeka 100ms return 'wraca tam skąd wybył i jeśli dalej trzymamy przycisk czyli 'dłużej niż 100ms to znowu skoczy nam do podprogramu prawo Zgadza się? W takim razie nasuwa się jeszcze jedno pytanie: Gdzie tu jeszcze kilkukrotna zmiana stanu portd.0 ? Cytuj Link do komentarza Share on other sites More sharing options...
slawko_k Kwiecień 25, 2011 Udostępnij Kwiecień 25, 2011 Zgadza się? W takim razie nasuwa się jeszcze jedno pytanie:Gdzie tu jeszcze kilkukrotna zmiana stanu portd.0 ? Nie zgadza się Szanowny kolego MATRIX a tu toggle portd.0 lub tu portd.0=not portd.0 Zresztą nie wiem po co drążysz temat skoro moja podpowiedź rozwiązała problem autora wątku Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!