obsŁuga interfejsu rs232 na mikrokontrolerze...

30
1 INTERFEJS RS232 CEZARY KLIMASZ OBSLUGA INTERFEJSU RS232 NA MIKROKONTROLERZE ATMEGA8 wydanie pierwsze Opracowanie zawiera treści różnych publikacji takich jak: książki, datasheety, strony internetowe Cezary Klimasz Kraków 2007

Upload: lephuc

Post on 01-Mar-2019

223 views

Category:

Documents


0 download

TRANSCRIPT

1

INTERFEJS RS232 – CEZARY KLIMASZ

OBSŁUGA INTERFEJSU RS232 NA MIKROKONTROLERZE ATMEGA8

wydanie pierwsze

Opracowanie zawiera treści różnych publikacji takich jak:

książki, datasheety, strony internetowe

Cezary Klimasz Kraków 2007

2

INTERFEJS RS232 – CEZARY KLIMASZ

Spis treści

1. Przedstawienie standardu .................................................................. str. 3

2. Opis sprzętowy AVR+MAX232 ........................................................ str. 4

3. Wykorzystanie USARTa .................................................................... str. 5

4. Przykładowe programy obsługi w języku C .................................... str. 14

- program pierwszy ......................................................................... str. 14

- program drugi – protokół Modbus ............................................. str. 17

5. Obsługa portu szeregowego w Borland Builder C++ ...................... str. 22

- program w builderze ..................................................................... str. 23

6. Podsumowanie .................................................................................... str. 29

7. Bibliografia .......................................................................................... str. 30

8. Tablica ASCII ..................................................................................... str. 30

3

INTERFEJS RS232 – CEZARY KLIMASZ

Protokoły transmisji

1. Przedstawienie standardu

Standard RS-232 opisuje sposób połączenia urządzeń DTE (ang. Data Terminal Equipment) tj. urządzeń końcowych danych (np. komputer) oraz urządzeń DCE (ang. Data Circuit-terminating Equipment), czyli urządzeń komunikacji danych (np. modem). Standard określa nazwy styków złącza oraz przypisane im sygnały a także specyfikację elektryczną obwodów wewnętrznych. Standard ten definiuje normy wtyczek i kabli portów szeregowych typu COM.

POWSTANIE STANDARDU

Standard RS-232 (ang. Recommended Standard) opracowano w 1962 roku na zlecenie amerykańskiego stowarzyszenia producentów urządzeń elektronicznych w celu ujednolicenia parametrów sygnałów i konstrukcji urządzeń zdolnych do wymiany danych cyfrowych za pomocą sieci telefonicznej.

MAGISTRALA KOMUNIKACYJNA

RS-232 jest magistralą komunikacyjną przeznaczoną do szeregowej transmisji danych. Najbardziej popularna wersja tego standardu, RS-232C pozwala na transfer na odległość nie przekraczającą 15 m z szybkością maksymalną 20 kbit/s.

SPECYFIKACJA WARSTWY FIZYCZNEJ

Specyfikacja napięcia definiuje "1" logiczną jako napięcie -3V do -15V, zaś "0" to napięcie +3V do +15V. Poziom napięcia wyjściowego natomiast może przyjmować wartości -12V, -10V, +10V, +12V, zaś napięcie na dowolnym styku nie może być większe niż +25V i mniejsze niż -25V. Należy zaznaczyć przy tym, że zwarcie dwóch styków RS-232 teoretycznie nie powoduje jego uszkodzenia. W praktyce ten zapis w specyfikacji nie zawsze jest przestrzegany.

PROCESORY AVR I TRANSMISJA RS232 Większość kontrolerów AVR posiada wbudowany interfejs pozwalający na przesyłanie informacji w postaci szeregowej za pomocą linii: TXD - wyjście szeregowe i RXD - wejście szeregowe. Transmisja może się odbywać w trybie half i full-duplex, gdyż układ ten posiada dwa niezależne rejestry transmisyjne. Układ posiada także własny układ taktujący, co zwalnia liczniki-czasomierze z generowania tego sygnału.

ASYNCHRONICZNY

Każdy bajt jest przesyłany niezależnie, i jest poprzedzony bitem START (stan 0), po którym są przesyłane bity danych, po nich opcjonalnie bit parzystości (do wyboru: tak, by łączna ilość jedynek w danych i tym bicie była parzysta (Even Parity), albo nieparzysta (Odd Parity), albo by miał określoną wartość 0 albo 1 (Stick Parity) - łącznie 4 możliwości), i na koniec bit (lub bity) STOP (stan 1; dla słowa 5-bitowego 1 lub 1.5 bitu, dla dłuższych 1 lub 2; jest to gwarantowany odstęp przed bitem START następnego bajtu, może on jednak być dowolnie długi); bity mają czas trwania określony przez stronę wysyłającą, strona odbierająca odmierza czas od zbocza 1->0 na początku bitu start i próbkuje stan w połowie długości bitu; wykrycie wartości '1' w połowie bitu START jest interpretowane jako "fałszywy start"; wykrycie wystąpienia '0' pół odstępu czasu po rozpoczęciu bitu STOP jest interpretowane jako "błąd ramki" (framing error).

SYNCHRONICZNY DCE (modem) podaje sygnały TxC (nie musi go podawać, lub może być nieprawidłowy, kiedy nie daje CTS) i RxC (nie musi go podawać, lub może być nieprawidłowy, gdy nie daje DCD), a DTE (terminal) wysyła (TxD) lub odbiera (RxD) kolejne bity danych; żeby ustalić przy odbieraniu, gdzie jest granica bajtów, dane są poprzedzone serią bajtów SYN (0x16 - DTE

4

INTERFEJS RS232 – CEZARY KLIMASZ

2. Opis sprzętowy AVR+MAX232

Wymiana danych przez interfejs szeregowy

musi analizować je i wykryć, o ile bitów trzeba przesunąć dane, by uzyskać taką wartość), po których następuje znak rozpoczynający pakiet danych (np. SOH - 0x01) i kolejne bajty, bez możliwości "zaczekania" (najwyżej z możliwością wysłania danych nieznaczących); dane mają strukturę określającą ich przeznaczenie (np. dane do wyświetlenia, dane do wydrukowania, sterowanie terminalem - to, co w protokole TCP/IP określa "port"), i gdzie jest ich koniec; zwykle dla kontroli poprawności transmisji pakiet zawiera dodatkowe dane do jej sprawdzenia, czasem jest to różnica symetryczna wszystkich bajtów, częściej CRC; z powodu konieczności synchronizacji przesyłanie danych wyłącznie pakietami; ilość bitów pomiędzy pakietami nie musi być wielokrotnością bajtu.

