Skocz do zawartości

[Bascom] Coś nie tak z programem


bluehais

Pomocna odpowiedź

Witam,
Mam taki problem. Chcę by w programie po zadziałaniu jednego z czujników jeden z silników obracał się przez 1 sekundę (tylne obroty) i analogicznie jeśli drugi zadziała również ten sam silnik (tylne obroty) lub oba zadziałają (czyli wartość spadnie poniżej granicy) również ma się obracać przez sekundę ten sam silnik (tylne obroty) a jeżeli będzie inaczej na obu silnikach będą włączone przednie obroty. Napisałem taki program (niżej), ale silniki dziwnie się zachowują. Gdy nie ma białej kartki blisko czujników (czujnika) układ samoczynnie włącza tylne obroty jednego z silników na czas 1s. Pierwsze moje skojarzenie to takie że pierwszy odczyt z czujnika może mieć dość wysoką wartość która przekracza granicę i tym jest to spowodowane. Tyle już kombinowałem i nic. Czy da się jakoś przywrócić to do ładu?

Dodam że wcześniej bez dodania "Wait 1" wszystko działało dobrze, ale chciałem tak zrobić by tuż po krótkim impulsie mniejszym od Granicy uC włączał silnik na 1 sekundę (niezależnie jaka wartość będzie na ADC w ciągu tej 1 sekundy) a nie całyczas "patrzył" i przyrównywał wartość na ADC do Granicy. Mam nadzieję że wiecie o co mi chodzi 🙂

Oto program:

$regfile = "m8def.dat"
$crystal = 1000000

Config Adc = Single , Prescaler = Auto

Config Portd = Output
Config Portb = Output

Silnik_lewy_a Alias Portd.3
Silnik_lewy_b Alias Portd.2
Silnik_prawy_b Alias Portd.0
Silnik_prawy_a Alias Portd.1

Const Granica = 1020

Dim Czujnik_prawy As Single
Dim Czujnik_lewy As Single
Dim W As Word

Reset Silnik_lewy_a
Reset Silnik_lewy_b
Reset Silnik_prawy_a
Reset Silnik_prawy_b

Do
Gosub Wczytaj_stany
If Czujnik_lewy < Granica And Czujnik_prawy < Granica Then
Silnik_lewy_a = 1                                           'do tyłu
Silnik_lewy_b = 0
Silnik_prawy_a = 1
Silnik_prawy_b = 0
Wait 1
Elseif Czujnik_lewy < Granica And Czujnik_prawy > Granica Then
Silnik_lewy_a = 1
Silnik_lewy_b = 0
Silnik_prawy_a = 0
Silnik_prawy_b = 0
Wait 1
Elseif Czujnik_prawy < Granica And Czujnik_lewy > Granica Then
Silnik_lewy_a = 0
Silnik_lewy_b = 0
Silnik_prawy_a = 1
Silnik_prawy_b = 0
Wait 1
Else
Silnik_lewy_a = 0                                             ' do przodu
Silnik_lewy_b = 1
Silnik_prawy_a = 0
Silnik_prawy_b = 1

End If

Loop

End

Wczytaj_stany:
Start Adc
W = Getadc(5)
W = Getadc(5)
Stop Adc
Czujnik_lewy = W
Start Adc
W = Getadc(3)
W = Getadc(3)
Stop Adc
Czujnik_prawy = W
Return

__________

Komentarz dodany przez: Treker

Link do komentarza
Share on other sites

Po mojemu to ta granica jest zbyt wysoka, sprawdzałes ją jakoś??

I co do zmiennych to te Single są nie potrzebne daj lepiej Word.

Powiem tak, ta jazda jest tym spowodowana ze ten pierwszy "if" działa na takiej zasadzie ze gdy zaden czujnik nie widzi lini czyli odczyt bedzie ponizej granicy to zawsze bedzie jechal do tyłu a wiec sproboj sie jego pozbyc.

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.