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

Atmega128 RS232: LCD nie wyświetla tekstu bez programatora SPI/LPT

pateroo 06 Cze 2012 13:39 3076 15
  • #1 10973249
    pateroo
    Poziom 9  
    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 / C++
    Zaloguj się, aby zobaczyć kod


    Atmega128 RS232: LCD nie wyświetla tekstu bez programatora SPI/LPT Atmega128 RS232: LCD nie wyświetla tekstu bez programatora SPI/LPT

    Dodano po 3 [minuty]:

    Atmega128 RS232: LCD nie wyświetla tekstu bez programatora SPI/LPT

    Dodano po 6 [sekundy]:

    Atmega128 RS232: LCD nie wyświetla tekstu bez programatora SPI/LPT

    Scaliłem 3 posty.
    [zumek]
  • #2 10974066
    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ć.
  • #3 10974956
    pateroo
    Poziom 9  
    Schematy:

    Atmega128 RS232: LCD nie wyświetla tekstu bez programatora SPI/LPT Atmega128 RS232: LCD nie wyświetla tekstu bez programatora SPI/LPT Atmega128 RS232: LCD nie wyświetla tekstu bez programatora SPI/LPT Atmega128 RS232: LCD nie wyświetla tekstu bez programatora SPI/LPT Atmega128 RS232: LCD nie wyświetla tekstu bez programatora SPI/LPT Atmega128 RS232: LCD nie wyświetla tekstu bez programatora SPI/LPT

    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ę =)
  • #4 10994128
    pateroo
    Poziom 9  
    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 / C++
    Zaloguj się, aby zobaczyć kod


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


    Uart.h
    Kod: C / 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?
  • #5 11003378
    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.
  • #6 11004105
    pateroo
    Poziom 9  
    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 / C++
    Zaloguj się, aby zobaczyć kod
  • #7 11008943
    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.
  • #8 11009146
    pateroo
    Poziom 9  
    Tyle że nie mogę napisac samego rs'a bo robot się nie uruchomi..
  • #9 11010557
    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.
  • #10 11014741
    pateroo
    Poziom 9  
    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?
  • #11 11014892
    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).
  • #12 11015266
    pateroo
    Poziom 9  
    Kod programu na kompa jest kilka postów wyżej.
    To jakie gotowe programy byś polecał?
  • #13 11015367
    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ż.
  • #14 11019780
    slx
    Poziom 19  
    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 / C++
    Zaloguj się, aby zobaczyć kod
  • #15 11020268
    pateroo
    Poziom 9  
    To jak powinienem podać wartość do tej funkcji:
    USART_Init() ?
REKLAMA