Układ transmisji szeregowej AVR Transmisja szeregowa/równoległa porównanie: w transmisji szeregowej dane wysyłane są bit po bicie, mniej przewodów niż w transmisji równoległej (dwa przewody elektryczne lub jeden światłowód), z natury mniejszy transfer, używana do transmisji na większe odległości, niższy koszt interfejsu (najdroższe jest łącze fizyczne - kabel, światłowód), bardziej skomplikowany interfejs zamiana informacji równoległej na szeregową i odwrotnie. Rodzaje transmisji szeregowej: asynchroniczna np. U(S)ART, synchroniczna np. TWI, SPI. Dane przesyłane asynchronicznie nie są związane z żadnym dodatkowym sygnałem synchronizują-cym, w szczególności nie towarzyszy im sygnał zegara. Transmisja przebiega zwykle bajtami przesyłanymi szeregowo w postaci ciągów bitów. Oprócz ośmiu bitów danych przesyła się dodatkowo bit startu oraz opcjonalnie bit parzystości do detekcji błędów i bit stopu. Pomiędzy nadajnikiem, a odbiornikami musi być uzgodniona częstotliwość przesyłania danych. Przy transmisji synchronicznej równolegle z ciągiem bitów danych przesyła się sygnał synchronizujący (zegarowy), który określa chwile, w których stan linii danych odpowiada ważnym wartościom kolejnych bitów. Po każdym bajcie może być dodatkowo przesłany bit parzystości. Rodzaje portów (interfejsów) szeregowych: dwukierunkowy (fullduplex) możliwość równoczesnego odbierania i nadawania danych dwie oddzielne linie do nadawania i odbioru. jednokierunkowy (halfduplex) możliwość transmisji danych tylko w jednym kierunku dane przesyłane na jednej linii.
Schemat ideowy portu szeregowego dwukierunkowego Port umożliwia: wysyłanie w postaci szeregowej, poprzez określone wyprowadzenie portu, zawartości rejestru, tzw. bufora nadajnika - na wyjściu linii portu pojawia się ciąg binarny odpowiadający zawartości wysyłanego rejestru (funkcja nadajnika transmiter). odbiór ciągu binarnego doprowadzonego do wejścia określonej linii portu i przetworzenie go na zawartość rejestru, zwanego buforem odbiornika. (funkcja odbiornika - receiver) Bufory nadajnika i odbiornika są dostępne z poziomu programu użytkownika.
Moduł USART w ATmega16. USART - uniwersalny synchroniczny/asynchroniczny port szeregowy - jest układem umożliwiającym prowadzenie prostej komunikacji szeregowej, np. pomiędzy dwoma mikrokontrolerami. Przy zastosowaniu zewnętrznych konwerterów (napięciowych, prądowych lub napięcioworóżnicowych) może być stosowany do obsługi interfejsu RS-232 (również RS-485) i połączenia z komputerem klasy PC (przez port COM). Cechy USART: dwukierunkowość (niezależne rejestry nadawania i odbioru), praca synchroniczna lub asynchroniczna, precyzyjny generator szybkości transmisji, obsługa rożnych konfiguracji ramek i kontroli parzystości, wykrywanie błędów transmisji, filtracja przeciwzakłóceniowa, trzy niezależne źródła przerwań, tryb podwójnej szybkości w trybie asynchronicznym, tryb komunikacji wieloprocesorowej. Format ramki danych
Schemat blokowy U(S)ART Struktura Układ składa się z trzech oddzielnych bloków: nadajnik, odbiornik, generator taktujący. Zasada działania - układ nadajnika: Transmisja jest inicjowana przez wpis danej do rejestru danych UDR. Jeśli dana jest 9 bitowa, wcześniej należy wpisać wartość 9-tego bitu do rejestru UCSRB - bit TXB8. Dana jest przesyłana z rejestru UDR do rejestru przesuwnego gdy : nowa dana została wpisana do UDR po tym jak wysłany został ostatni bit danej poprzedniej. Rejestr przesuwny jest ładowany natychmiast. nowa dana została wpisana do UDR zanim zakończono wysyłanie poprzedniej. Rejestr przesuwny jest ładowany dopiero po wysłaniu bitu stopu danej poprzedniej.
Zasada działania układ odbiornika: Odbiornik próbkuje sygnał na wejściu RxD z częstotliwością 16*BAUD (BAUD częstotliwość transmisji). Gdy linia jest w stanie spoczynkowym (IDLE stan wysoki), pojedyncza próbka o stanie 0 jest interpretowana jako zbocze opadające bitu startu i rozpoczyna się procedura sprawdzająca - czy stan 0 na linii jest bitem startu czy zakłóceniem. W tym drugim przypadku zbocze jest ignorowane. Po stwierdzeniu poprawności bitu startu (3 kolejne próbki z rzędu mają wartość 0), następuje odczyt bitów danej, rozpoczynając od LSB. Każdy bit próbkowany jest 3 razy i jako prawdziwa wartość interpretowana jest ta, która pojawia się w przynajmniej 2 próbkach - eliminacja zakłóceń. Kiedy do odbiornika trafia bit stopu, przechodzi on procedurę sprawdzenia poprawności jeśli z 3 próbek 2 lub 3 są zerami, ustawiana jest flaga FE (błąd ramki). Niezależnie od ewentualnego błędu ramki, ustawiana jest flaga RXC, a dana jest przesyłana do UDR. Jeśli ustawiony jest tryb odbioru danej 9 bitowej, bit RXB8 w rejestrze UCSRB jest ładowany wartością 9-tego bitu danej odebranej. UWAGA! Przed odczytaniem rejestru UDR należy więc zawsze sprawdzać stan flagi FE. Ogólna obsługa interfejsu UART: wybór prędkości transmisji wpisanie odpowiedniej wartość do rejestru prędkości, wybór 8 lub 9 bitowy format danych w rejestrze konfiguracyjnym, odblokowanie przerwania od nadajnika i/lub odbiornika (koniec wysyłania/odbioru danej), włączenie nadajnika i/lub odbiornika, uruchomienie nadawania wprowadzenie danej do rejestru danych zapisu UDR, odbiór odczyt danej z rejestru danych odczytu UDR, po sprawdzeniu flagi końca odbioru.
Dedykowane rejestry funkcyjne USART bufor danych rejestr UDR rejestry kontrolno-statusowe UCSRA, UCSRB, UCSRC rejestr prędkości transmisji UBRR(H:L) BAUD = f OSC / ( 16 ( UBRR+1 ) ). Rejestr UDR Rejestr nadawczy i odbiorczy USART współdzielą ten sam adres przestrzeni adresowej IO. Zapis do rejestru UDR spowoduje umieszczenie danych w buforze nadawczym (TXB), natomiast poprzez odczyt spod adresu tego rejestru spowoduje odczytanie danych rejestru odbiorczego (RXB). Bufor nadawczy może być nadpisany tylko wówczas, gdy jest ustawiona flaga UDRE w rejestrze UCSRA, w innym przypadku próba wpisania jest ignorowana. Wpisanie danych do buforu nadawczego, podczas gdy moduł nadawczy jest odblokowany, spowoduje przeniesienie danych do rejestru przesuwnego (jeśli rejestr przesuwny jest pusty), a to jest równoznaczne z rozpoczęciem transmisji na pinie TXD. Bufor odbiorczy składa się z dwóch buforów FIFO. Ze względu na budowę, nie należy korzystać z instrukcji bitowych pod adresem rejestru, gdyż zmienią one stan buforu.
Rejestr A kontroli i statusu - UCSRA RXC Odbiór zakończony. Flaga jest ustawiona, jeśli w buforze odbiorczym znajdują się nieodczytane dane. Flaga jest wykasowana, jeśli bufor jest pusty. Wyłączenie układu odbiornika kasuje zawartość buforu, więc i bit RXC jest także kasowany. Flaga RXC może generować przerwanie zakończenia odbioru (zob. opis RXCIE). TXC Transmisja zakończona. Flaga jest ustawiana, gdy cała ramka zostanie wysłana z nadawczego rejestru przesuwnego, oraz bufor nadawczy jest pusty. Flaga jest automatycznie kasowana przy wykonywaniu instrukcji spod wektora przerwań związanego z zakończeniem transmisji, lub może być skasowana przez wpisanie jedynki. Flaga TXC może generować przerwanie zakończenia transmisji (zob. opis bitu TXCIE). UDRE Pusty rejestr danych. FE Błędna ramka, np. bit stopu = 0 DOR Przepełnienie danych. Ten bit ma wartość 1, gdy zostało wykryte zdarzenie przepełnienia danych. Zdarzenie to następuje, gdy bufor odbiorczy jest pełny, a został wykryty kolejny bit startu. Bit jest ważny aż do odczytania buforu odbiorczego (UDR). Zapisując do UCSRA należy zawsze wpisywać temu bitowi wartość 0. PE Błąd parzystości. Bit ten ma wartość 0, gdy zawartość rejestru odbiorczego ma błąd parzystości oraz jest włączona kontrola parzystości (UPM1=1). Bit traci ważność z chwilą odczytania rejestru odbiorczego. Zapisując do UCSRA należy wpisywać 0. U2X Podwójna szybkość transmisji asynchronicznej. MPCM tryb komunikacji między procesorami.
Rejestr B kontroli i statusu - UCSRB RXCIE TXCIE UDRIE RXEN TXEN UCZ2 RXB8 TXB8 włączenie przerwań od układu odbiornika (gdy flaga TXC=1). włączenie przerwań od układu nadajnika (gdy flaga RXC=1). włączenie przerwań gdy bufor jest pusty (gdy flaga UDRE=1). włączenie odbiornika. PD0 staje się końcówką odbiornika RxD. włączenie nadajnika. PD1 staje się końcówką nadajnika TxD. rozmiar danej (wraz z UCZ1:0 z rejestru UCSRC) 9-ty bit odebranych danych, odczyt przed odczytem UDR 9-ty bit nadawanego znaku, zapis przed wpisaniem do UDR bitów nadawanych Rejestr C kontroli i statusu - UCSRC URSEL wybór rejestru Służy do przełączania dostępu między rejestrami UBRRH i UCSRC. Ma wartość 1 jeśli odczytany został rejestr UCSRC. Chcąc zapisać do rejestru UCSRC należy do tego bitu wpisywać wartość 1. Porównaj z opisem dla rejestru UBRRH. UMSEL wybór trybu pracy: asynchroniczna (0), synchroniczna (1). UPM1:0 wybór trybu parzystości, USBS wybór liczby bitów stopu. UCSZ2:0 liczba bitów w ramce danych UCPOL polaryzacja zegara w trybie synchronicznym
Rejestr prędkości transmisji UBRRH:L URSEL Wybór rejestru. Służy do przełączania dostępu między rejestrami UBRRH i UCSRC. Ma wartość 0 jeśli odczytany został rejestr UBRRH. Zapisując do rejestru UBRRH należy do tego bitu wpisywać wartość 0. Porównaj z opisem dla rejestru UCSRC. Bity 14:12 Zarezerwowane do przyszłych zastosowań, zapisując należy ustawiać na wartość 0. UBRR11:0 Rejestr szybkości transmisji (12 bitowy). Wpisanie bitów UBRR wprowadza natychmiastową zmianę preskalera w generatorze prędkości transmisji. Sposób wyznaczania szybkości transmisji BAUD i ustawień UBRR
Nastawy UBRR dla standardowych częstotliwości oscylatorów
Transmisja szeregowa - przykłady Przykład 1. init_rs: cli ldi r16, 0 out ubrrh, r16 ldi r16, 51 out ubrrl, r16 ldi r16, 0b10000110 out ucsrc, r16 ldi r16, 0b10011000 out ucsrb, r16 sei ret ; inicjalizaja ; prędkość transmisji 19200 bps ; 51 dla 16 MHz ; 25 dla 8MHZ ; tryb asynchroniczny 8 bit z jednym bitem stopu ; załączenie nadajnika, odbiornika i przerwań RXD Przykład 2. send_rs: sbis ucsra, UDRE rjmp send_rs out UDR, r16 ret ; procedura wysyłania 1 bajtu z rejestru r16 ; testowanie TXC ; wyślij bajt Przykład 3. send_str: lpm r16, z+ ; procedura wysyła łańcuch aż napotka zero cpi r16, 0 breq end_str rcall send_rs rjmp send_str end_str: ret Przykład 4. usart_rxc: push r16 ; procedura obsługi przerwania od odbiornika in r16, sreg push r16 in r24, udr rcall wr_data dec r23 brne wy_rxc ldi r23, 16 ldi r24, line1 rcall wr_instr wy_rxc: pop r16 out sreg, r16 pop r16 reti
Realizacja RS232 na USART Interfejs USART używany jest zwykle do komunikacji mikrokontrolera z komputerem PC. Odbywa się to najczęściej za pomocą standardu RS232. RS 232 interfejs szeregowy, służący w zamierzeniach do połączenia z mikrokomputerem przez modem. Obecnie umożliwia również połączenie dwóch urządzeń. Sygnały interfejsu RS-232 C Przebiegi czasowe w RS 232C Poziomy sygnałów interfejsu, dla zwiększenia odporności na zakłócenia, zawierają się w zakresie: ( 15 +15V): sygnał z zakresu: (-15V... -3V) interpretowany jest jako logiczna 1, a z zakresu: (+3V... +15V) jako logiczne 0. Maksymalne napięcia nie mogą przekroczyć ± 25V.
Sposób realizacji sprzętowej standardu RS232C. Zadaniem układu MAX232 jest konwersja sygnałów między poziomem TTL na wyprowadzeniach mikrokontrolera, a poziomem sygnału ±12V wykorzystywanym podczas transmisji łączem RS232C. Łącze to wymaga co najmniej trzech przewodów: linii nadajnika, odbiornika oraz linii odniesienia, czyli tzw. masy. Jest to zatem łącze asymetryczne. Umożliwia ono komunikację ze sobą tylko dwóch jednostek przy zastosowaniu transmisji fullduplex. Uproszczone połączenie - modem zerowy Uwaga: przewód połączeniowy skrosowany.
Wykorzystanie USART w ATmega. 1. RS-232 19200 bps; kabel 15m, jeden nadajnik, jeden odbiornik. 2. RS-485 10M bps; kabel 1200 m; transmisja półdupleksowa, 32 urządzenia (nadajniki odbiorniki) na jednej linii; standard przemysłowy (układy kontrolno-pomiarowe). 3. Moduły radiowe 433MHz 4. USB FTDI 232