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

[Atmega8][Bascom] If then Else petla główna do sumo robota

siwekyhy 04 Maj 2011 00:05 2119 10
REKLAMA
  • #1 9467649
    siwekyhy
    Poziom 14  
    Witam

    Zbudowałem sumo robota jednak mam problem z główną petlą która będzie nim sterować. Robot posiada jeden czujnik wykrycia białej lini (Sg2bc) oraz jeden czujnik wykrycia przecwinika (Sharp) Czujniki osobno gdy sa zaprogramowanie działają dobrze lecz nie umiem ich połączyć w jeden program by ze sobą współpracowały.

    Zasada działania: Gdy załącze robota kręci się wkoło by znaleść przeciwnika , jeśli go znajdzie jedzię do przodu

    jeśli nie znaleziono przeciwnika a wykryto biała linie ringu robot odbija w prawo by wrócić na ring a następnie wraca do poczatku petli by dalej szukać przeciwnika -> możliwość gdy robot będzie wypychany przez przecwinika z ringu

    Załączam próbny kod programu który nie działa

    kod:

    
    
    $regfile = "M8def.dat"                                      ' use the Mega8
    
    $crystal = 10000000
    
    Config Portc = 0110000
    Portc = 0110000
    
    Config Pind.0 = Output
     Config Pind.1 = Output
     Config Pind.2 = Output
     Config Pind.3 = Output
    
       Pind.0 = 1                                               ' silniki nie dzialaja
       Pind.1 = 1
       Pind.2 = 1
       Pind.3 = 1                                               ' silniki nie dzialaja
    
    
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc   'config ADC
    
    Start Adc
    
    Dim W As Word , Perc As Word , Volt As Word , Volt_d As Byte , Channel As Byte , I As Byte , Y As Byte , O As Byte
    
    Config Aci = On , Compare = Off , Trigger = Falling
    
    
    
    
    
    
    Do
    
      W = Getadc(2)                                             ' sprawdzanie czujnika przeciwnika
      Volt = W * 5
      Volt_d = Volt Mod 10
      Volt = Volt / 1000
    
    
    
    
      If Volt > 0 Then                                          ' jesli  wykryjesz   przeciwnika
    
    
                                                                 ' zapal diode  ZOLTA
       Portc = 0100000
                                                                 ' jedz na przod
       Portd.0 = 0
       Portd.1 = 1
       Portd.2 = 1
       Portd.3 = 0
    
    
    
    
    
       Else                                                     ' jesli nie znalazles przeciwnika
    
    
    
    
       Portc = 0000000
    
       Portd.0 = 0                                              ' krec sie w kolo szukaj przeciwnika
       Portd.1 = 1
       Portd.2 = 0
       Portd.3 = 1
    
    
    
    
    
       Elseif Volt < 0 And Acsr.5 = 0 Then                      ' Jesli nie znalazles przeciwnika a wykryles biala linie
    
       Portc = &B0000000                                        ' Zapal diode czerwona
    
                                                               ' odbij w prawo by wrocic na ring
       Portd.0 = 0
       Portd.1 = 1
       Portd.2 = 1
       Portd.3 = 0
    
    
                                                                 ' nastepnie wroc do poczatku petli
    
    
    
    
    
    
    
    
    
      Loop
    
    End
    
    
    
    
    
    
    
    
    
    
     ' ZOlta zapalona znaleziono przeciwnika
    
     ' czerwona zapalona najechano na biala linie
    
    
  • REKLAMA
  • #2 9467689
    xury
    Specjalista automatyka domowa
    Dużo błędów. Błędna konfiguracja portu C - chyba zapomniałeś o &B. :)
    W kilku innych miejscach również.

    Warunek
    Elseif Volt < 0 And Acsr.5 = 0 Then

    nigdy nie zostanie spełniony. Dlaczego ? Ano zobacz sobie jakie dane przechowuje zmienna typu Word.
  • #3 9470327
    siwekyhy
    Poziom 14  
    Co do konfiguracji portu C hm mam najnowszego bascoma i nie ma żadnych błędów po kompilacji i robot zaprogramowany tylko z czujnikiem lini lub tylko z czujnikiem wykrycia przeciwnika działają poprawnie. Co do zmiennej Word to jest to liczba całkowita bez znaku, od 0 do 65535, ok zgodzę sie bo zmienna Volt nie będzie całkowita i jest zaokrąglana do 0 lub 1 ale tak jak pisałem wcześniej to wszytko działa osobno zaprogramowane. Chodzi mi o główną składnie pętli nie mogę sobie z tym poradzić ...
  • REKLAMA
  • #4 9470550
    xury
    Specjalista automatyka domowa
    Bascom niestety tak ma, że czasem "łyka" niepoprawną składnię, a potem są problemy.
    Co do warunku to chodziło mi o to, że zmienna Volt nigdy nie będzie mniejsza niż 0, no bo jest typu Word właśnie. Nie ma też Endif więc zdziwiłbym się jakby się skompilował.
    Czasem też nie wiadomo czemu nie chcą działać warunki złożone. Wtedy najlepiej rozbić warunek złożony na dwa warunki proste.
  • REKLAMA
  • #5 9470584
    Fredy
    Poziom 27  
    Z portu PIN sie tylko czyta a nie zapisuje .

    Zamień PINd.0=1 itp na
    Portd.0=1
  • REKLAMA
  • #6 9474921
    siwekyhy
    Poziom 14  
    hm chodzi mi o główna składnie pętli konstrukcje if then ...
  • #7 9475377
    Fredy
    Poziom 27  
    Myślisz że tu są wróżki?
    Skąd mamy wiedzieć o co Tobie chodzi dokładnie.
    Sprecyzuj pytanie.
  • #8 9475414
    slawko_k
    Poziom 35  
    tylu błędów w programie to już dawno nie widziałem.

    Portc = 0110000

    przecież ty na port który ma 8 bitów ( lub mniej nawet) pakujesz liczbę 110 tysięcy

    z pewnością chciałeś napisać

    Portc = &b0110000

    z każdym innym przypisaniem ten sam bład. ten program nie moze nie działać.

    co do twojego pytania to przecież to oczywiste

    do
    if przeciwnik then
    cala naprzód
    end if
    if linia then
    zawróć
    end if
    loop
    oczywiście warunki ktore podalem musisz dopasowac do swoich czujników o których my niewiele wiemy.
  • #9 9479378
    siwekyhy
    Poziom 14  
    Poprawiłem trochę ale dalej nie działa jak powinien ...

    
    
    
    $regfile = "M8def.dat"                                      ' use the Mega8
    
    $crystal = 10000000
    
    Config Portc = &B0110000
    Portc = &B0110000
    
    Config Pind.0 = Output
     Config Pind.1 = Output
     Config Pind.2 = Output
     Config Pind.3 = Output
    
       Pind.0 = 1                                               ' silniki nie dzialaja
       Pind.1 = 1
       Pind.2 = 1
       Pind.3 = 1                                               ' silniki nie dzialaja
    
    
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc   'config ADC
    
    Dim Wart_ac As Word
    
    
    Config Aci = On , Compare = Off , Trigger = Falling
    
    Start Adc
    
    
    Do
    
      Wart_ac = Getadc(2)                                       ' sprawdzanie czujnika przeciwnika
    
    
    
    
    
      If Wart_ac > 206 Then                                     ' jesli  wykryjesz   przeciwnika
    
    
                                                                 ' zapal diode  ZOLTA
       Portc = &B0100000
                                                                 ' jedz na przod
       Portd.0 = 0
       Portd.1 = 1
       Portd.2 = 1
       Portd.3 = 0
    
    
      Elseif Wart_ac < 206 Then
    
       Portc = &B0000000
    
       Portd.0 = 0
       Portd.1 = 1
       Portd.2 = 0
       Portd.3 = 1
    
    
      Elseif Wart_ac < 206 And Acsr.5 = 0 Then                       ' Jesli nie znalazles przeciwnika a wykryles biala linie
    
       Portc = &B0010000                                        ' Zapal diode czerwona
    
                                                               ' odbij w prawo by wrocic na ring
       Portd.0 = 1
       Portd.1 = 0
       Portd.2 = 1
       Portd.3 = 0
    
    
                                                ' nastepnie wroc do poczatku petli
    End If
    
    
    
    
    
    
      Loop
    
    End
    
    
    
    
    
    
    
    
    
    
     ' ZOlta zapalona znaleziono przeciwnika
    
     ' czerwona zapalona najechano na biala linie
    
    
  • #10 9479635
    slawko_k
    Poziom 35  
    Pind.0 = 1                                               ' silniki nie dzialaja
       Pind.1 = 1
       Pind.2 = 1
       Pind.3 = 1  


    Ma być portd.1=1 itd

    Ile tych elseif'ów masz??

    zrób to na 3 zwykłych osobnych if'ach tak jak ci napisałem
  • #11 9483737
    siwekyhy
    Poziom 14  
    Dzieki za pomoc faktycznie było pare dużych błedów które przeoczyłem.. Wszystko już działa jak powinno :)
REKLAMA