Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

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

siwekyhy 04 May 2011 00:05 2041 10
  • #1
    siwekyhy
    Level 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:

    Code:


    $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

  • #2
    xury
    Automation specialist
    Dużo błędów. Błędna konfiguracja portu C - chyba zapomniałeś o &B. :)
    W kilku innych miejscach również.

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

    nigdy nie zostanie spełniony. Dlaczego ? Ano zobacz sobie jakie dane przechowuje zmienna typu Word.
  • #3
    siwekyhy
    Level 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ć ...
  • #4
    xury
    Automation specialist
    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.
  • #5
    Fredy
    Level 27  
    Z portu PIN sie tylko czyta a nie zapisuje .

    Zamień PINd.0=1 itp na
    Portd.0=1
  • #6
    siwekyhy
    Level 14  
    hm chodzi mi o główna składnie pętli konstrukcje if then ...
  • #7
    Fredy
    Level 27  
    Myślisz że tu są wróżki?
    Skąd mamy wiedzieć o co Tobie chodzi dokładnie.
    Sprecyzuj pytanie.
  • #8
    slawko_k
    Level 34  
    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
    siwekyhy
    Level 14  
    Poprawiłem trochę ale dalej nie działa jak powinien ...

    Code:



    $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
    slawko_k
    Level 34  
    Code:
    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
    siwekyhy
    Level 14  
    Dzieki za pomoc faktycznie było pare dużych błedów które przeoczyłem.. Wszystko już działa jak powinno :)