Komunikacja przez interfejs szeregowy jest najpopularniejszym sposobem wymiany danych pomiędzy układami zbudowanymi na mikrokontrolerach. Umożliwia komunikację takich układów z komputerami PC. Zaletą jest dostępność standardu w mikrokontrolerach jak i łatwość obsługi portu COM w systemie Windows. Dzięki temu transmisja szeregowa zawitała w wielu rodzajach mierników: od woltomierzy po wskaźniki prędkości wiatru. Trzeba jednak zauważyć, że w rozwiązaniach przemysłowych rzadko stosuje się interfejs RS232. Spowodowane jest to ograniczeniami standardu, spowodowanych zbyt dużym wpływem czynników zewnętrznych na powodzenie transmisji. W zastosowaniach przemysłowych stosuje się interfejsy takie jak RS422, RS485. Ten drugi zyskał bardzo dużą popularność dzięki dostępności różnych protokołów. Dzięki transmisji różnicowej RS485 oraz konwerterów RS232 na RS485, możliwe jest wykorzystanie mikroprocesorów posiadających port szeregowy do przesyłu danych magistralą RS485.

Standardowe złącze interfejsu szeregowego przedstawiono poniżej. Jest to gniazdo typu DB-9, występują męskie i żeńskie odmiany tego gniazda.

5

INTERFEJS RS232 – CEZARY KLIMASZ

3. Wykorzystanie USART’a

Datasheet ATmega8

Trzeba w tym miejscu wyjaśnić, że w systemach mikroprocesorowych zazwyczaj korzysta się z 3 linii. Są to oczywiście linie danych RxD, TxD oraz masa. Większość z mikrokontrolerów AVR ma wbudowany port szeregowy wraz z obsługą (UART lub USART). Piny w mikrokontrolerze oznaczone są przez RXD i TXD. Aby połączyć dwa urządzenia poprzez RS232 należy zastosować układ konwertujący poziomy napięć. W tym wypadku prym wiedzie układ firmy Maxim MAX232. Poniżej przedstawiono standardowe połączenie pomiędzy mikroprocesorem a wyjściem zewnętrznym interfejsu. Trzeba zwrócić uwagę na wymagane skrosowane połączenia.

USART - (Universal Synchronous and Asynchronous Receiver and Transmitter) w mikrokontrolerach uniwersalny port mogący pracować w trybie transmisji synchronicznej i asynchronicznej. Jak wskazuje nazwa, możliwa jest praca synchroniczna (kolejne bity są przesyłane w takt zegara sterującego transmisją), lub praca asynchroniczna, kiedy odbiornik USART wykrywa początek ramki transmisyjnej, a następnie próbkuje sygnał wejściowy przez ustalony przez obie strony czas trwania bitu.

USART

Jest to wbudowany port szeregowy w układy mikroprocesorowe typu ATmega. Pozwala na wysyłanie i odbieranie danych szeregowo. Zapewnia: o transmisję full duplex (w obydwie strony), o synchroniczne i asynchroniczne operacje, o tryb master / slave, o różne rodzaje możliwych prędkości nadawania / odbierania, o ramki rozmiaru: 5,6, 7, 8, 9 bitowe z 1 lub 2 bitowym znakiem stopu, o zapewnia sprawdzenie parzystości, nieparzystości, o duże prędkości transmisji przy małej częstotliwości zegarowej, o filtracja szumów i zakłóceń, o rozmaite detekcje błędów, o generuje trzy oddzielne przerwania (szczegółowy opis w dalszych punktach opracowania).

6

INTERFEJS RS232 – CEZARY KLIMASZ

CLOCK GENERATION Umożliwia wybranie trybu pracy: normalna asynchroniczna, szybka asynchroniczna, Master synchroniczna, Slave synchroniczna. Bity UMSEL w rejestrze USART i UCSRC decydują pomiędzy wyborem: asynchronicznego lub synchronicznego działania. Double speed (szybka asynchroniczna) kontrolowana jest przez bit U2X w rejestrze UCSRA. Jeśli używamy trybu synchronicznego (UMSEL=1), rejestr Data Direction (XCK pin, DDR_XCK) musi jest aktywny.

INTERNAL CLOCK GENERATION THE BAUD RATE GENERATOR

Wewnętrzny zegar używany jest przy pracy asynchronicznej i synchronicznej (Master). Rejestr USART Baud Rate Register (UBRR) oraz licznik w dół połączone są przez programowy preskaler i szybkość generatora (baud rate generator). Licznik w dół, używany w zegarze, ładowany jest wtedy gdy od wartości UBRR dojdzie do zera lub do wartości określonej w rejestrze UBRRL. Transmiter dzieli szybkość transmisji przez 2, 8, 16 zależne od trybu.

Tabela przedstawiająca sposób obliczenia wartości dla rejestru UBRR

BUDOWA RAMKI Ramka do przesyłu szeregowego zdefiniowana jest jako jeden znak danych z bitem startu i bitem stopu, ewentualnie dodana jest weryfikacja parzystości lub sprawdzania błędów. USART akceptuje wszystkie 30 różnych kombinacji opierających się o następujące założenia:

o 1 bit startu, o 5, 6, 7, 8, 9 bity danych, o no, even, odd parity bit (bity parzystości), o 1 lub 2 bity stopu.

Ramka zaczyna się od bitu startu poprzedzającego najmłodszy bit danych. Następnie kolejne bity danych, aż do ostatniego, ramka kończy się najstarszym bitem danych. Jeśli włączone jest sprawdzanie parzystości bitów, bit parzystości umieszczony jest zaraz po bitach danych, przed bitem stopu. Kiedy cała ramka zostanie przesłana, można bezpośrednio przesłać następną ramkę, ewentualnie linia komunikacyjna zostanie ustawiona w stan bezczynności.

PARZYSTOŚĆ

Sprawdzanie parzystości polega na przeprowadzeniu obliczeń opierających się o operację XOR dla wszystkich bitów danych. Jeśli ustawiono odd parity, wtedy rezultat obliczeń jest odwracany. Poniżej przedstawiono zasadę działania:

7

INTERFEJS RS232 – CEZARY KLIMASZ

