Skocz do zawartości

ATmega8 i L293DNE -> zablokowane silniki


Dżony

Pomocna odpowiedź

Cześć,
mam problem taki że w moimi minisumo nie chcą działać silniki. Sprawdziłem stany logiczne i na pinach w l293dne 1A i 3A jest 1 na 2A i 4A jest 0 a na pinach EN również jest 0 🙁 przez co silniki nie działają. Program jest taki jak z konaru

'Polecenia dla kompilatora
  $crystal = 8000000                                       'czestotliwosc taktowania procesora
  $lib "i2c_twi.lbx"                                       'korzystaj ze sprzetowego interfejsu TWI
  $regfile = "m8def.dat"                                   'procesor to Atmega48, dla atmega8 nalezy
                                                            'wpisac "m8def.dat", dla atmega88/168 analogicznie
                                                            '"m88def.dat" i "m168def.dat"
  'Ustawienie Aliasow
  Led Alias Portd.0                                        'Do tego pinu podlaczona jest dioda LED2
  Sonar_rst Alias Portc.3                                  'Linia RESET sonaru
  S1 Alias Pinb.7                                          'przycisk ma plytce drukowanej
  S2 Alias Pinb.6                                          'czujnik zderzeniowy
  Pp Alias Pind.1                                          'Prawy Przedni czujnik bialej linii
  Lp Alias Pind.2                                          'Lewy Przedni ...
  Lt Alias Pind.3                                          'Lewy Tylny
  Pt Alias Pind.4                                          'Prawy Tylny
  A1 Alias Portb.0                                         'Linie sterujace silnikiem A
  A2 Alias Portd.7
  B1 Alias Portd.6                                         'Linie sterujace silnikiem B
  B2 Alias Portd.5
  Ena Alias Portb.1                                        'Linia do wlaczania silnika A
  Enb Alias Portb.2                                        '... i silnika B

  'Dekleracja adresu I2C dla sonaru
  Sonar_adres_r Alias &H03                                 'adres do czytania z sonaru
  Sonar_adres_w Alias &H02                                 'adres do zapisu

  'Konfiguracja kierunku pracy portow
  Ddrb = &B00111111
  Ddrd = &B11100001
  Ddrc.3 = 1

  'Konfiguracja stanow portow
  Portb.7 = 1
  Portb.6 = 1
  Portd.1 = 0
  Portd.2 = 0
  Portd.3 = 0
  Portd.4 = 0
  Portc.4 = 0
  Portc.5 = 0



  'Dekleracja funkcji i procedur
  Declare Sub Sonar_reset
  Declare Sub Sonar_impulsy(byval Impulsy As Byte)
  Declare Sub Sonar_pomiar(byval Wzmocnienie As Byte)
  Declare Function Sonar_odczyt() As Word
  Declare Sub L_do_przodu(byval Szybkosc As Byte)
  Declare Sub L_do_tylu(byval Szybkosc As Byte)
  Declare Sub P_do_przodu(byval Szybkosc As Byte)
  Declare Sub P_do_tylu(byval Szybkosc As Byte)
  Declare Sub L_stop
  Declare Sub P_stop

  'Konfiguracja PWM dla silnikow
  Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 64

  'Konfiguracja timera dla programu, przerwanie co ~2ms
  Config Timer0 = Timer , Prescale = 64
  On Timer0 Przerwanie

  Enable Interrupts                                        'globalne zezwolenie na przerwania

  'Konfiguracja I2C dla sonaru
  Config Scl = Portc.5
  Config Sda = Portc.4
  Config Twi = 100000                                      'ustawienie predkosci na 100Khz
  I2cinit                                                  'inicjalizacja interfejsu I2C

  'Deklaracja zmiennych
  Dim Czas As Byte                                         'zmienna wykorzystywana do okreslania jak dlugo robot ma uciekac z bialej linii
  Dim Czas2 As Byte                                        'zmienna zawierajaca czas liczony przez timer0
  Dim Linie As Byte                                        'zmienna okreslajaca ktore czujniki koloru wykryly biala linie
  Dim Namierzony_sonar As Bit                              'flaga okreslajaca wykrycie przeszkody przez sonar
  Dim Stan As Byte                                         'flaga okreslajaca zachowanie sie robota
  Dim Obrot As Word                                        'dodatkowy licznik wykorzystywany przy szukaniu


  'Program glowny

  Linie = 0
  Led = 0                                                  'zapal diode na 1 sekunde i zgas
  Wait 1
  Led = 1
  Call Sonar_reset                                         'wykonaj reset sonaru
  Call Sonar_impulsy(10)                                   'ustaw liczbe impulsow na 10
  Bitwait S1 , Reset                                       'czekaj az zostanie nacisniety przycisk S1
  Led = 0                                                  'zapal diode i czekaj 5 sekund
  Wait 5
  Enable Timer0                                            'zezwolenie na przerwanie od timera


  'Petla glowna

  Do
     If S1 = 0 Then                                        'jezeli zostanie nacisniety przycisk S1 zatrzymaj robota
        Stop Timer0
        Call L_stop
        Call P_stop
        Do                                                 'i wejdz w nieskonczona petle (koniec programu)
        Loop
     End If

     If Czas2 = 14 Then                                    'analogicznie odczytaj wartosc z sonaru i ustaw odpowiednia
        If Sonar_odczyt() < 500 Then                       'flage jesli zmierzona odleglosc jest mniejsza niz 50cm
        Namierzony_sonar = 1
        Else
        Namierzony_sonar = 0
        End If
     End If

     If Czas2 = 15 Then                                    'jezeli zmienna pomocnicza odliczyla ~32ms to
        Czas2 = 0                                          'zacznij liczyc od nowa
        Call Sonar_pomiar(15)                              'i wykonaj pomiar sonarem (wynik zostanie odczytany za ~30ms)
     End If

     Select Case Stan                                      'w zaleznosci od stanu w jakim znajduje sie robot
     Case 1
     Gosub Pucieczka                                       'przejdz do odowiedniego programu ucieczki
     Case 2
     Gosub Tucieczka
     Case 0                                                'lub jesli nie ma potrzeby uciekac
        If Namierzony_sonar = 1 Or S2 = 0 Then             'atakuj jesli czujniki cos wykryly
           Gosub Gon
        Else                                               'w przeciwnym razie szukaj nadal.
           Gosub Szukaj
        End If
     End Select


  Loop                                                     'koniec petli glownej

  Przerwanie:                                              'przerwanie wykonywane co ~2ms
     Incr Obrot                                            'zwieksz wartosc pomocniczje zmiennej odpowiedzialnej za obrot przy szukaniu
     Incr Czas2                                            'zwieksz wartosc zmiennej pomocniczej Czas2
     If Czas = 0 Then                                      'zmniejsz wartosc zmiennej pomocniczej Czas i jesli osiagnela 0
        Czas = 1                                           'to niech pozostanie wyzerowana
     End If
     Decr Czas
     Linie.0 = Lp                                          'zerowemu bitowi liczby Linie zostanie nadana wartosc z czujnika bialej linii
     Linie.1 = Lt                                          'podobnie kolejnym bitom, w ten sposob powstaje 4bitowa liczba, zawierajaca
     Linie.2 = Pp                                          'stany czujnikow bialej linii
     Linie.3 = Pt

     Select Case Linie                                     'teraz w zaleznosci od wartosci zmiennej Linie zostaje podjete odpowiednie dzialanie
     Case 14                                               'Czujnik Lewy przedni zauwazyl biala linie
        Stan = 1                                           'robot przechodzi do stanu 1 - ucieczka w tyl i obrot
        Czas = 250                                         'stan ten bedzie trwal ~500ms
        Call P_do_tylu(255)                                'zacznij sie cofac
        Call L_do_tylu(255)
     Case 13                                               'Czujnik Lewy tylny, przejdz do stanu 2 - ucieczka do przodu
        Stan = 2
        Czas = 250
        Call P_do_przodu(255)                              'zacznij uciekac
        Call L_do_przodu(255)
     Case 11
        Stan = 1                                           'analogicznie czujnik Prawy przedni (Pp)
        Czas = 250
        Call P_do_tylu(255)
        Call L_do_tylu(255)
     Case 7                                                'analogicznie czujnik Prawy tylny
        Stan = 2
        Czas = 250
        Call P_do_przodu(255)
        Call L_do_przodu(255)
     Case 5                                                'oba czujniki tylne, stan 2 - ucieczka do przodu
        Stan = 2
        Czas = 250
        Call P_do_przodu(255)
        Call L_do_przodu(255)
     Case 10                                               'oba czujniki przednie, stan 1 - ucieczka do tylu
        Stan = 1
        Czas = 250
        Call P_do_tylu(255)
        Call L_do_tylu(255)
     Case 12                                               'oba czujniki lewe, stan 3 - stan "slepy"
        Stan = 3                                           'robot bedzie sie obracal w lewo, az przejdzie do innego stanu
        Call P_do_przodu(255)                              'gdyz w koncu tylko jeen czujnik bedzie widzial biala linie
        Call L_do_tylu(255)
     Case 3
        Stan = 3                                           'oba czujniki prawe, analogicznie, robot bedzie sie obracal w
        Call P_do_tylu(255)                                'druga strone
        Call L_do_przodu(255)
     End Select
  Return

  Szukaj:                                                  'podprogram sluzacy do wyszukiwania przeciwnika
     Led = 1                                               'zgas diode
     If Obrot > 800 Then                                   'jezeli szukasz od ~1,6s nic nie wykryto,
     Call P_do_przodu(65)                                  'zacznij obrot
     Call L_do_tylu(65)
     Else
     Call P_do_przodu(90)
     Call L_do_przodu(90)
     End If
     If Obrot = 2000 Then                                  ' po ~4s. zacznij liczyc od nowa (i jedz prosto)
     Obrot = 0
     End If
  Return

  Gon:                                                     'podprogram ataku, silniki pelna moc i zapal diode
     Call P_do_przodu(255)                                 'dodatkowo zeruje licznik obrotu
     Call L_do_przodu(255)
     Led = 0
     Obrot = 0
  Return

  Pucieczka:                                               'podprogram ucieczki do tylu
  If Czas > 0 And Czas < 128 Then                          'jezeli odliczono ~polowe czasu, zacznij sie obracac
  Call P_do_tylu(255)
  Call L_do_przodu(255)
  End If
  If Czas > 129 Then                                       'jesli jeszcze nie, uciekaj pelna moca do tylu
  Call P_do_tylu(255)
  Call L_do_tylu(255)
  End If
  If Czas = 0 Then                                         'na koniec wroc do stanu 0 (szukanie i atak)
  Stan = 0
  End If
  Obrot = 0                                                'dodatkowo zeruje licznik obrotu
  Return


  Tucieczka:                                               'podprogram ucieczki do przodu
  If Czas > 0 Then                                         'cala moc do przodu i reszta analogicznie jak wyzej
  Call P_do_przodu(255)
  Call L_do_przodu(255)
  Else
  Stan = 0
  End If
  Obrot = 0
  Return

  Sub Sonar_reset                                          'podprogram resetujacy sonar
  Sonar_rst = 0
  Waitms 10
  Sonar_rst = 1
  Waitms 40
  End Sub

  Sub Sonar_impulsy(byval Impulsy As Byte)                 'podprogram ustawiajacy liczbe impulsow
  Stop Timer0                                              'wysylanych przez sonar
  I2cstart                                                 'na czas komunikacji z sonarem (i2c) zatrzymywany jest TIMER0
  I2cwbyte Sonar_adres_w                                   'aby nie powodowac konfliktu przerwan
  I2cwbyte &H10
  I2cwbyte &H04
  I2cwbyte Impulsy
  I2cstop
  Start Timer0
  End Sub

  Sub Sonar_pomiar(byval Wzmocnienie As Byte)              'podprogram ustawiajacy wzmocnienie, ustawienie wzmocnienia
  Stop Timer0                                              'powoduje wykonanie pomiaru przez sonar
  I2cstart
  I2cwbyte Sonar_adres_w
  I2cwbyte &H10
  I2cwbyte &H02
  I2cwbyte Wzmocnienie
  I2cstop
  Start Timer0
  End Sub



  Function Sonar_odczyt() As Word                          'funckcja zwracajaca odleglosc odczytana z sonaru
  Stop Timer0
  Dim Pomiar(2) As Byte                                    'zmienna pomocnicza
  I2cstart
  I2cwbyte Sonar_adres_w
  I2cwbyte &H20
  I2cstop
  I2cstart
  I2cwbyte Sonar_adres_r
  I2crbyte Pomiar(1) , Ack
  I2crbyte Pomiar(2) , Nack
  I2cstop
  Sonar_odczyt = Makeint(pomiar(1) , Pomiar(2))            'wartosc zmiennej pomocniczej (2*8bit) jest skladana
  Start Timer0                                             'w liczbe 16bitowa
  End Function

  Sub P_do_przodu(byval Szybkosc As Byte)                  'podprogramy ustawiajace predkosc i kierunek pracy silnikow
  A1 = 1
  A2 = 0
  Pwm1a = Szybkosc
  End Sub

  Sub P_do_tylu(byval Szybkosc As Byte)
  A1 = 0
  A2 = 1
  Pwm1a = Szybkosc
  End Sub

  Sub L_do_przodu(byval Szybkosc As Byte)
  B1 = 1
  B2 = 0
  Pwm1b = Szybkosc
  End Sub

  Sub L_do_tylu(byval Szybkosc As Byte)
  B1 = 0
  B2 = 1
  Pwm1b = Szybkosc
  End Sub

  Sub P_stop                                               'podprogramy zatrzymujace silniki
  A1 = 0
  A2 = 0
  End Sub

  Sub L_stop
  B1 = 0
  B2 = 0
  End Sub

