Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 19 sty 2026, o 18:57


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 27 lis 2016, o 23:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 gru 2014
Posty: 88
Pomógł: 2

Proszę o potwierdzenie/korektę moich przemyśleń dotyczących poniższego fragmentu inicjalizacji UART:
void USART_Init( uint16_t baud ) {
UBRRH = (uint8_t)(baud>>8);
UBRRL = (uint8_t)baud;
.
.
}
W rejestrze UBRRH ustaw 0b0000 0000 (rzutowanie na 8 bitów i przesuń w prawo o 8 bitów czyli wypełnij zerami), natomiast do rejestru UBRRL wprowadź zmienną baund ośmiobitową (rzutowanie) czyli ustaw prędkość transmisji.
ENDE



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2016, o 23:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Argumentem ten funkcji jest UBRR, a jak się go prawidłowo oblicza znajdziesz tutaj:
http://mirekk36.blogspot.co.uk/2013/01/ ... trick.html
Wartość tego argumentu może przekroczyć 8 bitów (255) dlatego musi być zapisany w dwóch bajtach: UBRRH i UBRRL.
Do UBRRL wpisywane jest ostatnie 8 bitów (najmłodszych, najmniej znaczących), a do UBRRH (najstarszych, najbardziej znaczących) ze zmiennej 2 bajtowej uint16_t baud czyli UBRR.

Twoje rozumowanie jest OK tylko, że nie zawsze w UBRRH będzie 0b00000000, prawda?
Zobacz na zrzuty ekranu z programu Putty z linka wyżej, a przekonasz się, że przyjmuje wartości np 416, 383 itd



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2016, o 23:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 gru 2014
Posty: 88
Pomógł: 2

Jeżeli argument (bound > niż 8bitów) wówczas w inicjalizacji nie będzie UBRRH = (uint8_t)(baud>>8);
tylko UBRRH = (uint8_t)(a co tutaj)

znając Mirka nie może być tutaj błędu raczej ja czegoś nie rozumiem.
A może tak:
dalej będzie UBRRH = (uint8_t)(baud>>8) bo po przesunięciu o 8 bitów w prawo zostanie właśnie 8 bitów starszych z argumentu 16bitowego ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2016, o 00:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Zobacz np dla baud równe 416 musimy użyć zmiennej 16 bitowej uint16_t baud.
Binarnie to będzie 0b00000001 10100001,
więc musimy dokonać jawnego rzutowania typu na uint8_t, by do UBRRL trafił ten najmłodszy bajt:
UBRRL = (uint8_t)baud;
UBRRL = 0b10100001
Jeśli chodzi o UBRRH to chcemy wpisać 0b00000001, aby to uzyskać to oprócz rzutowania typu na uint8_t trzeba go jeszcze przesunąć w lewą (w prawą ;) ), stronę o 8 bitów żeby wpadł w miejsce tego młodszego bitu.



Ostatnio edytowano 28 lis 2016, o 00:41 przez anshar, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2016, o 00:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 gru 2014
Posty: 88
Pomógł: 2

Przemyślę to co napisałeś, dzięki za dialog pracując samemu czasami trudno o spojrzenie z boku, ale wiesz co nie rozumiem dlaczego mówisz o przesunięciu w lewo



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2016, o 00:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Podłącz sobie 8 diod LED do jednego z portów np PORTC i sprawdź sobie:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


fobos napisał(a):
Przemyślę to co napisałeś, dzięki za dialog pracując samemu czasami trudno o spojrzenie z boku, ale wiesz co nie rozumiem dlaczego mówisz o przesunięciu w lewo

Jasne, mój błąd! W prawą stronę, oczywiście! ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2016, o 00:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 gru 2014
Posty: 88
Pomógł: 2

Podsumowując: po rzutowaniu zmiennej baund 16bitowej na 8bitową UBRRH = (uint8_t)(baud>>8) i po przesunięciu o 8 bitów w prawo w rejestr UBRRH są wpisywane starsze (8bitów) ze zmiennej 16bitowej bound.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2016, o 00:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Podsumowując: Po dokonaniu przesunięcia bitowego zmiennej uint16_t baud o 8 miejsc w prawo i rzutowaniu na typ uint8_t w rejestr UBRRH są wpisywane starsze (8bitów) z tej zmiennej. ;)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2016, o 01:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 gru 2014
Posty: 88
Pomógł: 2

Dzięki bez tej rozmowy nie wiedziałbym że:
1. najpierw przesunięcie o 8 bitów,
2. później rzutowanie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2016, o 11:24 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27446
Lokalizacja: Szczecin
Pomógł: 1045

mpo napisał(a):
zamiast liczyć "na piechotę"?

A kto liczy na piechotę ;) ? ... liczy makro #define ..... a przy okazji jak widzisz początkujący mogą się czegoś nauczyć - zamiast zawsze korzystać tylko z gotowca ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lis 2016, o 12:12 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27446
Lokalizacja: Szczecin
Pomógł: 1045

mpo napisał(a):
A to makro #define uwzględnia użycie bitu USE_2X w celu redukcji błędów?

W tym nie ma ale to tylko prosta przeróbka wzoru. Poza tym kto używa 2X ? ;) jak już to bardzo rzadko i przy 100% pewności taktowania jak już bo to mniej bezpieczne jeśli chodzi o błędy.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO