Skocz do zawartości

Debounce działa tylko raz


Majski

Pomocna odpowiedź

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?

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

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

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
Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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 ?

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.