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

[ATmega8][C][UART][8-bit] - zakłocenia na najstarszym bicie

pkacper0 17 Lut 2009 17:17 1892 8
REKLAMA
  • #1 6163531
    pkacper0
    Poziom 10  
    Witam,
    Komunikuję się z komputerem PC za pośrednictwem protokołu RS232 wykorzystując do tego celu USART ATmegi8 aktualnie ustawiony na:
    - transmicja 8-bitowa (dla 7-bitowej wszystko przebiega zgodnie z zalozeniem),
    - 1 bit stopu (identyczna sytuacja dla 2 bitow),
    - 2400 bps...

    Podczas przesyłania danych wystepują zakłócenia na najstarszym bicie.

    **********************************************************

    Fragmenty kodu kontrolera:
    (...)
    void usart_ini(unsigned int baud){

    UBRRH = (unsigned char) (baud>>8);
    UBRRL = (unsigned char) baud;

    UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<RXCIE);

    UCSRC = (1<<URSEL) | (1<<USBS) | (3<<UCSZ0) | (3<<UPM0);

    }
    (...)
    void usart_trans(unsigned char data){

    while ( !( UCSRA & (1<<UDRE)) );

    UDR = data;

    }
    (...)
    int main(){
    (...)
    usart_trans(10);
    (...)

    **********************************************************

    Dane otrzymywane przez komputer

    (...)
    00001010
    00001010
    00001010
    10001010
    10001010
    10001010
    10001010
    10001010
    10001010
    10001010
    10001010
    10001010
    10001010
    10001010
    00001010
    00001010
    10001010
    10001010
    10001010
    10001010
    (...)


    ********************************************************


    Co może być tego przyczyną? Podkreślę, że dla komunikacji 7-bitowej wszystko przebiega bez zastrzeżeń.

    Dodam jeszcze, że zakłócenia zwiększają się wraz ze zwiększeniem taktowania kontrolera (dla 2MHz - komunikacji praktycznie idealna, dla 8MHz - najstarszy bit jest ciągle jedynką). Czyżby brak synchronizacji z PC? Jak można temu zaradzić?
  • REKLAMA
  • REKLAMA
  • #3 6163826
    pkacper0
    Poziom 10  
    Podaje Baud Rate

    usart_ini(baud);

    W moim przypadku 103 (4Mhz -> 2400 bps).
  • REKLAMA
  • Pomocny post
    #4 6164451
    Terminator
    Poziom 23  
    według Twoich ustawień z 1 postu mamy :
    2 bity stopu (1<<USBS) , transmisja 8bit (3<<UCSZ0) oraz ustawiony tryb nieparzystości (3<<UPM0)
    Czy takie same ustawienia są na kompie ?
  • REKLAMA
  • #5 6166488
    pkacper0
    Poziom 10  
    Są dokładnie takie. Sprawdzałem również dla 1 bitu stopu stąd mała nieścisłość.
  • Pomocny post
    #6 6167164
    szelus
    Poziom 34  
    A zegar w mikrokontrolerze masz jaki? Wewnętrzny?
  • #7 6167250
    pkacper0
    Poziom 10  
    Tak, korzystam z wewnętrznego taktowania.
  • Pomocny post
    #8 6171208
    vcd_a
    Poziom 18  
    Próbowałeś różnych terminali? Osobiście polecam RealTerm, spróbuj zwiększyć prędkość, zobacz co się dzieje przy 1 bicie stopu, pozdrawiam Krzysiek

    Napisz o efektach, jak nie działa to podrzucę Ci kawałki swojego kodu :-)
  • #9 6172702
    pkacper0
    Poziom 10  
    Dziękuję wszystkim za zaangażowanie. Dla potomnych: poradziłem sobie zwiększają lekko wartość Baud Rate do 106 przy parametrach opisanych powyżej (wg dokumentacji powinno być 103). Widocznie wewnętrzny zegar się trochę rozkalibrował... Teraz działa bez zarzutu. W ramach testu spróbuje podłączyć taktowanie zewnętrzne.

    Pozdrawiam i dziękuję za odpowiedzi,
    Paweł Adam K.
REKLAMA