Skocz do zawartości

[Bascom] Kasowanie zmiennej po danym czasie


Pomocna odpowiedź

Napisano

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.

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

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.

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.

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.

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?

Na pewno można, ale po co utrudniać sobie życie? Rozumiem, że chcesz nauczyć się programować, ale do tego lepiej kupić/zbudować jakiś zestaw uruchomieniowy i bawić się w różnorodne programy, nie tylko do robotów.

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.

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