INICJALIZACJA USART USART inicjalizuje się przed komunikacją. Inicjalizacja polega na ustawieniu szybkości transmisji (baud rate), ustawienia formatu ramki i ustawieniu trybu pracy w zależności od potrzeb. Podczaj inicjalizacji czyszczone są globalne flagi przerwań. Przed ponowną inicjalizacją np. ze względu na zmianę szybkości transmisji lub formatu ramki, trzeba być pewnym, że nie ma żadnej niezakończonej transmisji. Flaga TXC sprawdza czy nadajnik wysłał wszystkie dane, a RXC sprawdza czy są jakieś nieodczytane dane w buforze odbiornika. Flaga TXC powinna być wyczyszczona przed każdą transmisją.

Przykład inicjalizacji w języku C

NADAWANIE

Nadajnik USART jest uruchamiany poprzez ustawienie bitu TXEN w rejestrze UCSRB. W momencie gdy nadajnik jest aktywny, operacje na porcie TXD są zablokowane. Oczywiście baud rate jak i tryb pracy i format ramki muszą być ustawione przed nadawaniem. Transmisja danych rozpoczyna się od załadowania danych do bufora. Procesor może załadować dane zapisując je do rejestru UDR I/O. Dane z bufora przenoszone są do Shift Register kiedy rejestr ten jest gotowy do wysłania nowej ramki. Shift Register może być załadowany jeśli znajduje się w stanie bezczynności (żadnych wychodzących transmisji) lub natychmiast po ostatnim bicie stopu z ramki właśnie przesyłanej. Poniższy kod pokazuje sposób działania:

8

INTERFEJS RS232 – CEZARY KLIMASZ

BITY NADAJNIKA

USART Transmitter posiada dwie flagi określające jego stan: USART Data Register Empty (UDRE) i Transmit Complete (TXC). Obydwie flagi mogą być użyte do wygenerowania przerwania. Flaga UDRE przedstawia stan kiedy bufor nadajnika jest gotowy na przyjęcie nowych danych. Bit ten jest ustawiony gdy bufor jest pusty, gdy bufor nadajnika zawiera dane, które nie zostały jeszcze przeniesione do Shift Register. Jeśli Data Register jest pusty bit Interrupt Enable (UDRIE) w rejestrze UCSRB ma wartość jeden, USART Data Register Empty Interrupt będzie wykonywany tak długo dopóki UDRE jest ustawiony. UDRE czyści się poprzez zapisanie rejestru UDR. Flaga TXC (Transmit Complete) ustawiana jest na jeden, jeśli cała ramka zostaje wysłana i nie ma nowych danych w buforze nadajnika. Flaga ta jest automatycznie czyszczona jeśli wygenerowane jest przerwanie zakończenia transmisji, lub może być wyczyszczona poprzez nadpisanie bitu. TXC jest przydatny przy komunikacji half-duplex (np. RS485) kiedy system musi przestawić się z nadajnika na odbiornik i zwolnić linie komunikacyjną, natychmiastowo po transmisji.

PARITY GENERATOR

Oblicza wartość bitu parzystości z ramek danych. Jeśli ustawiony jest bit UPM1=1 (sprawdzanie parzystości) wtedy nadajnik wstawia bit parzystości pomiędzy ostatnim bitem danych a pierwszym bitem stopu wysyłanej ramki.

WYŁĄCZANIE NADAJNIKA

Aby wyłączyć nadawanie ustawia się bit TXEN na zero. Nie da to efektów dopóki wychodząca transmisja nie zakończy się.

ODBIORNIK Odbiornik USART jest aktywny poprzez włączenie bitu RXEN (Receive Enable) w rejestrze UCSRB. Kiedy odbiornik jest aktywny, pin RXD jest nieaktywny. Oczywiście prędkość, format ramki muszą być ustawione przed odbieraniem. Start następuje gdy wykryty zostanie bit startu. Bity, które odbierane są następnie, są próbkowane z prędkością transmisji (lub zegara), przesuwane do rejestru Recive Shift Register dopóki nie nastąpi pierwszy bit stopu lub cała ramka zostanie odebrana. Drugi bit stopu powinien być zignorowany. Kiedy zostanie odebrany pierwszy bit stopu, zawartość Shift Register zostanie przeniesiona do bufora odbiornika. Bufor jest wtedy gotowy do odczytu z UDR I/O. Poniżej przedstawiono prosty odbiór przez USART bazujący na fladze RXC.

9

INTERFEJS RS232 – CEZARY KLIMASZ

Prosty odbiór danych

Funkcja czeka na dane z bufora odbiorczego poprzez sprawdzanie flagi RXC, przed odczytaniem bufora i zwróceniem wartości.

ODBIÓR FLAGI UKOŃCZENIA

Odbiornik posiada jedną flagę odpowiadającą jego statusowi. Flaga Receive Complete (RXC) sygnalizuje jeśli są jakieś nieodczytane dane w buforze odbiornika. Flaga ta przyjmuje wartość jeden kiedy istnieją nieodczytane dane w buforze odbiornika, a przyjmuje wartość zero, jeśli bufor jest pusty. Jeśli odbiornik jest nieaktywny (RXEN=0), wtedy bit RXC również równy jest zero. Kiedy flaga RXCIE (Receive Complete Interrupt Enable) w rejestrze UCSRB jest ustawiona, wtedy przerwanie Receive Complete Interrupt jest wykonywane tak długo dopóki flaga RXC nie zostanie ustawiona. Odbiornik USART Receiver posiada 3 flagi błędów: Frame Error (FE) błąd ramki, Data OverRun (DOR), i Parity Error (PE) błąd parzystości. Wszystkie dostępne są po odczytaniu zawartości rejestru UCSRA. Wspólne dla tych flag błędów jest to, że zlokalizowane są w buforze odbiornika razem z ramką, przez co sygnalizują status błędu. Zatem rejestr UCSRA musi być odczytywany przed buforem odbiornika UDC, od czasu odczytywania UDR I/O. Flaga Frame Error (FE) sygnalizuje stan następnej czytelnej ramki umieszczonej w buforze odbiornika. Flaga FE jest równa zero, kiedy bit stopu został poprawnie odczytany, w innej sytuacji równa jeden.

