Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek 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

pateroo 06 Cze 2012 13:39 2728 15
  • #1 06 Cze 2012 13:39
    pateroo
    Poziom 7  

    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]

    0 15
  • #2 06 Cze 2012 18:23
    leonow32

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

    0
  • #3 06 Cze 2012 22:32
    pateroo
    Poziom 7  

    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ę =)

    0
  • #4 12 Cze 2012 17:32
    pateroo
    Poziom 7  

    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?

    0
  • #5 15 Cze 2012 07:10
    janbernat
    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.

    0
  • #6 15 Cze 2012 13:09
    pateroo
    Poziom 7  

    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

    0
  • #7 16 Cze 2012 22:48
    janbernat
    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.

    0
  • #8 16 Cze 2012 23:52
    pateroo
    Poziom 7  

    Tyle że nie mogę napisac samego rs'a bo robot się nie uruchomi..

    0
  • #9 17 Cze 2012 14:36
    janbernat
    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.

    0
  • #10 18 Cze 2012 18:24
    pateroo
    Poziom 7  

    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?

    0
  • #11 18 Cze 2012 18:57
    janbernat
    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).

    0
  • #12 18 Cze 2012 20:23
    pateroo
    Poziom 7  

    Kod programu na kompa jest kilka postów wyżej.
    To jakie gotowe programy byś polecał?

    0
  • #13 18 Cze 2012 20:44
    janbernat
    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ż.

    0
  • #14 19 Cze 2012 21:11
    slx
    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

    0
  • #15 19 Cze 2012 22:26
    pateroo
    Poziom 7  

    To jak powinienem podać wartość do tej funkcji:
    USART_Init() ?

    0