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

[ATmega16][C] UART i przesłanie 0x00

Myrek1 08 Wrz 2008 21:55 1960 11
REKLAMA
  • #1 5518024
    Myrek1
    Poziom 23  
    Mam problem z przesłaniem 0x00 przez uart do kompa. Dane inne niż zero w bajcie przesyła dobrze. Mam taki kod:

    void uart_init(void)
    {
    	UBRRH = (unsigned char) (ZAWARTOSC_UBRR >> 8); //ustawienie prędkości
    	UBRRL = (unsigned char) ZAWARTOSC_UBRR;
    	UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); //8bitowe slowo, bit parzystosci, bit stopu
    	UCSRB = _BV(RXEN)| _BV(TXEN) | _BV(RXCIE);
    
    }
    
    void uart_wyslij(char znak)
    {
    	while(!(UCSRA & (1 << UDRE)));
    	UDR = znak;
    }
    
    uart_wyslij(0x00);
    uart_wyslij(0x01);
    uart_wyslij(0x11);


    I mam takie dane przy odbiorze:



    [ATmega16][C] UART i przesłanie 0x00

    Widać, że zamiast 0x00 jest 0xC0, zamiast 0x01 jest 0x81, ale przy 0x11 jest już ok, tak jak przy innych bajtach bez zera np. 0x12, 0xf2 etc. Czasem te złe bajty są inne niż 0x81 czy 0x0C.

    Dlaczego?
  • REKLAMA
  • #2 5518161
    adamusx
    Poziom 27  
    Sprawdz czy na pewno masz ustawione takie same parametry transmisji w uC jak i w terminalu (predkość transmisji, bity stopu, parzystości itp)
  • #3 5518201
    Myrek1
    Poziom 23  
    Oczywiście, że sprawdziłem.
    Zastanawiam się, czy wpisując 0x00 do SPDR następuje przesłanie zer, czy zignorowanie tego, bo w końcu standardowo rejestr ma 0x00?
  • REKLAMA
  • #4 5518221
    crazy_phisic
    VIP Zasłużony dla elektroda
    SPDR jest w momencie inicjacji niezdefiniowany, natomiast UDR - o którego zapewne chodzi ma wartość 0.
  • #5 5518316
    Myrek1
    Poziom 23  
    Pomyliłem rejestry, SPDR jest od SPI, chodzi o UDR. To czy po wpisaniu do UDR wartości 0, następuje jej wysłanie (mimo, że rejestr UDR nie zmienia stanu)?
  • REKLAMA
  • #6 5518382
    KonusiK
    Poziom 12  
    Nie jestem pewien, bo jeszcze tego nie sprawdzałem, ale obstawiałbym,że tak, jest 0x00 jest wysyłany.

    W manualu jest napisane,że UDRE jest ustawiany po wysłaniu całego bajtu - czyli mamy odpowiednią logike zliczającą przesuniecia w FIFO. Ponadto, UDRE jest kasowany przy załadowaniu jakiejkolwiek wartości. Zatem spodziewać sie można,że jeśli masz właczoną transmisje, to automatycznie po przesłaniu bajtu urchamiana jest transmisja.

    Ale jak mówie - to tylko mój domysł. Dziś niestety nie mam dostępu do AVR.

    Tak BTW. polecam program X-CTU jako terminal do UARTA na PC. Rewelacyjny i bardz intuicyjny.

    Dodano po 12 [minuty]:

    Myrek1 napisał:

    UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); //8bitowe slowo, bit parzystosci, bit stopu
    UCSRB = _BV(RXEN)| _BV(TXEN) | _BV(RXCIE);



    Jeszcze raz sprawdź bity stopu na kompie - o ile jestem zorientowany, to masz ustawione 2 bity stopu. A tak wogóle... to nie jest bezpieczniej zrobić:
    
    UCSRC |= _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0);
    


    Nie wiem jaka jest default'owa wartość UCSRC po resecie, wiec może przypisałbym wartość konkretną, albo przynajmniej dał '|=' (OR logiczne)
  • REKLAMA
  • #7 5518450
    mgradzki
    Poziom 16  
    Spróbuj użyć jakiegoś innego terminala na PC.



    Kiedyś napisałem sobie kawałek softu w VB.Net do komunikacji kontroler/PC i po tygodniu dochodzenia, czemu raz działa jak należy, a raz nie zauważyłem, że przy niektórych znakach program odbiera co innego niż było nadane. Jak łączyłem się WinTermem wszystko było OK.

    Przypuszczam, że operując na typie char (w .Net dwubajtowe) program wykonywał sobie jakieś dziwne konwersje i słał/odbierał nie to, co trzeba.
    Wszystko ustąpiło jak zacząłem operować na typie byte.
  • Pomocny post
    #8 5518789
    szelus
    Poziom 34  
    KonusiK napisał:
    Nie jestem pewien, bo jeszcze tego nie sprawdzałem, ale obstawiałbym,że tak, jest 0x00 jest wysyłany.

    Oczywiście, że jest wysyłany. Procesory jeszcze nie wyewoluowały w kierunku pobierania danych przez osmozę czy telepatię ;)

    Myrek1 napisał:
    Widać, że zamiast 0x00 jest 0xC0, zamiast 0x01 jest 0x81, ale przy 0x11 jest już ok, tak jak przy innych bajtach bez zera np. 0x12, 0xf2 etc. Czasem te złe bajty są inne niż 0x81 czy 0x0C.

    A masz podłączony kwarc? Jaki? Czy na wewn. oscylatorze? Bo jeżeli to ostatnie, to może być problem niedokładności zegara.
  • Pomocny post
    #9 5518951
    KonusiK
    Poziom 12  
    szelus napisał:

    Oczywiście, że jest wysyłany. Procesory jeszcze nie wyewoluowały w kierunku pobierania danych przez osmozę czy telepatię ;)


    Jeszcze nie wyewoluwały? Dammit... Dałbym głowe,że mój jest inny ;)

    Dodano po 2 [minuty]:



    A jeśli chodzi o X-CTU to ma możliwość podzielenia okna na dwie części - w jednej pokazuje wartości w Hexie a w drugim odpowiadające im znaki w kodzie ASCII.
  • #10 5519060
    Myrek1
    Poziom 23  
    Jednak problemem był oscylator wewnętrzny!
    Podłączyłem kwarc i działa.
    Zmyliło mnie to, że program dobrze wysyłał inne bajty, niż te zawierające zera, więc kilka zer w bajcie było dobrze wysłanych.
    Dzięki.
  • #12 5519104
    Myrek1
    Poziom 23  
    Tak, parametry są ok. Nie ma bitu parzystości (nie jest ustawiony bit UPM1 w programie).

    Teraz jest ok.
REKLAMA