Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

Autor artykułu: mgr Jerzy Wałaszek
Konsultacje: Wojciech Grodowski, mgr inż. Janusz Wałaszek

©2024 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Mikrokontrolery

ATmega640/1280/1281/2560/2561

USART

obrazek

Educational and Non-Profit Use of Copyrighted Material:

If you use Microchip copyrighted material solely for educational (non-profit) purposes falling under the “fair use” exception of the U.S. Copyright Act of 1976 then you do not need Microchip’s written permission. For example, Microchip’s permission is not required when using copyrighted material in: (1) an academic report, thesis, or dissertation; (2) classroom handouts or textbook; or (3) a presentation or article that is solely educational in nature (e.g., technical article published in a magazine).

https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines

SPIS TREŚCI
Podrozdziały

obrazek

Cechy USART

USART (ang. Universal Synchronous and Asynchronous serial Receiver and Transmitter – uniwersalny synchroniczny i asynchroniczny nadajnik i odbiornik) jest wysoko elastycznym, szeregowym modułem do przesyłu i odbioru danych. Jego głównymi cechami są:

Na początek:  podrozdziału   strony 

Przegląd USART

Mikrokontroler ATmega640/1280/2560 posiada cztery moduły USART:  USART0, USART1, USART2 i USART3. Mikrokontroler ATmega1281/2561 ma ich dwa: USART0 i USART1. Poniżej opisano działanie wszystkich układów USART. USART0, USART1, USART2 i USART3 mają różne zestawy rejestrów we/wy, co pokazano w podrozdziale "Opis rejestrów USART".

Moduły USART można również używać w trybie Master SPI, zobacz do następnego rozdziału. Odpowiedni bit ograniczania poboru prądu przez moduł USART n (ang. Power Reduction USARTn bit, PRUSARTn) w rejestrach PRR0 i PRR1 należy wyzerować, aby powiązany z nim moduł USART został włączony.

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.

Obszary rozdzielone przerywanymi liniami na schemacie blokowym obrazują trzy główne części USART (wymienione kolejno z góry na dół): generator zegarowy, nadajnik i odbiornik. Rejestry sterujące są wspólnie używane przez wszystkie moduły. Logika generacji zegara składa się z układu synchronizacji dla wejścia zegara zewnętrznego, które jest używane w czasie pracy w synchronicznym trybie Slave, oraz z generatora szybkości transmisyjnej. Końcówka XCK (ang. External Transfer Clock – zewnętrzny zegar nadawania) jest używana tylko w synchronicznym trybie nadawania. Nadajnik składa się z pojedynczego bufora zapisu, szeregowego rejestru przesuwającego, generatora parzystości oraz logiki sterującej do obsługi różnych formatów ramek szeregowych. Bufor zapisu pozwala na ciągłe nadawanie danych bez żadnych opóźnień pomiędzy ramkami. Odbiornik jest najbardziej skomplikowanym elementem modułu USART z powodu jego modułów rekonstrukcji zegara i danych. Moduły te są używane przy asynchronicznym odbiorze danych. Oprócz modułów odtwarzających odbiornik zawiera układ sprawdzania parzystości, logikę sterującą, rejestr przesuwający oraz dwu-poziomowy bufor odbiorczy (UDRn). Odbiornik obsługuje takie same formaty ramek jak nadajnik i może wykrywać błąd ramki, przekroczenie danych oraz błędy parzystości.

Na początek:  podrozdziału   strony 

Generacja zegara

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 UCSRnA. Gdy używany jest tryb synchroniczny (UMSELn = 1), rejestr kierunku danych dla końcówki XCKn (bit DDR_XCKn) określa, czy źródło zegarowe jest wewnętrzne (tryb Master) lub zewnętrzne (tryb Slave). Końcówka XCKn 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).
rxclk – podstawowy zegar odbiornika (sygnał wewnętrzny).
xcki – wejście z końcówki XCK (sygnał wewnętrzny). Używane do synchronizacji pracy w trybie Slave.
xcko – wyjście zegara na końcówkę XCK (sygnał wewnętrzny). Używane do synchronizacji pracy w trybie Master.
fOSCn – częstotliwość zegara systemowego

