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.

[AT91S7SAM128] UART wysyła same 0.

24 Lip 2008 10:15 2291 13
  • Poziom 13  
    Witam
    Mam napisaną procedurę inicjalizacji UART0 oraz procedurę wysyłki rejestru 16bitowego, transmisja startuje aczkolwiek w Terminalu odbieram same 0, nie ważne co wysyłam z uC ;/
    U kolegi, który ma takie same wyjście UARTu i wykorzystuje te same procedury, wszystko działa...
    Parametry wysyłki mam takie same w Terminalu oraz w rejestrach uC.
    Jeśli by był błąd na płytce np. zimny lut to transmisja by wogóle nie doszła do skutku, prawda? Albo coś mam upalone? Ale co jeśli bez inicjalizacji i odpalenia wysyłania, na linii jest cisza ?
    Linia transmisyjna wygląda następująco:
    Za uC jest bariera (ADUM1401 bodajże), potem konwerter z RS232 na RS485 (SP485), od PC jest tylko konwerter z RS232 na RS485.
    Linii nie mam na odwrót podpiętej tj. +A<-> -B, gdyż w tym przypadku nic nie rusza. Napięcie różnicowe początkowe na linii RS485 wynosi ~4V na +A i 0V na -B. Wyrównanie mas obu konwerterów jest.
    Co może być przyczyną ?
    Dzięki za wszelkie sugestie.

    Poprawiłem tytuł:
    https://www.elektroda.pl/rtvforum/topic1015361.html
    [c_p]
  • Specjalista - Mikrokontrolery
    znaczy ten sam kod i tem sam hardware dzialaja u kolegi?

    jesli tak, to moze cos z twoim kompem jest nie tak, sprobuj na innym. jesli zas kolega ma inne konwertery, to moze przetestuj te jego. bo hipotetyzowac to my mozemy sobie dlugo [;

    4\/3!!
  • Poziom 13  
    hehe, no gdybać to można długo...
    Chodziłoby mi bardziej o opinię kogoś kto się zna na zależnościach tego interfejsu... dlaczego wysyłam zmienne różne, a otrzymuję zawsze 0 - przy jakich warunkach jest to możliwe ? czy tylko przy źle dobranych parametrach transmisji (różne na we i wy), czy również jeśli któraś z linii jest źle podłączona lub "wisi".

    Transmisją mogę sterować ale gubię przesyłane bajty ;/
    Znajomy ma taki sam uC wraz z linią sygnałową UART, wszystko identyczne. Hardware oraz software dotyczący UARTu są identyczne, a moduł podpinałem do 3 różnych PeCetów i na wszystkich o samo ;/

    ps. aktualnie nie mam możliwości przetestować swojego modułu na konwerterach znajomego ;/
  • Specjalista - Mikrokontrolery
    1. jesli dostajesz nieodmiennie same zera, to nie ma to raczej wiele wspolnego z parametrami transmisji IMHO, na pewno zas nie ma nic wspolnego z predkoscia, bo przy zlej predkosci odbieralbys losowe (mniej wiecej) smieci, ale na pewno nie same zera. zero to pernamentny stan niski (czy tam wysoki) na linii danych.
    2. moze padniety jest uart w procesorze? jesli masz oscyloskop / analizator stanow to zobacz, co sie tam dzieje na liniach TX i czy wyglada to na poprawna transmisje.

    4\/3!!
  • Poziom 13  
    Ciężko u mnie z oscyloskopem, ale w wolnej chwili odpalę drugi kanał UARTu i zobaczę czy ruszy. Poza tym przelecę grotem po pinach jeszcze raz, może to coś pomoże.
    Odezwię się jak coś już będę wiedział, dzięki za zainteresowanie.
    Oczywiście nie rezygnuję z Waszych podpowiedzi ;)
    pozdrawiam;)

    ps. najdalej do soboty będę coś wiedział, bo teraz to ciężko z wolnym czasem;/
  • Poziom 38  
    Weź lepiej powiedz czy używasz kontroli przepływu, jak tak chwilo olej i pozwieraj linie...
  • Poziom 13  
    Do kontroli przepływu danych wykorzystuję jedynie sygnał RTS. Niestety teraz nie mam czasu żeby się tym bawić ;/ jak tylko znajdę chwilę to sprawdzę i odpiszę.
    pozdro
  • Poziom 13  
    Hmmm... miałem kiedyś podobnie w ATtiny 2313, mimo że deklarowałem rożne znaki do wysłania przez mikrokontroler, komputer odbierał tylko C z ogonkiem. Po paru godzinach męki okazało się że miałem ustawiony bit odpowiedzialny za dzielenie częstotliwości kwarcu przez 8 (CKDIV8). Wychodzi na to, że jeśli masz rożne prędkości transmisji, to co byś nie wysyłał, zawsze dostajesz to samo ;)

    Mogę się mylić, bo generalnie to jestem świeżak w temacie.

    Pozdrawiam
  • Poziom 38  
    Mylisz się.
    Dostaniesz to samo, nadając to samo.
  • Poziom 17  
    Oczywiście, że możliwe jest odebranie ciągu jednakowych bajtów od nadajnika mimo że on wysyła różne dane. Przy różnym baudrate tzn. nadajnik 8,9 razy niższy baud niż odbiornik występuje sytuacja w której po IDLE( odpowiednik 1 logiczne) wysyłamy startbit( odpowiednik 0 logiczne). Trwa on przez okres startbitu i ośmiu pozostałych biciorów. Po nim nadajnik wysyła najniższy bit danych który jest logicznym 1 co odbiornik interpretuje jako stopbit( logiczne 1 ). Wszystko jest ok, ramka jest zachowana( start i stop bit), bajt( same 0) zostaje przyjęty, sterownik zjada a terminal wypluwa( wypluje zero?) na ekranie. I tak się dzieje przy każdym bicie. Jeśli nadajnik wysyła kilka bitów 0 po sobie to odbiornik nie widzi stopbitu, wyrzuca framing error.
    To samo może dziać się przy nadajniku z wyższym baudrate. Odbiornik sampluje bity w momencie gdy nadajnik wysłał stopbit i linia jest już w stanie idle. Teraz nie ma nawet framing error. I pewnie jeszcze pełno sytuacji w których jest to możliwe.
    UART zakłada transmisję przy jednakowym baudrate. Bez tego sieczka i przypadek.
    Kolega alex2c otrzymuje odpowiedź więc coś tam macha pinem TX w at91.
    Nie wiem co dzieje się gdy RTS zniknie w środku transmisji bajciora.
    Pozdrawiam
  • Poziom 27  
    Jeśli w terminalu odbierasz "0" niezależnie od tego co wysyłasz, to jak kolega powyżej pisze prawdopodobnie jest problem z błednie ustawionymi baudrate po stronie kompa albo procka. Może masz coś z pętlą PLL (zimne luty itp) w SAM i nie generauje zegara takiego jak powinien. Wypróbuj jakiś inny terminal.Jest na sieci sporo innych lepszych od Windowsowego Hyper Terminala.
  • Poziom 13  
    witam
    Wczoraj udało mi się troszeczkę posiedzieć przy module i oto do czego doszedłem.
    Linie sygnałowe są połączone, zasilanie jest w porządku. Napięcia na liniach komunikacyjnych +A i -B przy połączeniu modułu z PC jak i nie podczas ciszy wynoszą odpowiednio ~ +4V i oV.
    Tak więc pomyślałem, że jednak coś musi być z softem. Początkowo miałem jedną funkcję wysyłającą rejestr typu INT na linię RS w pętli nieskończonej, otrzymywałem same zera na PC.
    Gdy dam rozkaz wysyłki przed pętlą while{1} to na wyjściu otrzymuję jedno 0, gdy dam w szeregu więcej takich rozkazów to również otrzymuję tylko jedno 0. Wiem, że uC przechodzi przez wszystkie rozkazy bo na końcu zapalam diodę i rzeczywiście się tak dzieje.
    Zamieszczam poniżej listing, proszę was o małą analizę. Może jest gdzieś tam jakiś robal, który u kumpla nie robi wielkich szkód, a u mnie jest klęska ;/ Chociaż byłoby to dziwne, dwa te same uC, to samo rozwiązanie hardware'owe wyjść komunikacyjnych...

    Code:

    /*zegar 48MHz*/
    #define BRD 26 //

    void UART0_Open( void )
    {
       BASE_PMC->PMC_PCER = 1<<ID_US0;       //wlaczenie zegara dla USART0
       BASE_US0->US_IDR = 0xFFFFFFFF;         //wylaczenie przerwan od US0
       BASE_PIOA->PIO_PDR = 1<<RX0 | 1<<TX0 | 1<<RTS0; //zalaczenie urzadzenia peryf A
       
       
       BASE_US0->US_CR =   AT91C_US_RSTRX|
                   AT91C_US_RSTTX|
                   AT91C_US_RXDIS|
                   AT91C_US_TXDIS;      /# reset & disable UART #/

       BASE_US0->US_MR =   AT91C_US_USMODE_RS485|
                   AT91C_US_CLKS_CLOCK|
                   AT91C_US_CHRL_8_BITS|
                   AT91C_US_PAR_NONE|
                   AT91C_US_NBSTOP_1_BIT;

       BASE_US0->US_BRGR = BRD;   // Baud Rate Divisor
       
       // konfiguracja DMA dla UART0
       BASE_PDC_US0->PDC_PTCR =    AT91C_PDC_RXTDIS | AT91C_PDC_TXTDIS; //wylacznie PDC
       
          
       //BASE_US0->US_TTGR = 0;
       BASE_US0->US_RTOR = 12; //Time_out w bitach.


       BASE_US0->US_CR =AT91C_US_TXEN | AT91C_US_RXEN | AT91C_US_RTSEN;
       
       // konfiguracja DMA dla UART0
       BASE_PDC_US0->PDC_PTCR = AT91C_PDC_RXTEN | AT91C_PDC_TXTEN; //wlaczenie PDC

    }


    void uart0_putreg (unsigned int reg)
    {
    int i,t;
       for (i=3; i>=0; i--)
       {
          while (!(BASE_US0->US_CSR & AT91C_US_TXRDY));   /* Wait for Empty Tx Buffer

    */
          
          t = reg>>i*8;
          
          BASE_US0->US_THR = t;              /* Transmit Data */
          
       }

    }




    adamusx, nie korzystam z WIN terminala, może Cię to zmyliło, że pisałem z dużej litery ;) Korzystam z Terminal v1.9b by Br@y, jego poprzedniej wersji oraz z DockLight.

    Na pętli PLL jest raczej wszystko OK, czy uC pracuje na 18MHz czy na 48MHz to dzieje się to samo.
  • Poziom 17  
    W jednym z wątków zamieściłem tutorial J.Lyncha na temat UART-a w mikrokontrolerach SAM7.Zajrzyj tam może znajdziesz coś co ci się przyda.

    pz
  • Poziom 13  
    Witam
    Sprawa się wyjaśniła ;)
    Konwerter, którego używałem był jakiś felerny ;/
    Przy wykorzystaniu innego wszystko śmiga aż miło ;]
    pozdrawiam i thx za porady!