Ćw 5 Obsługa portu szeregowego UART w mikrokontrolerach 8051 Opracowanie: mgr inż Michał Lankosz 1 Wprowadzenie Celem ćwiczenia jest poznanie działania układu transmisji szeregowej UART 2 Niezbędne wiadomości Architektura i lista rozkazów 8051, w szczególności: - struktura i działanie układu portu szeregowego - tryby pracy portu szeregowego - rola liczników w pracy portu szeregowego - znaczenie początkowych adresów pamięci programu - działanie przerwań sprzętowych Transmisja szeregowa RS-232 3 Podstawy 31 Układ UART Układ UART jest przeznaczony do prowadzenia asynchronicznej transmisji szeregowej (bit po bicie) Do transmisji szeregowej asynchronicznej potrzebne są dwie linie, które w 8051 są przypisane do konkretnych linii portu P3: nadawcza TxD P31 odbiorcza RxD P30 Format przesyłanych znaków w trybie 1 przedstawiono niżej Znak składa się z bitu startu, ośmiu bitów danej i bitu stopu Pierwszy bit jest bitem najmniej znaczącym Słowo danych do wysłania jest pobierane z rejestru wyjściowego SBUF, a słowo odebrane do rejestru odbiorczego SBUF Mimo występowania tej samej nazwy jak i adresu rejestru SBUF są to jednak dwa osobne rejestry, a wybór odpowiedniego zależy od operacji Szybkość transmisji w trybie 1 wyznacza częstotliwość sygnału przepełnienia licznika T1 W 8052 źródłem taktowania może być także licznik T2, w innych odmianach również dedykowany do transmisji szeregowej licznik Najczęściej licznik T2 pracuje w trybie 2 (8-bitowy licznik TL1 z automatycznym ładowaniem wartości początkowej z TH1) Wartość jaką należy wpisać do TH1 określa się wzorem: 1
gdzie: F XTAL baud lub TH1=256 F XTAL 12 32 baud TH1=256 F XTAL 12 16 baud gdy SMOD = 0 gdy SMOD = 1 częstotliwość rezonatora kwarcowego (11059200 Hz) szybkość transmisji Typowe szybkości transmisji w bodach to: 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200 Wysłanie jednego bajtu polega na wpisaniu wartości do rejestru SBUF Transmisja szeregowa zostaje zainicjowana automatycznie Zakończenie transmisji jest sygnalizowane przez układ ustawieniem flagi TI (bit w rejestrze SCON) Odczytywanie znaku jest inicjowane programowo przez wyzerowanie w rejestrze SCON bitu flagi RI, pod warunkiem ustawienia REN=1 W chwili skompletowania całego bajtu w rejestrze przesuwnym jest on przepisywany do SBUF, a flaga RI zostaje ustawiona Ustawienie flagi RI lub TI jest sygnałem zgłoszenia przerwania z portu szeregowego Przyjęcie tego przerwania (gdy nie jest ono zamaskowane) nie powoduje automatycznego wyzerowania flag, a zatem ich stan może być w programie obsługi odczytany w celu identyfikacji przyczyny przerwania Flagi RI i TI powinny być programowo zerowane odpowiednio po odebraniu i wysłaniu danej Typowa konfiguracja portu szeregowego Zaprogramowanie układu UART do pracy nie jest trudne Należy tylko skonfigurować sam układ portu poprzez wpisanie odpowiedniej wartości do rejestru sterującego SCON oraz licznikatimera 1 TMOD, TCON i TH1 Znaczenie poszczególnych bitów rejestrów jest podane w dodatku W przypadku tego ćwiczenia wykorzystywany jest tylko tryb 1 pracy portu szeregowego, natomiast prędkość transmisji wyznacza licznik-timer 1 pracując w trybie 2 (patrz ćwiczenie nr 4) Podstawy obsługi Przykładowy fragment programu odbierający znak: JNB RI,$ sprawdzenie flagi odbioru MOV A,SBUF czytanie z uarta CLR RI zerowanie flagi odbioru Program jak widać posiada bardzo prostą pętlę oczekującą na nadejście danej z portu szeregowego Taka pętla rzadko występuje ze względu na to, że procesor nie może w tym czasie wykonywać innych zadań (oprócz obsługi przerwań) Przykład wysłania znaku: JNB TI,$ czekanie na opróżnienie bufora nadajnika CLR TI wyzerowanie flagi wysłania MOV SBUF,A zapis do uarta 2
W przypadku wysyłania danych przed wpisaniem wartości do SBUF należy mieć pewność, że poprzednia dana została wysłana Zastosowanie powyższej sekwencji rozkazów spełnia to założenie Przerwania Zdarzenia portu szeregowego mogą być źródłem przerwania Jeśli przerwanie z portu szeregowego zostało odblokowane ustawienie się którejkolwiek flagi RI lub TI powoduje podjęcie obsługi przerwania Z tym portem jest związany adres 23h, od którego zaczyna się procedura obsługi Zatem szkielet programu jest podobny jak dla obsługi innych przerwań: CSEG AT 0 LJMP start CSEG AT 23h LJMP serial_it po resecie wykonujemy skok do początku programu pod adresem 23h z pamięci programu umieszczamy instrukcję skoku do procedury obsługi przerwania CSEG AT 30h start: program główny zaczyna się od adresu 30h (za tablicą wektorów przerwań) MOV SCON, Konfiguracja układu portu szeregowego MOV TMOD, MOV TH1, SETB TR1 podłączenie licznika T1 SETB ES zezwolenie na przerwanie z portu szeregowego SETB EA globalne odblokowanie przerwań loop: główna pętla programu ljmp loop serial_it: PUSH PSW PUSH ACC JBC TI,ser_tx CLR RI MOV,SBUF SJMP ser_end ser_tx: MOV SBUF, ser_end: POP ACC POP PSW RETI procedura obsługi przerwania zapamiętanie ważnych rejestrów na stosie sprawdzenie powodu przerwania odbiór wysyłanie END 32 Komunikacja z PC Mikrokontroler 8051 może poprzez układ szeregowy komunikować się z innymi elementami systemu w tym również z komputerem typu PC Obecnie komputery PC przeważnie nie posiadają już złącza RS232 Jednak standard ten często jest stosowany w urządzeniach przemysłowych i wielu innych komercyjnych zastosowaniach, gdzie prostota implementacji i niezawodność są ważniejsze od wygody i uniwersalności Na potrzeby laboratorium zastosowano przejściówki 3
z USB na RS-232 Od strony mikrokontrolera praktycznie nie wprowadzają one żadnej różnicy Po stronie komputera specjalny sterownik obecny w systemie operacyjnym emuluje obecność portu szeregowego, dzięki czemu programy widzą port jakby był on fizycznie dostępny w systemie W celach uruchomieniowych bardzo przydatny jest terminal, za pomocą którego można wysyłać dane jak i wyświetlać napływające dane W ćwiczeniu użyty zostanie jeden z bezpłatnie dostępnych terminali - Terminal v 19b by Br@y++ Poniżej krótki jego opis: Otwarcie/zamknięcie portu Wybór prędkości transmisji Wybór portu Dane odbierane Okno do wprowadzania danych nadawanych Ponieważ ten sam port jest wykorzystywany do programowania zestawu ZL2MCS51 jak i transmisji szeregowej, programator Flip może blokować dostęp do portu Należy zatem odpowiednio skonfigurować program Flip lub wyłączać go na czas pracy aplikacji Rozpoczęcie pracy z terminalem polega na wybraniu właściwej prędkości transmisji i numeru portu komunikacyjnego Ze względu na specyfikę zestawu laboratoryjnego należy również włączyć sygnał DTR tak, aby kontrolka w aplikacji świeciła na zielono Następnie należy wcisnąć klawisz Connect Każdy wpisany do okna nadawczego znak zostaje natychmiast wysyłany, natomiast dane nadchodzące są wyświetlane w oknie odbiorczym 4
4 Zadanie do wykonania Należy przeanalizować pracę mikrokontrolera poprzez wykonanie symulacji krokowej, a następnie uruchomić program na płytce ZL2MCS51 41 Program cw5p1asm CSEG AT 0 AJMP reset CSEG AT 30h reset: CLR P27 sygnalizacja uruchomienia programu MOV SCON,#50h uart w trybie 1 (8 bit), REN=1 MOV TMOD,#20h licznik 1 w trybie 2 MOV TH1,#0FDh 9600 Bds at 110592MHz SETB TR1 uruchomienie licznika CLR TI wyzerowanie flagi wysłania loop: JNB RI,loop sprawdzenie flagi odbioru MOV A,SBUF czytanie z uarta CLR RI zerowanie flagi odbioru INC A modyfikacja danej MOV SBUF,A zapis do uarta CLR P20 załączenie LED "nadawanie" JNB TI,$ czekanie na opróżnienie bufora nadajnika CLR TI wyzerowanie flagi wysłania SETB P20 wyłączenie LED "nadawanie" AJMP loop END a) Uruchom w symulatorze pracę krokową programu Należy skorzystać z okna UART do wprowadzania i odczytywania znaków, a także podglądać stany flag RI i TI w oknie Serial Channel b) Sprawdź działanie programu w rzeczywistym układzie c) Program jest swego rodzaju koderem informacji, gdyż zamienia każdy znak na znak o kodzie o jeden większym Rozszerz program o dekoder zakodowanej informacji Funkcja ma być przełączana za pomocą przycisków S6 i S7, a tryb pracy sygnalizowany odpowiednio diodami D6 i D7 d) Wykorzystując system przerwań napisz program, który przychodzące dane będzie wpisywał do cyklicznego bufora o długości 16 bajtów umiejscowionego w wewnętrznej pamięci RAM 5
5 Dodatek IT0 EX0 EA INT0 0 1 IE0 ET0 TF0 IT1 EX1 INT1 0 1 IE1 ET1 TF1 ES RI TI Rys1 Schemat blokowy systemu przerwań 8051 Adresy, od których zaczyna się wykonywanie programów obsługi przerwań: 03h 0Bh 13h 1Bh 23h zewnętrzne z wejścia /INT0 licznik T0 układu czasowo-licznikowego zewnętrzne z wejścia /INT1 licznik T1 układu czasowo-licznikowego zdarzenie portu szeregowego 6
Rejestry specjalne znaczenie poszczególnych bitów TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 TFx - znacznik przepełnienia licznika Tx, ustawiany sprzętowo, zerowany przy przyjęciu przerwania TRx - bit sterujący zliczaniem licznika Tx, 1 zapewnia podłączenie sygnału zliczającego do licznika IEx - znacznik zgłoszenia przerwania zewnętrznego /INTx ustawiany sprzętowo, zerowany przy przyjęciu przerwania ITx - bit określający wyzwalanie przerwania poziomem niskim na /INTx 0 lub zboczem 1 IE EA - - ES ET1 EX1 ET0 EX0 EA - bit maski systemu przerwań ES - bit maski przerwania z portu szeregowego ET1 - bit maski przerwania z licznika-czasomierza T1 EX1 - bit maski przerwania zewnętrznego /INT1 ET0 - bit maski przerwania z licznika-czasomierza T0 EX0 - bit maski przerwania zewnętrznego /INT0 bit=1 przerwanie dozwolone bit=0 przerwanie zablokowane SCON SM0 SM1 SM2 REN TB8 RB8 TI RI SM0,SM1 - bity sterujące; określają tryb pracy portu szeregowego SM2 - maskowanie odbioru znaku; zmieniany programowo; gdy SM2=1 ignorowane są odebrane znaki, w których w trybie 2 i 3 dziewiąty bit danych jest zerem, a w trybie 1 nie został wykryty bit stopu; w trybie 0 powinno być SM2=0 REN - uaktywnienie odbiornika, gdy REN=0 nie są odbierane znaki TB8 - dziewiąty bit nadawanego znaku w trybie 2 i 3, ustawiany programowo RB8 - dziewiąty bit odebranego znaku w trybie 2 i 3 TI - flaga wysłania znaku; ustawiana sprzętowo po zakończeniu wysyłania znaku; zerowana tylko programowo; jest sygnałem zgłoszenia przerwania RI - flaga odebrania znaku; ustawiana sprzętowo po odebraniu znaku; zerowana tylko programowo; jest sygnałem zgłoszenia przerwania SM0 SM1 tryb 0 0 0 Transmisja synchroniczna; znaki 8-bitowe; taktowanie zegarem F XTAL /12 0 1 1 Transmisja asynchroniczna; znaki 8-bitowe; szybkość określona programowo 1 0 2 Transmisja asynchroniczna; znaki 9-bitowe; taktowanie zegarem F XTAL /64 lub F XTAL /32 1 1 3 Transmisja asynchroniczna; znaki 9-bitowe; szybkość określona programowo 7
TMOD licznik T1 licznik T0 GATE C/T M1 M0 GATE C/T M1 M0 GATE - uaktywnienie bramkowania licznika GATE=0 - licznik Tx pracuje gdy TRx=1 GATE=1 - licznik Tx pracuje gdy TRx=1 i /INTx=1 C/T - określa funkcję licznika Tx C/T=0 - czasomierz taktowany wewnętrznym zegarem f XTAL /12 C/T=1 - licznik impulsów zewnętrznych z wejścia Tx M1, M0 - tryb pracy licznika Tx M1 M0 tryb 0 0 0 8-bitowy licznik THx taktowany poprzez 5-bitowy dzielnik TLx 0 1 1 16-bitowy licznik THxTLx 1 0 2 8-bitowy licznik TLx z automatycznym wpisywaniem wartości początkowej z THx 1 1 3 T0 dwa niezależne liczniki 8-bit: TL0 sterowany bitami licznika T0 i TH0 sterowany bitami licznika T1; licznik T1 zatrzymany 8