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

[amtmega16][winavr] uart problem

sieciech 05 Cze 2010 16:03 1497 16
REKLAMA
  • #1 8158102
    sieciech
    Poziom 12  
    Hej mam płytke evbavr05 z atmega16 propoxa. Próbuję odpalić transmisję po RSie. I lipa. Znaki owszem trafiają z PC do atmegi, ale niestety w drugą stronę już nie. Przedzowniłem płytkę - połączenia od gniazdka do st3232 są poprawne, tak samo od mikroproca do st3232. Program wziąłem od propoxa, ale też testowałem kod, który jest w datashecie atmegi. Zawsze to samo. Kable też sprawdziłem - są ok (przy zwarciu rx i tx na kablu na terminalu jest echo)

    Wartosci rejsetrów uartu są następujące (po wywołaniu funkcji UART_putchar:
    UCSRA :00100000
    UCSRB: 11011000
    UCSRC: 0x00

    inicjalizacja rsa:
    
    void UART_init(unsigned int ubrr) 
    {
      /* 4800 bit/s */
      UBRRH = (unsigned char)(ubrr>>8);
      UBRRL = (unsigned char)ubrr;
      UCSRB = _BV(TXCIE)|_BV(RXCIE)|_BV(RXEN)|_BV(TXEN);
      /* 8-bit dane, 1-bit stopu, prak bitu parzystosci */
      UCSRC = (1<<URSEL)|(0<<USBS)|(3<<UCSZ0);  
    }
    

    wysylanie danych:
    
    
    void UART_putchar(char c)
    { 
      UDR = c;                                // wpisz c do rejestru UDR
      loop_until_bit_is_set(UCSRA,TXC);       // czekaj na zakonczenie transmisji
      UCSRA |= _BV(TXC);                       // ustaw bit TXC w rej. USR
    }
    


    Z góry dzięki za wszelką pomoc

    Proszę poprawić pisownię!
    Robak
  • REKLAMA
  • #2 8158114
    _Robak_
    Poziom 33  
    Putchar powinien wyglądać następująco

    
    void uart_putc(unsigned char ch) 
    { 
        
      loop_until_bit_is_set(UCSRA,UDRE); 
      UDR=ch; 
          
    }
    
  • REKLAMA
  • #3 8159825
    sieciech
    Poziom 12  
    Hej niestety oprócz tego, że bit USART Transmit Complete w UCSRA jest ustawiony, to nic to nie dało. Nadal nic nie otrzymuje na rsie, ściągnąłem sobie jakiś super podgląd rs'a i widzę, że tylko linia txd (w pececie) mi chodzi.

    pzdr
  • #4 8159859
    gaskoin
    Poziom 38  
    bo nie ma byc bit transmitt complete ustawiony, tylko empty transmit buffer UDRE

    przeczytaj dokladnie kod robaka
  • #5 8161186
    sieciech
    Poziom 12  
    Wybacz, ale przeczytałem uważnie. Wkelojny kod powoduje ustawienie bitu Transmit Complete w UCSRA, a nie powoduje wysłania znaku.

    pzdr
  • REKLAMA
  • #6 8161333
    _Robak_
    Poziom 33  
    Cytat:

    Wkelojny kod powoduje ustawienie bitu Transmit Complete w UCSRA

    Że co proszę?
  • REKLAMA
  • #8 8161464
    sieciech
    Poziom 12  
    zgodnie z datasheetem:

    Cytat:
    This flag bit is set when the entire frame in the transmit Shift Register has been shifted out and
    there are no new data currently present in the transmit buffer (UDR). The TXC Flag bit is automatically
    cleared when a transmit complete interrupt is executed, or it can be cleared by writing
    a one to its bit location. The TXC Flag can generate a Transmit Complete interrupt (see description
    of the TXCIE bit).
  • #9 8162463
    gaskoin
    Poziom 38  
    sulfur napisał:
    Nic, po prostu koledzy mają problemy z interpretacją kodu.


    mnie w to nie wciagaj :)

    sieciech napisał:
    zgodnie z datasheetem:

    Cytat:
    This flag bit is set when the entire frame in the transmit Shift Register has been shifted out and
    there are no new data currently present in the transmit buffer (UDR). The TXC Flag bit is automatically
    cleared when a transmit complete interrupt is executed, or it can be cleared by writing
    a one to its bit location. The TXC Flag can generate a Transmit Complete interrupt (see description
    of the TXCIE bit).


    zgadza się, więc czekanie na pojawienie sie flagi TXC jest bez sensu, sens ma czekanie na flage UDRE
  • #10 8163442
    sieciech
    Poziom 12  
    Zatem program jest ok. W takim razie problem może być w układzie st3232. macie jakieś pomysły jak sprawdzić poprawność działania tego układu ?
  • #11 8163509
    sulfur
    Poziom 24  
    Kto powiedział, że program jest OK ? Może nie obsługujesz przerwania od TXCIE ?
  • #12 8163685
    sieciech
    Poziom 12  
    co masz na myśli przez obsługę przerwania ? Imho nie jest to konieczne. TXCIE ustawia się, jeśli chce się mieć przerwanie po wysłaniu znaku. (dodam, że niewiele pomogło usuniecie usatwiania tego bitu w UCSRB)
  • #13 8163701
    gaskoin
    Poziom 38  
    sulfur napisał:
    Kto powiedział, że program jest OK ? Może nie obsługujesz przerwania od TXCIE ?


    nie musi, tj napisal wyzej


    Ale moglbys wrzucic wiecej tego kodu + moze schemat elektryczny ? bo tak to lipa :)
  • #14 8163709
    sulfur
    Poziom 24  
    Czego nie musi ? Obsługiwać przerwania jak z niego korzysta ? A kolega wie może co to jest "bad interrupt" ?
  • #15 8163862
    Maciekqbn
    Poziom 15  
    sulfur napisał:
    Kto powiedział, że program jest OK ? Może nie obsługujesz przerwania od TXCIE ?


    Przy nadawaniu konieczne jest, przed wysłaniem znaku do UDR sprawdzenia stanu UDRE w UCSRA, tak jak słusznie wskazał _Robak_ a później ironicznie potwierdził sulfur. Oryginalna procedura wysyłania znaków przedstawiona przez autora tematu jest błędna. Może mój post już nic nowego nie wnosi ale nie mogłem się powstrzymać czytając te dyskusję.
    Zastanawiam się też, po co autor używa przerwania TXCIE, z przedstawionego kodu to nie wynika a zatem IMHO nie ma sensu.

    sieciech napisał:
    Zatem program jest ok. W takim razie problem może być w układzie st3232. macie jakieś pomysły jak sprawdzić poprawność działania tego układu ?


    Pomijając oczywistości, o których wyżej, możesz sprawdzić układ ST3232B w następujący sposób:

    1. Na złączu RS232 (DB9F) zewrzyj piny 2 i 3 (RXd i TXd).
    2. Sprawdź stan na pinie RXD (listwa MISC) - powinien być wysoki.
    3. Zewrzyj do GND pin TXD (listwa MISC).
    4. Sprawdź stan na pinie RXD (listwa MISC), powinien być przeciwny do tego, który był uprzednio.
  • #16 8164102
    sieciech
    Poziom 12  
    reasumując:
    1) wyrzuciłem TXCIE (wspomniałem o tym parę postów wcześniej) 2) kod wysyłania zmieniłem na ten, który przedstawił _Robak_. Niestety nic to nie pomogło. 3) testowałem także z użyciem biblioteki uart - http://homepage.hispeed.ch/peterfleury/group__pfleury__uart.html (tu wysyłanie i odbiór zorganizowany jest na przerwaniach (uwzgledniłem to w inicjlalizacji)) i efekt był ten sam - odbiór działa a wysyłanie nie.

    wieczorem sprawdzę tego st3232 zgodnie z twoimi wskazówkami.

    Sprawdziłem ten układ jak mówiłeś, i w obu przypadkach mam napięcie +5,80 V

    Moderowany przez _Robak_:

    Proszę nie pisać posta pod postem, oba scaliłem.

  • #17 8171915
    Maciekqbn
    Poziom 15  
    Są dwie możliwości, albo masz rzeczywiście coś skopane sprzętowo na płycie, albo źle mierzysz. Zmierzyłem na moim egzemplarzu płyty stany i L=0,01V, H=5,07V.
    Teoretycznie nie powinno być więcej niż 5V ale wartość napięcia zasilającego układ to u mnie 5,09V.

    Wartość zmierzona przez Ciebie 5,8V jest stanowczo zbyt wysoka. Ponadto jak napisałeś stan się nie zmienia - mogłoby to wskazywać na uszkodzenie układu ST3232, najbardziej zastanawia jednak to 5,8V, sprawdź układ zasilania na płytce.
REKLAMA