Witam Mam napisany program aby po naciśnięciu przycisku wysterował mi przekaźnik. W sumie jest osiem kanałów. W kodzie programu zastosowana zastała procedura Toggle ale jest mały problem bo program ma dwa błędy. Pozdrawiam KOD PROGRAMU: $regfile = "m16def.dat" $crystal = 16000000 Config Portb = &B00000000 Portb = &B11111111 Config Portd = &B11111111 Portd = &B00000000 Do If Pinb.0 = 0 Then Toggle Portd.0 End If Waitms 50 If Pinb.1 = 0 Then Toggle Portd.1 End If Waitms 50 If Pinb.2 = 0 Then Toggle Portd.2 End If Waitms 50 If Pinb.3 = 0 Then Toggle Portd.3 End If Waitms 50 If Pinb.4 = 0 Then Toggle Portd.4 End If Waitms 50 If Pinb.5 = 0 Then Toggle Portd.5 End If Waitms 50 If Pinb.6 = 0 Then Toggle Portd.6 End If Waitms 50 If Pinb.7 = 0 Then Toggle Portd.7 End If Waitms 50 Loop End
|
|||
Przede wszystkim
Przede wszystkim wyrzuć te Wait-y.To one powodują,że musisz długo trzymać przycisk do zrealizowania danej funkcji.
Drugi problem rozwiążesz dodatkową zmienną,może być typu Bit.
Zrób to tak:
jeśli zmienna pomocnicza bit jest prawdziwa i jeśli naciskasz przycisk to przełącz port i następnie zmień pomocniczą bit.Wówczas zablokujesz dalsze zmiany stanu portu.Po puszczeniu przycisku zmień pomocniczą bit na wartość prawdziwą i po problemie.Stan portu zmieni się raz i dopiero po puszczeniu przycisku i ponownym naciśnięciu będzie mógł zmienić się jeszcze raz.
I jeszcze jedno.Zapoznaj się z polecenie Else.W tym przypadku będzie pomocne.
Powodzenia
Grzegorz
Dzięki za szybką
Dzięki za szybką odpowiedź.
Te Wait-y czasem nie odpowiadają za drganie styków?
Co do drugiego pytania to możesz podać przykład? Bo za bardzo nie rozumiem.
Wybaczcie ale w bascomie orłem nie jestem ;)
Pozdrawiam
wait nie ma nic wspólnego z drganiem styków
Tak jak napisałem w tytule wait to wait każe ?C się obijać, marnuje czas i moc obliczeniową.
W Twoim przykładzie użyty po instrukcji testującej stan pinu, powoduje bezczynność na czas jaki określiłeś. Zauważ że po każdej instrukcji testowania każesz czekać zakładam że ?C jest akurat w trakcie wykonywania If Pinb.7 wtedy klikasz sobie ten guzik i musisz go trzymać 7x50 ms aż ?C znowu będzie w "tym miejscu". Jak nie chcesz tyle trzymać guzika wciśniętego to popraw choć na 10ms. Oczywiście ta bezczynność w tym przypadku powoduje, że gdyby styk był "kiepsko" przyduszony program nie popędzi swoim życiem i nie zinterpretuje ponownie (po raz kolejny) tej instrukcji. Potestuj sobie bez tych wait... i z krótszymi czasami. Potestuj też instrukcję DEBOUNCE -
Mirley też pokazał jak ładnie można obsługiwać guziki. A tu mój patent na jeden guzik.
Przyjemnej lektury i owocnych wyników.
kaktus
"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".
wait-y i drganie styków
Wait-y odpowiadają za wszystko co najgorsze w Bascomie.Co to jest polecenie Wait.Otóż wstrzymuje działanie programu na określony w tym poleceniu czas.Czyli jeśli w pętli głównej dasz polecenie wait 5 to cały program opóźni działanie o te 5 sekund (oczywiście jest to uogólnienie).W czasie 5 sekund procesor może Cię wysłać na Księżyc i z powrotem :).
Za drganie styków jest odpowiedzialne polecenie Debounce które jest według mnie tak samo kiepskie jak Wait.
Choć nie przeczę czasem jedno i drugie jest czasem przydatne.
Działam w tej chwili w Linuxie więc napiszę Ci jak to mniej więcej powinno wyglądać.
Dim pomoc as bit
bit = 0
do
if pomoc = 0 then
if przycisk = 0 then
toogle "cośtam"
pomoc = 1
end if
end if
if przycisk = 1 then
pomoc = 0
end if
Tak to mniej więcej wygląda.Popróbuj też plecenie Else.Może to wyglądać tak:
if pomoc = 0 then
if przycisk = 0 then
toogle "cośtam"
pomoc = 1
else
if przycisk = 1 then
pomoc = 0
end if
end if
Oczywiście są to przykłady i do realizacji celu możesz użyć kompletnie innych danych.
Powodzenia
Grzegorz
Dzięki za wszystkie
Dzięki za wszystkie podpowiedzi. Ostatecznie zrobiłem na funkcji Debounce i działa tak jak chciałem :)
Pozdrawiam