Flaga Data OverRun (DOR) sygnalizuje utratę danych. Występuje kiedy bufor odbiornika jest pełny (2 znaki), tymczasem w Receive Shift Register oczekuje nowy znak i wykryto nowy bit startu. Jeśli ustawiona jest ta flaga wtedy jedna lub więcej ramek zostaje utraconych. Flaga Parity Error (PE) sygnalizuje, że następna ramka w buforze odbiornika posiada niewłaściwy bit parzystości. Jeśli nie sprawdzamy parzystości, wtedy flaga PE równa jest zawsze zero.

SPRAWDZANIE PARZYSTOŚCI

Flaga Parity Checker jest aktywna gdy ustawiony jest bit UPM1. Typ sprawdzania może zostać wybrany za pomocą bitu UPM0. Kiedy aktywne jest sprawdzanie, obliczana zostaje parzystość z bitów danych a wynik porównywany z bitem otrzymanym w odebranej ramce. Wynik sprawdzenia jest przechowywany w buforze odbiornika wraz z odebranymi danymi i bitami stopu. Możliwe jest odczytanie flagi Parity Error przez oprogramowanie aby sprawdzić czy są błędy parzystości. Bit PE jest ustawiony jeśli następny znak, który ma być odczytany z bufora odbiornika zawiera błąd parzystości, kiedy odbiornik i sprawdzanie jest załączone (UPM1=1). Bit ten jest ważny dopóki nie zostanie odczytana zawartość bufora odbiornika (UDR).

10

INTERFEJS RS232 – CEZARY KLIMASZ

OPIS REJESTRÓW USART

WYŁĄCZANIE ODBIORNIKA W odróżnieniu od nadajnika, wyłączenie odbiornika następuje natychmiastowo. Dane przychodzące nieodebrane są tracone.

USART I/O Data Register UDR

Bufor nadajnika może być jedynie zapisywany kiedy flaga UDRE w rejestrze UCSRA jest ustawiona. Kiedy dane są zapisywane do bufora nadajnika, nadajnik jest aktywny, nadajnik ładuje dane do Transmit Shift Register.

USART Control and Status Register A – UCSRA

Bit 7 – RXC: Receive Complete Flaga jest ustawiona jeśli są nieodczytane dane w buforze odbiornika i wtedy gdy bufor jest czysty. Bit 6 – TXC: Transmit Complete Flaga ustawiona jeśli cała ramka z Transmit Shift Register została wysłana, i nie ma nowych danych w buforze nadajnika (UDR). Bit 5 – UDRE: Data Register Empty Flaga sygnalizuje, że bufor nadajnika jest gotowy do przyjęcia nowych danych. Jeśli UDRE jest ma wartość jeden to bufor jest czysty i dlatego gotowy do zapisania. Bit 4 – FE: Frame Error Bit ten jest ustawiony jeśli kolejny znak w buforze odbiornika posiada ramkę błędu (Frame Error). Bit 3 – DOR: Data OverRun Bit ten jest ustawiony stan Data OverRun jest wykrywany. Bit 2 – PE: Parity Error Bit ten jest ustawiony jeśli następny znak w buforze odbiornika posiada Parity Error, i sprawdzanie parzystości jest aktywne. Bit 1 – U2X: Double speed Ustawienia tego bitu znaczące są tylko w przypadku operacji asynchronicznych. Należy zapisać do tego bitu 0, jeśli używa się transmisji synchronicznej. Bit 0 – MPCM: Multi-processor Communication Mode Bit ten uaktywnia Multi-processor Communication mode. Jeśli posiada wartość jeden, wszystkie z przychodzących ramek nie zawierających informacje adresową zostają zignorowane.

11

INTERFEJS RS232 – CEZARY KLIMASZ

USART Control and Status Register B – UCSRB

Bit 7 – RXCIE: RX Complete Interrupt Enable Zapisanie tego bitu aktywuje przerwania dla flagi RXC. Przerwanie Receive Complete jest generowane tylko wtedy gdy RXCIE ustawione jest na jeden, globalna flaga przerwań w rejestrze SREG zapisywana jest jako jeden oraz bit RXC w rejestrze UCSRA jest ustawiany. Bit 6 – TXCIE: TX Complete Interrupt Enable Ustawienie tego bitu aktywuje przerwania dla flagi TXC. Generowane jest przerwanie Transmit Complete kiedy TXCIE=1, globalna flaga przerwań w rejestrze SREG ustawiana jest na jeden, również ustawiany jest bit TXC z rejestru UCSRA. Bit 5 – UDRIE: Data Register Empty Interrupt Enable Zapisanie tego bitu, aktywuje przerwania dla flagi UDRE. Przerwanie jest generowane jeśli UDRIE ustawione jest na jeden, globalna flaga przerwań w rejestrze SREG ustawiana jest na jeden, bit UDRE z rejestru UCSRA również jest ustawiany. Bit 4 – RXEN: Receiver Enable Zapisanie tego bity aktywuje odbiornik USART. Odbiornik wyłącza normalną obsługę pinu RXD kiedy jest RXEN=1. Wyłączenie odbiornika generuje sekwencje flag: FE, DOR, PE. Bit 3 – TXEN: Transmitter Enable Zapisanie tego bitu, aktywuje nadajnik USART. Jeśli nadajnik jest aktywny zostaje wyłączona normalna obsługa pinu TXD. Wyłączenie nadajnika może nie daje efektu dopóki wychodząca transmisja nie zostanie zakończona (odpowiednie rejestry przechowujące dane do wysłania są czyste). Wyłączenie powoduje odblokowanie pinu TXD. Bit 2 – UCSZ2: Character Size Bity te połączone są z bitem UCSZ1:0 w rejestrze UCSRC ustawiającym ilość bitów danych w ramce nadajnika i odbiornika. Bit 1 – RXB8: Receive Data Bit 8 Bit ten jest dziewiątym bitem z odebranej ramki, jeśli wykorzystujemy taki rozmiar ramki. Musi być przeczytany przed przeczytaniem niższych bitów z UDR. Bit 0 – TXB8: Transmit Data Bit 8 Bit ten jest dziewiątym bitem danych, jeśli zakładamy użycie 9 bitów danych w ramce wiadomości. Musi być zapisany przez zapisaniem niższych bitów do UDR.

USART Control and Status Register C – UCSRC

12

INTERFEJS RS232 – CEZARY KLIMASZ