Na zdjęciu przesyłam wygląd pcb.

Link do komentarza
Share on other sites

Teraz sprawdziłem

$crystal = 8000000                                          'czestotliwosc taktowania procesora
 $regfile = "m8def.dat"                                    'procesor to Atmega48, dla atmega8 nalezy


 A1 Alias Portb.0                                          'Linie sterujace silnikiem A
 A2 Alias Portd.7
 B1 Alias Portd.6                                          'Linie sterujace silnikiem B
 B2 Alias Portd.5
 Ena Alias Portb.1                                         'Linia do wlaczania silnika A
 Enb Alias Portb.2                                         '... i silnika B

 'Konfiguracja kierunku pracy portow
Config Portb = Output
Config Portd = Output





Do

A1 = 0
A2 = 1
B1 = 0
B2 = 1
Ena = 1
Enb = 1



 Loop                                                      'koniec petli glownej




 End

przy takim czymś działa 😃 to teraz pomóżcie co w tamtym jest źle, proszę.

__________

Komentarz dodany przez: Nawyk

Popraw, proszę, sygnaturkę na regulaminową:

4.Podpis (sygnatura):

a) Sygnatura nie może zawierać więcej niż 255 znaków, oraz zajmować więcej niż 4 linijki tekstu (niezależnie od jego rozmiaru).

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Wiesz na razie sam mam problem 🙁 pierwsze że robot nie reaguje na sonar kółka cały czas się kręcą do przodu, a o pwm nie wspominam 😕 Poza tym może ktoś wie dlaczego po zmanie w kodzie

