Bascom - jak przerobić program?


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.
- Pierwszy to taki że po naciśnięciu przycisku muszę przytrzymać go ok 1-2s. aby zareagował.
- Drugi problem to taki że jak trzymam przycisk cały czas to przekaźnik załącza i wyłącza się z częstotliwością migającej diody itp.
Pytanie jest takie, jak wyeliminować te 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




Portret użytkownika glecki

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

Portret użytkownika popak20

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

Portret użytkownika kaktus

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 -

Quote:

Debounce a port pin connected to a switch.

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.".

Portret użytkownika glecki

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

Portret użytkownika popak20

Dzięki za wszystkie

Dzięki za wszystkie podpowiedzi. Ostatecznie zrobiłem na funkcji Debounce i działa tak jak chciałem :)

$regfile = "m16def.dat"
$crystal = 16000000
 
Config Portb = &B00000000
       Portb = &B11111111
 
Config Portd = &B11111111
       Portd = &B00000000
 
Do
 
Debounce Pinb.0 , 0 , 1 , Sub
Debounce Pinb.1 , 0 , 2 , Sub
Debounce Pinb.2 , 0 , 3 , Sub
Debounce Pinb.3 , 0 , 4 , Sub
Debounce Pinb.4 , 0 , 5 , Sub
Debounce Pinb.5 , 0 , 6 , Sub
Debounce Pinb.6 , 0 , 7 , Sub
Debounce Pinb.7 , 0 , 8 , Sub
 
Loop
End
 
1:
  Toggle Portd.0
Return
 
2:
  Toggle Portd.1
Return
 
3:
  Toggle Portd.2
Return
 
4:
  Toggle Portd.3
Return
 
5:
  Toggle Portd.4
Return
 
6:
  Toggle Portd.5
Return
 
7:
  Toggle Portd.6
Return
 
8:
  Toggle Portd.7
Return

Pozdrawiam