Bit 7 – URSEL: Register Select Ustawienie tego bitu powoduje wybranie rodzaju dostępu do rejestrów UCSRC lub UBRRH. Jeśli zapisany jako jeden – czytanie UCSRC. Jeśli zapisujemy do UCSRC bit URSEL musi być ustawiony na jeden. Bit 6 – UMSEL: USART Mode Select Ustawienie tego bitu powoduje wybór pomiędzy trybem asynchronicznym (UMSEL=0) i synchronicznym (UMSEL=1). Bit 5:4 – UPM1:0: Parity Mode Aktywuje rodzaj sprawdzania parzystości. Jeśli opcja aktywna to nadajnik automatycznie generuje bit parzystości i dodaje do ramki. W przypadku odbiornika, powoduje wygenerowanie wartości parzystości z przychodzących danych i porównanie z ustawieniami UPM0. Jeśli wykryje jakiś błąd, zostaje ustawiona flaga PE w rejestrze UCSRA. Poniżej znajdują się możliwe ustawienia:

Bit 3 – UCSBS: Stop Bit Select Za pomocą tego bitu wybiera się ilość bitów stopu: 1 bit (USBS=0), 2 bity (USBS=1). Potrzebne jest to przy nadawaniu. Odbiornik ignoruje te ustawienia. Bit 2:1 – UCSZ1: Rozmiar znaku Bity te połączone są z bitem z UCSZ2 z rejestru UCSRB, określają rozmiar danych dla odbiornika i nadajnika. Poniżej przedstawiono ustawienia tabele z ustawieniami

Bit 0 – UCPOL: Clock Polarity Ustawienia tego bitu mają wpływ tylko w przypadku opcji pracy synchronicznej. Bit ten ma wartość zero w przypadku transmisji asynchronicznej. Bit ten określa relacje pomiędzy zmianami danych wyjściowych a próbkami danych wejściowych oraz synchronicznego zegara.

13

INTERFEJS RS232 – CEZARY KLIMASZ

USART Baud Rate Registers UBRRL and UBRRHs

Bit 15 – URSEL: Register Select Ustawienie tego bitu powoduje wybór dostępu pomiędzy rejestrami UBRRH lub UCSRC. Bit 14:12 – Reserved Bits Bit 11:0 – UBRR11:0: Baud Rate Register Jest to 12 bitowy rejestr zawierający prędkość transmisji. UBRRH zawiera cztery najstarsze bity, zaś UBRRL osiem pozostałych. Wychodząca transmisja zostaje uszkodzona w wypadku zmiany prędkości przesyłu. Poniżej znajdują się jedne z ustawień bitów UBRR

14

INTERFEJS RS232 – CEZARY KLIMASZ

PRZERWANIA USART

4. PRZYKŁADOWE PROGRAMY OBSŁUGI W JĘZYKU C

PROGRAM PIERWSZY

NAZWY PRZERWAŃ GENEROWANYCH PRZEZ USART

SIG_USART_DATA Data Register Empty Interrupt - czysty rejestr z danymi SIG_USART_RECV Receive Complete Interrupt - zakończenie odbierania SIG_USART_TRANS Transmit Complete Interrupt - zakończenie nadawania

W niniejszych przykładach pokazano jak przeprowadzić prostą transmisję szeregową pomiędzy procesorem AVR ATmega8 oraz komputerem PC. Założono, że uda się nawiązać komunikacje dwukierunkową. Każdy fragment kodu został szczegółowo opisany, aby analiza i ew. przeniesienie komunikacji na inny procesor nie nastręczała problemami.

Założeniami tego programu było proste obsłużenie wysyłania i odbierania danych przez port szeregowy. Założono, że nie będą sprawdzane błędy transmisji.

KONFIGURACJA POCZĄTKOWA

Implementacje programową oparto o środowisko WinAVR obejmujące zarówno edytor, jak i również systemowy programator AVRdude. Użyto wersji z dnia 25.05.2007r. Pierwsze wiersze programu są standardowe – zawierają dyrektywy dla kompilatora, z których bibliotek program będzie korzystał. W naszym przypadku będą to standardowe biblioteki I/O. W programie zakładamy, że nie będziemy używać przerwań, więc wystarczy tylko jedna biblioteka.

(1)

INICJALIZACJA USART

Celem zainicjowania komunikacji szeregowej należy zainicjować prędkość transmisji, rozmiar przesyłanej ramki, ilość bitów stopu, sprawdzanie parzystości. Następnie należy odblokować komunikację załączając odpowiednie bity.

W programie założono: prędkość 9600bps (bodów na sekundę), kwarc w systemie 8MHz, 8 bitów danych, sprawdzanie parzystości.

15

INTERFEJS RS232 – CEZARY KLIMASZ

(2)

Wartość dla rejestru UBRRL odczytano z tabeli zamieszczonej w datasheecie ATmega8. WYSŁANIE POJEDYNCZEGO ZNAKU

Algorytm wysyłania opiera się na zapisie znaku do rejestru UDR. Zapis jest równoznaczny ze startem nadawania.

(3)

WYSŁANIE CAŁEGO NAPISU

Operacja taka realizowana jest poprzez wysyłanie do rejestru UDR pojedynczych znaków z całego napisu. Jak widać funkcja ta korzysta z procedury (3).

(4)

ODBIÓR POJEDYNCZEJ RAMKI

Odbieranie sprowadza się do sprawdzania w rejestrze UCSRA flagi RXC, która odpowiada za detekcje danych w buforze.

(5)

Aby sprawdzić działanie nadawania o odbierania danych, poniżej znajduje się kod programu, który odbiera dane z portu szeregowego, następnie sprawdza czy została odebrana jedynka

16

INTERFEJS RS232 – CEZARY KLIMASZ

OBSŁUGA PRZERWAŃ

czy dwójka i zapala diody podpięte do pinów PB1, PB2 oraz wysyła odebrany znak do komputera.

(6)

ODBIÓR DANYCH I WYŚWIETLENIE Operacja będzie polegała odbieraniu pojedynczych bajtów. Następnie odebrana informacja z komputera będzie wyświetlona na wyświetlaczu LCD. Ze względu na obszerność nie zostaną przedstawione funkcje obsługi wyświetlacza. Odsyłam do różnych publikacji opisujących sposób obsługi (przede wszystkim sterownika HD44870).

(7)

Dzięki korzystaniu z przerwań nie trzeba cały czas nasłuchiwać w pętli czy coś nie nadeszło. Wyróżnia się trzy rodzaje przerwań dla USARTa: SIG_USART_DATA, SIG_USART_RECV, SIG_USART_TRANS.

KONFIGURACJA POCZĄTKOWA

