Rys. 1. Schemat konwertera interfejsu UART na RS-232 Mikrokontroler 80C51/52 6. Port szeregowy Port szeregowy jest przeznaczony do komunikacji z urządzeniami zewnętrznymi. Dane są przesyłane poczynając od najmniej znaczącego bitu, synchronicznie lub asynchronicznie. W trybie synchronicznym port może tylko nadawać lub przyjmować dane, w trybie asynchronicznym może równocześnie przyjmować i nadawać dane (full duplex). Dostęp do portu odbywa się przez dwa rejestry SBUF mieszczące się pod adresem 99H w przestrzeni SFR. Zatem odczyt z rejestru SBUF może dawać inną wartość, niż tam wpisano. Port szeregowy może pracować w czterech trybach. Tryby różnią się między sobą liczbą bitów w przesyłanych danych i źródłem sygnałów taktujących odbiornik i nadajnik. Tryb pracy portu oraz inne aspekty jego pracy są wybierane przez odpowiednie ustawienie znaczników w rejestrze SCON mieszczącego się pod adresem 98H w przestrzeni SFR. Znaczniki tego rejestru mogą być ustawiane pojedynczo. Rejestr SCON zawiera następujące znaczniki: SCON SM0 SM1 SM2 REN TB8 RB8 TI RI adres 98H Znaczenie poszczególnych znaczników jest następujące: SM0, SM1 - wybór trybu pracy SM0 SM1 tryb rodzaj transmisji częst. taktująca 0 0 0 rejestr przesuwny (8 bitów) fosc/12 0 1 1 UART (8 bitów) zmienna 1 0 2 UART (9 bitów) fosc/64 lub fosc/32 1 1 3 UART (9 bitów) zmienna
SM2 - maskowanie odbioru znaku tryb 0 powinno być SM2 = 0 tryb 1 przy SM2 = 1 znacznik przerwania RI nie jest uaktywniany przy braku bitu stopu w odbieranym słowie tryb 2 i 3 przy SM2 = 1 znacznik przerwania RI nie jest uaktywniany jeżyli 9-ty bit odbieranego słowa jest równy 0; w tych trybach znacznik ten jest wykorzystywany przy komunikacji wieloprocesorowej REN - znacznik uaktywnienia odbiornika 0 odbiór zablokowany 1 odbiór dozwolony TB8 - znacznik używany w transmisji dziewięciobitowej tryb 0 i 1 nie używany tryb 2 i 3 dziewiąty bit w nadawanym słowie RB8 - znacznik używany w transmisji dziewięciobitowej tryb 0 nie używany tryb 1 gdy SM2, do RB8 jest wpisywany bit stopu odbieranego słowa tryb 2 i 3 do RB8 jest wpisywany dziewiąty bit odbieranego słowa TI - znacznik przerwania nadajnika. Ustawiany w stan 1 przez mikrokontroler tylnym zboczem 9-mego bitu wysyłanego słowa w trybie 0 lub przednim zboczem bitu stopu w pozostałych trybach. Może być zerowany tylko programowo. RI - znacznik przerwania odbiornika. Ustawiany w stan 1 przez mikrokontroler tylnym zboczem 9-mego bitu przyjmowanego słowa w trybie 0 lub w połowie bitu stopu w pozostałych trybach z wyjątkiem gdy w trybach 2 i 3 bit SM2 = 1, a dziewiąty bit odbieranego słowa jest równy 0 Rys. Format danych interfejsu UART
6.1 Tryby pracy portu szeregowego 6.1.1 Tryb 0 W trybie 0 nadawanie i odbieranie słowa, w układzie rejestru przesuwnego, odbywa się przez końcówkę P3.0, a przez końcówkę P3.1 jest wysyłany sygnał taktujący, rysunek 7-1. Przesyłana dana jest 8-bitowa. Częstotliwość taktująca jest stała i wynosi fosc/12. Proces wysyłania danych rozpoczyna się w momencie wpisania do rejestru SBUF wysyłanej danej. Rejestr ten jest rejestrem przesuwnym, jego zawartość jest przesuwana w prawo o jeden bit w fazie S6P2 każdego cyklu maszynowego. Na wolne miejsca po przesuniętych bitach wpisywane są zera. Odbiór danych może odbywać się pod warunkiem ustawienia REN w stan 1 i wyzerowaniu znacznika RI. Stan wejścia RxD jest testowany w kolejnych cyklach maszynowych, a wynik testowania jest wpisywany do rejestru przesuwnego i przesuwany w lewo. Po skompletowaniu danej zawartość rejestru przesuwnego przepisywana jest do rejestru SBUF i następuje ustawienie znacznika RI w stan 1, co jest sygnałem zgłoszenia przerwania. Przyjęcie tego przerwania (gdy nie jest ono zamaskowane) nie powoduje automatycznego wyzerowania znacznika RI, a zatem jego stan można później badać programowo. 6.1.2 Tryby 1,2,3 W trybach 1, 2 i 3 port szeregowy pełni funkcję niezależnego nadajnika (linia P3.1 = TxD) i odbiornika (linia P3.0 = RxD) asynchronicznej transmisji szeregowej. Tryby różnią się między sobą długością przesyłanych słów oraz sposobem określenia szybkości transmisji. Słowo przesyłane składa się z bitu startu (zawsze 0), ośmiu bitów danych w trybie 1 albo dziewięciu w trybie 2 i 3 oraz bitu stopu (zawsze 1). Słowo danych do wysłania jest pobierane z rejestru wyjściowego SBUF, odebrane słowo jest wpisywane do rejestru wejściowego SBUF. W trybach 2 i 3 ostatni D8 (MSB) bit danych jest pobierany do wysłania z pozycji TB8 (słowo SCON, adres 98H), a ten odbierany jest wpisywany na pozycję RB8 (słowo SCON). Jeżeli w słowie SCON jest SM2 = 0, to wartość bitu D8 nie jest istotna dla działania układów transmisji szeregowej - można go wykorzystać programowo jako np. bit parzystości. Jeżeli natomiast jest SM2 = 1, to w porcie szeregowym jest maskowane odebranie znaku, w którym D8 = 0. Mechanizm ten jest wykorzystany w protokole transmisji dla systemu wieloprocesorowego. Drugim elementem wpływającym na różnice między trybami 1, 2 i 3 jest źródło sygnału taktującego, określającego szybkość transmisji. W trybie 2 układ transmisji jest taktowany wewnętrznym sygnałem zegarowym o częstotliwości fosc/2, doprowadzonym bezpośrednio lub poprzez dzielnik przez 2 - w zależności od zawartości znacznika SMOD, tzn. PCON.7. W trybach 1 i 3 sygnałem taktującym układ transmisji jest sygnał przepełnienia licznika T1 z układu czasowo-licznikowego. Jest on doprowadzany bezpośrednio lub poprzez dzielnik przez 2 - zgodnie z zawartością znacznika SMOD. We wszystkich trzech trybach właściwy sygnał zegarowy, określający rytm pracy nadajnika (TxD) i odbiornika (RxD) powstaje po podzieleniu przez 16 odpowiedniego, opisanego powyżej, sygnału taktującego. Zatem dla trybu 2 częstotliwość taktująca wynosi fosc/32 lub fosc/64, dla trybów 1 i 3 zależy od nastawy i trybu pracy licznika T1. Wysłanie znaku jest inicjowane programowo, przez wykonanie dowolnego rozkazu zapisującego dane do rejestru SBUF. Po zakończeniu transmisji ustawiany jest znacznik TI rejestru SCON, adres 98H.
Odbieranie znaku jest inicjowane sprzętowo, po wykryciu zmiany 1 na 0 na linii P3.0 (RxD). Odbywa się to tylko wtedy, kiedy jest ustawiony znacznik REN w rejestrze SCON. Aby odebrany znaku znalazł się w rejestrze SBUF ( i ew. dziewiąty bit w znaczniku RB8 - SCON.2 w trybach 2 i 3) muszą zachodzić dwa warunki: 1. RI (SCON.0) = 0 2. SM2 (SCON.5) = 0 lub SM2 = 1 i odebrany bit D8 = 1 Jeśli warunki te są spełnione, ustawiany jest znacznik RI; jeśli zaś jeden z powyższych warunków nie zachodzi, to odebrany znak jest tracony. Rys. 10. Licznik T2 jako generator sygnału taktującego UART mk 80C51/52 W trybie 1 i 3, przy użyciu licznika w trybie 2 (8-bitowy licznik z autoładowaniem), prędkość transmisji jest określona zależnością: f tr 2 = 32 SMOD * 12* f osc [ 256 ( TH1) ] gdzie (TH1) - liczba wpisana do rejestru TH1 (adres 8DH). Licznik 1 może również taktować port szeregowy pracując w pozostałych trybach, z sygnałem zewnętrznym lub wewnętrznym. W takim przypadku do ponownego załadowania licznika należy wykorzystać przerwanie wywołane przepełnieniem licznika a czas obsługi przerwania musi być uwzględniony przy obliczaniu częstotliwości przepełnienia licznika. Korzystając z licznika T2 prędkość wyraża się następującym wzorem: f osc f tr = 32 *[65536 ( RCAP2H, RCAP2L)] gdzie: (RCAP2H, RCAP2L) - liczba wpisana do 16-bitowego rejestru licznika T2.
5. Licznik T2 Układ posiada dwa rejestry TH2 i TL2 stanowiące 16-bitowy licznik (odpowiednio adresy CDH i CCH) oraz dwa rejestry zatrzaskujące RCAP2H i RCAP2L (CBH i CAH). Rejestr T2CON mieści się pod adresem C8H w SFR i zawiera znaczniki: T2CON TF2 EXEF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RL2 adres C8H TF2 - znacznik przepełnienia licznika 2. Ustawiany na 1 gdy nastąpi przepełnienie licznika. Nie dotyczy to sytuacji gdy RCLK = 1,lub CLK = 1. Znacznik ten musi zarezerwowany programowo. EXF2 -znacznik ustawiony na 1 opadającym zboczem na wejściu T2EX(P1.1) gdy znacznik EXEN2 = 1.Jest to informacja, że nastąpiło autoładowanie licznika lub przepisanie stanu licznika do bufora pod wpływem zewnętrznego sygnału. Przy uaktywnionym przerwaniu od licznika 2 następuje zgłoszenie przerwania. Znacznik ten musi być zerowany programowo. RCLK - znacznik przełączania generatora taktującego odbiornik portu szeregowego pracującego w trybie 1 lub 3. Gdy RCLK = 1 odbiornik portu szeregowego jest taktowany sygnałem wyjściowym licznika2, a gdy RCLK =0- sygnałem wyjściowym licznika 1. TCLK znacznik przełączania generatora taktującego nadajnik portu szeregowego pracującego w trybie 1 lub 3.Zasada przełączania jest taka jak dla znacznika RCLK. EXEN2-znacznik bramkujący zewnętrzne wejście sterujące T2EX (P1.1). Gdy EXEN2 = 1ilicznik nie pracuje Jako generator dla portu szeregowego, to opadające zbocze na wejściu T2EX, w zależności od trybu pracy licznika, może powodować autoładowanie lub przepisanie zawartości licznika do bufora. TR2 -znacznik uruchamiania licznika. Gdy TR2 = 1 to licznik pracuje. C/T2-znacznik przełączania wejścia licznika. Gdy C/T2 = 0, to licznik pracuje jako czasomierz z sygnałem odniesienia o częstotliwości fosc/12 otrzymywanym z zegara wewnętrznego.gdy C/T2 = 1 do wejścia licznika jest doprowadzony sygnał z wejściat2 (P1.0). CP/RL2 -znacznik przełączania trybu pracy. Gdy CP/RL2 = 1 praca z zatrzaskiem. Do bufora jest przepisywana zawartość licznika gdy stan wejścia T2EX zmienia się z wysokiego na niski i znacznik EXEN2 = 1. Gdy CP/RL2 = 0 licznik pracuje z autoładowaniem, które odbywa się albo gdy następuje przeładowanie licznika, albo pod wpływem opadającego zbocza na wejściu T2EX (przy EXEN2 = 1). Znacznik ten jest ignorowany gdy licznik pracuje jako generator taktujący port szeregowy (RCLK = 1 lub/i TCLK =1 ). RCLK + TCLK CP/RL2 TP2 TRYB PRACY 0 0 1 Licznik 16-to bitowy z autoładowaniem 0 1 1 Licznik 16-to bitowy z zatrzaskiem 1 X 1 Generator taktujący port szeregowy X X 0 Zatrzymanie licznika Rejestr T2MOD mieści się pod adresem C9H w SFR i zawiera znaczniki: T2MOD - - - - - - T2OE DCEN adres C9H T2OE - znacznik uaktywniający wyjście licznika T2.
DCEN jeżeli jest ustawiony umożliwia na zmianę kierunku zliczania góra/dół w zależnosci od stanu linii T2EX ( 1 / 0 ). 6.2 Przygotowanie portu szeregowego do pracy Uruchomienie portu szeregowego, który ma pracować ze standardową prędkością bodową, wymaga ustawienia trybu pracy licznika - licznik z autoładowaniem, zaprogramowania licznika na określony stopień podziału, ustawienia trybu pracy portu szeregowego, a przy odbiorze danych należy ustawić znacznik REN. Po każdorazowym nadaniu i odbiorze bajtu danych należy wyzerować odpowiedni znacznik TI lub RI. Należy również podjąć decyzję, czy kontrola końca transmisji pojedynczego bajtu będzie się odbywać poprzez przerwanie, czy poprzez programowe testowanie znacznika TI przy nadawaniu lub RI przy odbiorze. Mikrokontroler AT90S8515 8. UART UART : nadawanie Transmisja jest inicjowana przez wpis danej do rejestru danej UART : UDR. Dana jest transferowana z UDR do rejestru przesuwnego gdy : 1) Nowa dana została wpisana do UDR po tym jak wysłany został ostatni bit danej poprzedniej. Rejestr przesuwny jest ładowany natychmiast. 2) 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. Przesłanie danej z UDR do rejestru przesuwnego powoduje ustawienie flagi UDRE w rejestrze statusowym UART. Flaga ta sygnalizuje gotowość przyjęcia następnej danej do nadawania. Zaraz po załadowaniu rejestru przesuwnego czyszczony jest jego LSB (bit startu) a bit 9 ( lub 10 ) jest ustawiany ( bit stopu ). W przypadku wysyłania danej 9 bitowej ( patrz bit CHR9 w rejestrze sterującym UCR ), dziewiąty bit danej jest przepisywany na 9-ty bit rejestru przesuwnego. Z prędkością ustawianą zawartością rejestru UBRR następuje przesyłanie bitów, rozpoczynając bitem startu, następnie LSB, kończąc na bicie stopu. Bity są wystawiane na pin TxD. Po wysłaniu bitu stopu, następuje przesłanie nowej danej z UDR do rejestru przesuwnego ( o ile nowa dana została tam wpisana w czasie transmisji ). Podczas przesłania ustawiana jest flaga UDRE. W przypadku braku nowej danej, UDRE pozostaje ustawiona aż do momentu wpisania danej do UDR. Jeśli nie ma już danych do przesłania, a bit stopu pozostaje na TxD przez czas potrzebny na przesłanie 1 bitu, ustawiana jest flaga TxC w USR. Bit TXEN w rejestrze UCR włącza tryb nadawania UART. Jeśli jest wyczyszczony, pin PD1 może być użyty jako pin ogólnego przeznaczenia. Jeśli jest ustawiony, pin PD1 będzie ustawiony jako wyjście i to niezależnie od stanu rejestru kierunku danych portu D ( patrz DDRD).
Rys. 4.46. Schemat blokowy układu nadajnika UART w mk AT90S8515 UART : odbiór Układ odbioru próbkuje sygnał wejściowy ( RxD ) z częstotliwością 16 * BAUD. Gdy linia jest w stanie spoczynkowym, pojedyncza próbka o stanie 0 jest interpretowana jako zbocze opadające bitu startu i rozpoczyna się procedura sprawdzająca. Testuje ona, czy rzeczywiście stan 0 na linii jest bitem startu czy też zakłóceniem, i w tym drugim przypadku ignoruje zbocze. Jeśli bit startu jest stwierdzony poprawnie ( 3 próbki z rzędu to 0 ), następuje odczyt kolejnych 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. Pozwala to na eliminację zakłóceń. Kiedy do odbiornika trafia bit stopu, także on przechodzi procedurę sprawdzenia poprawności i jeśli z 3 próbek 2 lub 3 są zerami, ustawiana jest flaga FE ( błąd ramki ). Przed odczytaniem UDR należy więc zawsze sprawdzić stan flagi FE. Niezależnie od ewentualnego błędu ramki, dana jest przesyłana do UDR ( rejestru danej ) i ustawiana jest flaga RxC. W rzeczywistości UDR nie jest jednym rejestrem, lecz dwoma oddzielnymi dla wysyłania i odbioru. W przypadku zapisu do UDR dana jest wpisywana do rejestru wysłania, a w przypadku odczytu podstawiana jest zawartość rejestru odbioru. Jeśli
ustawiony jest tryb odbioru danej 9 bitowej ( patrz bit CHR9 w UCR ), bit RXB8 w rejestrze UCR jest ładowany wartością dziewiątego bitu danej odebranej. Jeśli po odebraniu danej stwierdzi się brak pobrania z rejestru UDR danej poprzedniej, ustawiana jest flaga kolizji OR w UCR. Oznacza ona, że ostatnio odbierana dana nie mogła zostać przesłana do UDR i została utracona. Flaga OR jest czyszczona przy odczycie prawidłowej danej z UDR. Przed odczytem UDR należy więc zawsze sprawdzić flagę OR. Kiedy bit RXEN w rejestrze UCR jest wyczyszczony, odbiornik jest wyłączony. Pin PD0 może być użyty dowolnie. Gdy RXEN = 1 pod pin PD0 podłączone jest wejście odbiornika, co oznacza, że staje się on pinem wejściowym, niezależnie od ustawień w rejestrze kierunku pinów DDRD. Kiedy ustawiony jest nit CHR9 w rejestrze UCR, dane odbierane i nadawane mają długość 9 bitów plus bit startu i stopu. Dziewiąty bit danej do nadania należy wpisać pod bit TXB8 w UCR, a odebrany dziewiąty bit danej znajduje się w RXB8 w UCR. Wpis bitu do TXB8 oczywiście musi nastąpić wcześniej niż wpis reszty danej do UDR, co rozpoczyna transmisję. Rys. 4.47. Schemat blokowy układu odbiornika UART w mk AT90S8515 Sterowanie UART em Sterowanie układem UART realizuje się poprzez rejestry : Danej : UDR ( dana odbierana lub nadawana ) Statusowy : USR ( flagi błędów, zakończenie transmisji, etc. ) Sterowania : UCR ( włączenie przerwań, włączenie / wyłączenie UART )
Prędkości : UBRR ( BAUD = fck / ( 16 ( UBRR+1 ) ) ) UDR rejestr danej UART Adres: $0C ( $2C ) Dostęp: R/W Wartość początkowa: $00 UDR nie jest jednym rejestrem, lecz dwoma oddzielnymi dla wysyłania i odbioru. W przypadku zapisu do UDR dana jest wpisywana do rejestru wysłania, a w przypadku odczytu podstawiana jest zawartość rejestru odbioru. USR rejestr statusowy UART Adres: $0B ( $2B ) Bit 7 6 5 4 3 2 1 0 RXC TXC UDRE FE OR - - - Dostęp R R/W R R R R R R Wartość początkowa 0 0 0 0 0 0 0 0 7 : RXC Odbiór zakończony. Gdy flaga jest ustawiona, odebrana dana została przesłana do rejestru UDR. Flaga ta jest ustawiana niezależnie od błędów transmisji. W przypadku włączenia przerwania ( RXCIE w UCR), ustawienie RXC oznacza wywołanie obsługi przerwania zakończenia odbioru. RXC czyszczona jest przez odczyt UDR. Obsługa przerwanie zakończonego odbioru musi odczytać UDR i wyczyścić RXC. 6 : TXC Nadawanie zakończone. Zakończono nadawanie bitu stopu, a w rejestrze UDR nie ma nowej danej. Flaga ta jest użyteczna w trybie half-duplex, kiedy urządzenie po nadaniu danych musi zwolnić linię i ustawić się w tryb odbioru. Jeśli ustawiona jest flaga TXCIE w UCR, wykona się obsługa przerwania zakończonego nadawania. TXC czyści się wtedy automatycznie. W przypadku wyłączonego przerwania TXC można wyczyścić poprzez wpisanie logicznej 1. 5 : UDRE Rejestr danej pusty. Flaga ta ustawia się przy przesłaniu danej z UDR do rejestru przesuwnego celem nadania i oznacza, że do UDR można wpisać kolejną daną. 4 : FE Błąd ramki. Ustawia się gdy zamiast bitu stopu stwierdza się 0. Czyści się automatycznie po prawidłowym odbiorze bitu stopu. 3 : OR Błąd kolizji. Ustawia się, gdy nie można przesłać odebranej danej do rejestru UDR, ponieważ nie odczytano z tego rejestru danej poprzedniej. Zeruje się przy prawidłowym przepisaniu danej do UDR. 2..0 : zarezerowane. UCR rejestr sterowania UART
Adres: $0A ( $2A ) Bit 7 6 5 4 3 2 1 0 RXCIE TXCIE UDRIE RXEN TXEN CHR9 RXB8 TXB8 Dostęp R/W R/W R/W R/W R/W R/W R W Wartość początkowa 0 0 0 0 0 0 1 0 7 : RXCIE Włączenie przerwania zakończonego odbioru. Gdy flaga jest ustawiona, ustawienie flagi RXC w USR powoduje wywołanie obsługi przerwania ( oczywiście przy odblokowanej globalnej masce przerwań ). 6 : TXCIE Włączenie przerwania zakończonego nadawania. Gdy flaga jest ustawiona, ustawienie flagi TXC w USR powoduje wywołanie obsługi przerwania ( oczywiście przy odblokowanej globalnej masce przerwań ). 5 : UDRIE Włączenie przerwania rejestr danej pusty. Gdy flaga jest ustawiona, ustawienie flagi UDRE w USR powoduje wywołanie obsługi przerwania ( oczywiście przy odblokowanej globalnej masce przerwań ). 4 : RXEN Bit ten włącza tryb odbioru ( gdy RXEN= 1 ). Gdy RXEN= 0 flagi TXC, OR i FE nie mogą mieć wartości 1. Jeśli flagi te są ustawione, wyłączenie RXEN nie powoduje ich czyszczenia. 3 : TXEN Bit ten włącza tryb nadawania (gdy TXEN= 1 ). Wyłączenie tego bitu w czasie transmisji ma efekt dopiero po zakończeniu nadawania zarówno aktualnej danej jak i ewentualnie następnej już wpisanej do UDR. 2 : CHR9 Włączenie trybu transmisji danej 9 bitowej. Patrz opis bitów RXB8 i TXB8. Dziewiąty bit może być użyty jako dodatkowy bit stopu lub do kontroli parzystości. 1 : RXB8 Dziewiąty bit odebranej danej. Czyta się go, jeśli bit CHR9 jest ustawiony. 0 : TXB8 Dziewiąty bit danej do nadania. Należy go modyfikować, jeśli dana przesłana ma być 9 bitowa ( czyli gdy CHR9= 1 ). Generator taktujący UART Generator taktujący transmisję jest dzielnikiem częstotliwości, który generuje zegar o częstotliwości zgodnie z równaniem: BAUD = fck / ( 16 ( UBRR+1 ) ) gdzie UBRR jest zawartością rejestru prędkości UART. fck jest częstotliwością oscylatora Przykładowe prędkości transmisji dla różnych częstotliwości zegara przedstawiono w tabeli. Na następnej stronie. Przy każdej kombinacji podano procentowy błąd rzeczywistej prędkości transmisji w stosunku do standardowej. Zaleca się stosować takie prędkości transmisji, aby ten błąd był mniejszy niż 1 % ( mniej błędów transmisji ). UBRR rejestr prędkości transmisji UART
Adres: $09 ( $29 ) Dostęp: R/W Wartość początkowa: $00 Jest to rejestr determinujący prędkość transmisji UART wg równania podanego na poprzedniej stronie. Tabela 4. Przykładowe prędkości transmisji UART dla różnych częstotliwości oscylatora Bodów fosc = % fosc = % fosc = % fosc = % 3.2768 Mhz błąd 3.6864 Mhz błąd 4 Mhz błąd 4.608 Mhz błąd 2400 UBRR=84 0.4 UBRR=95 0.0 UBRR=103 0.2 UBRR=119 0.0 4800 UBRR=42 0.8 UBRR=47 0.0 UBRR=51 0.2 UBRR=59 0.0 9600 UBRR=20 1.6 UBRR=23 0.0 UBRR=25 0.2 UBRR=29 0.0 14400 UBRR=13 1.6 UBRR=15 0.0 UBRR=16 2.1 UBRR=19 0.0 19200 UBRR=10 3.1 UBRR=11 0.0 UBRR=12 0.2 UBRR=14 0.0 28800 UBRR=6 1.6 UBRR=7 0.0 UBRR=8 3.7 UBRR=9 0.0 38400 UBRR=4 6.3 UBRR=5 0.0 UBRR=6 7.5 UBRR=7 6.7 57600 UBRR=3 12.5 UBRR=3 0.0 UBRR=3 7.8 UBRR=4 0.0 76800 UBRR=2 12.5 UBRR=2 0.0 UBRR=2 7.8 UBRR=3 6.7 115200 UBRR=1 12.5 UBRR=1 0.0 UBRR=1 7.8 UBRR=2 20.0 Bodów fosc = 7.3728 Mhz % błąd fosc = 8 Mhz % błąd fosc = 9.216 Mhz % błąd fosc = 11.059 Mhz 2400 UBRR=191 0.0 UBRR=207 0.2 UBRR=239 0.0 UBRR=287 --- 4800 UBRR=95 0.0 UBRR=103 0.2 UBRR=119 0.0 UBRR=143 0.0 9600 UBRR=47 0.0 UBRR=51 0.2 UBRR=59 0.0 UBRR=71 0.0 14400 UBRR=31 0.0 UBRR=34 0.8 UBRR=39 0.0 UBRR=47 0.0 19200 UBRR=23 0.0 UBRR=25 0.2 UBRR=29 0.0 UBRR=35 0.0 28800 UBRR=15 0.0 UBRR=16 2.1 UBRR=19 0.0 UBRR=23 0.0 38400 UBRR=11 0.0 UBRR=12 0.2 UBRR=14 0.0 UBRR=17 0.0 57600 UBRR=7 0.0 UBRR=8 3.7 UBRR=9 0.0 UBRR=11 0.0 76800 UBRR=5 0.0 UBRR=6 7.5 UBRR=7 6.7 UBRR=8 0.0 115200 UBRR=3 0.0 UBRR=3 7.8 UBRR=4 0.0 UBRR=5 0.0 % błąd Mikrokontroler PIC16F873/6 7. Uniwersalny synchroniczny-asynchroniczny odbiornik nadajnik (USART) Moduł uniwersalnego asynchronicznego - synchronicznego nadajnika odbiornika (USART) jest jednym z dwóch szeregowych nadajników I/O. (USART jest także znany jako interfejs komunikacji szeregowej lub SCI). USART może być konfigurowany jako w pełni dwukierunkowy interfejs asynchroniczny, który może komunikować się z urządzeniami peryferyjnymi, takimi jak terminale CRT i komputery osobiste. Może on być również konfigurowany jako jednokierunkowy synchroniczny interfejs służący do współpracy z urządzeniami peryferyjnymi takimi jak: przetworniki A/D i / D/A, szeregowe pamięci EEPROM, itd. Układ USART może pracować w następujących trybach: Asynchronicznym (dwukierunkowym). Synchronicznym master (jednokierunkowym). Synchronicznym slave (jednokierunkowym).
Bit SPEN (RCSTA<7>) i bity TRISC <7:6> muszą być ustawione na 1 w celu skonfigurowania pinów RC6/TX/CK i RC7/RX/DT jako wyjścia i wejścia układu USART. Rejestr TXSTA (Adres 98h) R/W-0 R/W-0 R/W -0 R/W -0 R/W -0 U-0 R/W -0 R-1 CSRC TX9 TXEN SYNC - GRGH TRMT TX9D bit 7 Bit 0 CSRC : bit wyboru źródła sygnału zegara: Tryb Asynchroniczny: bez znaczenia. Tryb Synchroniczny: 1 = Tryb Master (Zegar generowany wewnętrznie z BRG), 0 = Tryb Slave (Zegar z źródła zewnętrznego). TX9 : bit włączenia transmisji 9 bitowej: 1 = transmisja 9 bitowa, 0 = transmisja 8 bitowa. TXEN bit włączający transmisję: 1 = transmisja możliwa, 0 = transmisja niemożliwa. Uwaga : SREN/CREN jest nadrzędny w stosunku do TXEN w trybie SYNC. SYNC : bit wyboru trybu USART, 1 = tryb synchroniczny, 0 = tryb asynchroniczny. BRGH : bit wyboru szybkiej prędkości bodowej: Tryb Asynchroniczny: 1 = duża prędkość, 0 = niska prędkość. Tryb Synchroniczny: Nieużywany w tym trybie TRMT : bit statusu rejestru przesuwającego w nadawaniu: 1 = TSR pusty, 0 = TSR pełny. TX9D : 9 ty bit danych transmitowanych - może być bitem parzystości. Rejestr RCSTA (Adres 18h) R/W-0 R/W-0 R/W -0 R/W -0 R/W -0 U-0 R-0 R-x SPEN RX9 SREN CREN ADDEN FERR OERR RX9D bit 7 Bit 0 SPEN : bit uaktywniania portu szeregowego 1 = port szeregowy aktywny (konfiguruje piny RC7/RX/DT i RC6/TX/CK jako piny portu szeregowego), 0 = port szeregowy nieaktywny. RX9 : bit włączenia odbioru 9 bitowego: 1 = odbiór 9 bitowa, 0 = odbiór 8 bitowa. SREN bit włączający jednokrotny odbiór:
Tryb Asynchroniczny: bez znaczenia. Tryb Synchroniczny Master: 1= włącza jednokrotny odbiór, 0= wyłącza jednokrotny odbiór. Bit jest zerowany po zakończeniu odbioru. Tryb Synchroniczny Slave: bez znaczenia. CREN : bit aktywowania odbioru ciągłego: Tryb Asynchroniczny: 1= włącza ciągły odbiór, 0= wyłącza ciągły odbiór. Tryb Synchroniczny: 1=ciągły odbiór dopóki bit CREN nie jest wyzerowany (CREN jest nadrzędny w stosunku do SREN), 0=wyłącza ciągły odbiór. ADDEN : bit aktywowania wykrywania adresu: Tryb Asynchroniczny 9 bitowy (RX9 = 1 ) 1 = uaktywnia wykrywanie adresu, uaktywnia przerwanie i opróżnia bufor odczytu, kiedy RSR<8> jest ustawiony, 0 = dezaktywuje wykrywanie adresu, wszystkie bajty są odczytywane i dziewiąty bit może być wykorzystany jako bit parzystości. FERR : bit błędu ramki: 1=błąd ramki (może być zmieniony przez odczyt rejestru RCREG i odbiór następnego znaczącego bajtu), 0=brak błędu ramki. OERR : bit błędu przepełnienia 1 = błąd przepełnienia (kasowanie poprzez wyzerowanie bitu CREN), 0 = brak błędu przepełnienia RX9D : 9 ty bit danych odebranych (może być bitem parzystości). 7.1. Generator szybkości transmisji BRG układu USART Układ BRG wspomaga oba tryby pracy interfejsu USART synchroniczny i asynchroniczny. Jest to dedykowany 8-bitowy generator szybkości transmisji. Rejestr SPBRG kontroluje okres swobodnej pracy 8-bitowego zegara. W trybie asynchronicznym bit BRGH (TXTA<2>) kontroluje również szybkość transmisji. W trybie synchronicznym bit BRGH jest ignorowany. Poniższa tabela pokazuje wzory potrzebne do obliczenia szybkości transmisji dla różnych trybów USART. Mając podaną żądaną szybkość transmisji i Fosc, najbliższa wartość całkowita dla rejestru SPBRG może być obliczona przy użyciu wzorów z poniższej tabeli. Korzystne może być użycie wysokiej szybkości transmisji (BRGH=1) nawet dla wolniejszych zegarów transmisji. Dzieje się tak dlatego, gdyż równanie Fosc/(16(X+1)) może w niektórych przypadkach zredukować błąd transmisji. Wpisanie nowej wartości do rejestru SPBRG powoduje zresetowanie timera BRG. SYNC BGRH=0(mała prędkość) BRGH=1 (duża prędkość) 0 (Asynchroniczny) szybkość transmisji =Fosc/(64(x+1)) Szybkość transmisji= Fosc/(16(x+1)) 1 (Synchroniczny) szybkość transmisji=fosc/(4(x+1)) nie oblicza się
Rejestry związane z generatorem BRG układu USART Adres Nazwa Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Stany po: POR, BOR Stany po pozostałych RESET-ach 98h TXSTA CSRC TX9 TXEN SYNC - BRGH TRMT TX9D 0000-010 0000-010 18h RCSTA SPEN RX9 SREN CREN ADDE N FERR OERR RX9D 0000 000x 0000 000x 99h SPBRG ADFM REJESTR GENERATORA SZYBKOŚCI TRANSMISJI 0000 0000 0000 0000 7.2. Tryb asynchroniczny USART W tym trybie, interfejs USART używa standardowego formatu bez powrotu do zera (NRZ) (jeden bit START, 8 lub 9 bitów danych i jeden bit STOP). Najbardziej popularnym formatem danych jest format 8 bitowy (8N1). Transmisja danych zaczyna się od bitu LSB. Nadajnik i odbiornik USART są funkcjonalnie niezależne, ale używają tego samego formatu danych i tej samej szybkości transmisji. Generator szybkości transmisji wywołuje zegar x16 albo x64 szybkości przesunięcia transmisji bitów, zależnie od bitu BRGH (TEXSTA <2>). Parzystość nie jest wspomagana sprzętowo, ale może być implementowana programowo (i zapisana jako 9 bit danych). Tryb asynchroniczny jest zatrzymany podczas trybu SLEEP mikrokontrolera. Tryb asynchroniczny jest wybierany przez wyczyszczenie bitu SYNC (TEXTA<4>). W tym trybie układ USART składa się z elementów: generatora szybkości transmisji, układu próbkującego, nadajnika asynchronicznego, odbiornika asynchronicznego. 7.2.1 Nadajnik transmisji asynchronicznej USART Schemat blokowy nadajnika USART pokazany jest na rys. 24. Sercem nadajnika jest rejestr przesuwny nadajnika (TSR). Rejestr przesuwny otrzymuje dane z bufora transmisji TXREG (można do niego zapisać i odczytać zawartość). Do rejestru TXREG dane są wprowadzane przez program użytkownika. Rys. 24. Schemat blokowy nadajnika USART dla transmisji asynchronicznej
Rejestr TSR jest ładowany nowymi danymi z rejestru TXREG pod warunkiem, że bit STOP jest ustawiony (zakończone nadawanie). Kiedy rejestr TXREG nada dane do rejestru TSR to rejestr TXREG jest wówczas pusty i flaga TXIF (PIR<4>) jest ustawiana. Przerwanie może być aktywne / nie aktywne przez ustawienie / wyzerowanie bitu TXIE (PIE<4>). Flaga bitu TXIF będzie ustawiona nie zważając na stan bitu TXIE i nie może być wyzerowana programowo. Bit ten będzie zresetowany dopiero wtedy, kiedy nowe dane będą załadowane do rejestru TXREG. Podczas gdy flaga TXIF wskazuje na status rejestru TXREG inny bit TRMT (TXSTA <1>) pokazuje status rejestru TSR. Bit statusu TRMT jest tylko do odczytu i jest ustawiany, gdy rejestr TSR jest pusty. Żadne przerwania nie jest związane z tym bitem więc użytkownik musi przeglądać ten bit aby określić czy rejestr TSR jest pusty. Rejestr TSR nie jest mapowany w pamięci danych więc nie jest dostępny dla użytkownika. Flaga TXIF jest ustawiona kiedy bit TXEN jest ustawiony. Flaga TXIF jest zerowana przez załadowanie danej do rejestru TXREG. Układ USART jest włączany (uaktywniony) przez ustawienie bitu TXEN (TXSTA<5>). Transmisja rozpoczyna się gdy do rejestru TXREG wprowadzimy daną. Oczywiście generator BRG musi generować sygnał zegarowy o właściwej częstotliwości. Normalnie gdy zaczyna się transmisja rejestr TSR jest pusty. W tym momencie transfer do rejestru TXREG spowoduje natychmiastowy transfer do rejestru TSR i opróżnienie rejestru TXREG. Zerując bit TXEN podczas transmisji spowodujemy przerwanie transmisji i zresetowanie układu nadajnika. W rezultacie pin RC6/TX/CK przejdzie w stan wysokiej impedancji. Jeśli zostanie wybrana transmisja 9 bitowa, bit transmisji TX9 (TXSTA<6>) powinien być ustawiony, dziewiąty bit powinien być zapisany do TX9D (TXSTA<0>). Dziewiąty bit musi być zapisany przed zapisem ośmiu bitów danych do rejestru TXREG. Taka sytuacja ma miejsce, ponieważ dane zapisane do rejestru TXREG mogą spowodować natychmiastowe przeniesienie danych do rejestru TSR (jeśli TSR jest pusty). W takim przypadku nieprawidłowy dziewiąty bit może być zapisany do rejestru TSR. Aby ustawić transmisję asynchroniczną należy wykonać następujące kroki : Uaktywnić rejestr SPBRG wpisując odpowiednią wartość szybkości transmisji. Uaktywnić asynchroniczny port szeregowy przez wyzerowanie bitu SYNC i ustawienie bitu SPEN. Jeśli przerwania będą wykorzystane należy ustawić bit TXIE. Jeśli wykorzystana będzie transmisja 9 bitowa należy ustawić bit TX9. Uaktywnić transmisję przez ustawienie bitu TXEN, który ustawi bit TXIF. Jeśli została wybrana transmisja 9 bitowa bit dziewiąty powinien być załadowany do bitu TX9D. Załadować dane do rejestru TXREG (początek transmisji ). Jeśli przerwania są używane upewnić się, że GIE i PEIE (bity 7 i 6 ) rejestru INTCON są ustawione.
Rejestry związane z nadajnikiem asynchronicznym układu USART Adres Nazwa Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 0Bh,8Bh, 10Bh, 18Bh INTCO N Stany po: POR, BOR Stany po pozostałych RESET-ach GIE PEIE T0IE INTE RBIE T0IF INTF R0IF 0000 000x 0000 000u 0Ch PIR1 PSPIF 1 ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000 18h RCSTA SPEN RX9 SREN CREN - FERR OERR RX9D 0000-00x 0000-00x 19h TXREG REJESTR UKŁADU TRANSMIJI USART 0000 0000 0000 0000 8Ch PIE1 PSPIE 1 ADIE RCIE TXIE SSPIE CCP1IF TMR2IE TMR1IE 0000 0000 0000 0000 98h TXSTA CSRC TX9 TXEN SYNC - BRGH TRMT TX9D 0000-010 0000-010 99h SPBRG REJESTR GENERATORA BRG 0000 0000 0000 0000 7.2.2 Odbiornik transmisji asynchronicznej USART Schemat blokowy odbiornika jest pokazany na rys. 25. Dane są czytane na pinie RC7/RX/DT i są przesyłane do bloku odbioru danych (Data Recovery).Blok odbioru danych jest szybkim rejestrem przesuwnym (prędkość generatora BRG x16), podczas gdy główny rejestr odbiornika szeregowego pracuje z częstotliwością Fosc. Gdy wybrany jest tryb asynchroniczny, odbiór jest możliwy jeżeli ustawimy bit CERN (RCSTA<4>). Najważniejszą częścią odbiornika jest szeregowy rejestr przesuwny RSR. Po wykryciu bitu STOP, odebrana dana w rejestrze RSR jest przesyłana do rejestru RCREG (jeżeli jest on pusty). Po zakończeniu przesyłania zostaje ustawiona flaga RCIF (PIR1<5>). Przerwanie może być odblokowane /zablokowane poprzez ustawienie /wyzerowanie bitu RCIE w rejestrze PIE1<5>. Flaga RCIF jest bitem tylko do odczytu i może być wyzerowana tylko przez kontroler. Zostaje ona wyzerowana gdy zostanie odczytany rejestr RCREG (jest on pusty). Rejestr RCREG jest podwójnie buforowany (dwustopniowy FIFO). Jest możliwy odbiór i przesłanie dwóch bajtów danych do RCREG FIFO i zapoczątkowanie przesuwania trzeciego bajtu do rejestru RSR. Po wykryciu bitu STOP w trakcie wysyłania trzeciego bajta, jeżeli rejestr RCREG jest ciągle pełny to jest ustawiany bit przepełnienia OERR (RCSTA<1>). Dane w RSR zostaną utracone. Aby odzyskać dwa bajty znajdujące się w FIFO należy dwukrotnie odczytać rejestr RCREG. Bit przepełnienia OERR musi być wyzerowany programowo. Robi się to poprzez wyzerowanie i ustawienie bitu CREN. Gdy bit OERR jest ustawiony, przesyłanie z rejestru RSR do RCREG jest wstrzymane, a kolejne dane nie są odbierane. Dlatego niezbędne jest wyzerowanie bitu błędu OERR. Bit błędu ramki FERR (RCSTA<2>) zostaje ustawiony, gdy bit STOP nie zostaje wykryty (stan wysoki). Bit FERR i 9-ty odebrany bit są buforowane tak jak odbierana dana. Odczyt RCREG załaduje bity RX9D i FERR nowymi wartościami, dlatego konieczny jest odczyt RCSTA zanim odczytany zostanie rejestr RCREG, aby nie stracić informacji o starych wartościach bitów RX9D i FERR.
Rys. 25. Schemat blokowy odbiornika USART w trybie asynchronicznym Należy wykonać następujące kroki przy programowaniu odbioru asynchronicznego: Ustawić w rejestrze SPBRG zadana szybkość transmisji. Jeżeli zadana jest duża szybkość transmisji, należy ustawić bit BRGH. Uaktywnić asynchroniczny port szeregowy, zerując bit SYNC i ustawiając SPEN. Jeśli przerwania będą wykorzystane należy ustawić bit RCIE. Jeśli wykorzystana będzie transmisja 9 bitowa należy ustawić bit RX9. Uaktywnić transmisję przez ustawienie bitu CREN. Flaga RCIF zostanie ustawiona gdy dane zostaną odebrane i zostanie wygenerowane przerwanie jeżeli bit RCIE jest ustawiony. Należy odczytać rejestr RCSTA aby uzyskać dziewiąty bit (jeżeli ustawiony) oraz określić czy nie wystąpił błąd podczas transmisji. Odczytać 8-bitów danych z rejestru RCREG. W przypadku wystąpienia błędu, wyczyścić bit CREN. Jeśli używane są przerwania, należy upewnić się, że bity GIE i PIE (bity7 i 6 ) w rejestrze INTCON są ustawione. Rejestry związane z odbiornikiem asynchronicznym układu USART Adres Nazwa Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 0Bh,8Bh, 10Bh, 18Bh INTCON GIE PEIE T0IE INTE RBIE Stany po: POR, BOR Stany po pozostałych RESET-ach T0IF INTF R0IF 0000 000x 0000 000u 0Ch PIR1 PSPIF 1 ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000 18h RCSTA SPEN RX9 SREN CREN - FERR OERR RX9D 0000-00x 0000-00x 1Ah RCREG REJESTR UKŁADU TRANSMIJI USART 0000 0000 0000 0000 8Ch PIE1 PSPIE 1 ADIE RCIE TXIE SSPIE CCP1IF TMR2IE TMR1IE 0000 0000 0000 0000 98h TXSTA CSRC TX9 TXEN SYNC - BRGH TRMT TX9D 0000-010 0000-010 99h SPBRG REJESTR GENERATORA BRG 0000 0000 0000 0000
Fragment programu obsługi UART dla 8051 STMODE equ 01110000B T1MODE equ 00100000B BAUDH equ 243 BAUDL equ 243 ;8 bit UART without multiprocessor communication ;feature, enable serial reception ;8-bit auto-reload timer ;2400 baud rate at 12MHz quartz, and ;SMOD=0 ORG 000h START: sjmp BEGIN ORG 003h sjmp OBSINT0 ORG 023h sjmp STINT ;przerwanie od INT0 ;przerwanie portu szeregowego ORG 100h BEGIN: mov SP,#30h mov TMOD,#T1MODE ;tryb licznika 1 mov SCON,#STMODE ;tryb portu szeregowego mov TH1,#BAUDH mov TL1,#BAUDL ;szybkość transmisji setb TR1 ;wystartuj licznik T1 clr TI clr RI setb ES setb EX0 setb EA ; odblokowanie przerwania od UART ;odblokowanie przerwania od INT0 ;uaktywnienie przerwań sjmp $ ; Obsluga portu szeregowego STINT: clr EA jb TI, STWR STRD: mov DATABUFF,SBUF clr RI jmp STEND STWR: clr TI STEND: setb EA ;czy przerwanie z nadajnika ;pobierz odebrana dana ;kasuj znacznik
; Obsluga przerwania INT0 OBSINT0: clr EA mov,sbuf, DATABUFF setb EA ;wyślij daną Fragment programu obsługi UART dla 8052 WLoT2 EQU 0BFH ;65471 tj. predkosc transmisji szeregowej 9600bd WHiT2 EQU 0FFH ;przy fosc=20mhz ORG 0023H AJMP OBSRS ; DO OBSLUGI PORTU SZEREGOWEGO START: MOV T2CON,#30H MOV SCON,#50H MOV TL2,#WLoT2 MOV TH2,#WHiT2 MOV RCAP2L,#WLoT2 MOV RCAP2H,#WHiT2 SETB TR2 ;T2 TAKTUJE PORT SZEREGOWY, T2 STOP ;TRYB 1, UKLAD UAKTYWNIONY ;START T2 TAKTUJACEGO PORT SZEREGOWY AJMP $ ; - obs. przerwania od portu szeregowego OBSRS: JBC RI,OMIN54A SJMP RSEND1 OMIN54A: PUSH ACC MOV A,LICZBAJT CJNE A,#00H,OMIN53 MOV ROZKAZ,SBUF MOV A,ROZKAZ ANL A,#03H ;WPROWADZ LICZBE BAJTOW DANYCH ;ODCZYTANIE PRZESLANEGO ROZKAZU ;SPRAWDZENIE CZY ROZKAZ WYMAGA ;DANYCH JNZ OMIN54 ACALL PARSER ;GDY NIE TO DEKODOWANIE ROZKAZU SJMP RSEND OMIN54: MOV LICZBAJT,A ;USTAW LICZNIK DANYCH DO ODEBRANIA
SJMP RSEND OMIN53: MOV A,LICZBAJT CJNE A,#03H,OMIN55 MOV DANA3,SBUF DEC LICZBAJT SJMP RSEND OMIN55: MOV A,LICZBAJT CJNE A,#02H,OMIN56 MOV DANA2,SBUF DEC LICZBAJT SJMP RSEND OMIN56: MOV A,LICZBAJT CJNE A,#01,RSEND MOV DANA1,SBUF DEC LICZBAJT ANL ROZKAZ,#0FCH ACALL PARSER RSEND: POP ACC RSEND1: CLR TI CLR RI RETI ;OBSLUGA DLA 3 DANYCH ;OBSLUGA DLA 2 DANYCH ;OBSLUGA DLA 1 DANEJ ;ZEROWANIE DWOCH NAJMLODSZYCH ;BITOW ;DEKODOWANIE ROZKAZU ;ZERUJ FLAGI PRZERWAN Program obsługi UART dla AT90S8515 include "8515def.inc".def temp =r16.org 0x00 rjmp START ;reset zewnętrzny, przy włączeniu i Watchdoga rjmp OBSINT0 ;żądanie przerwania zewnętrznego 0 ;żądanie przerwania zewnętrznego 1 ;licznik1: zdarzenie zatrzaśnięcia ;licznik1: zdarzenie porównania A ;licznik1: zdarzenie porównania B ;licznik1: zdarzenie przekroczenia zakresu ;licznik0: zdarzenie przekroczenia zakresu ;transfer zakończony (SPI) rjmp ODCZYT ;Rx zakończony (UART) ;rejestr danej pusty (UART) ;Tx zakończony (UART) ;przerwanie komparatora analogowego
START: ldi temp, high(ramend) out SPH,temp ldi temp, low(ramend) out SPL,temp ldi temp,0x80 out ACSR,temp ldi temp,0x00 out DDRA,temp out PORTA,temp ldi temp,0xff out DDRC,temp out PORTC,temp ldi temp,0x04 out PORTD,temp ldi temp,0x14 out DDRD,temp ldi temp,25 out UBRR,temp ldi temp,0x98 out UCR,temp ldi temp,0x02 out MCUCR,temp ldi temp,0x40 out GIMSK,temp sei LOOP: rjmp LOOP OBSINT0: in temp, PINA SKOK: sbis USR,UDRE rjmp SKOK out UDR,temp ODCZYT: in temp,udr out PORTC,temp.exit ;inicjalizacja stosu ;wyłączenie zasilania komparatora ;inicjalizacja portu A, port wejściowy ;inicjalizacja portu C, port wyjściowy ;inicjalizacja portu D, PD4 wyjście i PD2 (INT0) ;wyjście z "1" ;prędkość 9600 przy oscylatorze 4MHz ;konfiguracja UART ;przerwanie INT0 zboczem opadającym ;odblokowane przerwanie INT0 ;odblokowanie przerwań ;obsługa przerwania INT0, wysłanie bajta do ;komputera PC ;czy rejestr UDR jest pusty ;obsługa przerwania po odbiorze bajta z komputera
Fragment programu obsługi UART dla PIC16F873/6 LIST P=16F873 INCLUDE "P16F873.INC" org 0x00 GOTO START org 0x04 BTFSC INTCON,INTF GOTO OBSINT BTFSC PIR1,RCIF GOTO OBSRS ;skok do początku kodu programu ;skok do obsługi przerwania INT ;skok do obsługi przerwania odbioru RS-232 START BCF STATUS,RP1 BSF STATUS,RP0 ;wybor Banku 1 MOVLW 0x97 MOVWF TRISC MOVLW 0x0D0 MOVWF INTCON MOVLW 0x20 MOVWF PIE1 ;RCIE=1 reszta 0 ;TX, SDO i SCL - wyjścia, ;RX, SDA, CCP1, CCP2 i T1CKI - wejścia ;GIE=1, odblokowane INT i PEIE=1 MOVLW 0x26 MOVWF TXSTA MOVLW 51 MOVWF SPBRG ;nadajnik włączony, transmisja 8-bitowa ;prędkość transmisji 9600 bodów przy f=8mhz BCF STATUS,RP0 ;wybor Banku 0 MOVLW 0x90 MOVWF RCSTA GOTO $ OBSINT BCF INTCON,INTF BTFSS TXSTA,TRMT GOTO $-1 MOVWF TXREG ;odbiornik włączony, transmisja 8-bitowa ;oczekiwanie na przerwanie INT ;wyzerowanie flagi przerwania, ;wykonywane na początku obsługi każdego ;przerwania!!! ;czekaj na pusty bufor nadajnika ;wysłanie danej w ej. W przez RS-232 RETFIE
OBSRS BCF PIR1,RCIF ;wyzerowanie flagi przerwania odbiornika UART MOVF RCSTA,W ;odczyt odebranej danej (do rej. W) RETFIE END