Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

atmega8 - Inicjacja USART

adi1525 29 Sie 2014 21:26 1005 12
  • #1 29 Sie 2014 21:26
    adi1525
    Poziom 14  

    Witam, zrobiłem transmisje szeregową z komputerem przez USART, teraz gdy zacząłem się wgłębiać w tą transmisję mam kilka problemów i nie mam pojęcia o co chodzi. Otóż zrobiłem transmisję z prędkością 9600bps, resztę danych zostawiłem domyślnie czyli ramka 8 bitów, 1 bit stop i bez parzystości. Później gdy nie ustawiałem domyślnych, tylko wpisałem wszystkie wartości, transmisja przestała działać. Co robię źle ?
    Tutaj kod:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Gdy sprawdziłem domyślne wartości UCSZ0,UCSZ1 mają wartość 0 a domyślnie powinny mieć ustawione 1.

    Również nie rozumiem pewnej rzeczy odnośnie bitu URSEL wiem, że gdy jest wartość 0 to korzysta się z UBRRH a gdy 1 to UCSRC, więc czemu w katalogu atmegi jest napisane:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Przecież domyślnie ma 1 więc powinno się go zerować przy UBRRH. Mógłby ktoś mi pomóc to zrozumieć ? ;)

    0 12
  • Pomocny post
    #2 29 Sie 2014 21:49
    BlueDraco
    Specjalista - Mikrokontrolery

    UCSRC i UBRRH to jeden rejestr. Jeśli zapisujesz do niego wartość z zerem na bicie 7 - to zapisujesz UBRRH; jeśli z jedynką - zapisujesz UCSRC.

    Przykład z katalogu właśnie to ilustruje. Zapisujesz wartość z zerem na b7 - i zapis idzie do UBRRH, następnie zapisujesz wartość zawierającą 1 << URSEL - i zapis idzie do UCSRC. Zwróć uwagę, że obie nazwy - UBRRH i UCSRC oznaczają dokładnie to samo, a użycie raz jednej, raz drugiej służy wyłączenie przejrzystości kodu.

    Zerowanie bitów, które domyślnie są zerami przy użyciu instrukcji &= ~cośtam jest mało sensowne i służy zaciemnianiu kodu. Podobie nie ma sensu ustawiania bitów pojedynczo. Zapis taki, jak w przykładzie z datasheet (zwykłe podstawienie pod UCSRS zamiast ustawiania bitów pojedynczo) jest czytelniejszy.

    0
  • #3 29 Sie 2014 21:59
    adi1525
    Poziom 14  

    BlueDraco napisał:
    UCSRC i UBRRH to jeden rejestr. Jeśli zapisujesz do niego wartość z zerem na bicie 7 - to zapisujesz UBRRH; jeśli z jedynką - zapisujesz UCSRC.


    To wiem, ale miałem na myśli to, że bit URSEL domyślnie ustawiony jest jako 1, więc czemu w tym przykładzie nie zostaje ten bit wyzerowany, żeby zapisać wartość do UBRRH ??

    0
  • Pomocny post
    #4 29 Sie 2014 22:14
    excray
    Poziom 39  

    adi1525 napisał:
    więc czemu w tym przykładzie nie zostaje ten bit wyzerowany, żeby zapisać wartość do UBRRH

    UBRRH = 0x02 - rozpisz sobie binarnie tą wartość (0x02) i sprawdź jaką wartość przyjął siódmy bit czyli URSEL.

    0
  • #5 29 Sie 2014 22:28
    adi1525
    Poziom 14  

    No w sumie excray, to by się zgadzało ;) patrzyłem tylko na to, że ta wartość zapisuje się do UBRR i zapomniałem że tam jest URSEL. Dobra a wracając do ustawienia długości ramki, czemu przy takim ustawieniu nie działa ?? I co z tymi wartościami domyślnymi UCSZ0,UCSZ1 ?? Gdy sprawdzam je np w symulacji na Atmel Studio czy przez if'a to wychodzi, że są ustawione jako 0.

    Zauważyłem jedną ciekawą rzecz, otóż gdy mam napisane ustawienie bita w ten sposób:
    UCSRC |= _BV(URSEL);
    UCSRC |= (1<<UCSZ0);
    UCSRC |= (1<<UCSZ1);
    To nie działa, nie ustawia ich. Lecz gdy zrobię tak

    UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);
    Wszystko działa, dlaczego tak się dzieje ??

    0
  • Pomocny post
    #6 31 Sie 2014 09:14
    BlueDraco
    Specjalista - Mikrokontrolery

    Dlaczego nie napiszesz po prostu tak:

    UCSRC = 1<<URSEL | 1<<UCSZ0 | 1<<UCSZ1;

    - bez zbędnych operatorów i sztucznego pompowania objętości kodu zarówno źródłowego, jak i wynikowego.

    Dlaczego sekwencja |= nie działa - nie wiem. Czy nie działa na żywym uC, czy na symulatorze? Jeśli to drugie - to błąd symulatora, jeśli to pierwsze - niezgodność układu z dokumentacją.

    Z drugiej strony - po co w ogóle stosować taką sekwencję? żeby program był dłuższy w zapisie i wolniej się wykonywał?

    0
  • #7 31 Sie 2014 13:06
    adi1525
    Poziom 14  

    Nie chodzi mi o to żeby pisać tak cały program. Po prostu jak się uczę to w taki sposób szybko mogę ustawiać i zerować bity.

    A w tym:

    UCSRC = 1<<URSEL | 1<<UCSZ0 | 1<<UCSZ1;

    nie wiem jak w np. UCSZ1 ustawić wartość 0.

    I własnie nie działa to na uC, jak by to nie działało na symulatorze to dałbym sobie spokój, bo tam jest dużo błędów. W tym przypadku zastanawiam się czy to błąd czegoś w układzie czy ja coś źle robię.

    Mam jeszcze pytanie, czy któraś symulacja pozwala na sprawdzenie ustawienia początkowych bitów ? Ponieważ w Atmel Studio przy włączeniu programu bity które powinny być ustawione jako 1, są wyzerowane.

    0
  • Pomocny post
    #8 31 Sie 2014 13:39
    tmf
    Moderator Mikrokontrolery Projektowanie

    Jeśli bitowi chcesz nadać wartość 0 to po prostu nie nadajesz mu wartości 1 - proste, prawda? Oczywiście tylko w sytuacji w której stosujesz zapis np. UCSRC=, a nie UCSRC|=.
    Co do błędów w symulatorze to jakie masz na myśli? Dobra rada - dopóki nie osiągniesz istotnego stopnia wtajemniczenia, porzuć myśl o błędach w kompilatorze, symulatorze itd. Jeśli błędy gdzieś są to najpewniej w twoim programie lub zbudowanym układzie elektronicznym.
    Wartości początkowe rejestrów podane są w nocie katalogowej mikrokontrolera, można je też odczytać na symulacji - skoro w symulacji masz inne wartości rejestrów niż początkowe po resecie, to znaczy, że coś im te wartości nadało - fragment programu, który się do tej pory wykonał. Innej możliwości nie ma.

    0
  • #9 31 Sie 2014 14:26
    adi1525
    Poziom 14  

    No tak proste, ale UCSZ0 i UCSZ1 są ustawione domyślnie jako 1, więc jak ich nie ustawie to będą dalej 1.
    Stworzyłem nowy projekt w którym dołączyłem tylko bibliotekę io.h, nic więcej, włączyłem program i bity UCSZ0 i UCSZ1 są wyzerowane, a np. bit UDRE, który powinien być ustawiony jako 1, ma wartość 1. Nie mam pojęcia co jeszcze może to powodować.

    0
  • #10 31 Sie 2014 15:20
    BlueDraco
    Specjalista - Mikrokontrolery

    A konkretnie to z czym masz problem?

    io.h nie jest biblioteką, tylko plikiem nagłówkowym.

    0
  • #11 31 Sie 2014 18:05
    adi1525
    Poziom 14  

    Po pierwsze, w symulatorze w Atmel Studio bity UCSZ0 i UCSZ1 są wyzerowane choć powinny być ustawione, a w programie nie ustawiam żadnych bitów.
    Po drugie, da się sprawdzić ustawienie jakiegoś bita przez takie sprawdzenie??

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Tak samo jak odczytuje się stan napięcia na portach??

    0
  • Pomocny post
    #12 31 Sie 2014 18:12
    tmf
    Moderator Mikrokontrolery Projektowanie

    Skoro są wyzerowane, to widać powinny być, jakie to ma znaczenie? Skoro wpisujesz coś do tego rejestru to i tak musisz stan tych bitów ustalić...
    A sprawdzenie można zrobić tak jak w przypadku portów, tyle, że zamiast UCSZ1, które zawiera tylko numer bitu należy zastosować (1<<UCSZ1) lub _BV(UCSZ1), żeby zamienić nr bitu na maskę bitową.

    0
  • #13 01 Wrz 2014 19:29
    adi1525
    Poziom 14  

    Oki dzięki za pomoc, temat uważam za zamknięty.

    0