Jako, że będziemy korzystać z przerwań należy dodać odpowiednie dyrektywy informujące kompilator o tym fakcie. Pierwsze linijki kodu programu wyglądają następująco:

(1)

W sytuacji w której kompilator zasygnalizowałby błąd spowodowany brakiem odniesień do funkcji lub procedur, należy poszukać pliku iom8.h w katalogach WinAVR i dodać go w deklaracji bibliotek.

17

INTERFEJS RS232 – CEZARY KLIMASZ

PROGRAM DRUGI - PROTOKÓŁ MODBUS

INICJALIZACJA USARTa

Przy inicjalizacji musimy zwrócić uwagę na fakt iż jeśli chcemy skorzystać z przerwań musimy je odblokować. Są to: RXCIE, TXCIE, UDRIE. Odblokowanie polega na ustawieniu odpowiednich bitów w rejestrze UCSRB.

(2)

W kodzie widać funkcje sei(), odblokowującą system przerwań globalnych. Oczywiście założono, że rejestr UCSRB załączy wszystkie możliwe przerwania. Zazwyczaj nie ma takich potrzeb.

ODBIÓR POJEDYNCZEJ RAMKI

Dzięki przerwaniu SIG_USART_RECV (które generowane jest po zakończeniu odbioru) możliwy jest prostu odbiór danych.

(3)

Kwestia obsługi błędów odbioru i wysyłania nie została omówiona. Analizując przytoczoną dokumentację można łatwo dodać te opcje.

USART można wykorzystać do wygenerowania danego formatu ramki aby skorzystać z dowolnego protokołu. Założeniami niniejszego programu jest praca układu typu master-slave, gdzie nadrzędnym urządzeniem jest komputer zaś podrzędnym mikrokontroler ATmega8. Wybrano protokół MODBUS, który jest popularnym protokołem przede wszystkim w transmisji przez magistralę RS485. Naszym zadaniem będzie napisanie programu dla mikroprocesora.

MODBUS

Założono, że transmisja odbędzie się w trybie ASCII. Zatem każdy bajt przesyłany jest za pomocą dwóch znaków ASCII. Używane jest kodowanie heksadecymalne. Ramkę używaną do przesyłania wiadomości przedstawiono poniżej. Ramka taka zawiera pole adresowe, funkcje, dane, obliczone LRC oraz bity stopu.

18

INTERFEJS RS232 – CEZARY KLIMASZ

Bit startu ma wartość 3A (:), zaś bity końca odpowiednio (0D, 0A). Zakładamy w naszym programie, że adres slave’a to 1A, dostępna funkcja to zapalanie i gaszenie diody na porcie B. Urządzenie slave ma za zadanie nasłuchiwać, jeśli otrzymana ramka zawiera poprawnie obliczone LRC oraz właściwy dla układu adres funkcja zostaje wykonana. Założono, że ma być to prosty przykład zatem slave nie wysyła informacji powrotnej. Założenia początkowe Adres: 1A – adres naszego slave’a Funkcja: 01 – zapalanie i gaszenie diody Dane: Ilość danych: 01 (jest to prosty przykład zatem tylko taka możliwość dostępna) Opcja: 01 – zgaś diodę, 02 – zapal diodę Przykładowy wygląd ramki przesyłanej z komputera: : 1A 01 01 01 E3 CRLF– gasi diodę (E3 jest wynikiem obliczenia LRC) : 1A 01 01 02 E2 CRLF– zapala diodę (E2 wynik LRC)

KONFIGURACJA POCZĄTKOWA

Standardowe ustawienia – bibliotek, zmiennych oraz uaktywnienie przerwań wraz z konfiguracją USARTA. Poniżej znajduje się początek kodu programu.

(1)

Widoczne jest użycie struktury, aby łatwo można było dostać się do różnych danych z ramki. Poniżej znajduje się główna funkcja main, w której znajdują się ustawienia USARTa, wyświetlacza LCD, a także odblokowanie przerwań.

19

INTERFEJS RS232 – CEZARY KLIMASZ

(2)

Widać, że inicjalizacja USART jest standardowa. Port B ustawiany jest jako port wyjściowy, zaś pętla for jest pętlą nieskończoną. Inicjalizacja i obsługa LCD zakłada używanie funkcji wyświetlających danych w postaciach: napisów, 8 bitowych zmiennych typu int, oraz zmiennych char. Można przeanalizować przykład bez obsługi LCD, ale w programach testowych tego typu obsługa jest przydatna.

SPRAWDZANIE LRC

LRC są to dwa znaki ASCII, które są wynikiem odpowiedniego algorytmu obliczeń części informacyjnej ramki. Algorytm ten polega na sumowaniu kolejnych 8-bitowych bajtów wiadomości, odrzuceniu przeniesień i na końcu wyznaczeniu uzupełnienia dwójkowego wyniku (U2). Sumowanie dotyczy części informacyjnej bez bitu startu i końca. Poniżej znajduje się kod programu liczącego LRC.

(3)

ODBIERANIE RAMEK DANYCH Nasłuch odbywa się w przerwaniach. W momencie wykrycia znaku startu (3A) wiadomość zostaje sklejana w ciąg znaków. Kiedy w buforze znajdą się znaki końca (CRLF) wtedy ramka Modbus jest gotowa. Ramka taka zawiera: adres, funkcje, dane, LRC.

20

INTERFEJS RS232 – CEZARY KLIMASZ

(4)

Kluczową funkcją jest funkcja wykonaj(ramkaodbierz, licznik), gdyż wywoływana jest po odebraniu znaku końca. Funkcja ta konwertuje ramkę, liczy jej LRC i wywołuje obsługę żądania.

WERYFIKACJA WYKONANIE FUNKCJI

Jeśli sprawdzone LRC jest poprawne z przesłanym należy sprawdzić czy adres w wywołaniu jest taki jak układu slave’a. Jeśli tak należy zdekodować funkcje i ją wykonać.

21

INTERFEJS RS232 – CEZARY KLIMASZ

(5)

PODSUMOWANIE

Zaprezentowany program jest tylko prostym przykładem obsługi protokołu MODBUS. Nie uwzględniono w nim wiele aspektów. Protokołu tego nie używa się zazwyczaj w wypadku interfejsu RS232, za to w transmisji RS485 jest bardzo popularny. Dla tej transmisji należałoby dodać odpowiednie linie w kodzie źródłowym odpowiedzialne za przełączanie pomiędzy nadajnikiem i odbiornikiem w przypadku wysyłania wartości ze slave’a to mastera1.

