Wbudowane systemy mikroprocesorowe Ćwiczenie laboratoryjne Interfejs RS-485. Blok peryferyjny USART Tematy ćwiczenia interfejs RS-485, blok peryferyjny USART Plan a) Podłączyć terminal do sieci RS-485 przez pierwsze złącze typu RJ45. Uruchomić w komputerze głównym aplikację XChronos i ustawić tryb skanowania terminali podłączonych do sieci. Aby obserwować sygnały na magistrali interfejsu, linie A i B połączyć z uziemionymi opornikami koło 5 kom każdy. Linie A i B są dostępne przez drugie złącze typu RJ45. Linia A jest połączona z wyprowadzeniem 1, a linia B jest połączona z wyprowadzeniem 2. Ziemia jest dostępna na złączę J13. Oporniki zamontować na płycie montażowej. Podłączyć oscyloskop do jednego z oporników i obserwować procesy na linii. Podłączyć drugi kanał oscyloskopu do drugiego opornika i obserwować sygnał różniczkowy. Pośród sygnałów wyszukać polecenie Podaj stan zaadresowane terminalowi swojego stanowiska i odpowiedź swojego terminalu. Rozszyfrować strukturę polecenia. Pokazać ramkę sygnałów prowadzającemu i przy tym opisać strukturę pakiety. b) Napisać w języku asemblera MPASM program, który generuje na liniach interfejsu ramkę (bajt) z numerem terminalu. Długość ramki musi odpowiadać częstotliwości 9600 bod. Ramka bez bitu parzystości, z jednym stopbitem. Uruchomić środowisko MPLAB IDE. Otworzyć nowy projekt przez punkt menu "Project/Project Wizard...". W projekt włączyć swój plik ".asm" i plik nagłówkowy P18F6720.inc. Przez punkt menu "File/Open..." otworzyć swój plik ".asm" z programem. Ustawić bity konfiguracyjne (ang. Configuration Bits) przez punkt menu "Configure/Configuration Bits" jak w ćwiczeniu "Środowisko MPLAB". Wybierając punkt menu "Project/Build All" wygenerować aplikację.
W celu sprawdzania programu w trybie krokowym za pomocą symulatora wybrać tryb "MPLAB SIM" przez punkt menu "Debugger/Select Tool". W ustawieniach debuggera (punkt menu "Debugger/Settings...") ustawić opcję "Processor Frequency" na 40 MHz. Sprawdzić aplikację. Wybrać punkt menu "File/Save Workspace" i zapisać ustawienia projektu, aby następnym razem można było otworzyć projekt przez punkt menu "File/Open Workspace". Przełączyć MPLAB na tryb "Programmer". Importować plik HEX32 ze swoim programem. Zaprogramować mikrokontroler PIC18F6720 w terminalu. Odłączyć terminal od sieci RS-485. Uruchomić aplikację i pokazać prowadzającemu ramkę sygnałów. Wskazówki Interfejs RS-485 Nazwa standardu zawiera skrót RS pochodzący od słów "Recommended Standard". Standard jest opracowany towarzystwem Electronics Industry Association. Szyna interfejsu szeregowego RS-485 łączy do 32 urządzeń. Linii interfejsu dwie: linia A i linia B. Na magistrali interfejsu informacja jest przekazywana sygnałem różniczkowym. Jedynka logiczna to różnica napięć na liniach A i B większa niż +200 mv, a zero logiczne to różnica napięć na liniach A i B mniejsza niż -200 mv. Linie są realizowane jako skręcona para. Trzecia linia - linia ziemi - może nie istnieć. Układy nadajników/odbiorników wytrzymują różnicę potencjałów ziemi do 15 kv. Transmisja asynchroniczna W interfejsie RS-485 jest używana transmisja asynchroniczna. W przypadku transmisji asynchronicznej urządzenia nadrzędne i podległe są synchronizowane sygnałami od różnych oscylatorów. Częstotliwość dwóch oscylatorów powinna być możliwie równa, ale nie może być idealnie jednakowa. Dlatego dane są przesyłane porcjami nie większymi niż jeden bajt. Ramka danych Porcja danych (bajt) jest wysyłany w ramce (rys. 1) z dodatkowymi bitami: - bitem startowym, - bitem parzystości lub nieparzystości, - jednym lub dwoma stop - bitami. Rys. 1. Struktura ramki interfejsu RS-485 przy transmisji asynchronicznej
Sygnałem synchronizacji jest zbocze na początku bita startowego. Zbocze powoduje w odbiorniku rozpoczęcie generacji sygnałów taktowych z częstotliwością nie mniejszą niż o 10 razy większą od częstotliwości nadawania bitów (zwykle o 16 razy większą). Mnie więcej na środku bita startowego sprawdza się poziom napięcia. Przy odbiorze bitu startowego, jeżeli poziom nie odpowiada poziomowi 0 logicznemu, odbiornik wstrzyma się od odbioru i interpretuje otrzymywany sygnał jako zakłócenie w kanale transmisji. Jeżeli bit startowy jest rozpoznany, to odbiornik mniej więcej na środku każdego następnego bita rejestruje aktualną wartość. Protokół transmisji danych Standard interfejsu RS-485 opisuje tylko ramkę z bajtem danych i nie nawiązuje protokółu transmisji danych. Wielopunktowy interfejs RS-485 potrzebuje rozwiniętego protokołu transmisji danych. Oprócz operacji po przesyłaniu danych są potrzebne operacje adresowania współdziałających urządzeń. Zwykle jedno z urządzeń połączonych w tor transmisyjny uważa się za główne i na niego spada obowiązek sterowania innymi. Protokół transmisji danych często buduje się pod konkretne zagadnienie. Rozpatrzmy protokół transmisji danych w interfejsie RS-485 dla systemu rejestracji czasu pracy. Niech system obejmuje komputer i kilka terminali do odczytu kart zbliżeniowych. Na kartach są zapisane dane do identyfikacji pracownika. W najprostszych realizacjach to może być tylko numer identyfikacyjny pracownika. W chwili rejestracji karty terminal zapisuje do swojej pamięci identyfikacyjny numer pracownika i czas rejestracji (rok, miesiąc, dzień, godzinę, minutę i sekundę). Od czasu do czasu komputer daje polecenie każdemu terminalowi przesłać zachowane dane. Jasne, że na bazie tej informacji program komputerowy może liczyć czas pracy każdego pracownika zakładu i udokumentować wyniki obliczeń. Niżej jest opisany możliwy protokół transmisji danych dla podobnego systemu. Każda transmisja jest inicjowana przez komputer. Komputer wysyła polecenie, a zaadresowany terminal musi wysłać odpowiedź. Podobny tryb komunikacji nazywa się trybem główny - podległy ( master slave ). Polecenie może być następującym pakietem bajtów: bajt długości pakietu, bajt numeru terminalu, bajt kodu rozkazu, bajty informacyjne, bajt sumy kontrolnej. Wartość bajta długości bloku jest równa ilości wszystkich bajtów. Bajt sumy kontrolnej można obliczać jako dopełnienie do 256 sumy wszystkich poprzednich bajtów. W takim przypadku suma bajtów całego pakietu powinna być równa 0. Po odebraniu poprawnego pakietu rozkazowego, wybrany terminal odpowiada podobnym pakietem, potwierdzając wykonanie rozkazu i przesyłając żądane dane. Odpowiedź może mieć następującą strukturę: bajt długości pakietu, bajt numeru terminalu, bajt kodu rozkazu,
bajty informacyjne, bajt sumy kontrolnej. Kod rozkazu w poleceniu i odpowiedzi może być jego numerem w następującej liście rozkazów: 1. Podaj stan. 2. Podaj czas. 3. Ustaw czas. 4. Ustaw wskaźnik odczytu na pierwszą rejestrację. 5. Kasuj rejestracje odczytane. 6. Podaj rejestrację i przesuń wskaźnik odczytu na następną rejestrację. Pakiet polecenia Podaj stan nie musi zawierać bajtów informacyjnych. Pakiet odpowiedzi Podaj stan może zawierać dane w następującej kolejności: 2 bajty liczby nie przeczytanych rejestracji. Polecenie Podaj czas i odpowiedź na polecenie Ustaw czas nie potrzebują danych. Polecenie Ustaw czas i odpowiedź na polecenie Podaj czas mogą zawierać dane w następującej kolejności: 4 bajty bieżącego czasu w formacie DOS (6 młodszych bitów dla sekundy, następne 6 bitów dla minuty, 5 bitów dla godziny, 5 bitów dla dnia (liczba od 1), 5 bitów dla miesiąca (liczba od 1), 6 starszych bitów dla roku od 1980). Polecenia Ustaw wskaźnik odczytu na pierwszą rejestrację, Kasuj rejestracje odczytane oraz odpowiedzi na te polecenia mogą być bez bloków danych. Podobnie może być z poleceniem Podaj rejestrację i przesuń wskaźnik odczytu na następną rejestrację. Tylko odpowiedź na ostatnie polecenie musi być z bajtami danych: 4 bajty czasu rejestracji w formacie DOS. Blok USART (UART) Techniczna realizacja interfejsu RS-232 lub RS-485 zwykle jest skoncentrowana w modułu lub układzie nazywanym USART (Universal Synchronous/Asynchronous Receiver/Transmitter) lub UART (Universal Asynchronous Receiver/Transmitter). W postaci bloków USART są realizowane łącza szeregowe COM komputera. Blok USART może być nazywany blokiem SCI (Serial Communications Interface). Mikrokontroler PIC18F6720 terminalu zawiera dwa bloki USART. Pierwszy z bloków (USART1) jest przeznaczony do implementacji interfejsu RS-485, drugi (USART2) - do implementacji interfejsu RS-232. Blok USART1 wykorzystuje wyprowadzenie RC6/TX1/CK1 jako wyjście nadajnika i wyprowadzenie RC7/ RX1/DT1 jako wejście odbiornika. Sygnały na tych wyprowadzeniach mają poziomy TTL. Układ MAX485E Do generowania sygnałów różnicowych interfejsu RS485 jest użyty układ MAX485E firmy MAXIM. Nadajnik układu MAX485E ma wejścia ze strony mikrokontrolera: DI - wysyłany bit, DE - zezwolenie na wysyłanie. Odbiornik układu MAX485E ma wyjścia w stronę mikrokontrolera: RO - przyjmowany bit,
^RE - zezwolenie na przyjmowanie (sygnałem jest poziom 0 ). Wejście DI układu MAX485E jest podłączone do wyprowadzenia RC6/TX1/CK1, a wejście DE - do wyprowadzenia RE6. Wyjście RO układu MAX485E jest podłączone do wyprowadzenia RC7/RX1/DT1, a wejście ^RE - do wyprowadzenia RE7/CCP. Sterowanie blokiem USART Rejestr PIR1 znaczników przerwań zawiera dwa bity związane z blokiem USART1: RC1IF (bit 5) - znacznik zapełnienia rejestru RCREG1 podbloku odbiornika, TX1IF (bit 4) - znacznik opustoszenia rejestru TXREG1 podbloku nadajnika. Znacznik RC1IF jest zerowany automatycznie po przeczytaniu rejestru RCREG1, a znacznik TX1IF - po zapisywaniu do rejestru TXREG1. Zezwolenia na przerwania przy odbiorze i nadawaniu są ustawiane w bitach rejestru PIE1: RC1IE (bit 5) - znacznik zezwolenia na przerwanie z powodu zapełnienia rejestru RCREG1 przy odbiorze, TX1IE (bit 4) - znacznik zezwolenia na przerwanie z powodu opustoszenia rejestru TXREG1 przy nadawaniu. Priorytety przerwań przy odbiorze i nadawaniu są ustawiane w bitach rejestru IPR1: RC1IP (bit 5) - znacznik najwyższego priorytetu przerwania z powodu zapełnienia rejestru RCREG1 przy odbiorze, TX1IP (bit 4) - znacznik najwyższego priorytetu przerwania z powodu opustoszenia rejestru TXREG1 przy nadawaniu. Aby blok USART1 był włączony należy ustawić w stan "1" bit SPEN (bit 7) rejestru RCSTA1. Do sterowania każdym z bloków USART istnieją trzy rejestry: o TXSTAx do sterowania podblokiem nadajnika, o RCSTAx do sterowania podblokiem odbiornika, o SPBRGx do wyboru częstotliwości kanału, gdzie x jest równa 1 lub 2. Zestaw bitów rejestru TXSTA1 dla trybu asynchronicznego: TX9 (bit 6) - wybór szerokości ramki: 1-9 bitów, 0-8 bitów; TXEN (bit 5) - zezwolenie na transmisję, SYNC (bit 4) - wybór trybu: 1 - synchroniczny, 0 - asynchroniczny; BRGH (bit 2) - wybór dzielnika wstępnego podbloku synchronizacji: 1-16, 0-64; TRMT (bit 1) - znacznik opustoszenia rejestru przesuwającego (wyjściowego); TX9D (bit 0) - dziewiąty wysyłany bit danych (bit adresu lub bit parzystości). Zestaw bitów rejestru RCSTA1 dla trybu asynchronicznego: SPEN (bit 7) - włączenie bloku USART1; RC9D (bit 6) - wybór szerokości ramki przyjmowanej: 1-9 bitów, 0-8 bitów. RCEN (bit 4) - zezwolenie na przyjmowanie, ADDEN (bit 3) - zezwolenie na zastosowanie dziewiątego bitu jako bitu adresu; FERR (bit 2) - znacznik błędu ramki; OERR (bit 1) - znacznik przepełnienia rejestru przyjmującego (wejściowego);
RC9D (bit 0) - dziewiąty przyjęty bit danych (bit adresu lub bit parzystości). Rejestr SPBRG1 przechowuje współczynnik dzielenia sygnału synchronizacji mikrokontrolera. Dodatkowy dzielnik wstępny jest wybierany przez bit BRGH rejestru TXSTA1. Obliczmy przykładowo, co należy załadować do rejestru SPBRG1, gdy częstotliwość w kanale musi być F = 9600 bod, a częstotliwość synchronizacji mikrokontrolera jest równa Fosc = 40 MHz. Współczynnik dzielenia Wd sygnału synchronizacji: Wd = Fosc / F = 40000000 / 9600 =4166,67 Ponieważ zakres wartości rejestru SPBRG1 jest od 0 do 255, to należy zastosować dzielnik wstępny na 64: Wd = Wd / 64 = 65 Do rejestru SPBRG1 należy załadować wartość o 1 mniejszą: SPBRG1 = Wd - 1 = 64 Bit BRGH musi być równy 0. Inicjalizacja mikrokontrolera związana z blokiem USART i układem MAX485E Porty C i E muszą być zainicjalizowane następująco: ;--- Port C movlw H'FF' movwf LATC, ACCESS movlw H'94' movwf TRISC, ACCESS ;--- Port E movlw H'BB' movwf LATE, 0 movlw H'00' movwf TRISE, 0 ;--- Ustawienia UART1 movlw H'02' movwf TXSTA1, ACCESS ;tryb asynchroniczny, 8 bitów, BRGH=0 movlw H'80' movwf RCSTA1, ACCESS ;włączenie bloku USART1, 8 bitów movlw H'40' movwf SPBRG1, ACCESS ;Dzielenie na (64+1) Funkcja wysyłania bajta danych bsf Przed wysyłaniem danych należy ustawić zezwolenie na transmisję w bicie TXEN (bit 5) rejestru TXSTA1: TXSTA1, TXEN, ACCESS Wysyłanie rozpoczyna się po załadowaniu bajta do rejestru TXREG1: pptx: ;dana w WREG movwf TXREG1, ACCESS nop ;opóźnienie o jeden cykl, aby TRMT := 0 kontx: btfss TXSTA1, TRMT, ACCESS bra kontx return