Serwis Elektroniki - http://www.serwis-elektroniki.prv.pl
Serwis Elektroniki - vortal otwartych umysłów ->
Strona główna | Projekty | Artykuły | Pliki | Programy | Forum | Kontakt | Historia strony
AKTUALIZACJA
01.10.2015

DOBRA KSIĄŻKA


SONDA
Czy uzupełniać projekty o wzory płytek drukowanych?

tak
nie
bez zdania
NA FORUM:
>schematy apar
 atów telefoni
 cznych z w...
>Elektronika o
 gólna
>projekt
>ATMEGA32 + LC
 D problem
>assembler
>PILNE Termome
 tr DS1820
>LISTWA ŚWIETL
 NA LED ("
 ;z filmu N...
>Poszukuję try
 bów serwisowy
 ch
>Assembler 51.
  (ASEM-51) -
 implementa...
>pomysł może ,
  lub pomocy ?
 

KOMENTARZE

MAILING



LICZBA WEJŚĆ

KY3ORR
GG:  
  

Obsługa RS232 w LabView

         W obecnych czasach, gdzie implementacja specjalizowanych układów do nawet najprostszych zadań nie jest niczym dziwnym, ba — nawet ekstrawaganckim z uwagi na niskie ceny półprzewodników, wykorzystanie mikrokontrolerów i układów dedykowanych stwarza nowe możliwości zwłaszcza, jeśli chodzi o komunikację. Właśnie dzięki temu zyskujemy coraz to nowsze, bardziej śmiałe i niespotykane rozwiązania układowe w sprzęcie powszechnego użytku, oraz zaawansowane narzędzia w sprzęcie profesjonalnym. Wszystko to powoduje, że dzisiaj jesteśmy w stanie sczytywać informację z kardridży drukarkowych, bezstykowo identyfikować zakupy przesuwające się na taśmie w markecie, czy otwierać drzwi bez wkładania w zamek tradycyjnego klucza. Niebawem normą będzie lodówka zamawiająca przez Internet beczkę świeżego piwa, gdy to w lodówce będzie na wyczerpaniu.
Opisane przypadki wymagają posiadania sprzętowej i programowej obsługi transmisji danych. Jednym z popularniejszych sposobów jest wykorzystanie portu RS232 nagminnie stanowiącego integralną część mikrokontrolerów.
Podchodząc, zatem do tematu niejako z duchem czasów chcę zaproponować swoim Czytelnikom zainteresowanie problemem wymiany danych poprzez rzeczony port RS232 na dwukierunkowej drodze: mikrokontroler<->PC. Od strony komputera pomocne okaże się programowe wsparcie doskonałego środowiska dedykowanego tworzeniu wirtualnych narzędzi laboratoryjnych: LabView 6.1 produkcji National Instruments.

[do góry]

RS232

         Szczegółowych informacji na temat standardu RS232 nie będę tu przytaczał, gdyż informacje te wykraczają poza ramy artykułu, wspomnę tylko o najpopularniejszym ze sposobów sterowania, zwłaszcza podczas stawiania pierwszych kroków. Milcząco przyjmę, iż Czytelnik ma pojęcie o sterowaniu transmisją od strony mikrokontrolera.

W podstawowym i najprostszym wydaniu łącze RS232 posiada jedynie trzy przewody, które łączą końcówki współpracujących urządzeń: nadawcze TX, odbiorcze RX i masy GND. Należy pamiętać o fakcie, iż to, co w nadajniku jest RX łączone jest przewodem do odbiornika na TX i na odwrót. Końcówki GND łączone są razem, co powoduje powstanie wspólnego odniesienia dla sygnałów logicznych, których poziomy szacowane są właśnie względem masy. Warto mieć na uwadze, iż standardowo łącze RS232 komutuje jedynie 2 urządzenia (w rozwiązaniu wieloprocesorowym wykorzystuje się transmisję 9-cio bitową w celu adresowania większej ilości urządzeń na magistrali, ale i tak sama wymiana danych może zachodzić jedynie pomiędzy dwoma na raz) to też aplikacje bardziej rozwinięte i te sieciowe warto zaopatrzyć w inny hardware’owo—software’owy sposób wymiany danych (np. TCP/IP).

Transmisja szeregowa w standardzie RS232 możliwa jest na kilka sposobów. Generalnie wyróżnia się transmisję synchroniczną i asynchroniczną. W pierwszym przypadku dwukierunkowe przesyłanie danych odbywa się po jednym przewodzie w takt sygnału zegarowego podawanego na drugi z przewodów (RX, TX). W tym wypadku dane mogą w danej chwili płynąć tylko w jednym kierunku, a ten typ transmisji nazywa się HALF DUPLEX lub DUPLEX.

Z kolei transmisja asynchroniczna, jednocześnie w obie strony po obu przewodach, realizowana jest w takt sygnałów zegarowych generowanych osobno w nadajniku i odbiorniku niezależnie. Ważne jest, aby częstotliwości te były dobrze dopasowane, aby nie występowały przekłamania podczas transmisji/odbioru danych. W tym przypadku otrzymujemy tak zwany FULL DUPLEX, co oznacza, iż dane mogą przepływać niezależnie i jednocześnie w obie strony.

Kolejnymi wariantami są: ilość bitów pakietu danych (standardowo 7, 8, lub 9), ilość bitów stopu kończących datagram (standardowo 1, 1,5 lub 2), prędkość transmisji (standardowo 1200, 2400, 4800, 9600 etc. bodów), oraz bit parzystości (brak, ODD, EVEN, MARK, SPACE). Dodatkowo występuje taki termin jak sterowanie przepływem (brak, XON/XOFF, RTS/CTS, DTR/DSR) i dotyczy to organizacji i zarządzania ruchem na łączu RS232.

W najprostszym trzyprzewodowym wykonaniu transmisja ma następujące parametry: transmisja asynchroniczna, 8 bitów danych, 1 bit stopu, bez bitu parzystości i bez kontroli przepływu. Cała zabawa sprowadza się, zatem do określenia i wybrania tej samej prędkości transmisji w obu urządzeniach przyłączonych do magistrali, pomiędzy którymi chcemy przesyłać dane.

W mikrokontrolerach sprawa obsługi portu RS232 jest stosunkowo prosta. Dzięki implementacji sprzętowej protokołu w połączeniu ze sterowaniem odpowiednimi jego końcówkami, oraz możliwości bezpośredniego dostępu do bufora znakowego, gdzie wysłanie danej przez ówcześnie skonfigurowany, za pomocą rejestrów wewnętrznych procesora, port polega zaledwie na przesłaniu znaku do specjalnego bufora. Odczyt realizowany jest podobnie prosto bo poprzez odczyt danych z bufora. Natomiast obsługa portu szeregowego na komputerze PC możliwa jest do zrealizowania, na co najmniej kilka sposobów. Można napisać program w języku C, można w assemblerze, można posłużyć się gotowym komponentem programowym lub też zbudować obsługę rzeczonego portu graficznie z wykorzystaniem LabView i języka programowania G.

[do góry]

RS232 w LabView

         W LabView mamy dostępne bloczki odpowiedzialne za transmisję szeregową w sekcji Instrument I/O->Serial.

Należą one do grupy bloczków VISA, które to umożliwiają sprawne budowanie funkcji wymiany danych. Z bardziej użytecznych dostępne są: VISA configure serial port, VISA write, VISA read, VISA close, Bytes at serial port. Poszczególne bloczki opiszę poniżej, a w dalszej części artykułu pokażę przykładowy sposób dwukierunkowej transmisji przy ich wykorzystaniu.

VISA Configure serial port:

Bloczek ten odpowiedzialny jest za inicjalizację i konfigurację wykorzystywanego portu COM. Do każdego z połączeń wychodzących z bloczka ’’dodrutowuje’’ się odpowiednie stałe, czy zmienne w celu konfiguracji. Wartości pokazane w nawiasach są domyślnymi i takie są ustawiane w przypadku nie podłączenia wybranego wejścia.

  • VISA resorce name > nazwa zasobu — u nas będzie to COM1 (o tym skąd ten zasób wziąć w dalszej części),
  • baud rate > prędkość transmisji w bodach (bity/s),
  • data bits > ilość bitów danych pojedynczego znaku datagramu,
  • party > liczba bitów parzystości,
  • error in > kanał błędów z poprzednich bloków VISA (u nas początek obsługi więc brak podłączenia do czegokolwiek),
  • flow control > sterowanie przepływem,
  • duplicate VISA resorce name > połączenie do dalszych bloków VISA korzystających z tego portu,
  • error out > kanał błędów do dalszych bloków VISA.
  • Dodatkowo występują jeszcze 4 nieopisane połączenia i tak w kolejności od góry od lewej:

  • timeout > timeout operacji zapis/odczyt do portu COM w milisekundach,
  • termination char > znak kończący pakiet danych (po jego wykryciu zatrzymuje się odbiór, w przeciwnym przypadku oczekiwanie na timeout),
  • enable termination > zezwolenie na obsługę termination char,
  • stop bits > liczba bitów stopu.


  • VISA Write:

    Ten bloczek odpowiedzialny jest za wysyłanie danych do urządzenia, bądź strumienia zdefiniowanego w VISA resorce name i wysyła dane pojawiające się na wejściu write buffer, które akceptuje dane typu string. Return count zwraca liczbę znaków (bajtów) wysłanych w momencie odczytu tego wyjścia.

    VISA Read:

    VISA read realizuje odczyt ze strumienia, bądź urządzenia zdefiniowanego w VISA resorce name i dokonuje odczytu danych typu string count ilości byte count bajtów. Wynik dostępny jest na wyjściu read buffer. Wyjście return count sygnalizuje liczbę bajtów odczytanych z portu.

    VISA Bytes at port:

    Bloczek pozwala na określenie ile w danej chwili jest danych (bajtów) oczekujących do odczytania w buforze wejściowym portu szeregowego.

    VISA Close:

    Bloczek ten zamyka sesję VISA (zwalnia port dla innych procesów).

    [do góry]

    Przykładowy program

             Przykładowy program pokazany poniżej realizuje dwukierunkową komunikację z zegarem DCF77, w celu pobrania informacji o bieżącej godzinie, oraz dacie i zaprezentowania jej na komputerowym panelu operatorskim.
    Zegar wyposażony jest w mikroprocesor AT80C4051 oraz konwerter poziomu napięć TTL<->RS232 oparty o standardową aplikację układu MAX232. Przewód transmisyjny, dzięki któremu zegar połączony jest z komputerem jest trzy żyłowy zapewniając transmisję asynchroniczną bez kontroli przepływu.
    Parametry transmisji zostały ustawione na: 8 bitów danych, 1 bit stopu, bez bitu parzystości, prędkość 4800 bodów, bez kontroli przepływu.
    Ramka danych wygląda następująco: komputer wysyła zapytanie o aktualną nastawę zegara w formie dwóch znaków ’’?D’’, po czym zegar odpowiada mu ciągiem danych binarnych postaci: ’’godziny;minuty;sekundy;dni;miesiące;lata;znak_terminujący’’, gdzie poszczególne dane, rozdzielone średnikami, wysyłane są jako dwuznakowy string. W całym pakiecie danych mamy, zatem 18 bajtów + znak kończący ramkę danych.
    Przykładowy pakiet (19 września 2006 roku, godzina 19:34:16) wygląda następująco: „19;34;16;19;09;06;znak_terminujący”, gdzie każdy ze znaków przesyłany jest jako oddzielny kod ASCII.

    Poniżej przedstawiony jest program realizujący w pełni postawione wyżej zadanie. Tak jak w polskim piśmiennictwie tak i w LabView zapewniony jest przepływ informacji od lewej strony diagramu do prawej. Zatem na początku mamy konfigurację portu COM1 z timeoutem 250ms i wybranym znakiem terminującym 189 (binarnie 10111101) oraz włączoną obsługę poszukiwania znaku końca pakietu danych. Otwarty i skonfigurowany port może być wykorzystywany przez dalsze bloki VISA dzięki spięciu ich szynami VISA resource i error. Kolejnym etapem jest wytransmitowanie na port znaków zapytania o aktualną nastawę zegara: ’’?D’’, oraz odczyt 18 bajtów danych, bo tyle pojawi się w buforze (znak terminujący jest pomijany i nie jest przekazywany do bufora odbiorczego). Następnie zostaje zwolniony zasób portu szeregowego spowrotem do systemu operacyjnego (staje się możliwy do wykorzystania np. przez inny proces), a odczytane dane podlegają dekodowaniu i przesłaniu do odpowiednich zmiennych.

    Mimo, iż transmisja jest wolna, bo tylko 4800 bodów, okazało się w toku testów, że rozbudowany program obsługi zegara nie jest w stanie na bieżąco odbierać w locie danych przesyłanych z komputera (zapytanie o nastawę). Aby nie modyfikować gotowego już oprogramowania zegara zdecydowałem się dokonać pewnego chwytu i dać mikrokontrolerowi trochę czasu pomiędzy kolejnym wysyłanym bajtem (dokładnie drugim). Poniżej znajduje się zmodyfikowana wersja programu odczytującego bieżącą nastawę czasu. Zmiana dotyczy dodania pętli, która wykonuje się ze zwłoką 100ms w trakcie transmisji zapytania (czyli pomiędzy obu bajtami pojawia się krótka przerwa), co znakomicie poprawiło parametry odczytu danych z portu rs232 przez mikroprocesor i od tej pory nie ma problemu ze źle interpretowanymi zapytaniami.

    Powyżej przedstawione przykładowe kody są tylko fragmentem wirtualnego narzędzia, jakie zostało wykonane do testowania transmisji rs232. Poniżej znajduje się screen działającej aplikacji w momencie odebrania ramki danych z zegara przytoczonej w tekście powyżej.

    [do góry]

    VISA resource name

             W przykładzie, aby umożliwić pracę z portem szeregowym stosowana jest stała VISA resorce name constant o wartości COM1. Nie zawsze, po zainstalowaniu LabView, możliwy jest wybór portów COM, czy LPT. W wypadku, gdy Czytelnik ma pewność, że w systemie znajduje się port, którego nie da się wybrać należy zainstalować, bądź uaktualnić sterowniki, VISA, których najnowsze wersje zawsze są do pobrania na stronie producenta oprogramowania LabView - National Instruments: www.ni.com.

    [do góry]

    © Serwis Elektroniki 2002-2006