Spis tre 1. Przedstawienie standardu... 2. Opis sprz towy AVR+MAX232... 3. Wykorzystanie USARTa... 4. Przykładowe programy obsługi w j



Podobne dokumenty
TECHNIKA MIKROPROCESOROWA

Programowanie mikrokontrolerów. 15 stycznia 2008

Komunikacja w mikrokontrolerach Laboratorium

Układ transmisji szeregowej AVR

Mikroprocesory i mikrosterowniki Wydział Elektroniki Mikrosystemów i Fotoniki Politechniki Wrocławskiej Ćwiczenie nr 4

Podstawy systemów mikroprocesorowych. Interfejs USART. Interfejsy szeregowe w mikrokontrolerach AVR

MODBUS RTU wersja M1.14 protokół komunikacyjny wyświetlaczy LDN

Uniwersalny asynchroniczny. UART Universal Asynchronous Receier- Transmiter

. Rodzaje transmisji sygnału i RS-232

dokument DOK wersja 1.0

Instytut Teleinformatyki

Programowanie mikrokontrolerów AVR z rodziny ATmega.

INTERFEJSY SYSTEMÓW ELEKTRONICZNYCH. Interfejsy klasy RS

TECHNIKA MIKROPROCESOROWA

Hardware mikrokontrolera X51

4 Transmisja szeregowa na przykładzie komunikacji dwukierunkowej z komputerem PC, obsługa wyświetlacza LCD.

System interfejsu RS 232C opracowali P. Targowski i M. Rębarz

MultiTool instrukcja użytkownika 2010 SFAR

MOBOT-RCR v2 miniaturowe moduły radiowe Bezprzewodowa transmisja UART

TECHNIKA MIKROPROCESOROWA II

4 Transmisja szeregowa, obsługa wyświetlacza LCD.

Architektura Systemów Komputerowych. Transmisja szeregowa danych Standardy magistral szeregowych

CM Konwerter SUCOM_A Master - ModBus RTU Slave

MIKROPROCESORY architektura i programowanie

Interfejs transmisji danych

Kod produktu: MP-BTM222-5V

Obługa czujników do robota śledzącego linie. Michał Wendland czerwca 2011

Wyświetlacz alfanumeryczny LCD zbudowany na sterowniku HD44780

Komunikacja w mikrokontrolerach Laboratorium

Instrukcja MM-717 Tarnów 2010

Instrukcja integracji urządzenia na magistrali Modbus RTU. wersja 1.1

