Architektury Komputerów - Laboratorium Informatyka III rok studia dzienne Ćwiczenie nr 3: Komunikacja szeregowa w systemach mikroprocesorowych Cel ćwiczenia Celem ćwiczenia jest zapoznanie się z systemami szeregowej transmisji danych na przykładzie standardu RS 232C. Wymagane wiadomości Budowa mikrokontrolera BasicStamp2 Zestaw edukacyjny StampInClass budowa i obsługa Język PBASIC. Transmisja szeregowa i jej cechy charakterystyczne. Podstawowe informacje o asynchronicznej transmisji danych na przykładzie RS232. Wykorzystywany sprzęt Komputer PC z oprogramowaniem do obsługi zestawu BasicStamp. Zestaw edukacyjny StampInClass firmy Parallax inc wraz z niezbędnym wyposaŝeniem dodatkowym. Literatura www.parallaxinc.com www.stampsinclass.com 1
Transmisja w standardzie RS 232 Do wykonania niezbędna jest współpraca 2 zespołów. Transmisja będzie realizowana pomiędzy 2 zestawami Basic Stamp. Wykonanie niezbędnych połączeń: Za pomocą dostępnych długich przewodów zrealizować połączenia: a) połączyć masy obu modułów ( wyprowadzenia VSS) b) połączyć ze sobą port P0 w obu zestawach. c) Połączyć ze sobą port P1 w obu zestawach. Zestaw edukacyjny Basic Stamp jest wyposaŝony w mechanizmy komunikacji za pomocą łącza szeregowego pracującego w standardzie RS232. Do wysyłania danych słuŝy polecenie SEROUT. SEROUT Tpin {\Fpin}, Baudmode, {Pace,} {Timeout, Tlabel,} [ InputData ] Tpin stała, zmienna lub wyraŝenie określające I/O pin (0-15) przez który będą wysyłane asynchroniczne dane. Fpin opcjonalna stała/zmienna/wyraŝenie określające I/O pin mający słuŝyć jako wskaźnik kontroli przepływu. Pin ten jest konfigurowany jako wejście. Parametr ten musi zostać wyspecyfikowany jeśli zamierzamy uŝywać parametru Timeout i Tlabel. Baudmode - stała/zmienna/wyraŝenie określająca szybkość i inne parametry odbieranych Pace opcjonalna stała/zmienna/wyraŝenie określająca długość przerwy pomiędzy transmitowanymi danymi Timeout opcjonalna stała/zmienna/wyraŝenie określające jak długo oczekiwać na zezwolenie wysłania danych mające pojawić się na wyprowadzeniu Fpin. Jeśli zezwolenie nie przyjdzie w określonym czasie to sterowanie programem zostanie przekazane do etykiety Tlabel. Tlabel etykieta określająca gdzie przekazać sterowanie programem w przypadku nieuzyskania zezwolenia na transmisje OutputData Lista zmiennych i znaków formatu informująca jak wysyłać dane. Funkcja SEROUT moŝe transmitować dane w postaci bajtu, powtarzającego się ciągu bajtów, zamieniać wartości na odpowiadającą im tekstową reprezentacje binarna, dziesiętną lub szesnastkową oraz ciągi bajtów reprezentujące tablice. Do asynchronicznego przyjmowania danych słuŝy polecenie SERIN. SERIN Rpin {\Fpin}, Baudmode, {Plabel,} {Timeout, Tlabel,} [ InputData ] Rpin stała, zmienna lub wyraŝenie określające I/O pin (0-15) przez który będą odbierane asynchroniczne dane. Fpin opcjonalna stała/zmienna/wyraŝenie określające I/O pin mający słuŝyć jako wskaźnik kontroli przepływu. Pin ten jest konfigurowany jako wyjście. Baudmode - stała/zmienna/wyraŝenie określająca szybkość i inne parametry odbieranych 2
Plabel opcjonalna etykieta, do której ma zostać przekazanie wykonywania programu w przypadku wystąpienia błędu parzystości. Powinna być uŝywana wyłącznie w przypadku gdy Baudmode jest ustawiony na 7 bitów danych i bit parzystości. Timeout opcjonalna stała/zmienna/wyraŝenie określające jak długo oczekiwać na przychodzące dane. Jeśli dane nie dotrą na czas to sterowanie programem zostanie przekazane do etykiety Tlabel. Tlabel etykieta do której naleŝy przekazać sterowanie programem w przypadku przekroczenia czasu oczekiwania na dane. InputData Lista zmiennych i znaków formatu informująca jak traktować przychodzące dane. Funkcja SERIN moŝe zapisywać dane w zmiennej lub tablicy, interpretować jako tekst ( wartość binarną, dziesiętną lub szesnastkową) i zapisywać odpowiadającą wartość w zmiennej, oczekiwać na stałą lub zmienną ilość danych, oraz ignorować określoną ilość Przykład programu w PBASIC wysyłającego dane za pośrednictwem linii P0 : txd con 0 rxd con 1 baud con 1646 transmisja 2400 8,n,1 d var byte serout txd, baud,[ test rs ] debug wyslane Przykład programu odbierającego dane szeregowe za pośrednictwem linii P1 i wyświetlającego na terminalu debugera: txd con 1 rxd con 0 baud con 1646 transmisja 2400 8,n,1 d var byte debug czekam na dane...,cr serin rxd, baud,[d] debug d Za pomocą przedstawionych programów sprawdzić poprawność wykonania połączenia: na jednym zestawie uruchomić program odbierający dane, na drugim uruchomić program nadający dane. Jeśli dane zostaną poprawnie przesłane ( odbieramy to co nadajemy) przejść do dalszej części ćwiczenia. Jeśli nie są odbierane Ŝadne dane, sprawdzić czy właściwie skonfigurowane są programy ( dane powinny być nadawane tym samym przewodem z którego je odbieramy) Sprawdzić połączenia. Jeśli dane są odbierane z przekłamaniami to naleŝy spróbować zmniejszyć szybkość transmisji. (szczegółowy spis parametrów znajduje się na stronach 275-310 BASIC_Stamp_Manual_v2_0c.pdf) Następnie rozbudować programy na obu stanowiskach tak aby potrafiły nadawać i odbierać dane. Np. program zespołu A (nadajnik) wysyła 1 znak ASCII i czeka na odpowiedz, program zespołu B oczekuje na znak po odebraniu zwiększa odebrany znak o 1 i odsyła go do nadajnika. 3
Synchronizowana transmisja szeregowa W tej części podjęta zostanie próba zrealizowania własnego prostego standardu synchronizowanej transmisji szeregowej. Taki rodzaj transmisji wybrano ze względu na łatwość realizacji przyjętych załoŝeń. ZałoŜono, Ŝe transmisja danych będzie przebiegać jednokierunkowo, będzie wydzielona linia sygnałowa słuŝąca synchronizacji przesyłanych bitów. Budowa i opis działania. Dostępne są 2 linie sygnałowe : dane (DATA), zegar (CLOCK) i wyprowadzenie wspólne masa (GND). W transmisji bierze udział dedykowany nadajnik i dedykowany odbiornik. Linia DATA słuŝy do przesyłania bitów informacyjnych, linia CLOCK słuŝy do synchronizacji przebiegu. Obie linie są sterowane przez dedykowany nadajnik. Aby przesłać 1 bit na danych naleŝy : po stronie nadajnika: - ustawić nieaktywny stan na linii CLK - ustawić na linii DATA wartość tego bitu - ustawić aktywny stan na linii CLK. - Odczekać chwile - Powrócić do stanu nieaktywnego na linii CLK Proponuje się aby aktywnym stanem na linii CLK był stan niski ( logiczne zero). Po stronie odbiornika: Oczekiwać na pojawienie się aktywnego stanu na linii CLK W momencie pojawienia się tego stanu zapamiętać stan linii DATA. Bajt zawiera 8 bitów wiec celem przesłania bajtu wystarczy powtórzyć opisane czynności 8 razy. Aby móc przesyłać dowolne dane niezbędne są procedury konwersji danych z postaci bajtu na ciąg bitów (serializacja danych) i ciągu bitów na bajt (deserializacja danych). Język PBASIC posiada wszystkie niezbędne elementy do przygotowania takich procedur. Wykorzystując zestawione wcześniej połączenie napisać procedury nadawania i odbierania danych w sposób przedstawiony wcześniej. Do dowolnego bitu zmiennej moŝemy odwoływać się poprzez jej identyfikator z odpowiednim przyrostkiem : zmienna.bit_nr ( przykład dana.bit0 odwołuje się do najmłodszego bitu zmiennej dana). dana var byte deklarujemy zmienna dana o rozmiarze 1bajtu bit_danej var bit i inna zmienna o rozmiarze 1 bitu bit_danej = dana.bit5 zmiennej bitowej przypisujemy wartosc 5 bitu zmiennej dana 4
Do przesuwania bitów w bajcie o zadana ilość pozycji słuŝą funkcje : >>- w prawo i <<- w lewo. Pierwszym argumentem jest zmienna na której naleŝy wykonać operacje, a drugim ilość bitów o jaka naleŝy przesunąć (przykład: zmienna1=zmienna2 >>2 zmiennej 1zostanie przypisana wartość zmiennej2 przesuniętej w prawo o 2 bity) Aby sterować wybranym pinem wyjściowym za pomocą wartości zmiennej naleŝy go najpierw zadeklarować jako wyjście za pomocą instrukcji OUTPUT nr_bitu. Nastepnie moŝna się do niego odwoływać jak do zmiennej bitowej za pomocą identyfikatora OUTnr_bitu. Przykład poniŝej: OUTPUT 7 konfiguruje port P7 do pracy jako wyjscie OUT7 =1 ustawia na linii P7 stan 1 PAUSE 100 odczekuje 100ms OUT7 = 0 ustawia na linii P7 stan 0 Lub inaczej: OUTPUT 7 konfiguruje port P7 do pracy jako wyjscie HIGH 7 ustawia 1 na linii P7 PAUSE 100 czeka 100ms LOW 7 ustawia 0 na linii P7 Aby odczytywać stan wybranego pinu wejściowego naleŝy go najpierw zadeklarować jako wejście za pomocą instrukcji INPUT nr_bitu. Następnie moŝna się do niego odwoływać za pomocą zmiennej bitowej INnr_bitu. Przykład poniŝej: a var bit deklarujemy zmienna bitowa INPUT 6 konfiguruje port P6 do pracy jako wejscie A = IN6 przypisujemy zmiennej a stan linii P6 Debug Linia P6 ma wartosc:, BIN A, CR slowa kluczowe BIN i CR sluza do formatowania komunikatu. 5