1 konwertery poziomów RS485 posiadają wejście Drive Enable pozwalające na ustawienie statusu urządzenia i ew. zajęcie

lub zwolnienie magistralii.

22

INTERFEJS RS232 – CEZARY KLIMASZ

5. OBSŁUGA PORTU SZEREGOWEGO W BCB 6.0

WPROWADZENIE

Aby obsłużyć interfejs RS232C z poziomu Windows można użyć Hyper Terminala. Konfigurując odpowiednie połączenie można wysyłać i odbierać dane portem szeregowym. Problem pojawia się gdy dane stanowią dużą ilość. Wpisywanie danych, ew. odtwarzanie ich z pliku może nastręczać problemów. Dlatego warto zająć się napisaniem programu obsługi portu w jednym z języków programowania wysokiego poziomu. Zazwyczaj robi się to w Delphi lub w Borland Builderze. Cechą wspólną obu tych programów jest możliwość obsługi WinAPI. Dzięki temu obsługa portu szeregowego nie powinna sprawiać problemów.

INTERFEJS

Najpierw zostanie przedstawiony interfejs programisty, w tym typy funkcji i ich parametry, a następnie obsłużona zostanie transmisja.

DCB (Device Control Block) – zmienne i parametry dopuszczalne (wybrane zmienne)

Typ Zmienna Znaczenie Wartość DWORD DCBlength rozmiar struktury należy wpisać

DWORD BaudRate określenie prędkości transmisji (bity/sek)

CBR_110 CBR_19200 CBR_300 CBR_ 38400 CBR_600 CBR_56000 CBR_1200 CBR_57600 CBR_2400 CBR_115200 CBR_4800 CBR_128000 CBR_9600 CBR_256000

CBR_14400

WORD

XonLim

określenie minimalnej liczby bajtów w

buforze wejściowym domyślnie: 65535

WORD XoffLim

określenie maksymalnej liczby bajtów w buforze

wejściowym

domyślnie: 65535

BYTE

ByteSize wybór liczby bitów

danych 5, 6, 7, 8

BYTE

Parity określenie kontroli

parzystości

EVENPARITY - parzysta MARKPARITY - bit

parzystości stały równy 1 NOPARITY – brak kontroli ODDPARITY – nieparzysta

BYTE

StopBits wybór bitów stopu ONESTOPBIT

ONE5STOPBITS TWOSTOPBITS

Createfile() Jest to podstawowa funkcja zawierająca konfiguracje portu szeregowego. W jej skład wchodzi m.in. nazwa portu, jego dostępność.

HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD ShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);

23

INTERFEJS RS232 – CEZARY KLIMASZ

PROGRAM W BUILDERZE

Pierwszy parametr LPCTSTR służy do deklaracji portu COM zatem

LPCTSTR lpFileName = ”COM2”;

Parametr dwDesiredAccess umożliwia ustalenie rodzaju dostępu do portu szeregowego. Z praktycznego punktu widzenia najwygodniej jest ustalić rodzaj dostępu jako GENERIC_READ|GENERIC_WRITE (zapisuj do portu lub odczytuj z portu). Umożliwi nam to płynne wysyłanie i odbieranie komunikatów. Parametrowi dwCreationDistribution należy przypisać właściwość OPEN_EXISTING – otwórz istniejący (port). Pozostałym przyporządkujemy następujące wartości:

DWORD ShareMode = 0 (FALSE); LPSECURITY_ATTRIBUTES lpSecurityAttributes = NULL; DWORD dwFlagAndAttributes = 0 (FALSE); HANDLE hTemplateFile = NULL

Funkcją zwracającą ostatnie ustawienia DCB jest następująca funkcja

BOOL GetCommState(HANDLE hCommDev, LPDCB lpdcb)

Wybrany przez nas port szeregowy ostatecznie skonfigurujemy zgodnie ze specyfikacją struktury DCB, za pomocą funkcji SetCommState(), która reinicjalizuje i uaktualnia wszystkie dostępne parametry w ustawieniach łącza szeregowego:

BOOL SetCommState(HANDLE hCommDev, LPDCB lpdcb)

Przed zakończeniem działania aplikacji otwarty port szeregowy należy koniecznie zamknąć i zwolnić obszar pamięci przydzielony na jego identyfikator, korzystając z:

BOOL CloseHandle(HANDLE hCommDev)

Przykład wykonano w C++ Borland Builder 6.0 Personal. Założono, że używane wyłącznie będą funkcje WinAPI. W sieci znaleźć można bardzo dużą ilość komponentów do obsługi portu szeregowego, jednak większość z nich zawiera w swojej strukturze funkcje WinAPI, zatem warto przeanalizować obsługę RS232C od podstaw. Przykład wzorowany jest na przykładzie z książki RS 232 C. Praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera Andrzeja Daniluka. Założeniem programu jest obsługa protokołu MODBUS i komunikacja z mikroprocesorem zaprogramowanym programem nr 2. Najpierw zostanie stworzona forma na której będą podstawowe opcje obsługi portu szeregowego. Poniżej znajduje się przykładowa forma.

widok przykładowej formy

24

INTERFEJS RS232 – CEZARY KLIMASZ

Użyte elementy to przyciski Button, pola Edit, tabela StringGrid, przyciski CheckBox. Program ma za zadanie wysłanie do mikrokontrolera ramki danych zawierającej: adres, funkcję, ilość danych, dane oraz obliczone LRC. Przyciski odpowiadają za: otworzenie portu, zamknięcie portu i programu, obliczenie LRC danych, wysłanie danych do mikroprocesora.

KONFIGURACJA POCZĄTKOWA

Oczywiście pliki nagłówkowe mogą być różne niż przedstawione w poniższym kodzie.

(1)

W pierwszym fragmencie zdefiniowane są pliki nagłówkowe oraz zadeklarowane zmienne globalne. Zmienne HANDLE, LPCTSTR, DCB są zmiennymi WinAPI , dzięki nim możliwa jest obsługa portu COM. Poniżej znajduje się główna funkcja programu. Ma ona za zadanie wpisać wartości startowe do tabeli ramki wiadomości.

(2)

Wykorzystano tutaj obiekt StrinGrid, będący niczym innym jak tabelą stringów. Jego parametr Cells[x][y] wskazuje na daną komórkę w tabeli.

25

INTERFEJS RS232 – CEZARY KLIMASZ