Ddrb = &B00111111
  Ddrd = &B11100001
  Ddrc.3 = 1

na

Config Portb = &B00111111
  Config Portd = &B11100001
  Config Portc.3 =1 

silniki zaczęły się kręcić ale nic więcej pwm nie działa itp.

Link do komentarza
Share on other sites

Witaj,

1. Zamieść schemat.

2.Na stronie KoNaR'u są programy do testowania poszczególnych podzespołów:

'============================================================
 '*           Program testowy do robota minisumo             *
 '*                            ---                           *
 '*                           KoNaR                          *
 '*                            ---                           *
 '*                   Program testuje silniki                *
 '*                                                          *
 '*                   www.konar.pwr.wroc.pl                  *
 '============================================================



  'Polecenia dla kompilatora
  $crystal = 8000000                                       'czestotliwosc taktowania procesora
  $regfile = "m48def.dat"                                  'procesor to Atmega48, dla atmega8 nalezy
                                                            'wpisac "m8def.dat", dla atmega88/168 analogicznie
                                                            '"m88def.dat" i "m168def.dat"
  'Ustawienie Aliasow
  Led Alias Portd.0                                        'Do tego pinu podlaczona jest dioda LED2
  A1 Alias Portb.0                                         'Linie sterujace silnikiem A
  A2 Alias Portd.7
  B1 Alias Portd.6                                         'Linie sterujace silnikiem B
  B2 Alias Portd.5
  Ena Alias Portb.1                                        'Linia do wlaczania silnika A
  Enb Alias Portb.2                                        '... i silnika B

  'Konfiguracja kierunku pracy portow
  Ddrb = &B00111111
  Ddrd = &B11100001
  Ddrc 0.3 = 1

  'Konfiguracja stanow portow
  Portb 0.7 = 1
  Portb 0.6 = 1
  Portd 0.1 = 0
  Portd 0.2 = 0
  Portd 0.3 = 0
  Portd 0.4 = 0
  Portc 0.4 = 0
  Portc 0.5 = 0


  'Dekleracja funkcji i procedur
  Declare Sub L_do_przodu(byval Szybkosc As Byte)
  Declare Sub L_do_tylu(byval Szybkosc As Byte)
  Declare Sub P_do_przodu(byval Szybkosc As Byte)
  Declare Sub P_do_tylu(byval Szybkosc As Byte)
  Declare Sub L_stop
  Declare Sub P_stop

  'Konfiguracja PWM dla silnikow
  Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 64


  'Program glowny

  Led = 0                                                  'zapal diode na 1 sekunde i zgas
  Wait 1
  Led = 1

  'Petla glowna

  Do
  Call L_do_przodu(255)                                    'oba kola z pelna predkoscia do przodu
  Call P_do_przodu(255)
  Wait 1                                                    'i tak przez sekunde
  Led = 0                                                  'dodatkowo zapal diode
  Call L_stop                                              'oba silniki stop
  Call P_stop
  Wait 1
  Led = 1                                                  'zgas diode
  Call L_do_tylu(255)                                      'oba kola z pelna predkoscia do tylu
  Call P_do_tylu(255)
  Wait 1
  Led = 0
  Call L_stop
  Call P_stop
  Wait 1
  Led = 1
  Call L_do_przodu(255)                                    'skret w lewo
  Call P_do_tylu(255)
  Wait 1
  Led = 0
  Call L_stop
  Call P_stop
  Wait 1
  Led = 1
  Call L_do_tylu(255)                                      'skret w prawo
  Call P_do_przodu(255)
  Wait 1
  Led = 0
  Call L_stop
  Call P_stop
  Wait 1
  Led = 1
  Call L_do_przodu(100)                                    'i jeszcze raz to samo tylko wolniej
  Call P_do_przodu(100)                                    'liczba w nawiasie odpowiada szybkosci - stopniowi
  Wait 1                                                   'wypelnienia sygnalu PWM podawanego na wejscie
  Led = 0                                                  'wyzwalajace sterownika silnikow. 0-wypelnienie 0%
  Call L_stop                                              '255-wypelnienie 100%, kazdy silnik ma inny
  Call P_stop                                              'prog wypenienia, przy ktorym zacznie sie krecic
  Wait 1                                                   'nalezy go dobrac doswiadczalnie
  Led = 1
  Call L_do_tylu(100)
  Call P_do_tylu(100)
  Wait 1
  Led = 0
  Call L_stop
  Call P_stop
  Wait 1
  Led = 1
  Call L_do_przodu(100)
  Call P_do_tylu(100)
  Wait 1
  Led = 0
  Call L_stop
  Call P_stop
  Wait 1
  Led = 1
  Call L_do_tylu(100)
  Call P_do_przodu(100)
  Wait 1
  Led = 0
  Call L_stop
  Call P_stop
  Wait 1
  Led = 1


  Loop                                                     'koniec petli glownej


  Sub P_do_przodu(ByVal Szybkosc As Byte)                  'podprogramy ustawiajace predkosc i kierunek pracy silnikow
  A1 = 1
  A2 = 0
  Pwm1a = Szybkosc
  End Sub

  Sub P_do_tylu(ByVal Szybkosc As Byte)
  A1 = 0
  A2 = 1
  Pwm1a = Szybkosc
  End Sub

  Sub L_do_przodu(ByVal Szybkosc As Byte)
  B1 = 1
  B2 = 0
  Pwm1b = Szybkosc
  End Sub

  Sub L_do_tylu(ByVal Szybkosc As Byte)
  B1 = 0
  B2 = 1
  Pwm1b = Szybkosc
  End Sub

  Sub P_stop()                                             'podprogramy zatrzymujace silniki
  A1 = 0
  A2 = 0
  End Sub

  Sub L_stop()
  B1 = 0
  B2 = 0
  End Sub
Link do komentarza
Share on other sites

Tak jak wspominałem musiałem zmienić to

Ddrb = &B00111111
            Ddrd = &B11100001
            Ddrc.3 = 1

na

   Config Portb = &B00111111
   Config Portd = &B11100001
   Config Portc.3 =

inaczej nie chciał ruszyć 😉 a testy też robiłem i nie wiele z nich wynikało. Ale nareszcie jest sukces 😉 Zaczął reagować na sonar oraz inne czujniki, okazało się że błąd jest na moje płytce w ustawieniach pinów pod sonar i się nie zgadzały->mój błąd 😉

Ale dziwi mnie to że sonar tak jak by musiał się rozgrzać bo na początku cały czas jak by coś widział a dopiero po pewnym czasie reaguje poprawnie czyli jak na przykład przyłożę rękę to atakuje. Nie wiem co to jest ale jeśli ktoś z was wie co z tym robić byłbym wdzięczny 😉 schemat jeszcze jak by ktoś chciał zobaczyć w załączniku 😉

minisumo_ver21.pdf

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!

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