Generowanie zegara wewnętrznego – generator szybkości transmisji

Wewnętrzna generacja zegara wykorzystywana jest w asynchronicznych i synchronicznych trybach pracy.

Rejestr szybkości transmisji USARTn (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_XCKn.

Tabela poniżej zawiera równania do wyliczania szybkości  transmisji fT (w bitach na sekundę) oraz wyliczania wartości UBRRn 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 (U2Xn = 0)
Tryb asynchroniczny podwójnej szybkości (U2Xn = 1)
Tryb synchroniczny Master
fT – szybkość transmisji w bitach na sekundę
fOSC – częstotliwość zegarowa oscylatora systemowego
UBRR – zawartość rejestrów UBRRnH i UBRRnL (0...4095)

Praca z podwójną szybkością (U2Xn)

Szybkość przesyłu można podwoić przez ustawienie bitu U2Xn w rejestrze UCSRnA. 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ń.

Zegar zewnętrzny

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.

Praca synchroniczna

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 UCSRnC wybiera zbocza zegara XCKn, 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 XCKn. Dla UCPOLn ustawionego na jeden kolejność zboczy jest odwrotna.


Na początek:  podrozdziału   strony 

Formaty ramek

Ramkę szeregową (ang. serial frame) definiuje się jako jeden ciąg bitów danych wraz z bitami synchronizacji (bitami startu i stopu) oraz opcjonalnie z bitem parzystości do celów wykrywania błędów. USART akceptuje  jako poprawne formaty wszystkie 30 kombinacji poniższych parametrów:

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 USARTn 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 USARTn (UCSZn[2:0]) wybierają liczbę bitów danych w ramce. Bity trybu parzystości USARTn (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.

Obliczanie bitu parzystości/nieparzystości

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.


Na początek:  podrozdziału   strony 

Inicjalizacja USART

Układ USART musi zostać zainicjalizowany, zanim będzie mogła się odbyć jakakolwiek komunikacja. Na proces inicjalizacji zwykle składa się ustawienie szybkości przesyłu danych (ang. baud rate), formatu ramki oraz uaktywnienie nadajnika lub odbiornika w zależności od planowanego zastosowania. Dla pracy USART sterowanej przerwaniami należy wyzerować globalny znacznik przerwań przy dokonywaniu inicjalizacji.

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 USARTn 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
    sts UBRRnH, r17
    sts UBRRnL, r16
    ; Włącz odbiornik i nadajnik
    ldi r16, (1<<RXENn)|(1<<TXENn)
    sts UCSRnB,r16
    ; Ustaw format ramki: 8 bitów danych, 2 bity stopu
    ldi r16, (1<<USBSn)|(3<<UCSZn0)
    sts 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.


Na początek:  podrozdziału   strony 

Nadawanie danych – nadajnik USART

Nadajnik USARTn jest włączany przez ustawienie  bitu uaktywnienia nadawania (ang. Transmit Enable, TXENn) w rejestrze UCSRnB. Gdy włączony zostanie nadajnik, normalna praca portu końcówki TxDn zostaje przejęta przez USARTn i otrzymuje funkcję wyjścia szeregowego nadajnika. Szybkość przesyłania danych, tryb pracy oraz format ramki muszą być ustawione przed wykonaniem jakiejkolwiek transmisji. Po wyborze pracy synchronicznej zegar na końcówce XCKn zostanie przejęty i użyty jako zegar transmisji.

Wysyłanie ramek z liczbą bitów danych od 5 do 8

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 XCKn w zależności od trybu pracy.

Poniższe przykłady kodu pokazują prostą funkcję nadawczą USARTn 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. USARTn 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
    lds r17, UCSRnA
    sbrs r17, UDREn
    rjmp USART_Transmit
    ; Umieść dane (r16) w buforze, co je wyśle
    sts  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 w buforze, co je wyśle */
    UDRn = data;
}

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.

Wysyłanie ramek z 9 bitami danych

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
    lds r17, UCSRnA
    sbrs r17, 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 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.

Dziewiąty bit można wykorzystać do oznaczania ramek adresowych w trybie komunikacji wieloprocesorowej lub do obsługi innych protokołów.

Znaczniki nadajnika a przerwania

Nadajnik USARTn posiada dwa znaczniki, które wskazują jego stan: znacznik opróżnienia rejestru danych USARTn (ang. USARTn 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

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łączanie nadajnika

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.


Na początek:  podrozdziału   strony 

Odbiór danych – odbiornik USART

Odbiornik USARTn jest włączany przez zapis stanem jeden bitu uaktywniania odbioru (ang. Receive Enable bit, RXENn) w rejestrze UCSRnB. Gdy odbiornik zostaje włączony, normalne działanie końcówki RxDn jest przejmowane przez USARTn i otrzymuje ona funkcję wejścia szeregowego dla odbiornika. Szybkość transmisji, tryb pracy oraz format ramki muszą być jednokrotnie ustawione zanim będzie mógł być wykonany jakikolwiek odbiór szeregowy. Jeśli jest ustawiona praca synchroniczna, to zegar na końcówce XCKn będzie wykorzystywany jako zegar przesyłu.

Odbiór ramek z liczbą bitów danych od 5 do 8

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 XCKn, 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ą USARTn 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. USARTn musi być zainicjalizowany przed użyciem tej funkcji.

Przykład w kodzie maszynowym
USART_Receive:
    ; Czekaj na odbiór danych
    lds r17, UCSRnA
    sbrs r17, RXCn
    rjmp USART_Receive
    ; Pobierz odebrane dane z bufora
    lds 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.

Odbiór ramek z 9 bitami danych

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
    lds r17, UCSRnA
    sbrs r17, RXCn
    rjmp USART_Receive
    ; Pobierz stan i 9-ty bit, a następnie dane z bufora
    lds r18, UCSRnA
    lds r17, UCSRnB
    lds 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.

Znacznik zakończenia odbioru a przerwanie

Odbiornik USARTn 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 RXCn, w przeciwnym razie wystąpi nowe przerwanie tuż po zakończeniu tej procedury obsługi przerwania.

Znaczniki błędów odbiornika

Odbiornik USARTn 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

Układ sprawdzania parzystości jest aktywny po ustawieniu bitu trybu parzystości USART (ang. USARTn 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).

Wyłączanie odbiornika

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.

Opróżnianie bufora odbiorczego

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 RXCn zostanie wyzerowany.

Poniższy przykład kodu pokazuje, jak należy opróżniać bufor odbiorczy.

Przykład w kodzie maszynowym
USART_Flush:
    lds r17, UCSRnA
    sbrs r17, RXCn
    ret
    lds r16, UDRn
    rjmp USART_Flush
Przykład w języku C
void USART_Flush( void )
{
    unsigned char dummy;
    while ( UCSRnA & (1<<RXCn) ) dummy = UDRn;
}

Na początek:  podrozdziału   strony 

Asynchroniczny odbiór danych

USART zawiera moduły rekonstrukcji sygnału zegarowego i danych do obsługi asynchronicznego odbioru danych. Układ rekonstrukcji zegara używany jest do synchronizowania wewnętrznego zegara szybkości transmisji z nadchodzącymi asynchronicznymi ramkami szeregowymi na końcówce RxD. Układ rekonstrukcji danych próbkuje i przepuszcza przez filtr dolnoprzepustowy każdy nadchodzący bit, co poprawia odporność odbiornika na zakłócenia. Zakres działania odbioru asynchronicznego zależy od dokładności wewnętrznego zegara szybkości transmisji, szybkości transmitowania nadchodzących ramek oraz ich rozmiaru określonego liczbą bitów.

Asynchroniczna rekonstrukcja sygnału zegarowego

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ą (U2Xn = 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.

Asynchroniczna rekonstrukcja danych

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.


Asynchroniczny zakres roboczy

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 (U2X0 = 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.


Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2024 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.

Tryb komunikacji wieloprocesorowej

Ustawienie bitu trybu komunikacji wieloprocesorowej MPCMn w rejestrze UCSRnA włącza funkcję filtrowania nadchodzących ramek odbieranych przez odbiornik USART. Ramki bez informacji o adresie będą ignorowane i nie zostaną wstawione do bufora odbiorczego. W systemie z wieloma mikrokontrolerami komunikującymi się poprzez tę samą magistralę szeregową zmniejsza to znacznie liczbę nadchodzących ramek, które muszą być obsłużone przez mikroprocesor. Ustawienie bitu MPCMn nie wpływa na nadajnik, lecz musi on być używany inaczej, jeśli jest częścią systemu wykorzystującego tryb komunikacji wieloprocesorowej.

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.

Używanie bitu MPCM

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:

  1. Wszystkie mikrokontrolery Slave są w trybie komunikacji wieloprocesorowej (ustawiony bit MPCMn w UCSRnA).
  2. Mikrokontroler Master wysyła ramkę adresową, a wszystkie układy Slave odbierają i odczytują tę ramkę. W mikrokontrolerze Slave znacznik RXCn w UCSRnA będzie ustawiany jak zwykle.
  3. Każdy mikrokontroler Slave odczytuje swój rejestr UDRn i określa, czy został wybrany. Jeśli tak, to zeruje on bit MPCMn w UCSRnA, w przeciwnym razie czeka na następną ramkę adresową i utrzymuje bit MPCMn w stanie wysokim.
  4. Zaadresowany mikrokontroler będzie otrzymywał wszystkie ramki danych, aż do odebrania nowej ramki adresowej. Pozostałe mikrokontrolery Slave, które wciąż mają ustawiony bit MPCMn, zignorują te ramki danych.
  5. Po odebraniu ostatniej ramki danych przez zaadresowany mikroprocesor, ustawia on bit MPCMn i czeka na nową ramkę adresową z układu Master. Proces powtarza się wtedy od punktu 2.

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.


Na początek:  podrozdziału   strony 

Przykłady ustawień szybkości transmisji

Dla standardowych częstotliwości kwarców i rezonatorów najpowszechniejsze szybkości transmisji w pracy asynchronicznej można otrzymać poprzez użycie ustawień UBRRn zebranych w tabeli poniżej. Wartości UBRRn dające w wyniku szybkość transmisji różniącą się mniej niż 0,5% od docelowej szybkości transmisji są w tabeli zapisane grubą czcionką. Wyższe wartości błędu są do przyjęcia, lecz odbiornik będzie przy nich mniej odporny na zakłócenia, szczególnie przy długich ramkach szeregowych (zobacz do podrozdziału "Asynchroniczny zakres działania"). Wartości błędu są wyliczane przy użyciu następującego wzoru:

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
UBRR0 Błąd UBRR0 Błąd UBRR0 Błąd UBRR0 Błąd UBRR0 Błąd UBRR0 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
UBRR0 Błąd UBRR0 Błąd UBRR0 Błąd UBRR0 Błąd UBRR0 Błąd UBRR0 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
UBRR0 Błąd UBRR0 Błąd UBRR0 Błąd UBRR0 Błąd UBRR0 Błąd UBRR0 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
UBRR0 Błąd UBRR0 Błąd UBRR0 Błąd UBRR0 Błąd UBRR0 Błąd UBRR0 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%

Na początek:  podrozdziału   strony 

Opis rejestrów USART

UDRn – USARTn I/O Data Register – Rejestr danych we/wy USARTn

Bit 7 6 5 4 3 2 1 0  
Adresy poniżej RXB[7:0] UDRn (Odczyt)
TXB[7:0] UDRn (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  

Adresy rejestru UDRn dla poszczególnych modułów USART

USART 0 UDR0 0xC6
USART 1 UDR1 0xCE
USART 2 UDR2 0xD6
USART 3 UDR3 0x136

Rejestry bufora nadawczego i bufora odbiorczego danych USARTn używają wspólnie tej samej komórki we/wy, którą nazywamy rejestrem danych USARTn (ang. USARTn Data Register, UDRn). Rejestr bufora nadawczego (TXB) stanie się miejscem docelowym danych zapisanych po adresem rejestru UDRn. Odczyt adresu UDRn zwróci zawartość rejestru bufora odbiorczego (RXB).

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 USARTn. 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 TxDn.

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.


UCSRnA – USARTn Control and Status Register A – Rejestr A sterowania i stanu USARTn

Bit 7 6 5 4 3 2 1 0  
Adresy poniżej RXCn TXCn UDREn FEn DORn UPEn U2Xn MPCMn UCSRnA
Zapis/Odczyt O Z/O O O O O Z/O Z/O  
Wartość początkowa 0 0 1 0 0 0 0 0  

Adresy rejestru UCSRnA dla poszczególnych modułów USART

USART 0 UCSR0A 0xC0
USART 1 UCSR1A 0xC8
USART 2 UCSR2A 0xD0
USART 3 UCSR3A 0x130

Bit 7 – RXCn: USARTn Receive Complete – Znacznik zakończenia odbioru USARTn

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).

Bit 6 – TXCn: USARTn Transmit Complete – Znacznik zakończenia nadawania USARTn

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).

Bit 5 – UDREn: USARTn Data Register Empty – Znacznik pustego rejestru danych USARTn

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.

Bit 4 – FEn: Frame Error – Znacznik błędu ramki

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.

Bit 3 – DORn: Data OverRun – Znacznik przekroczenia ilości danych

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.

Bit 2 – UPEn: USART Parity Error – Znacznik błędu parzystości USART

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.

Bit 1 – U2Xn: Double the USARTn Transmission Speed – Podwojenie szybkości transmisji USARTn

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.

Bit 0 – MPCMn: Multi-processor Communication Mode – Tryb komunikacji wieloprocesorowej

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 USARTn będą ignorowane, jeśli nie będą zawierały informacji o adresie. Bit MPCMn0 nie wpływa na pracę nadajnika. Więcej na ten temat znajdziesz w podrozdziale "Tryb komunikacji wieloprocesorowej".


UCSRnB – USARTn Control and Status Register B – Rejestr B sterowania i stanu USARTn

Bit 7 6 5 4 3 2 1 0  
Adresy poniżej RXCIEn TXCIEn UDRIEn RXENn TXENn UCSZn2 RXB8n TXB8n UCSRnB
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  

Adresy rejestru UCSRnB dla poszczególnych modułów USART

USART 0 UCSR0B 0xC1
USART 1 UCSR1B 0xC9
USART 2 UCSR2B 0xD1
USART 3 UCSR3B 0x131

Bit 7 – RXCIEn: RX Complete Interrupt Enable – Włączenie przerwań przy zakończeniu odbioru

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.

Bit 6 – TXCIEn: TX Complete Interrupt Enable – Włączenie przerwań przy zakończeniu nadawania

Ustawienie tego bitu na jeden włącza przerwania przy ustawieniu znacznika TXCn. Przerwanie przy zakończeniu nadawania USARTn (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.

Bit 5 – UDRIEn: USARTn Data Register Empty Interrupt Enable – Włączenie przerwań przy pustym rejestrze danych USARTn

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.

Bit 4 – RXENn: Receiver Enable – Włączenie odbiornika

Zapis tego bitu stanem jeden włącza odbiornik USARTn. Gdy odbiornik jest włączony, przechwytuje normalną funkcję portu końcówki RxDn. Wyłączenie odbiornika powoduje opróżnienie bufora odbiorczego i unieważnienie znaczników FRn, DORn i UPEn.

Bit 3 – TXENn: Transmitter Enable – Włączenie nadajnika

Zapis tego bitu stanem jeden włącza nadajnik USARTn. Nadajnik po włączeniu przejmuje normalne działanie końcówki portu TxDn. 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 TxDn.

Bit 2 – UCSZn2: Character Size – Długość ciągu bitów danych

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.

Bit 1 – RXB8n: Receive Data Bit 8 – Odbiorczy bit danych nr 8

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.

Bit 0 – TXB8n: Transmit Data Bit 8 – Nadawczy bit danych nr 8

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.


UCSRnC – USARTn Control and Status Register C – Rejestr C sterowania i stanu USARTn

Bit 7 6 5 4 3 2 1 0  
Adresy poniżej UMSELn1 UMSELn0 UPMn1 UPMn0 USBSn UCSZn1 UCSZn0 UCPOLn UCSRnC
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  

Adresy rejestru UCSRnC dla poszczególnych modułów USART

USART 0 UCSR0C 0xC2
USART 1 UCSR1C 0xCA
USART 2 UCSR2C 0xD2
USART 3 UCSR3C 0x132

Bity 7:6 – UMSELn[1:0]: USARTn Mode Select – Wybór trybu USARTn

Ten bit dokonuje wyboru pomiędzy asynchronicznym lub synchronicznym trybem pracy.

UMSELn1 UMSELn0 Tryb
0 0 Praca asynchroniczna
0 1 Praca synchroniczna
1 0 Zarezerwowane
1 1 Tryb Master SPI(1)
Uwaga: 1 Pełny opis trybu pracy Master SPI znajdziesz w rozdziale "USART w trybie SPI"

Bity 5:4 – UPMn[1:0]: Parity Mode – Tryb parzystości

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ść

Bit 3 – USBSn: Stop Bit Select – Wybór bitów stopu

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

Bit 2:1 – UCSZn[1:0]: Character Size – Liczba bitów danych w ramce

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

Bit 0 – UCPOLn: Clock Polarity – Polaryzacja zegara

Ten bit używany jest tylko w trybie synchronicznym. Jeśli USARTn 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 (XCKn).

UCPOLn Zmiana danych wysyłanych
(Wyjście na końcówce TxDn)
Próbkowanie danych odbieranych
(Wejście na końcówce RxDn)
0 Narastające zbocze XCKn Opadające zbocze XCKn
1 Opadające zbocze XCKn Narastające zbocze XCKn

UBRRnL i UBRRnH – USARTn Baud Rate Registers – Rejestry szybkości transmisji USARTn

Bit 15 14 13 12 11 10 9 8  
Adresy poniżej UBRRn[11:8] UBRRnH
UBRRn[7:0] UBRRnL
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  

Adresy rejestrów UBRRnL i UBRRnH dla poszczególnych modułów USART

USART 0 UBRR0H 0xC5
UBRR0L 0xC4
USART 1 UBRR1H 0xCD
UBRR1L 0xCC
USART 2 UBRR2H 0xD5
UBRR2L 0xD4
USART 3 UBRR3H 0x135
UBRR3L 0x134

Bity 15:12 – Zarezerwowane

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.

Bit 11:0 – UBRRn[11:0]: USARTn Baud Rate Register – Rejestr szybkości transmisji USARTn

Jest to 12 bitowy rejestr, który zawiera wartość szybkości transmisji USARTn. Rejestr UBRRnH przechowuje cztery najbardziej znaczące bity, a UBRRnL przechowuje osiem najmniej znaczących bitów wartości szybkości transmisji USARTn. 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.


Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2024 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.