Serwis Edukacyjny w I-LO w Tarnowie ![]() Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej Autor artykułu: mgr Jerzy Wałaszek |
©2023 mgr Jerzy Wałaszek |
https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines
Mikrokontroler ATmega64 posiada dwa moduły USART, USART0 i USART1. Działanie obu modułów USART jest opisane poniżej. USART0 i USART1 mają różne rejestry we/wy, co pokazano w podrozdziale "Opis rejestrów USART". W trybie kompatybilności z ATmega103 moduł USART1 jest niedostępny, również niedostępne są rejestry UBRR0H i UCRS0C. Oznacza to iż w trybie kompatybilności z ATmega103 mikrokontroler ATmega64 obsługuje tylko pracę asynchroniczną modułu USART0.
Uniwersalny synchroniczny i asynchroniczny szeregowy odbiornik i nadajnik (ang. Universal Synchronous and Asynchronous serial Receiver and Transmitter, USART) jest wysoko elastycznym szeregowym urządzeniem komunikacyjnym. Poniższy rysunek przedstawia uproszczony schemat blokowy nadajnika/odbiornika USART. Dostępne dla mikroprocesora rejestry i końcówki we/wy są opisane tłustym drukiem.
Moduł USART jest w pełni kompatybilny z AVR UART (ang. Universal Asynchronous Receiver/Transmitter – uniwersalny, asynchroniczny nadajnik/odbiornik) odnośnie:
Jednakże buforowanie odbiorcze posiada dwa ulepszenia, które wpłyną na kompatybilność w niektórych przypadkach specjalnych:
Następujące bity sterujące zmieniły nazwy, lecz posiadają te same funkcje i położenia w rejestrach:
Logika generacji zegara wytwarza podstawowy zegar dla odbiornika i nadajnika. USART obsługuje cztery tryby pracy zegara: asynchroniczny normalny (ang. Normal asynchronous), asynchroniczny o podwójnej szybkości (ang. Double Speed asynchronous), synchroniczny Master (ang. Master synchronous) oraz synchroniczny Slave (ang. Slave synchronous). Bit UMSELn w rejestrze C sterowania i stanu USART n (ang. USART Control and Status Register n C, UCSRnC) dokonuje wyboru pomiędzy pracą asynchroniczną a synchroniczną. Podwójna szybkość (tylko w trybie asynchronicznym) jest włączana przez bit U2Xn w rejestrze UCSRnB. Gdy używany jest tryb synchroniczny (UMSELn = 1), rejestr kierunku danych dla końcówki XCK (bit DDR_XCK) określa, czy źródło zegarowe jest wewnętrzne (tryb Master) lub zewnętrzne (tryb Slave). Końcówka XCK jest aktywna tylko przy korzystaniu z trybu synchronicznego.
Poniższy rysunek pokazuje schemat blokowy logiki generacji zegara.
Opis sygnałów: txclk – zegar nadajnika
(sygnał wewnętrzny). |
Wewnętrzna generacja zegara wykorzystywana jest w asynchronicznych i synchronicznych trybach pracy.
Rejestr n szybkości transmisji USART (ang. USART Baud Rate Register, UBRRn) wraz z podłączonym do niego licznikiem zliczającym w dół funkcjonują jako programowalny preskaler lub generator szybkości transmisji. Licznik wsteczny, pracujący z częstotliwością zegara systemowego (fOSC), jest ładowany wartością UBRRn za każdym razem, gdy licznik ten osiągnie wartość zero lub gdy nastąpi zapis do rejestru UBRRnL. Takt zegarowy jest generowany za każdym razem, gdy licznik osiąga zero. Zegar ten pojawia się na wyjściu generatora szybkości transmisji (= fOSC/(UBRRn+1)). Nadajnik dzieli zegar szybkości transmisji przez 2, 8 lub 16 w zależności od trybu pracy. Wyjście generatora szybkości transmisji jest używane bezpośrednio przez moduły zegara odbiornika i moduły rekonstrukcji danych. Jednakże moduły rekonstrukcji używają automatu stanu, który sam używa 2, 8 lub 16 stanów w zależności od trybu określanego ustawieniami bitów UMSELn, U2Xn i DDR_XCK.
Tabela poniżej zawiera równania do wyliczania szybkości transmisji fT (w bitach na sekundę) oraz wyliczania wartości UBRR dla każdego trybu pracy korzystającego z generowanego wewnętrznie źródła zegarowego.
Tryb pracy | Wzór na szybkość transmisji | Wzór na wyliczenie wartości UBRR |
---|---|---|
Tryb asynchroniczny normalny (U2X = 0) | ![]() |
![]() |
Tryb asynchroniczny podwójnej szybkości (U2X = 1) | ![]() |
![]() |
Tryb synchroniczny Master | ![]() |
![]() |
Szybkość przesyłu można podwoić przez ustawienie bitu U2Xn w rejestrze UCSRnB. Ustawienie tego bitu przynosi efekt tylko w trybie pracy asynchronicznej. Przy pracy synchronicznej ustaw ten bit na zero. Ustawienie bitu zmniejszy podzielnik w dzielniku częstotliwości transmisyjnej z 16 na 8, co w efekcie podwoi szybkość przesyłu danych w transmisjach asynchronicznych. Jednakże zauważ, iż odbiornik w tym przypadku będzie używał jedynie połowy próbek (ich liczba zmniejszy się z 16 na 8) przy próbkowaniu danych i rekonstrukcji sygnału zegarowego, a z tego powodu wymagane jest dokładniejsze ustawienie szybkości transmisji oraz zegara systemowego, gdy stosowany jest ten tryb. Dla nadajnika nie ma żadnych ograniczeń.
Taktowanie zewnętrzne wykorzystywane jest przez synchroniczne tryby pracy.
Wejście zegara zewnętrznego z końcówki XCKn jest próbkowane przez rejestr synchronizacyjny w celu zminimalizowania szansy powstania metastabilności (stanu nietrwałej równowagi). Sygnał wyjściowy z rejestru synchronizacji musi następnie przejść przez detektor zbocza, zanim będzie mógł być użyty przez nadajnik lub odbiornik. Proces ten wprowadza opóźnienie o okresie dwóch taktów zegara mikroprocesora i dlatego maksymalna częstotliwość zewnętrznego zegara XCKn jest ograniczona poniższym wzorem:
Zauważ, iż fOSC zależy od stabilności źródła zegara systemowego. Dlatego zaleca się dodanie pewnego marginesu w celu uniknięcia możliwej utraty danych z powodu zmian częstotliwości.
Gdy jest używany tryb synchroniczny (UMSELn = 1), końcówka XCKn będzie wykorzystywana albo jako wejście zegara (Slave), albo jako wyjście zegara (Master). Zależność pomiędzy zboczami zegara a próbkowaniem danych lub zmianą danych pozostaje taka sama. Podstawową zasadą jest, iż wejście danych (na końcówce RxDn) jest próbkowane na przeciwnym zboczu sygnału zegara XCKn niż zmiana wyjścia danych (TxDn).
Wykres czasowy dla trybu
synchronicznego XCK
Bit UCPOLn w rejestrze UCRSnC wybiera zbocza zegara XCK, które będą używane do próbkowania danych oraz do zmiany danych. Zgodnie z rysunkiem powyżej, gdy UCPOLn ma wartość zero, to dane będą zmieniane przy zboczu narastającym, a próbkowanie będzie się odbywało przy zboczu opadającym sygnału zegarowego XCK. Dla UCPOLn ustawionego na jeden kolejność zboczy jest odwrotna.
Ramka rozpoczyna się bitem startowym, po którym następuje najmniej znaczący bit danych. Następnie kolejne bity danych do maksymalnie dziewięciu, kończące się bitem najbardziej znaczącym. Bit parzystości/nieparzystości jest dołączany po bitach danych i przed bitem stopu, jeśli ta opcja została włączona. Gdy przesłana zostanie pełna ramka, może za nią natychmiast wystąpić nowa ramka lub linia komunikacyjna może przejść w stan bezczynny (wysoki). Poniższy rysunek ilustruje możliwe kombinacje formatów ramki. Bity w klamrach są opcjonalne:
St | – | bit startu, zawsze o stanie niskim. |
(n) | – | bity danych (0 do 8). |
P | – | bit parzystości/nieparzystości. |
Sp | – | bit stopu, zawsze o stanie wysokim. |
BEZCZYNNY | – | brak przesyłu przez linię komunikacyjną. Linia w stanie bezczynnym zawsze jest w stanie wysokim. |
Format ramki używany przez USART jest ustawiany za pomocą bitów UCSZn[2:0], UPMn[1:0] i USBSn w rejestrach UCSRnB i UCSRnC. Nadajnik i odbiornik wykorzystują te same ustawienia. Zauważ, iż zmiana tych ustawień w trakcie wykonywania transmisji zepsuje ją zarówno dla odbiornika jak i nadajnika.
Bity liczby bitów w ciągu danych USART (UCSZn[2:0]) wybierają liczbę bitów danych w ramce. Bity trybu parzystości USART (UPMn[1:0]) włączają oraz ustawiają rodzaj bitu parzystości. Wybór pomiędzy jednym lub dwoma bitami stopu dokonywany jest za pomocą bitu USBSn. Odbiornik ignoruje drugi bit stopu. Z tego powodu błąd ramki (ang. Frame Error, FEn) zostanie wykryty tylko wtedy, gdy pierwszy bit stopu będzie zerowy.
Bit parzystości/nieparzystości wyliczany jest za pomocą operacji alternatywy rozłącznej (ang. Exclusive-OR, XOR) na bitach danych:
a | b | a XOR b |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Jeśli zostanie wybrana nieparzystość, to wynik jest negowany. Wzory są następujące:
PP | – | bit parzystości. |
PN | – | bit nieparzystości |
dn | – | bit danych. |
Jeśli jest używany, to bit parzystości/nieparzystości jest umieszczany pomiędzy ostatnim bitem danych a bitem stopu w ramce szeregowej.
Przy ponownej inicjalizacji ze zmienioną szybkością transmisji lub formatem ramki upewnij się, że nie trwa jakakolwiek transmisja podczas zmiany zawartości rejestrów sterujących. Znacznik TXCn może być użyty do sprawdzenia, czy nadajnik zakończył wszystkie przesyły, a znacznik RXCn można użyć do sprawdzenia, czy w buforze odbiorczym nie pozostały żadne nieodczytane jeszcze dane. Zwróć uwagę, że znacznik TXCn należy wyzerować przed każdą transmisją (przed zapisem rejestru UDRn), jeśli jest on używany do tego celu. Poniższe kody inicjalizujące USART pokazują jedną funkcję w asemblerze oraz jedną funkcję w języku C, które wykonują tę samą pracę. Przykłady zakładają pracę asynchroniczną wykorzystującą śledzenie (bez włączonych przerwań) oraz ustalony format danych. Szybkość transmisji jest podana jako parametr funkcji. Dla kodu asemblerowego zakłada się, iż parametr szybkości transmisji został umieszczony w rejestrach r17:r16.
Przykład w kodzie maszynowym |
USART_Init: ; Ustaw szybkość transmisji out UBRRnH, r17 out UBRRnL, r16 ; Włącz odbiornik i nadajnik ldi r16, (1<<RXENn)|(1<<TXENn) out UCSRnB,r16 ; Ustaw format ramki: 8 bitów danych, 2 bity stopu ldi r16, (1<<USBSn)|(3<<UCSZn0) out UCSRnC,r16 ret |
Przykład w języku C |
#define FOSC 1843200 // Szybkość zegara #define BAUD 9600 #define MYUBRR FOSC/16/BAUD-1 void main( void ) { ... USART_Init ( MYUBRR ); ... } void USART_Init( unsigned int ubrr) { /* Ustaw szybkość transmisji */ UBRRnH = (unsigned char)(ubrr>>8); UBRRnL = (unsigned char)ubrr; /* Włącz odbiornik i nadajnik */ UCSRnB = (1<<RXENn)|(1<<TXENn); /* Ustaw format ramki: 8 bitów danych, 2 bity stopu */ UCSRnC = (1<<USBSn)|(3<<UCSZn0); } |
Można stworzyć bardziej zaawansowane funkcje inicjalizacji, które jako parametry posiadają format ramki, wyłączają przerwania, itd. Jednakże wiele aplikacji stosuje stałe ustawienia szybkości transmisji oraz zawartości rejestrów sterujących, a w takich typach aplikacji kod inicjalizujący może zostać umieszczony bezpośrednio w programie głównym lub być połączony z kodem inicjalizującym inne moduły we/wy.
Transmisja danych rozpoczyna się po załadowaniu do bufora nadawczego danych do wysłania. Mikroprocesor może załadować bufor nadawczy przez wpis do komórki we/wy UDRn. Buforowane dane w buforze nadawczym zostaną umieszczone w rejestrze przesuwającym, gdy będzie on gotowy na przesłanie nowej ramki. Rejestr przesuwający jest ładowany nowymi danymi, gdy znajduje się w stanie bezczynnym (nie jest wykonywana żadna transmisja) lub bezpośrednio po ostatnim bicie stopu poprzednio transmitowanej ramki. Gdy rejestr przesuwający zostanie załadowany nowymi danymi, prześle on jedną pełną ramkę z szybkością określoną przez rejestr szybkości transmisji oraz bit U2Xn lub XCK w zależności od trybu pracy.
Poniższe przykłady kodu pokazują prostą funkcję nadawczą USART opartą na śledzeniu stanu znacznika opróżnienia rejestru danych (ang. Data Register Empty, UDREn). Gdy wykorzystywane są ramki z mniej niż ośmioma bitami danych, najbardziej znaczące bity zapisane do rejestru UDRn zostaną zignorowane. USART musi zostać zainicjalizowany przed użyciem tej funkcji. Dla kodu asemblerowego wysyłane dane powinny znajdować się w rejestrze R16.
Przykład w kodzie maszynowym |
USART_Transmit: ; Czekaj na pusty bufor nadawczy sbis UCSRnA,UDREn rjmp USART_Transmit ; Umieść dane (r16) w buforze, co je wyśle out UDRn,r16 ret |
Przykład w języku C |
void USART_Transmit( unsigned char data ) { /* Czekaj na pusty bufor nadawczy */ while ( !( UCSRnA & (1<<UDREn)) ) ; /* Umieść dane (r16) w buforze, co je wyśle */ UDRn = data; } |
Uwaga | 1. | Dla rejestrów we/wy umieszczonych w rozszerzonej pamięci we/wy instrukcje IN, OUT, SBIS, SBIC, CBI i SBI należy zastąpić instrukcjami umożliwiającymi dostęp do rozszerzonej pamięci we/wy. Są to zwykle instrukcje LDS i STS w połączeniu z SBRS, SBRC, SBR i CBR. |
Funkcja po prostu oczekuje aż bufor nadawczy będzie pusty przez sprawdzanie znacznika UDREn, zanim załaduje go nowymi danymi do wysłania. Jeśli będzie wykorzystywane przerwanie przy pustym rejestrze danych (ang. Data Register Empty interrupt), to procedura obsługi tego przerwania zapisze dane do bufora.
Jeśli używane są ciągi danych 9-bitowe (UCSZn = 7), to dziewiąty bit musi być wpisany do bitu TXB8n w rejestrze UCSRnB, zanim młodszy bajt ciągu danych zostanie wpisany do UDRn. Poniższe przykłady kodu pokazują funkcję, która zajmuje się ciągami 9-bitowymi. Dla kodu asemblerowego dane do wysłania powinny być umieszczone w rejestrach R17:R16.
Przykład w kodzie maszynowym(1) |
USART_Transmit: ; Czekaj na pusty bufor nadawczy sbis UCSRnA,UDREn rjmp USART_Transmit ; Skopiuj 9-ty bit z r17 do TXB8 cbi UCSRnB,TXB8n sbrc r17,0 sbi UCSRnB,TXB8n ; Umieść LSB danych (r16) w buforze, co je wyśle out UDRn,r16 ret |
Przykład w języku C(1) |
void USART_Transmit( unsigned int data ) { /* Czekaj na pusty bufor nadawczy */ while ( !( UCSRnA & (1<<UDREn))) ) ; /* Skopiuj 9-ty bit z r17 do TXB8 */ UCSRnB &= ~(1<<TXB8n); if(data & 0x0100) UCSRnB |= (1<<TXB8n); /* Umieść LSB danych (r16) w buforze, co je wyśle */ UDRn = data; } |
Uwaga: | 1. | Te funkcje nadawcze zostały napisane
ogólnie. Można je zoptymalizować dla stałej zawartości
rejestru UCSRnB. Na przykład, po
inicjalizacji używany jest tylko bit TXB8n rejestru
UCSRnB. Dla rejestrów we/wy umieszczonych w rozszerzonej pamięci we/wy instrukcje IN, OUT, SBIS, SBIC, CBI i SBI należy zastąpić instrukcjami umożliwiającymi dostęp do rozszerzonej pamięci we/wy. Są to zwykle instrukcje LDS i STS w połączeniu z SBRS, SBRC, SBR i CBR. |
Dziewiąty bit można wykorzystać do oznaczania ramek adresowych w trybie komunikacji wieloprocesorowej lub do obsługi innych protokołów.
Nadajnik USART posiada dwa znaczniki, które wskazują jego stan: znacznik opróżnienia rejestru danych USART (ang. USART Data Register Empty, UDREn) oraz znacznik zakończenia nadawania (ang. Transmit Complete, TXCn). Oba znaczniki można użyć do wygenerowania przerwań.
Znacznik UDREn informuje, czy bufor nadawczy jest gotowy na przyjęcie nowych danych. Bit ten zostaje ustawiony, gdy bufor nadawczy staje się pusty, natomiast zostaje wyzerowany, gdy bufor zawiera dane, które nie zostały jeszcze przeniesione do rejestru przesuwającego. Dla zachowania kompatybilności z przyszłymi mikrokontrolerami zawsze zapisuj ten bit stanem zero przy zapisie do rejestru UCSRnA.
Gdy bit uaktywnienia przerwań przy pustym rejestrze danych (ang. Data Register Empty Interrupt Enable bit, UDRIEn) w UCSRnB zostanie zapisany stanem jeden, to będzie generowane przerwanie tak długo, jak bit UDREn jest ustawiony (pod warunkiem globalnego włączenia przerwań). Bit UDREn jest zerowany przez zapis rejestru UDRn. Gdy używana jest transmisja sterowana za pomocą przerwań, to procedura obsługi przerwania od pustego rejestru danych (ang. Data Register Empty interrupt) musi albo wpisać nowe dane do rejestru UDRn w celu wyzerowania bitu UDREn, albo wyłączyć to przerwanie, w przeciwnym razie nowe przerwanie zostanie wygenerowane tuż po zakończeniu obsługi obecnego.
Bit znacznika zakończenia nadawania (ang. Transmit Complete flag bit, TXCn) jest ustawiany na jeden, gdy cała ramka w nadawczym rejestrze przesuwającym została wysłana, a w buforze nadawczym nie ma obecnie żadnych nowych danych. Bit znacznika TXCn jest automatycznie zerowany po wywołaniu przerwania od zakończenia nadawania, lub można go wyzerować przez zapis jedynki na pozycji jego bitu. Znacznik TXCn przydaje się w interfejsach transmisji pół-dupleksowych (takich jak standard RS-485), gdzie aplikacja nadawcza musi wejść w tryb odbiorczy i zwolnić linię komunikacyjną natychmiast po zakończeniu transmisji.
Gdy jest ustawiony bit uaktywnienia przerwania przy zakończeniu nadawania (ang. Transmit Compete Interrupt Enable bit, TXCIEn) w rejestrze UCSRnB, przerwanie to zostanie wykonane w momencie ustawienia na 1 znacznika TXCn (pod warunkiem globalnego włączenia przerwań). Gdy wykorzystywane jest przerwanie od zakończenia nadawania, procedura jego obsługi nie musi zerować znacznika TXCn, ponieważ jest to robione automatycznie przy wywołaniu tej procedury.
Generator parzystości (ang. Parity Generator) oblicza wartość bitu parzystości dla danych ramki szeregowej. Gdy bit parzystości zostanie uaktywniony (UPMn1 = 1), logika sterująca transmisją wstawia ten bit parzystości pomiędzy ostatnim bitem danych a pierwszym bitem stopu wysyłanej ramki.
Wyłączenie nadajnika (ustawienie bitu TXENn na zero) nie wejdzie w życie aż do zakończenia obecnej transmisji oraz transmisji oczekujących, tj. do czasu aż nadawczy rejestr przesuwający oraz rejestr bufora nadawczego nie będą zawierać danych do wysłania. W stanie wyłączenia nadajnik nie będzie dalej przechwytywał końcówki TxDn.
Odbiornik rozpoczyna odbiór danych po wykryciu poprawnego bitu startu. Każdy bit po bicie startu będzie próbkowany wg wybranej szybkości transmisji lub wg zegara XCK, a następnie przesuwany do odbiorczego rejestru przesuwającego aż do odebrania pierwszego bitu stopu ramki. Drugi bit stopu zostanie zignorowany przez odbiornik. Gdy zostanie odebrany pierwszy bit stopu, tj. gdy pełna ramka szeregowa znajdzie się w odbiorczym rejestrze przesuwającym, to zawartość tego rejestru przesuwającego jest przenoszona do bufora odbiorczego, który może zostać następnie odczytany pod adresem we/wy UDRn.
Poniższy przykład kodu pokazuje prostą funkcję odbiorczą USART opartą na badaniu stanu znacznika zakończenia odbioru (ang. Receive Complete flag, RXCn). Dla ramek posiadających mniej niż osiem bitów danych bity najbardziej znaczące w rejestrze UDRn zostaną ustawione na zero. USART musi być zainicjalizowany przed użyciem tej funkcji.
Przykład w kodzie maszynowym |
USART_Receive: ; Czekaj na odbiór danych sbis UCSRnA, RXCn rjmp USART_Receive ; Pobierz odebrane dane z bufora in r16, UDRn ret |
Przykład w języku C |
unsigned char USART_Receive( void ) { /* Czekaj na odbiór danych */ while ( !(UCSRnA & (1<<RXCn)) ) ; /* Pobierz odebrane dane z bufora */ return UDRn; } |
Funkcja po prostu czeka na pojawienie się danych w buforze odbiorczym poprzez sprawdzanie stanu znacznika RXCn, po czym odczytuje zawartość bufora.
Jeśli wykorzystywane są ciągi danych 9-bitowe (UCSZn=7), to ten dziewiąty bit należy odczytywać z bitu RXB8n w rejestrze UCSRnB zanim odczytane zostaną młodsze bity z rejestru UDRn. Reguła ta odnosi się również do znaczników stanu FEn, DORn i UPEn. Odczytaj stan z rejestru UCSRnA, a później dane z UDRn. Odczyt komórki UDRn w obszarze we/wy zmienia stan bufora odbiorczego FIFO, a w konsekwencji zmienia również bity TXB8n, FEn, DORn i UPEn, które wszystkie znajdują się w FIFO.
Poniższy przykład kodu pokazuje prostą funkcję odbiorczą USART, która obsługuje zarówno 9-bitowe ciągi danych jak i bity stanu.
Przykład w kodzie maszynowym |
USART_Receive: ; Czekaj na odbiór danych sbis UCSRnA, RXCn rjmp USART_Receive ; Pobierz stan i 9-ty bit, a następnie dane z bufora in r18, UCSRnA in r17, UCSRnB in r16, UDRn ; Przy błędzie zwróć -1 andi r18,(1<<FEn)|(1<<DORn)|(1<<UPEn) breq USART_ReceiveNoError ldi r17, HIGH(-1) ldi r16, LOW(-1) USART_ReceiveNoError: ; Odfiltruj 9-ty bit i zakończ lsr r17 andi r17, 0x01 ret |
Przykład w języku C |
unsigned int USART_Receive( void ) { unsigned char status, resh, resl; /* Czekaj na odbiór danych */ while ( !(UCSRnA & (1<<RXCn)) ) ; /* Pobierz stan i 9-ty bit, a następnie dane z bufora */ status = UCSRnA; resh = UCSRnB; resl = UDRn; /* Przy błędzie zwróć -1 */ if ( status & (1<<FEn)|(1<<DORn)|(1<<UPEn) ) return -1; /* Odfiltruj 9-ty bit i zakończ */ resh = (resh >> 1) & 0x01; return ((resh << 8) | resl); } |
Powyższy przykład funkcji odbiorczej wczytuje wszystkie potrzebne rejestry we/wy do zestawu rejestrów roboczych przed wykonaniem obliczeń. Daje to w wyniku optymalne wykorzystanie bufora odbiorczego, ponieważ odczyt komórki bufora zwolni go i umożliwi przyjęcie nowych danych tak szybko, jak jest to możliwe.
Odbiornik USART posiada jeden znacznik wskazujący na jego stan.
Znacznik zakończenia odbioru (ang. Receive Complete flag, RXCn) określa. czy w buforze odbiorczym znajdują się nieodczytane przez procesor dane. Znacznik przyjmuje stan jeden, gdy takie dane znajdują się w buforze, a zero, gdy bufor odbiorczy jest pusty. (tj. nie zawiera żadnych nieodczytanych jeszcze danych). Jeśli odbiornik zostanie wyłączony (RXENn = 0), to bufor odbiorczy jest czyszczony i w efekcie bit RXCn przyjmuje stan zero.
Jeśli jest ustawiony bit włączenia przerwań przy zakończeniu odbioru (ang. Receive Complete Interrupt Enable bit, RXCIEn) w rejestrze UCSRnB, to przerwanie od zakończenia odbioru będzie wykonywane tak długo, jak jest ustawiony znacznik RXCn (pod warunkiem globalnego włączenia przerwań). Gdy stosowany jest odbiór danych sterowany przerwaniami, to procedura obsługi zakończenia odbioru musi odczytać odebrane dane z rejestru UDRn w celu wyzerowania znacznika RXC, w przeciwnym razie wystąpi nowe przerwanie tuż po zakończeniu tej procedury obsługi przerwania.
Odbiornik USART ma trzy znaczniki błędów: błąd ramki (ang. Frame Error, FEn), błąd przekroczenia limitu danych (ang. Data OverRun, DORn) oraz błąd parzystości (ang. Parity Error, UPEn). Dostęp do nich wszystkich jest poprzez odczyt rejestru UCSRnA. Wspólną cechą tych znaczników błędów jest to, iż umieszczone są w buforze odbiorczym wraz z ramką, której stan opisują. Z powodu buforowania znaczników błędów rejestr UCSRnA musi być odczytany przed odczytem bufora odbiorczego (UDRn), ponieważ odczyt komórki we/wy UDRn zmienia zawartość tego bufora. Inną cechą wspólną tych znaczników błędów jest to, iż nie można ich zmienić programowo poprzez zapis na pozycji bitów znaczników. Jednakże wszystkie znaczniki należy ustawić na zero podczas zapisu do rejestru UCSRnA, aby zachować kompatybilność z przyszłymi implementacjami USART. Żaden z tych znaczników nie potrafi wygenerować przerwania. Znacznik błędu ramki (ang. Frame Error flag, FEn) oznacza stan pierwszego bitu stopu następnej czytelnej ramki umieszczonej w buforze odbiorczym.
Znacznik FEn ma wartość zero, gdy bit stopu został poprawnie odczytany (jako jeden), natomiast przyjmuje stan 1, gdy bit stopu był niepoprawny (zero). Znacznik ten można użyć do wykrycia warunków zerwania synchronizacji, warunków przerwania oraz obsługi protokołu. Na stan znacznika FEn nie wpływa ustawienie bitu USBSn w rejestrze UCSRnC, ponieważ odbiornik ignoruje wszystkie bity stopu poza pierwszym. Dla kompatybilności z przyszłymi mikrokontrolerami zawsze ustawiaj ten bit na zero przy zapisie do rejestru UCSRnA.
Znacznik przekroczenia limitu danych (ang. Data OverRun, DORn) wskazuje utratę danych z powodu zapełnienia bufora odbiorczego. Przekroczenie limitu danych występuje, gdy bufor odbiorczy jest pełen (dwa ciągi danych), w odbiorczym rejestrze przesuwającym czeka nowy ciąg, a zostaje wykryty nowy bit startu. Jeśli zostanie ustawiony znacznik DORn, to zgubiona została jedna lub więcej ramek szeregowych pomiędzy ramką ostatnio odczytaną z rejestru UDRn, a następną ramką odczytaną z UDRn. Dla kompatybilności z przyszłymi mikrokontrolerami zawsze ustawiaj ten bit na zero przy zapisie do rejestru UCSRnA. Znacznik DORn jest zerowany, gdy odebrana ramka została z powodzeniem przeniesiona z rejestru przesuwającego do bufora odbiorczego.
Znacznik błędu parzystości (ang. Parity Error, UPEn) wskazuje, iż następna ramka w buforze odbiorczym miała przy odbiorze błąd parzystości. Jeśli sprawdzanie parzystości nie zostało włączone, to bit UPEn będzie przy odczycie zawsze miał stan zero. Dla kompatybilności z przyszłymi mikrokontrolerami zawsze ustawiaj ten bit na zero przy zapisie do rejestru UCSRnA.
Układ sprawdzania parzystości jest aktywny po ustawieniu bitu trybu parzystości USART (ang. USART Parity mode bit, UPMn1). Rodzaj testu parzystości do wykonania (parzystość lub nieparzystość) jest wybierany bitem UPMn0. Gdy układ ten jest aktywny, to wylicza parzystość/nieparzystość bitów danych w nadchodzących ramkach i porównuje wynik z bitem parzystości w ramce szeregowej. Wynik testu zostaje umieszczony w buforze odbiorczym razem z odebranymi bitami danych i stopu. Znacznik błędu parzystości (ang. Parity Error flag, UPEn) można następnie odczytać programowo w celu sprawdzenia, czy dana ramka miała błąd parzystości. Znacznik UPEn jest ustawiany, jeśli następny ciąg danych, który można odczytać z bufora odbiorczego, miał przy odbiorze błąd parzystości i sprawdzanie parzystości jest włączone w tym momencie (UPMn1 = 1). Bit ten jest ważny do chwili odczytu bufora odbiorczego (UDRn).
W przeciwieństwie do nadajnika wyłączenie odbiornika następuje natychmiastowo. Dane z bieżącego odczytu zostaną z tego powodu utracone. Po wyłączeniu (tj. po wyzerowaniu bitu RXENn) odbiornik przestaje przechwytywać normalną funkcję końcówki portu RxD. Gdy odbiornik jest wyłączany, jego bufor odbiorczy FIFO jest opróżniany. Dane przebywające w tym buforze są tracone.
Bufor odbiorczy FIFO zostanie opróżniony, gdy odbiornik jest wyłączany, tj. z bufora zostanie usunięta jego zawartość. Nieodczytane dane będą stracone. Jeśli bufor ten ma być opróżniony w trakcie normalnej pracy, np. z powodu wystąpienia błędu, czytaj komórkę we/wy UDRn aż znacznik RXnC zostanie wyzerowany.
Poniższy przykład kodu pokazuje, jak należy opróżniać bufor odbiorczy.
Przykład w kodzie maszynowym |
USART_Flush: sbis UCSRnA, RXCn ret in r16, UDRn rjmp USART_Flush |
Przykład w języku C |
void USART_Flush( void ) { unsigned char dummy; while ( UCSRnA & (1<<RXCn) ) dummy = UDRn; } |
Układ rekonstrukcji zegara synchronizuje zegar wewnętrzny do nadchodzących ramek szeregowych. Poniższy rysunek ilustruje proces próbkowania bitu startu nadchodzącej ramki. Dla trybu normalnego szybkość próbkowania jest 16 razy większa od szybkości transmisji, a w trybie podwójnej szybkości jest osiem razy większa. Poziome strzałki ilustrują odchyłki w synchronizacji spowodowane przez proces próbkowania. Zwróć uwagę na większe odchylenia czasu w trybie pracy z podwójną szybkością (U2X = 1). Próbki oznaczone jako 0 są próbkami przy stanie bezczynnym linii RxD (tj. w czasie bez wykonywania transmisji).
Gdy układ rekonstrukcji zegara wykryje przejście ze stanu wysokiego (bezczynność) do stanu niskiego (start) na linii RxD, rozpoczyna się sekwencja rozpoznawania bitu startowego. Niech próbka 1 oznacza pierwszą zerową próbkę, jak pokazuje powyższy rysunek. Wtedy układ rekonstrukcji zegara wykorzystuje próbki 8, 9 i 10 w trybie normalnym, a w trybie o podwójnej szybkości są wykorzystywane próbki 4, 5 i 6 (na rysunku numery tych próbek umieszczono wewnątrz prostokątów) do zdecydowania, czy odebrano poprawny bit startu. Jeśli dwie lub więcej z tych trzech próbek posiadają wysoki poziom logiczny (większość wygrywa), to bit startu zostanie odrzucony jako zakłócenie impulsowe, a odbiornik rozpocznie poszukiwanie następnego przejścia z poziomu wysokiego w niski. Jednakże gdy zostanie wykryty poprawny bit startu, to układ rekonstrukcji zegara zsynchronizuje się z nim i może rozpocząć się rekonstrukcja danych. Ten proces synchronizacji powtarza się dla każdego bitu startu.
Gdy zegar odbiornika zostanie zsynchronizowany z bitem startu, może rozpocząć się rekonstrukcja danych. Układ wykonujący to zadanie wykorzystuje automat stanu posiadający 16 stanów dla każdego bitu w trybie normalnym oraz osiem stanów dla każdego bitu w trybie o podwójnej szybkości. Poniższy rysunek pokazuje próbkowanie bitów danych oraz bitu parzystości. Każda z tych próbek ma nadany numer odpowiadający stanowi układu rekonstrukcji.
Określenie poziomu logicznego odbieranego bitu ustalane jest na podstawie głosowania większości wartości logicznych trzech próbek w środku odbieranego bitu. Na rysunku te środkowe próbki są umieszczone w kolorowych prostokątach. Proces głosowania większościowego wykonywany jest następująco: jeśli dwie lub więcej próbek posiada wysokie poziomy logiczne, to odebrany bit zostanie zarejestrowany jako bit o poziomie logicznym 1. Jeśli dwie lub więcej próbek ma niskie poziomy, to odebrany bit zostanie zarejestrowany z poziomem logicznym 0. Ten proces głosowania większościowego działa jak filtr dolnoprzepustowy dla nadchodzącego sygnału na końcówce RxD. Proces rekonstrukcji jest następnie powtarzany aż do odebrania całej ramki. Łącznie z pierwszym bitem stopu. Zauważ, iż odbiornik używa tylko pierwszego bitu stopu z ramki.
Poniższy rysunek pokazuje próbkowanie bitu stopu oraz najwcześniejszy możliwy początek bitu startu następnej ramki.
Takie samo głosowanie większościowe wykonywane jest dla bitu stopu jak dla innych bitów w ramce. Jeśli bit stopu zostanie zarejestrowany z wartością logiczną 0, to zostanie ustawiony znacznik błędu ramki (ang. Frame Error, FEn). Nowe przejście z poziomu wysokiego w niski oznaczające bit startu nowej ramki może wystąpić bezpośrednio za ostatnią próbką użytą do głosowania większościowego. W trybie normalnej szybkości pierwsza próbka o niskim stanie może pojawić się w punkcie oznaczonym jako (A) na powyższym rysunku. W trybie o podwójnej szybkości pierwszy niski poziom musi być opóźniony do punktu (B). Punkt (C) oznacza bit stopu o pełnej długości. Wcześniejsze wykrycie bitu startu wpływa na zakres działania odbiornika.
Zakres roboczy odbiornika zależy od niezgodności pomiędzy szybkością bitów odbieranych a wewnętrznie generowaną szybkością transmisji. Jeśli nadajnik wysyła ramki ze zbyt dużą lub zbyt małą szybkością transmisji, albo wewnętrznie generowana szybkość transmisji nie ma podobnej częstotliwości bazowej, to odbiornik nie będzie w stanie zsynchronizować ramek do bitu startowego. Poniższe równania można używać do obliczenia współczynnika szybkości transmisji danych nadchodzących w stosunku do wewnętrznej szybkości transmisji odbiornika.
D | – | Suma liczby bitów i bitu parzystości w odbieranym ciągu bitów danych (D = 5 ... 10). |
S | – | Liczba próbek na bit. S = 16 w trybie normalnym i S = 8 w trybie o podwójnej szybkości. |
SF | – | Numer pierwszej próbki dla głosowania większościowego. SF = 8 w trybie normalnym i SF = 4 w trybie o podwójnej szybkości. |
SM | – | Numer środkowej próbki używanej w głosowaniu większościowym. SM = 9 w trybie normalnym i SM = 5 w trybie o podwójnej szybkości. |
Rslow | – | Współczynnik najniższej szybkości transmisji danych nadchodzących, które zostaną przyjęte, w zależności od szybkości transmisji ustawionej w odbiorniku. |
Rfast | – | Współczynnik najwyższej szybkości transmisji danych nadchodzących, które zostaną przyjęte, w zależności od prędkości transmisji ustawionej w odbiorniku. |
Poniższe dwie tabele zawierają listę maksymalnych współczynników odchyłek szybkości transmisji, które mogą być tolerowane. Zauważ, iż tryb o normalnej szybkości transmisji ma wyższą tolerancję odchyłek szybkości transmisji.
Zalecany maksymalny błąd szybkości transmisji odbiornika w trybie normalnym (U2Xn = 0)
D (dane + bit parzystości) |
Rslow (%) |
Rfast (%) |
Całkowity błąd maksymalny (%) |
Zalecany błąd maksymalny (%) |
5 | 93,20 | 106,67 | +6,67/-6,8 | ± 3,0 |
6 | 94,12 | 105,79 | +5,79/-5,88 | ± 2,5 |
7 | 94,81 | 105,11 | +5,11/-5,19 | ± 2,0 |
8 | 95,36 | 104,58 | +4,58/-4,54 | ± 2,0 |
9 | 95,81 | 104,14 | +4,14/-4,19 | ± 1,5 |
10 | 96,17 | 103,78 | +3,78/-3,83 | ± 1,5 |
Zalecany maksymalny błąd szybkości transmisji odbiornika w trybie podwójnej
szybkości (U2Xn = 1)
D (dane + bit parzystości) |
Rslow (%) |
Rfast (%) |
Całkowity błąd maksymalny (%) |
Zalecany błąd maksymalny (%) |
5 | 94,12 | 105,66 | +5,66/-5,88 | ± 2,5 |
6 | 94,92 | 104,92 | +4,92/-5,08 | ± 2,0 |
7 | 95,52 | 104,35 | +4,35/-4,48 | ± 1,5 |
8 | 96,00 | 103,90 | +3,90/-4,00 | ± 1,5 |
9 | 96,39 | 103,53 | +3,53/-3,61 | ± 1,5 |
10 | 96,70 | 103,23 | +3,23/-3,30 | ± 1,0 |
Zalecenia maksymalnego błędu szybkości transmisji odbiornika zostały wyznaczone przy założeniu, że odbiornik i nadajnik równo dzielą się całkowitym błędem maksymalnym.
Istnieją dwa możliwe źródła błędu szybkości transmisji odbiornika. Zegar systemowy odbiornika (XTAL) zawsze będzie posiadał małą niestabilność w zakresie napięć zasilających i w zakresie temperatur roboczych. Jeśli do generacji zegara systemowego używany jest kryształ kwarcu, to rzadko wystąpi ten problem, lecz przy rezonatorze zegar systemowy może mieć odchyłkę ponad 2% w zależności od jego tolerancji. Drugie źródło błędów można łatwiej kontrolować. Generator szybkości transmisji nie zawsze jest w stanie wykonać dokładnego dzielenia częstotliwości systemowej, aby otrzymać pożądaną szybkość transmisji. W tym przypadku, jeśli jest to możliwe, można użyć wartości UBRRn, która da możliwy do przyjęcia dolny błąd.
Jeśli odbiornik został ustawiony na odbiór ramek zawierających od 5 do 8 bitów danych, to pierwszy bit stopu wskazuje, czy dana ramka zawiera dane lub informację o adresie. Jeśli odbiornik został skonfigurowany na ramki z dziewięcioma bitami danych, to ten dziewiąty bit (RXB8n) jest wykorzystywany do identyfikowania ramek adresowych i ramek danych. Gdy bit typu ramki (pierwszy bit stopu lub dziewiąty bit) ma wartość jeden, to ramka zawiera adres. Gdy bit typu ramki ma stan zero, to ramka jest ramką danych.
Tryb komunikacji wieloprocesorowej umożliwia kilku mikrokontrolerom Slave odbiór danych z mikrokontrolera Master. Odbywa się to przez zdekodowanie najpierw ramki adresowej, aby określić adresowany mikrokontroler. Jeśli został zaadresowany określony mikrokontroler, to odbierze on kolejne ramki danych jak zwykle, natomiast pozostałe mikrokontrolery Slave będą ignorować odebrane ramki aż do odebrania następnej ramki adresowej.
Aby mikrokontroler pełnił funkcję mikrokontrolera Master, może on używać formatu ramki z 9-bitowymi ciągami danych (UCSZn = 7). Dziewiąty bit (TXB8n) musi być ustawiony (TXB8n = 1) przy wysyłaniu ramki adresowej i wyzerowany (TXBn = 0) przy wysyłaniu ramki danych. W tym przypadku mikrokontroler Slave musi być ustawiony na format ramek z danymi 9-bitowymi.
Należy stosować poniższą procedurę przy wymianie danych w trybie komunikacji wieloprocesorowej:
Używanie każdego z formatów ramek ze ciągami danych 5...8 bitowymi jest możliwe, lecz niepraktyczne, ponieważ odbiornik musi wymieniać używanie formatu ramek z ciągami danych n-bitowymi z (n + 1)-bitowymi. Utrudnia to komunikację obustronną, ponieważ nadajnik i odbiornik używają jednocześnie tych samych ustawień liczby bitów w ciągu danych ramki. Jeśli używane są ramki z ciągami 5...8-bitowymi, nadajnik musi być ustawiony do używania dwóch bitów stopu (USBSn = 1), ponieważ pierwszy bit stopu jest używany do oznaczania typu ramki (adres/dane).
Nie używaj instrukcji SBI i CBI do ustawiania lub zerowania bitu MPCMn. Bit MPCMn jest w tej samej komórce we/wy co znacznik TXCn, a ten mógłby przypadkiem zostać wyzerowany przez instrukcje SBI lub CBI.
E[%] | – | błąd procentowy szybkości transmisji |
BRCM | – | najlepsze przybliżenie szybkości transmisji |
BR | – | pożądana szybkość transmisji |
Szybkość transmisji (bps) |
fosc = 1,0000 MHz | fosc = 1,8432 MHz | fosc = 2,0000 MHz | |||||||||
UX2 = 0 | UX2 = 1 | UX2 = 0 | UX2 = 1 | UX2 = 0 | UX2 = 1 | |||||||
UBRRn | Błąd | UBRRn | Błąd | UBRRn | Błąd | UBRRn | Błąd | UBRRn | Błąd | UBRRn | Błąd | |
2400 4800 9600 14,4k 19,2k 28,8k 38,4k 57,6k 76,8k 115,2k 230,4k 250k |
25 12 6 3 2 1 1 0 – – – – |
0,2% 0,2% -7,0% 8,5% 8,5% 8,5% -18,6% 8,5% – – – – |
51 25 12 8 6 3 2 1 1 0 – – |
0,2% 0,2% 0,2% -3,5% -7,0% 8,5% 8,5% 8,5% -18,6% 8,5% – – |
47 23 11 7 5 3 2 1 1 0 – – |
0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% -25,0% 0,0% – – |
95 47 23 15 11 7 5 3 2 1 0 – |
0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% – |
51 25 12 8 6 3 2 1 1 0 – – |
0,2% 0,2% 0,2% -3,5% -7,0% 8,5% 8,5% 8,5% -18,6% 8,5% – – |
103 51 25 16 12 8 6 3 2 1 – 0 |
0,2% 0,2% 0,2% 2,1% 0,2% -3,5% -7,0% 8,5% 8,5% 8.5% – 0,0% |
Max.(1) | 62,5 kbps | 125 kbps | 115,2 kbps | 230,4 kbps | 125 kbps | 250 kbps |
1. UBRR = 0, Błąd = 0,0% |
Szybkość transmisji (bps) |
fosc = 3,6864 MHz | fosc = 4,0000 MHz | fosc = 7,3728 MHz | |||||||||
UX2 = 0 | UX2 = 1 | UX2 = 0 | UX2 = 1 | UX2 = 0 | UX2 = 1 | |||||||
UBRRn | Błąd | UBRRn | Błąd | UBRRn | Błąd | UBRRn | Błąd | UBRRn | Błąd | UBRRn | Błąd | |
2400 4800 9600 14,4k 19,2k 28,8k 38,4k 57,6k 76,8k 115,2k 230,4k 250k 0,5M 1M |
95 47 23 15 11 7 5 3 2 1 0 0 – – |
0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% -7,8% – – |
191 95 47 31 23 15 11 7 5 3 1 1 0 – |
0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% -7,8% -7,8% – |
103 51 25 16 12 8 6 3 2 1 0 0 – – |
0,2% 0,2% 0,2% 2,1% 0,2% -3,5% -7,0% 8,5% 8,5% 8,5% 8,5% 0,0% – – |
207 103 51 34 25 16 12 8 6 3 1 1 0 – |
0,2% 0,2% 0,2% -0,8% 0,2% 2,1% 0,2% -3,5% -7,0% 8,5% 8,5% 0,0% 0,0% – |
191 95 47 31 23 15 11 7 5 3 1 1 0 – |
0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% -7,8% -7,8% – |
383 191 95 63 47 31 23 15 11 7 3 3 1 0 |
0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% -7,8% -7,8% -7,8% |
Max.(1) | 230,4 kbps | 460,8 kbps | 250 kbps | 0,5 Mbps | 460,8 kbps | 921,6 kbps |
1. UBRR = 0, Błąd = 0,0% |
Szybkość transmisji (bps) |
fosc = 8,0000 MHz | fosc = 11,0592 MHz | fosc = 14,7456 MHz | |||||||||
UX2 = 0 | UX2 = 1 | UX2 = 0 | UX2 = 1 | UX2 = 0 | UX2 = 1 | |||||||
UBRRn | Błąd | UBRRn | Błąd | UBRRn | Błąd | UBRRn | Błąd | UBRRn | Błąd | UBRRn | Błąd | |
2400 4800 9600 14,4k 19,2k 28,8k 38,4k 57,6k 76,8k 115,2k 230,4k 250k 0,5M 1M |
207 103 51 34 25 16 12 8 6 3 1 1 0 – |
0,2% 0,2% 0,2% -0,8% 0,2% 2,1% 0,2% -3,5% -7,0% 8,5% 8,5% 0,0% 0,0% – |
416 207 103 68 51 34 25 16 12 8 3 3 1 0 |
-0,1% 0,2% 0,2% 0,6% 0,2% -0,8% 0,2% 2,1% 0,2% -3,5% 8,5% 0,0% 0,0% 0,0% |
287 143 71 47 35 23 17 11 8 5 2 2 – – |
0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% -7,8% – – |
575 287 143 95 71 47 35 23 17 11 5 5 2 – |
0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% -7,8% -7,8% – |
383 191 95 63 47 31 23 15 11 7 3 3 1 0 |
0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% -7,8% -7,8% -7,8% |
767 383 191 127 95 63 47 31 23 15 7 6 3 1 |
0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 5,3% -7,8% -7,8% |
Max.(1) | 0,5 Mbps | 1 Mbps | 691,2 kbps | 1,3824 Mbps | 921,6 kbps | 1,8432 Mbps |
1. UBRR = 0, Błąd = 0,0% |
Szybkość transmisji (bps) |
fosc = 16,0000 MHz | fosc = 18,4320 MHz | fosc = 20.0000 MHz | |||||||||
UX2 = 0 | UX2 = 1 | UX2 = 0 | UX2 = 1 | UX2 = 0 | UX2 = 1 | |||||||
UBRRn | Błąd | UBRRn | Błąd | UBRRn | Błąd | UBRRn | Błąd | UBRRn | Błąd | UBRRn | Błąd | |
2400 4800 9600 14,4k 19,2k 28,8k 38,4k 57,6k 76,8k 115,2k 230,4k 250k 0,5M 1M |
416 207 103 68 51 34 25 16 12 8 3 3 1 0 |
-0,1% 0,2% 0,2% 0,6% 0,2% -0,8% 0,2% 2,1% 0,2% -3,5% 8,5% 0,0% 0,0% 0,0% |
832 416 207 138 103 68 51 34 25 16 8 7 3 1 |
0,0% -0,1% 0,2% -0,1% 0,2% 0,6% 0,2% -0,8% 0,2% 2,1% -3,5% 0,0% 0,0% 0,0% |
479 239 119 79 59 39 29 19 14 9 4 4 – – |
0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% -7,8% – – |
959 479 239 159 119 79 59 39 29 19 9 8 4 – |
0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 0,0% 2,4% -7,8% – |
520 259 129 86 64 42 32 21 15 10 4 4 – – |
0,0% 0,2% 0,2% -0,2% 0,2% 0,9% -1,4% -1,4% 1,7% -1,4% 8,5% 0,0% – – |
1041 520 259 173 129 86 64 42 32 21 10 9 4 – |
0,0% 0,0% 0,2% -0,2% 0,2% -0,2% 0,2% 0,9% -1,4% -1,4% -1,4% 0,0% 0,0% – |
Max.(1) | 1 Mbps | 2 Mbps | 1,152 Mbps | 12,304 Mbps | 1,25 Mbps | 2,5 Mbps |
1. UBRR = 0, Błąd = 0,0% |
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x0C (0x2C) | RXB[7:0] | UDR0 (Odczyt) | |||||||
TXB[7:0] | UDR0 (Zapis) | ||||||||
Zapis/Odczyt | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
(0x9C) | RXB[7:0] | UDR1 (Odczyt) | |||||||
TXB[7:0] | UDR1 (Zapis) | ||||||||
Zapis/Odczyt | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Rejestry bufora nadawczego i bufora odbiorczego danych USART używają wspólnie tej samej komórki we/wy, którą nazywamy rejestrem danych USART (ang. USART Data Register, UDRn). Rejestr bufora nadawczego (TXBn) stanie się miejscem docelowym danych zapisanych po adresem rejestru UDRn. Odczyt adresu UDRn zwróci zawartość rejestru bufora odbiorczego (RXBn).
Dla ciągów danych 5...7 bitowych górne, nieużywane bity będą ignorowane przez nadajnik i ustawione na 0 przez odbiornik.
Wpis do bufora nadawczego można wykonać tylko przy ustawionym znaczniku UDREn w rejestrze UCSRnA. Dane zapisane do UDRn, gdy znacznik UDREn nie jest ustawiony, zostaną zignorowane przez nadajnik USART. Gdy dane zostaną wpisane do bufora nadawczego, a nadajnik jest włączony, rozpocznie on ładowanie tych danych do nadawczego rejestru przesuwającego, gdy ten stanie się pusty. Następnie dane zostaną wysłane szeregowo na końcówce TxD.
Bufor odbiorczy składa się z dwupoziomowej kolejki FIFO (ang. First-In, First-Out – co weszło najpierw, wychodzi najpierw). Kolejka FIFO zmienia swój stan za każdym razem przy dostępie do bufora odbiorczego. Z powodu tego zachowania się bufora odbiorczego, nie używaj na nim instrukcji modyfikujących zawartość (SBI i CBI). Ostrożnie używaj instrukcji testujących bity (SBIC i SBIS), ponieważ one również zmienią stan kolejki FIFO.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x0B (0x2B) | RXC0 | TXC0 | UDRE0 | FE0 | DOR0 | UPE0 | U2X0 | MPCM0 | UCSR0A |
Zapis/Odczyt | O | Z/O | O | O | O | O | Z/O | Z/O | |
Wartość początkowa | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
(0x9B) | RXC1 | TXC1 | UDRE1 | FE1 | DOR1 | UPE1 | U2X1 | MPCM1 | UCSR1A |
Zapis/Odczyt | O | Z/O | O | O | O | O | Z/O | Z/O | |
Wartość początkowa | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
Ten znacznik jest ustawiany, gdy w buforze odbiorczym znajdują się nieodczytane dane, a zerowany, gdy bufor odbiorczy jest pusty (tzn. nie zawiera żadnych nieodczytanych jeszcze danych). Jeśli odbiornik zostanie wyłączony, to bufor odbiorczy jest opróżniany i w rezultacie znacznik RXCn będzie ustawiony na zero. Znacznik RXCn może być wykorzystany do generacji przerwania przy zakończeniu odbioru (ang. Receive Complete interrupt) (zobacz na opis bitu RXCIEn w rejestrze UCSRnB).
Ten znacznik jest ustawiany, gdy cała ramka w nadawczym rejestrze przesuwającym (ang. Transmit Shift Register) została wysłana bit po bicie i nie ma nowych danych bieżąco oczekujących w buforze nadawczym(UDRn). Bit znacznika TXCn jest automatycznie zerowany, gdy zostanie wykonane przerwanie od zakończenia nadawania. Alternatywnie znacznik TXCn można wyzerować wpisując bit o stanie 1 na jego pozycję w rejestrze. Znacznik TXCn może generować przerwanie przy zakończeniu nadawania (ang. Transmit Complete interrupt) (zobacz na opis bitu TXCIEn w rejestrze UCSRnB).
Znacznik UDREn wskazuje, czy bufor nadawczy (UDRn) jest gotowy na przyjęcie nowych danych. Jeśli bit UDREn ma stan jeden, to bufor ten jest pusty, a zatem gotowy do zapisu. Znacznik UDREn może generować przerwanie przy pustym rejestrze danych (ang. Data Register Empty interrupt) (zobacz na opis bitu UDRIEn w rejestrze UCSRnB). Po resecie znacznik UDREn jest ustawiany na 1, aby wskazać, iż nadajnik jest gotowy.
Ten bit jest ustawiany, jeśli następny ciąg bitów w buforze odbiorczym miał błąd ramki przy odbiorze. Tj. gdy pierwszy bit stopu tego ciągu w buforze odbiorczym miał stan zero. Wartość tego bitu pozostaje ważna aż do odczytu bufora odbiorczego (UDRn). Bit FEn ma stan zero, gdy bit stopu odebranych danych jest równy 1. Zawsze ustawiaj ten bit na zero przy zapisie do rejestru UCSRnA.
Ten bit zostaje ustawiony po wykryciu przekroczenia ilości danych. Zdarzenie to występuje, gdy bufor odbiorczy jest pełny (zawiera dwa ciągi danych), w rejestrze przesuwającym oczekuje nowy ciąg danych, a zostanie wykryty nowy bit startu. Wartość tego bitu pozostaje ważna aż do odczytu bufora odbiorczego (UDRn). Zawsze ustawiaj ten bit na zero przy zapisie do rejestru UCSRnA.
Ten bit jest ustawiany, jeśli następny ciąg bitów danych w buforze odbiorczym miał przy odbiorze błąd parzystości, a sprawdzanie parzystości w tym punkcie zostało włączone (UPMn1 = 1). Wartość tego bitu pozostaje ważna aż do odczytu bufora odbiorczego (UDRn). Zawsze ustawiaj ten bit na zero przy zapisie do rejestru UCSRnA.
Ten bit ma znaczenie tylko przy pracy asynchronicznej. Zapisz ten bit stanem zero, jeśli używasz pracy synchronicznej.
Zapisanie bitu U2Xn stanem jeden zmniejszy podzielnik szybkości transmisji z 16 na 8, co da w rezultacie podwojenie szybkości przesyłania w komunikacji asynchronicznej.
Ten bit włącza tryb komunikacji wieloprocesorowej (ang. Multi-processor Communication mode). GDy do bitu MPCMn zostanie wpisany stan jeden, to wszystkie nadchodzące ramki odczytywane przez odbiornik USART będą ignorowane, jeśli nie będą zawierały informacji o adresie. Bit MPCMn nie wpływa na pracę nadajnika. Więcej na ten temat znajdziesz w podrozdziale "Tryb komunikacji wieloprocesorowej".
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x0A (0x2A) | RXCIE0 | TXCIE0 | UDRIE0 | RXEN0 | TXEN0 | UCSZ02 | RXB80 | TXB80 | UCSR0B |
Zapis/Odczyt | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | O | Z/O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
(0x9A) | RXCIE1 | TXCIE1 | UDRIE1 | RXEN1 | TXEN1 | UCSZ12 | RXB81 | TXB81 | UCSR1B |
Zapis/Odczyt | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | O | Z/O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Zapis tego bitu stanem jeden uaktywnia przerwanie przy ustawieniu znacznik RXCn. Przerwanie przy zakończeniu odczytu USART (ang. USART Receive Complete interrupt) zostanie wygenerowane tylko wtedy, gdy ustawione na jeden są bity: RXCIEn, I w rejestrze stanu SREG (globalne uaktywnienie przerwań) oraz RXCn w rejestrze UCSRnA.
Ustawienie tego bitu na jeden włącza przerwania przy ustawieniu znacznika TXCn. Przerwanie przy zakończeniu nadawania USART (ang. USART Transmit Complete interrupt) zostanie wygenerowane tylko wtedy, gdy ustawione na jeden są bity: TXCIEn, I w rejestrze stanu SREG (globalne uaktywnienie przerwań) oraz TXCn w rejestrze UCSRnA.
Ustawienie tego bitu na jeden włącza przerwania przy ustawieniu znacznika UDREn w rejestrze UCSRnA. Przerwanie przy pustym rejestrze danych USART (ang. USART Data Register Empty interrupt) zostanie wygenerowane tylko wtedy, gdy ustawione na jeden są bity: UDRIEn, I w rejestrze stanu SREG (globalne uaktywnienie przerwań) oraz UDREn w rejestrze UCSRnA.
Zapis tego bitu stanem jeden włącza odbiornik USART. Gdy odbiornik jest włączony, przechwytuje normalną funkcję portu końcówki RxD. Wyłączenie odbiornika powoduje opróżnienie bufora odbiorczego i unieważnienie znaczników FRn, DORn i UPE.
Zapis tego bitu stanem jeden włącza nadajnik USART. Nadajnik po włączeniu przejmuje normalne działanie końcówki portu TxD. Wyłączenie nadajnika (zapis bitu TXENn stanem zero) nie będzie wykonane, aż zostaną zakończone przesłania bieżące i oczekujące, tj. gdy nadawczy rejestr przesuwający (ang. Transmit Shift Register) i rejestr bufora nadawczego (ang. Transmit Buffer Register) nie będą przechowywały danych do przesłania. Po wyłączeniu nadajnik nie przechwytuje już działania końcówki portu TxD.
Bit UCSZn2 w połączeniu z bitami UCSZn[1:0] w rejestrze UCSRnC ustawia liczbę bitów danych w ramce używanej przez odbiornik i nadajnik.
RXB8n jest dziewiątym bitem danych odebranego ciągu bitów, gdy odbiornik został ustawiony do pracy z ramkami szeregowymi zawierającymi dziewięć bitów danych. Należy go odczytać przed odczytem młodszych bitów z rejestru UDRn.
TXB8n jest dziewiątym bitem w ciągu bitów transmitowanych w ramce szeregowej z dziewięcioma bitami danych. Musi być zapisany przed zapisem młodszych bitów do rejestru UDRn.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
(0x95) | – | UMSEL0 | UPM01 | UPM00 | USBS0 | UCSZ01 | UCSZ00 | UCPOL0 | UCSR0C |
Zapis/Odczyt | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | |
Wartość początkowa | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
(0x9D) | – | UMSEL1 | UPM11 | UPM10 | USBS1 | UCSZ11 | UCSZ10 | UCPOL1 | UCSR1C |
Zapis/Odczyt | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | |
Wartość początkowa | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Ten bit jest zarezerwowany do użycia w przyszłości. Dla kompatybilności z przyszłymi wersjami mikrokontrolera bit należy zapisywać stanem zero przy dostępie do portu UCSRnC.
Ten bit dokonuje wyboru pomiędzy asynchronicznym lub synchronicznym trybem pracy.
UMSELn | Tryb |
0 | Praca asynchroniczna |
1 | Praca synchroniczna |
Te bity włączają oraz określają rodzaj generacji i sprawdzania parzystości. Jeśli parzystość zostanie włączona, to nadajnik automatycznie będzie generował i wysyłał bit parzystości wraz z bitami danych w każdej ramce. Odbiornik będzie generował wartość parzystości z nadchodzących danych i porównywał ją z ustawieniem UPMn0. Jeśli zostanie wykryta niezgodność, to będzie ustawiony znacznik UPEn w rejestrze UCSRnA.
UPMn1 | UPMn0 | Tryb parzystości |
0 | 0 | Wyłączone |
0 | 1 | Zarezerwowane |
1 | 0 | Włączone, parzystość |
1 | 1 | Włączone, nieparzystość |
Ten bit wybiera liczbę bitów stopu, która mają być wstawiane przez nadajnik. Odbiornik ignoruje to ustawienie.
USBSn | Bity stopu |
0 | 1 bit |
1 | 2 bity |
Bity UCSZn[1:0] w połączeniu z bitem UCSZn2 w rejestrze UCSRnB ustawiają liczbę bitów danych w ramkach używanych przez nadajnik i odbiornik.
UCSZn2 | UCSZn1 | UCSZn0 | Liczba bitów danych w ramce |
0 | 0 | 0 | 5 bitów |
0 | 0 | 1 | 6 bitów |
0 | 1 | 0 | 7 bitów |
0 | 1 | 1 | 8 bitów |
1 | 0 | 0 | Zarezerwowane |
1 | 0 | 1 | Zarezerwowane |
1 | 1 | 0 | Zarezerwowane |
1 | 1 | 1 | 9 bitów |
Ten bit używany jest tylko w trybie synchronicznym. Jeśli USART pracuje w trybie asynchronicznym, to zapisz ten bit stanem zero. Bit UCPOLn ustawia zależność pomiędzy zmianą danych wyjściowych i próbkowaniem danych wejściowych a zegarem synchronicznym (XCK).
UCPOLn | Zmiana danych wysyłanych (Wyjście na końcówce TxD) |
Próbkowanie danych
odbieranych (Wejście na końcówce RxD) |
0 | Narastające zbocze XCK | Opadające zbocze XCK |
1 | Opadające zbocze XCK | Narastające zbocze XCK |
Bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | |
(0x90) | – | – | – | – | UBRR0[11:8] | UBRR0H | |||
0x09 (0x29) | UBRR0[7:0] | UBRR0L | |||||||
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
Zapis/Odczyt | O | O | O | O | Z/O | Z/O | Z/O | Z/O | |
Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | ||
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | |
(0x98) | – | – | – | – | UBRR1[11:8] | UBRR1H | |||
(0x99) | UBRR1[7:0] | UBRR1L | |||||||
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
Zapis/Odczyt | O | O | O | O | Z/O | Z/O | Z/O | Z/O | |
Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | ||
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Uwaga: | 1. | W trybie kompatybilności z ATmega103 rejestr UBRR0H jest niedostępny. |
Te bity są zarezerwowane do przyszłego użytku. Dla kompatybilności z przyszłymi mikrokontrolerami należy je zawsze zapisywać stanem zero, gdy następuje wpis do rejestru UBRRnH.
Jest to 12 bitowy rejestr, który zawiera wartość szybkości transmisji USART. Rejestr UBRRnH przechowuje cztery najbardziej znaczące bity, a UBRRnL przechowuje osiem najmniej znaczących bitów wartości szybkości transmisji USART. Jeśli wartość ta zostanie zmieniona w trakcie nadawania lub odbierania danych, to zakłóci to pracę nadajnika i odbiornika. Zapis do UBRRnL wyzwoli natychmiastowe uaktualnienie preskalera szybkości transmisji.
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2023 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.