Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Komunikacja [RS232] w [C] dla robota na Atmega128

06 Cze 2012 13:39 2845 15
  • Poziom 8  
    Kiedy zgrywam mój program dzieją się dziwne rzeczy, kiedy programator
    jest podłączony do SPI i LPT po włączeniu robota LCD wyświetla napis,
    który jest ustawiony w nieskończonej pętli programu (1.jpg w
    załączniku)
    Kiedy programator nie jest podpięty robot po włączeniu włacza LCD, ale
    nic nie wyświetla.
    Kiedy bez podłączonego programatora podłącze kabel do rs'a zapalają
    się obie lampki przy gniazdku, ale nadal LCD nic nie wyświetla (2.jpg)

    Czy ktoś mógłby zerknąć na kod, może robię jakiś banalny błąd którego nie mogę zauważyć.
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Komunikacja [RS232] w [C] dla robota na Atmega128 Komunikacja [RS232] w [C] dla robota na Atmega128

    Dodano po 3 [minuty]:

    Komunikacja [RS232] w [C] dla robota na Atmega128

    Dodano po 6 [sekundy]:

    Komunikacja [RS232] w [C] dla robota na Atmega128

    Scaliłem 3 posty.
    [zumek]
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.

  • Poziom 30  
    ATmega128 w nietypowy sposób ma wyprowadzone linie programatora ISP, na piny E0 i E1, które podczas normalnej pracy są wykorzystywane jako UART. Wstawiłeś tam multiplekser 4053 czy zwarłeś programator z UART-em?

    Pokaż schemat, to będzie można więcej powiedzieć, bo póki co można zgadywać.
  • Poziom 8  
    Schematy:

    Komunikacja [RS232] w [C] dla robota na Atmega128 Komunikacja [RS232] w [C] dla robota na Atmega128 Komunikacja [RS232] w [C] dla robota na Atmega128 Komunikacja [RS232] w [C] dla robota na Atmega128 Komunikacja [RS232] w [C] dla robota na Atmega128 Komunikacja [RS232] w [C] dla robota na Atmega128

    Dodano po 1 [minuty]:

    Ja nie robiłem tego robota, to była czyjaś praca magisterska. Ja go tylko oprogramowuje, więc wrzucam praktycznie wszystkie schematy które mam.
    Będę wdzięczny za każą wskazówkę =)
  • Poziom 8  
    Udało mi sie pójść krok dalej, robot przestał wariować, ale kiedy próbuje wysłać mu coś przez RSa, nic się nie dzieje.
    Ogólnie kiedy włączam robota zapala się lampka przy RS, która odpowiada wysyłanie, a kiedy podłączam kabel do RSa to zapala się też lampka od odbioru.
    Kod z robota:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    a tutaj kod programu, który odpalam na komputerze do komunikacji:
    Uart.cpp
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Uart.h
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Używam przejściówki USB-RS232, ale po zainstalowaniu sterowników w Menadżerze urządzeń pojawił mi się normalnie COM3, więc to raczej jest ok.

    Nie wiem czy problem leży po stronie Atmegi czy komputera.
    Jakieś pomysły?
  • Poziom 38  
    Po pierwsze sprawdź samą transmisję.
    Zakomentuj całą resztę i sprawdź migając jakąś diodą czy jest łączność.
    Po drugie usuń swoją funkcję opóźnienia i zastosuj delay_us() czy ms dołączając <util/delay> do plików nagłówkowych.
    Twoją funkcję kompilator wytnie- nie mam tylko pewności czy całą.
    Po trzecie- w głównej pętli wywołujesz funkcję blokującą USART_receive co sprawia że program wpada w pętlę i czeka aż coś przyjdzie.
    Równocześnie masz obsługę przerwania od odbioru- albo jedno albo drugie.
    Program robi wrażenie sklejonego z różnych kawałków- raz jest SIGNAL a potem ISR.
  • Poziom 8  
    Naniosłem poprawki do kodu, nie mam jak sprawdzić komunikacji diodą, bo nie mam jak się z nią podłączyć (przynajmniej nie wiem jak to zrobić).
    Zmieniłem przejściówkę USB-RS na kabel RS-RS z crossowaniem, ale wydaje mi się, że jest jeszcze gorzej, bo teraz po podłączeniu kabla nie zapala się dioda odbioru przy porcie, która przy przejściówce zapalała się.
    Próbowałem zrobić sam odbiór na robocie i dopisałem jakiegoś if'a który miał po otrzymaniu znaku '0' ruszyć. Nie ruszył.

    Jak mogę inaczej zbadać gdzie jest błąd, bo teraz kod uprościłem chyba do minimum.

    PS. Pod spodem załączam aktualny kod ;)





    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 38  
    To nie jest uproszczony kod.
    Wszystko robisz w jednym pliku- a przecież zasadą C jest rozdzielenie tego na małe funkcje i sprawdzanie tego po kolei.
    Najpierw sprawdź czy komunikacja przez RS jest dobra.
    Tylko RS i nic więcej.
  • Poziom 8  
    Tyle że nie mogę napisac samego rs'a bo robot się nie uruchomi..
  • Poziom 38  
    Już Ci pisałem- program należy pisać i uruchamiać po kawałku a nie wszysto naraz.
    Jak nie sprawdzisz czy działa Ci RS to i tak go nie uruchomisz.
  • Poziom 8  
    Wrzuciłem sam kawałek od RSa, ale nic nie ruszyło. Cały czas idą śmieci. Może ten program który odpalam na komputerze jest zły?
  • Poziom 38  
    Po pierwsze- nie wiem jaki program.
    Ściągnij sobie jakiś program terminala, skonfiguruj go tak jak w procesorze (prędkość, parzystość i bity stopu).
    Potem coś wyślij i wyświetl.
    No i dobierz częstotliwość zegara w procesorze tak aby nie było zbyt dużych błędów baudrate (2% maksimum).
  • Poziom 8  
    Kod programu na kompa jest kilka postów wyżej.
    To jakie gotowe programy byś polecał?
  • Poziom 38  
    realterm, putty.
    Poszukaj- program terminal.
    Jaki Ci będzie pasował.
    Bo w programie jaki masz w komputerze w C++ to Ci nie pomogę.
    Zresztą powtarzam- programy na procesor pisze się i sprawdza ich działanie po kawałku.
    Pewnie na komputer też.
  • Poziom 18  
    A z jaką częstotliwością jest taktowany procesor i jaką prędkość transmisji sobie życzysz. Bo jeżeli jest tak jak w zakomentowanej linijce
    Cytat:
    #define OSC 16000000 //czestotliwosc oscylatora

    i prędkość rs232
    Cytat:
    int SetupUart(char *Port="COM3", int baud=9600, int Bitsize=8, int StopBits=1, int Parity=NOPARITY);

    to to sie nijak nie zgadza z tym
    Cytat:
    USART_Init ( 5 );

    a poza tym lepiej używaj normalnej baud rate i makra przeliczającego na wartości do wpisania do rejestrów UBRR*
    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 8  
    To jak powinienem podać wartość do tej funkcji:
    USART_Init() ?