Zaliczenie Termin zaliczenia: Sala IE 415 Termin poprawkowy: > (informacja na stronie:

Mikrokontroler ATmega32. System przerwań Porty wejścia-wyjścia Układy czasowo-licznikowe

Terminal TR01. Terminal jest przeznaczony do montażu naściennego w czystych i suchych pomieszczeniach.

Wydział Elektryczny. Katedra Automatyki i Elektroniki. Instrukcja. do ćwiczeń laboratoryjnych z przedmiotu: SYSTEMY CYFROWE 1.

SM210 RS485 - JBUS/MODBUS dla SM102E. Æ Instrukcja obsługi

Funkcje standardowej biblioteki wejść-wyjść do wyświetlania i pobierania danych

interfejs szeregowy wyświetlaczy do systemów PLC

Wbudowane układy komunikacyjne cz. 1 Wykład 10

IZOLATOR FOTOELEKTRYCZNY Z INTERFEJSEM SZEREGOWYM RS-232

Start Bity Bit Stop 1 Bit Par Rys. 1

Przemysłowe Sieci informatyczne

WIZUALIZACJA DANYCH SENSORYCZNYCH Sprawozdanie z wykonanego projektu. Jakub Stanisz

CM Konwerter ModBus RTU slave ModBus RTU slave

Instrukcja do oprogramowania ENAP DEC-1

Opis procedur asemblera AVR

SM211 RS485 - JBUS/MODBUS dla SM103E. Æ Instrukcja obsługi

Kod produktu: MP01105

Magistrala LIN

Kod produktu: MP-W7100A-RS232

Mikroprocesor Operacje wejścia / wyjścia

Programowanie Mikrokontrolerów

Zastosowania mikrokontrolerów w przemyśle

Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska

Zastosowanie procesorów AVR firmy ATMEL w cyfrowych pomiarach częstotliwości

Komunikacja w mikrokontrolerach. Magistrala szeregowa I2C / TWI Inter-Integrated Circuit Two Wire Interface

Moduł komunikacyjny Modbus RTU do ciepłomierza SonoMeter 30

Mikroprocesory i Mikrosterowniki Magistrala szeregowa I2C / TWI Inter-Integrated Circuit Two Wire Interface

Aplikacja dla eksperymentu identyfikacyjnego z wykorzystaniem układu PAIO. Wykonał : Marcin Cichorowski Prowadzenie : dr inż.

Kod produktu: MP01611-ZK

Programowanie mikrokontrolerów. 8 listopada 2007

Instrukcja obsługi czytnika MM-R32

Czujnik zbliżeniowy indukcyjny

Kod produktu: MP-BT-RS232

Rozdział ten zawiera informacje na temat zarządzania Modułem Modbus TCP oraz jego konfiguracji.

Architektury Komputerów - Laboratorium Informatyka III rok studia dzienne

Instrukcja obsługi programatora AVR Prog USB v2

1.2 Schemat blokowy oraz opis sygnałów wejściowych i wyjściowych

Spis treści. 1 Moduł Modbus TCP 4

Kod produktu: MP01611

Interfejsy. w systemach pomiarowych. Ryszard J. Barczyński, 2016 Materiały dydaktyczne do użytku wewnętrznego

ĆWICZENIE 5. TEMAT: OBSŁUGA PORTU SZEREGOWEGO W PAKIECIE KEILuVISON WYSYŁANIE PORTEM SZEREGOWYM

Instrukcja integracji urządzenia na magistrali Modbus RTU

Modem Bluetooth MBL-232/UK

Instrukcja obsługi programatora AVR Prog USB v2

3. Sieć PLAN. 3.1 Adresowanie płyt głównych regulatora pco

1 Moduł Modbus ASCII/RTU 3

Interfejsy systemów pomiarowych

Metody obsługi zdarzeń

CM ModBus RTU slave DMX master

Konfigurator Modbus. Instrukcja obsługi programu Konfigurator Modbus. wyprodukowano dla

Kod produktu: MP01105T

Instrukcja obsługi Profesjonalny bezprzewodowy czytnik kodów HD2000

Systemy wbudowane Wykład 6 - transmisje szeregowe: UART i pochodne. Komunikacja szeregowa Notes. Rodzaje transmisji Notes. Rodzaje transmisji Notes

Zestaw przedłużacza, 4K HDMI HDBaseT, 70 m

Instrukcja obsługi programatora AVR Prog USB v2

Plan wykładu. 1. Urządzenia peryferyjne 2. Rodzaje transmisji danych 3. Interfejs COM 4. Interfejs LPT 5. Plug and Play

Zestaw przedłużacza, 4K HDMI HDBaseT, 100 m

Sterownik procesorowy S-2 Komunikacja RS485 MODBUS

Instrukcja obsługi programatora AVR Prog USB v2

Programowanie w językach asemblera i C

Organizacja pamięci VRAM monitora znakowego. 1. Tryb pracy automatycznej

Systemy wbudowane. Uniwersytet Łódzki Wydział Fizyki i Informatyki Stosowanej. Witold Kozłowski

Moduł RS232 E054. TAP - Systemy Alarmowe Sp. z o. o. os. Armii Krajowej Poznań tel ; fax:

Przemysłowy odtwarzacz plików MP3

Ogólne przeznaczenie i możliwości interfejsu sieciowego przepływomierza UniEMP-05 z protokołem MODBUS. ( )

Spis treści. 1 Moduł RFID (APA) 3

Aplikacja Sieciowa wątki po stronie klienta

Pracownia Transmisji Danych, Instytut Fizyki UMK, Toruń. Instrukcja do ćwiczenia nr 10. Transmisja szeregowa sieciami energetycznymi

Transkrypt:

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 1

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 2

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 Circuitterminating 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. Protokoły transmisji 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 3

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. Wymiana danych przez interfejs szeregowy 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. 2. Opis sprzętowy AVR+MAX232 Standardowe złącze interfejsu szeregowego przedstawiono poniżej. Jest to gniazdo typu DB- 9, występują męskie i żeńskie odmiany tego gniazda. 4

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. 3. Wykorzystanie USART a 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. Datasheet ATmega8 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). 5

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: 6

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: 7

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. 8

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). 9

WYŁĄCZANIE ODBIORNIKA W odróżnieniu od nadajnika, wyłączenie odbiornika następuje natychmiastowo. Dane przychodzące nieodebrane są tracone. OPIS REJESTRÓW USART 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. 10

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 11

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. 12

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 13

PRZERWANIA USART 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 4. PRZYKŁADOWE PROGRAMY OBSŁUGI W JĘZYKU C 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. PROGRAM PIERWSZY 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. 14

(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 15

(6) czy dwójka i zapala diody podpięte do pinów PB1, PB2 oraz wysyła odebrany znak do komputera. 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) OBSŁUGA PRZERWAŃ 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. 16

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. PROGRAM DRUGI - PROTOKÓŁ MODBUS 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. 17

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ń. 18

(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. 19

(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ć. 20

(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 mastera 1. 1 konwertery poziomów RS485 posiadają wejście Drive Enable pozwalające na ustawienie statusu urządzenia i ew. zajęcie lub zwolnienie magistralii. 21

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ć CBR_110 CBR_19200 CBR_300 CBR_ 38400 CBR_600 CBR_56000 DWORD BaudRate CBR_4800 CBR_128000 CBR_9600 CBR_256000 CBR_14400 określenie prędkości CBR_1200 CBR_57600 transmisji (bity/sek) CBR_2400 CBR_115200 WORD XonLim określenie minimalnej liczby bajtów w domyślnie: 65535 buforze wejściowym określenie WORD XoffLim maksymalnej liczby bajtów w buforze domyślnie: 65535 wejściowym BYTE wybór liczby bitów ByteSize danych 5, 6, 7, 8 BYTE BYTE Parity StopBits określenie kontroli parzystości wybór bitów stopu EVENPARITY - parzysta MARKPARITY - bit parzystości stały równy 1 NOPARITY brak kontroli ODDPARITY nieparzysta 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); 22

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) PROGRAM W BUILDERZE 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 23

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) (2) 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. 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. 24

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) 25

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. 26

(6) (7) Jak widać ta funkcja jest identyczna w stosunku do funkcji w kodzie obsługi mikrokontrolera 2. 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. 27

(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. 28

(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. 6. Podsumowanie 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. 29

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. 7. Bibliografia [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 8. Tabela kodów ASCII 30