logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Bascom warunek w programie

Alttair 23 Sty 2011 18:01 1484 14
  • #1 9046790
    Alttair
    Poziom 9  
    Witam,
    Mam już nadzieję że temat w odpowiednim miejscu :| Zamierzam zrobić robota, który będzie omijał przeszkody. Mój problem polega na jednym warunku. Oto program:


    $regfile = "m8def.dat" 
    $crystal = 1000000 
    
    Config Adc = Single , Prescaler = Auto 
    Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down 
    
    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 
    Dioda Alias Portd.6 
    
    Const Granica = 500 
    
    Dim Czujnik_prawy As Single 
    Dim Czujnik_lewy As Single 
    Dim W As Word 
    
    Set Dioda 
    Reset Silnik_lewy_a 
    Reset Silnik_lewy_b 
    Reset Silnik_prawy_a 
    Reset Silnik_prawy_b 
    
    Do 
    Gosub Wczytaj_stany 
    
    If Czujnik_prawy < Granica And Czujnik_lewy < Granica Then 
    Pwm1a = 255 
    Pwm1b = 255 
    Silnik_lewy_b = 1 
    Silnik_prawy_b = 1 
    Waitms 500 
    Pwm1a = 255 
    Pwm1b = 0 
    Silnik_lewy_b = 0 
    Silnik_prawy_b = 0 
    Silnik_lewy_a = 1 
    Waitms 500 
    Elseif Czujnik_prawy < Granica Then 
    Silnik_lewy_b = 1 
    Pwm1a = 255 
    Elseif Czujnik_lewy < Granica Then 
    Silnik_lewy_b = 0 
    Silnik_prawy_b = 1 
    Pwm1a = 0 
    Pwm1b = 255 
    Else 
    Silnik_lewy_a = 1 
    Silnik_lewy_b = 0 
    Silnik_prawy_a = 1 
    Silnik_prawy_b = 0 
    Pwm1a = 255 
    Pwm1b = 255 
    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 


    Chodzi mi głównie o warunek:
    If Czujnik_prawy < Granica And Czujnik_lewy < Granica Then 

    Pierwsze ten warunek napisałem tak:
    If Czujnik_prawy < Granica & Czujnik_lewy < Granica Then 

    ale kompilator pokazywał błąd w tej linii więc zamieniłem & na And
    Czy po wpisaniu Kod:

    warunek będzie działał jak należy? czyli gdy na czujniku prawym wartość będzie mniejsza niż stała Granica i gdy na czujniku lewym wartość będzie mniejsza niż stała Granica wtedy będą podejmowane działania czyli w tym przypadku włączą się w obu serwach tylne obroty?
  • #2 9047484
    arktik1
    Poziom 27  
    Czy wiesz co w ogóle znaczą AND, OR, IF ?
  • #3 9047491
    Alttair
    Poziom 9  
    If = Jeśli
    AND = iloczyn logiczny
    OR - suma logiczna
    Jeśli bym tego nie wiedział nie brałbym się za pisanie programów.
    Chodzi mi tylko o ten 1 warunek. Na diodzie napisali & a kompilator wywala błędy więc chciałem zapytać tylko czy & można zastąpić przez And.
  • #4 9047522
    arktik1
    Poziom 27  
    Ja bym to nazwał tak:

    IF--Jeśli
    AND-- i
    OR-- lub.
    THEN-- wtedy.

    Teraz sam widzisz czy twój program będzie działał.
  • #5 9047563
    Alttair
    Poziom 9  
    Czyli chyba będzie. Wybacz ale nie jestem zaawansowanym programistą. Chodzę jeszcze do gimnazjum :D
    A jeszcze tak swoją drogą W jakiej jednostce jest stała "Granica" poniżej której mają reagować silniki? Bo załóżmy że gdy robot jest np 3 cm od przeszkody wtedy dopiero zaczyna reagować. Czyli jaką wtedy trzeba ustawić granicę? 500 ustawiłem tak jak w moim linefollowerze więc i w tym tyle ustawiłem.
  • #7 9047725
    Alttair
    Poziom 9  
    ok, spróbuję coś znaleźć ; )
  • #8 9047733
    arktik1
    Poziom 27  
    Teraz ja mam pytanie:
    Co to w ogóle jest:
    
    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 
    
  • Pomocny post
    #9 9047893
    M. S.
    Poziom 34  
    Cytat:
    Co to w ogóle jest:


    Trochę przekombinowane:
    Powinno być:

    czytaj_stany:
    Czujnik_lewy = Getadc(5)
    Czujnik_prawy = Getadc(3)
    Return 


    ... aczkolwiek dwukrotne powtórzenie Getadc(x) kiedyś maskowało błąd Bascoma, który jak dobrze pamiętam polegał na odczytywaniu za pierwszym razem napięcia z końcówki o numerze o jeden niższym niż wskazana w Getadc.

    Prawidłowy jest warunek o składni:

    If Czujnik_prawy < Granica And Czujnik_lewy < Granica Then ...


    Then wykona się jeśli jeden i drugi warunek jednocześnie będzie spełniony.
  • #10 9047902
    Alttair
    Poziom 9  
    Odczyt z przetworników i przypisanie wartości odczytu zmiennej W :)

    M.S. dzięki za poprawienie już zmieniam w programie :)
    Ale tą granicę reagowania na przeszkodę należy dobrać doświadczalnie czyli chyba nie obejdzie się bez kilkukrotnego programowania proca :|
  • #12 9047952
    Alttair
    Poziom 9  
    Chyba jednak nie będę umiał :/
    No nic, mam płytkę stykową więc przynajmniej nie trzeba będzie lutować po kilka razy :D
  • #13 9047969
    arktik1
    Poziom 27  
    Możesz też zrobić to za pomocą potencjometru i kolejnego ADC.
  • #14 9048000
    Alttair
    Poziom 9  
    Aha i zmieniając rezystancję ustawiać odległość na jaką ma reagować. Ok, dzięki za radę :D:D pokombinuję.
  • #15 9048455
    arktik1
    Poziom 27  
    Zmieniając potencjometrem wartość napięcia na ADC regulować "Granica".
REKLAMA