OTWORZENIE PORTU Otworzenie portu następuje po wciśnięciu przycisku OpenComm. Poniżej zamieszczono kod programu odpowiedzialny za inicjalizacje portu.

(3)

Na początku sprawdzana są stany CheckBoxów. Przydzielana jest odpowiednia nazwa dla odpowiedniego wskazania. Nazwa lpFileName wskazuje na nazwę portu do obsługi. Inicjowanie portu odbywa się za pomocą funkcji CreateFile(). Jeśli poprawnie otworzono port, pobierane są wcześniejsze ustawienia oraz ustawiane są aktualne parametry transmisji.

ZAMKNIĘCIE PORTU WYJŚCIE Z PROGRAMU

Zawsze trzeba pamiętać, że po zakończonych transmisjach i przed końcem programu, należy zamknąć otworzony port, tym samym zwolnić alokowaną pamięć. W naszym programie odbywa się to w dwóch funkcjach, widocznych poniżej.

(4)

26

INTERFEJS RS232 – CEZARY KLIMASZ

Jak widać, druga funkcja jest wywoływana w momencie wciśnięcia przycisku CloseComm.

FUNKCJE POMOCNICZE Jako, że parametr StringGrida - goEditing został ustawiony na true, do tabeli można wpisywać dowolne ciągi znaków. Założono, że użytkownik będzie wpisywał poprawne dane i nie stworzono obsługi błędów. Trzeba było jednak stworzyć funkcje wspomagające. Jedną z takich funkcji jest zamiana wpisanego stringa do tabeli StringGrid na wartość w kodzie szesnastkowym. Potrzebne było to do wysyłania danych (mikrokontroler oczekiwał na dane w systemie szesnastkowym – Modbus). Funkcja obsługująca ten algorytm jest uniwersalna. Pozwala na zamianę każdego ciągu znaków na liczbę w systemach od dwójkowego po szesnastkowy. Autor opracowania nie jest autorem tej funkcji. Skorzystał z dostępnych algorytmów opracowanych wcześniej.

(5)

Kolejną funkcją pomocniczą jest funkcja licząca LRC ramki informacyjnej. Składa się z dwóch części. Pierwsza przygotowuje ramkę, zaś druga jest zmodyfikowaną funkcją zaczerpniętą z dokumentacji protokołu Modbus.

27

INTERFEJS RS232 – CEZARY KLIMASZ

(6)

(7)

Jak widać ta funkcja jest identyczna w stosunku do funkcji w kodzie obsługi mikrokontrolera2. Ostania z funkcji pomocniczych dec2hex() ma za zadanie konwertować obliczoną wartość LRC do postaci HEX. Poniżej znajduje się wygląd tej funkcji.

2 Świadczy to o uniwersalności języka C.

28

INTERFEJS RS232 – CEZARY KLIMASZ

(8)

NADAWANIE RAMEK

Funkcja nadawania ramek jest uaktywniana przez przycisk Button1. Nadawane są kolejno: bit startu, adres, funkcja, ilość danych, dane, LRC. W programie założono, że ilość danych będzie wynosiła zawsze jeden, ze względu na uproszczenie obsługi. Czytelnik może skonstruować dynamicznego StringGrida zmieniającego swój rozmiar, pozwalając na wprowadzanie większej ilości danych. Funkcja wysyłania danych też musiałaby być lekko zmodyfikowana, ale nie powinno to sprawić większych problemów. Poniżej znajduje się kod wysyłający dane portem szeregowym do mikrokontrolera.

29

INTERFEJS RS232 – CEZARY KLIMASZ

6. Podsumowanie

(9)

Widoczne są przeprowadzane konwersje ze string na *char. Spowodowane jest to wymaganiami funkcji obsługujących odpowiednie przekształcenia. Wyjaśnienia wymaga funkcja TransmitCommChar() bo dotychczas się nie pojawiła.

BOOL TransmitCommChar(HANDLE hCommDev, char chTransmit); Pozwala ona na wysłanie jednego znaku do bufora nadajnika. W publikacji RS 232 C. Praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera [4] szczegółowo został omówiony zakres użycia tej funkcji. Funkcja Sleep() zatrzymuje działanie programu na milisekundy, tak aby bufor odbiornika mikroprocesora zdążył przetworzyć otrzymane dane.

PODSUMOWANIE Jak widać dzięki środowisku Borland Builder można stworzyć zaawansowane programy obsługi portu COM, co pozwala również na obsłużenie różnych protokołów i wykorzystanie w celach przemysłowych. Należy nadmienić, że stworzony program to tylko szczyt góry lodowej kryjącej się pod nazwą WinAPI. Po szczegóły po raz kolejny odsyłam do książki Andrzeja Daniluka RS 232 C. Praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Jest to najlepsze źródło opisujące standard RS232C w szczególności programowanie pod Windows.

Obsługa portu szeregowego jest pojęciem bardzo szerokim, gdyż tyczy się różnych urządzeń, różnego sposobu sterowania i różnych opcji transmisji. Niniejsze opracowanie to jedynie wstęp do tworzenia aplikacji dla mikrokontrolerów AVR, obsługiwanych przez komputery PC, a także pracujących w trybach master/slave, w magistralach przemysłowych, jak np. RS485. Można znaleźć wiele zastosować wykorzystania interfejsu szeregowego, a także bardzo dużą liczbę urządzeń korzystającą z tego typu interfejsu.

30

INTERFEJS RS232 – CEZARY KLIMASZ

7. Bibliografia

8. Tabela kodów ASCII

Autor starał się przedstawić podstawowe wiadomości o komunikacji PC z. ATmega8. Celem było obsłużenie prostej komunikacji, bez sprawdzania błędów, wykorzystywania zaawansowanych funkcji. Za główny cel tego opracowania autor przyjął zasygnalizowanie sposobów i rodzajów obsługi interfejsu RS232, ma nadzieję, że po części się to udało.

[1] Daniluk A.: RS232C. Praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera.

Gliwice 2001, Helion [2] Grębosz J.: Symfonia C++. Kraków 1999, Kallimach [3] Opracowanie własne – Programowanie mikrokontrolerów AVR w języku C. Kraków 2007 [4] Witkowski A.: Mikrokontrolery AVR. Programowanie w języku C. Katowice 2006, PAN [5] Atmel : ATmega8 datasheet. Atmel 2007 [6] Modicon : Modbus Protocol Reference Guide. Massachusetts, Modicon 1996 [7] http://wikipedia.org