Skocz do zawartości

[Bascom] Kasowanie zmiennej po danym czasie


Carpe Diem

Pomocna odpowiedź

Ze względu, że nie mam części by robić dalej w ms, wziąłem się za odbijadło. Wszystko już mam, odbijanie na pojedynczych krańcówkach działa, ale nie mogę sobie poradzić z dwiema naraz. Chodziło mi coś w stylu:

Kr1 Alias Pinc.1
Kr2 Alias Pind.0

Do

  [...]

  If kr1=0 and kr2=0 Then
  Gosub Zawroc
  End If

Loop

End

Nie sprawdza się to dlatego, że robot nie dotknie dwiema krańcówkami jednocześnie przeszkody tylko w odstępie powiedzmy 5-10ms.

Jak by to zrobić? Próbowałem na zmiennych ale brakuje mi czegoś takiego jak w tytule.

Link do komentarza
Share on other sites

Tak nie działa. Dorzucę resztę programu:

Kr1 Alias Pinc.1
Kr2 Alias Pind.0


Dim B As Byte

Do

  If Kr1 = 1 And Kr2 = 1 Then
  Gosub Go
  End If

  If Kr1 = 0 Then
  B = B + 1
  Gosub Lewo
  End If

  If Kr2 = 0 Then
  B = B + 1
  Gosub Prawo
  End If

  If B = 2 Then
  Gosub Zawroc
  End If

  B = 0


Loop

End

Może to ułatwi wam sprawę.

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

Do

  If Kr1 = 1 And Kr2 = 1 Then
  Gosub Go
  End If

  If Kr1 = 0 Then
  Gosub Lewo
  End If

  If Kr2 = 0 Then
  Gosub Prawo
  End If

  If Kr1 = 0 Then
     Waitms 50
     If Kr2 = 0 Then
     Gosub Zawroc
     End If
  End If


Loop

End

I dalej nic.

Link do komentarza
Share on other sites

Dopisałem mu tak na złość:

Do

  [...]

  If Kr1 = 0 And Kr2 = 0 Then
  Gosub Zawroc
  End If



  If Kr2 = 0 Then
     Waitms 2
     If Kr1 = 0 Then
     Gosub Zawroc
     End If
  End If

  If Kr2 = 0 Then
     Waitms 5
     If Kr1 = 0 Then
     Gosub Zawroc
     End If
  End If

  If Kr2 = 0 Then
     Waitms 10
     If Kr1 = 0 Then
     Gosub Zawroc
     End If
  End If

  If Kr2 = 0 Then
     Waitms 15
     If Kr1 = 0 Then
     Gosub Zawroc
     End If
  End If

  If Kr2 = 0 Then
     Waitms 20
     If Kr1 = 0 Then
     Gosub Zawroc
     End If
  End If




  If Kr1 = 0 Then
     Waitms 2
     If Kr2 = 0 Then
     Gosub Zawroc
     End If
  End If

  If Kr1 = 0 Then
     Waitms 5
     If Kr2 = 0 Then
     Gosub Zawroc
     End If
  End If

  If Kr1 = 0 Then
     Waitms 10
     If Kr2 = 0 Then
     Gosub Zawroc
     End If
  End If

  If Kr1 = 0 Then
     Waitms 15
     If Kr2 = 0 Then
     Gosub Zawroc
     End If
  End If

  If Kr1 = 0 Then
     Waitms 20
     If Kr2 = 0 Then
     Gosub Zawroc
     End If
  End If

Loop

End

I działa, choć nie w 100% jeszcze.

Link do komentarza
Share on other sites

Wszystkie wartości czekanie ustaw takie same. Najlepiej jakbyś pisał wszędzie, gdzie masz opóźnienia czasowe Delay, a w sekcji konfiguracyjnej wpisał: Config Delay = 20 (nie wiem czy konfigurowanie Delay'a działa, bo nie stosowałem, a w Helpie nie ma mowy o tym). Ważne, żeby wszystkie opóźnienia były takie same i ≥10ms.

Link do komentarza
Share on other sites

Ważne, żeby wszystkie opóźnienia były takie same i ≥10ms.

Tylko, że właśnie te if'y z rożnymi waitms'ami wysyłają do tego samego podprogramu i gdy teraz dodałem po kolei 1-20ms błędy spadły poniżej 5-7%.

Tak czy siak - działa. Ale czy można by zrobić to tak jak chciałem czyli na zmiennej/zmiennych i kasowaniu jej po pewnym czasie lub inaczej?

Link do komentarza
Share on other sites

Carpe Diem, niepotrzebnie piszesz tyle razy warunki z różnymi opóźnieniami i do tego z różnymi czasami.

Spróbuj coś takiego:

Dim B As Byte 

Do 

  If Kr1 = 0  Then 
      gosub opoznienie
      if Kr2 = 0 then
          Gosub Go 
      End If
  else 
       B = B + 1 'zamiast tej sumy możesz dodać dyrektywę INCR B, zrobi dokładnie to samo a lepiej wygląda:P
       Gosub Lewo 
  End If 

  If Kr2 = 0  Then 
      gosub opoznienie
      if Kr1 = 0 then
          Gosub Go 
      End If
  else 
       B = B + 1 
       Gosub Prawo  
  End If 

  If B = 2 Then 
  Gosub Zawroc 
  End If 

  B = 0 'tutaj zawsze zmienna się zeruje. To miejsce jest nieodpowiednie. 


Loop 

End

opoznienie:
waitms 25
return

w jednym miejscu teraz będziesz mógł zmieniać opóźnienia dla wszystkich warunków.

Link do komentarza
Share on other sites

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!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.