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] USART. Po zaprogramowaniu nie działa poprawnie

Krzysiek_k1984 29 Lip 2008 00:19 1511 4
REKLAMA
  • #1 5387454
    Krzysiek_k1984
    Poziom 13  
    Witam.

    Zrobiłem sobie układzik, który mierzy napięcie i wynik przesyła po RS'ie do kompa. Niestety po zaprogramowaniu nie działał on poprawnie, dlatego postanowiłem sprawdzić komunikację pomiędzy układem a komputerem. Program zmieniłem tak, że uP ciągle wysyła liczbę 15 a terminal powinien mi ją odebrać. Niestety tak się nie dzieje. Oto co dostaję 80 00 i tak w kółko. Transmisję w terminalu jak i w uP ustawiłem na 2400 baud. ATmega taktowana jest kwarcem 3,686400MHz.
    Fuse bity ustawiłem tak:
    [ATmega16][C] USART. Po zaprogramowaniu nie działa poprawnie

    Gdy zmienię baud na 1200 w samym terminalu to otrzymuję F8 00.
    Może ktoś ma jakieś sugestie co może być nie tak?

    Aha kod obsługi RS'a mam identyczny z datasheet'em. A kod odpowiedzialny za inicjalizację wygląda następująco:
    
    void rs_init(long int baud)
    {
    	UBRRH=(unsigned char)((F_CPU/(2*baud)-1)>>8);
    	UBRRL=(unsigned char)(F_CPU/(2*baud)-1);
    	UCSRB=(1<<RXEN) | (1<<TXEN);
    	UCSRC=(1<<URSEL) | (3<<UCSZ0);
    }
    
  • REKLAMA
  • #2 5387952
    Krzysiek_k1984
    Poziom 13  
    Ustawiłem w terminalu na PC baud 300 i o dziwo odbieram 0F - czyli to co wysyłam. Nie wiem tylko gdzie mam błąd skora w uP ustawiłem na 2400. Fuse bity też chyba ok.

    Dodano po 33 [minuty]:

    Już wiem co było źle. Po prostu wcześniej korzystałem z USARTa synchronicznego w którym inaczej oblicza się baud rate (Fosc=baud/2(UBRR-1)), a w asynchronicznym jest zamiast 2 liczba 16. Mój błąd. :)
  • REKLAMA
  • REKLAMA
  • #4 5388284
    BoskiDialer
    Poziom 34  
    Problem polega na złej wartości wpisywanej do UBRR[H,L]: w dokumentacji na stronie 148 są wzory z których liczy się wartość dla UBRR: w kodzie liczysz dla trybu synchronicznego (F_CPU/(2*baud)-1) a powinieneś liczyć dla asynchronicznego w trybie normalnym (F_CPU/(16*baud)-1) - w przeciwnym przypadku transmisja wychodzi 8 razy wolniej: w kodzie masz 2400 bodów, a tak naprawdę ustawiasz 300 bodów - tutaj otrzymałeś poprawną wartość co jest dowodem tego błędu.

    Dodano po 57 [sekundy]:

    Aj.. jak wiedziałeś co było źle, to czemu nie zamknąłeś tematu?
  • #5 5388442
    Krzysiek_k1984
    Poziom 13  
    Dzięki wszystkim za pomoc:) Rzeczywiście zapomniałem zamknąć temat. Sorki.
REKLAMA