rs232_linux-win32_cz2.pdf

(605 KB) Pobierz
100-102_rs232_cz2.indd
K U R S
Programowanie portu szeregowego
w systemach operacyjnych
Linux i Windows, część 2
Umiejętność programowej obsługi interfejsu
RS232 od strony komputera PC jest
dziś istotnym elementem elektronicznego
rzemiosła. W niniejszym kursie piszemy jak
w praktyce oprogramować port szeregowy
w środowiskach Linux i Windows. Wiele
miejsca poświęcamy pisaniu przenośnych
aplikacji GUI, które korzystają z interfejsu
szeregowego i zachowują się tak samo
w systemach Windows jak i Linux. Wszystkie
omawiane zagadnienia poparto szczegółowo
opisanymi praktycznymi przykładami.
W poprzedniej części kursu
omówiłem funkcje służące do re-
alizacji operacji na porcie szere-
gowym w Linuksie. Przyszedł czas
na wykorzystanie zdobytej wiedzy
w praktyce. W części drugiej przed-
stawię budowę platformy sprzęto-
wej, która pozwoli nam testować
tworzone oprogramowanie.
Połączenie procesora U1 z kom-
puterem PC zrealizowane jest ty-
powo, to jest za pośrednictwem
układu MAX232. Model łączony
jest z komputerem za pośrednic-
twem kabla „prostego” (bez prze-
plotu), co wymusiło zastosowanie
złącza DB9F (żeńskiego). Czytel-
nicy, którzy zechcą użyć typowe-
go przewodu z przeplotem muszą
wykorzystać złącze DB9M oraz za-
mienić w nim miejscami końców-
ki 2 i 3. Rezonator kwarcowy X1
ma „okrągłą” wartość 1,8432 MHz,
co pozwala uzyskać większość ty-
powych prędkości transmisji z ze-
rowym (obliczanym) błędem bau-
drate. We wszystkich przykładach
w tym kursie wykorzystana bę-
dzie prędkość 19200 bodów i ram-
ka w formacie 8N1 (8 bitów da-
nych, brak kontroli parzystości, 1
bit STOP). Dodatkową zaletą dosyć
niskiej częstotliwości pracy mikro-
kontrolera jest redukcja pobierane-
go przez zestaw prądu.
Diody LED D1 i D2 stanowią
najprostszy interfejs wyjściowy –
rola przez nie pełniona będzie za-
leżna od funkcjonalności testowa-
nego przykładu. Elementy U3, C7...
C9 tworzą typowy zasilacz stabili-
zowany zasilający część cyfrową
napięciem 5 V. Para R1C3 wytwa-
rza napięcie zasilające część ana-
logową zestawu. Masy: analogowa
i cyfrowa są rozdzielone i łączą się
elektrycznie niedaleko punktu do-
łączenia napięcia zasilającego. Nie-
rozdzielenie mas analogowej i cy-
frowej mogłoby doprowadzić do
podawania na wejście przetworni-
ka A/C impulsów szpilkowych i
– w konsekwencji – do jego błęd-
nej pracy. Impulsy te pochodziły-
by ze spadków napięcia na ścież-
kach masy powodowanych dużymi
prądami impulsowymi występujący-
mi w części cyfrowej.
We wspomnianym przy-
kładzie woltomierza cy-
frowego przetwornik A/C
będzie pracował z wewnętrznym na-
pięciem odniesienia równym (typo-
wo) 2,56 V – napięcie to występu-
je na końcówce AREF. Jest ono fil-
trowane przez kondensator C2 i sta-
nowi napięcie wejściowe dla po-
tencjometru PR1. Napięcie z suwa-
ka PR1 jest podawane poprzez filtr
R2C1 na wejście ADC0 przetwor-
nika. Napięcie to będzie mierzone
przez woltomierz, który zaprojektu-
jemy w dalszej części kursu.
Zestaw testowy można zmon-
tować w dowolny sposób pamię-
tając jedynie o rozdzieleniu mas
i ogólnych zasadach montażu ukła-
dów elektronicznych. Zamiast opi-
sanego układu można oczywiście
użyć dowolnego zestawu laborato-
ryjnego dostępnego w handlu, by-
leby tylko miał on podobne moż-
liwości funkcjonalne jak opisa-
ny powyżej (przetwornik A/C i in-
terfejs RS232C). Nie musi to być
Zestaw testowy
Schemat zestawu testowego,
który posłuży nam do testowa-
nia wszystkich przykładów w dal-
szych częściach kursu, znajduje
się na rys. 2 . Jego sercem jest do-
brze wszystkim znany mikrokontro-
ler ATmega8 firmy Atmel. Wybór
tego właśnie mikrokontrolera po-
dyktowany był faktem, że jest to
jeden z najmniejszych mikrokontro-
lerów serii ATmega, który ma „na
pokładzie” przetwornik analogowo–
–cyfrowy. Przetwornik ten wykorzy-
stamy w ostatniej części cyklu do
realizacji woltomierza sterowane-
go przez port szeregowy. Sam wy-
bór rodziny AVR Atmela był oczy-
wisty – są to wszak najpopular-
niejsze (jeszcze!) w Polsce mikro-
kontrolery i większość Czytelników
zna je co najmniej dobrze. Dzięki
temu będą oni mogli skupić swoją
uwagę na zagadnieniu programo-
wania RS232C na PC, zaś szczegó-
ły oprogramowania części sprzęto-
wej będą dla nich od początku do
końca jasne.
100
Elektronika Praktyczna 4/2006
66534657.023.png
K U R S
nawet zestaw z mikrokontrolerem
AVR. Oprogramowanie jest napisa-
ne w języku C i może być przenie-
sione na dowolny mikrokontroler,
do którego istnieje kompilator tego
języka. Oczywiście w takim przy-
padku trzeba będzie zmienić te
fragmenty programu, które są spe-
cyficzne dla danego układu (np.
konfiguracja modułu USART).
W tab. 10 zamieściłem konfigurację
fusebit –ów niezbędną do poprawnej
pracy procesora ATmega8 w opisy-
wanym zestawie. Podczas progra-
mowania mikrokontrolera należy
zwrócić baczną uwagę na popraw-
ność tych ustawień, gdyż ich zmia-
na może uniemożliwić pracę syste-
Oprogramowanie
mikrokontrolera
Oprogramowanie mikrokontrolera
U1 ATmega8 napisałem w języku C
używając popularnego kompilatora
GCC w wersji 2002–06–25 zintegro-
wanego z pakietem AVRStudio3.53.
Kod źródłowy jest na tyle krót-
ki, prosty i pozbawiony „wodotry-
sków”, że można go z powodzeniem
skompilować za pomocą dowolnego
kompilatora C dla mikrokontrolerów
AVR – oczywiście po dokonaniu
stosownych (niewielkich) poprawek.
List. 5. Program testowy Example1.c
działający na mikrokontrolerze
//*******************************
// MAIN
//*******************************
int main(void)
{
unsigned char data,cou;
DDRB=0xFF;
DDRC=0x00;
DDRD=0xFE;
PORTC=0x00;
PORTD=0xFE;
Hello();
Init_UART();
while(1)
{
//Waiting for 1 byte
UCSRA&=~(1<<RXC);
while((UCSRA&(1<<RXC))==0);
data=UDR;
if(data==0)
{
RED_OFF;
GREEN_OFF;
SendString(PSTR(„ZERO”));
SendByte(13); SendByte(10);
}
else if(data==1)
{
RED_ON;
GREEN_OFF;
SendString(PSTR(„ONE”));
SendByte(13); SendByte(10);
}
else if(data==2)
{
RED_OFF;
GREEN_ON;
SendString(PSTR(„TWO”));
SendByte(13); SendByte(10);
}
else if(data==3)
{
RED_ON;
GREEN_ON;
SendString(PSTR(„THREE”));
SendByte(13); SendByte(10);
}
else if(data==255)
{
cou=0;
while(1)
{
SendByte(cou);
if(++cou==0) break;
}
}
else
{
SendString(PSTR(„FOUR OR MORE”));
SendByte(13); SendByte(10);
}
}
}
Rys. 2. Schemat zestawu testowego
Elektronika Praktyczna 4/2006
101
66534657.024.png 66534657.025.png 66534657.026.png 66534657.001.png 66534657.002.png 66534657.003.png 66534657.004.png 66534657.005.png 66534657.006.png 66534657.007.png 66534657.008.png 66534657.009.png 66534657.010.png 66534657.011.png 66534657.012.png 66534657.013.png 66534657.014.png 66534657.015.png 66534657.016.png
 
K U R S
mu! Podczas kursu będziemy wyko-
rzystywać dwa programy działające
na mikrokontrolerze U1. Pierwszym
z nich (opisanym niżej) jest prosty
system odpowiadający na pytania.
Program ten będzie wykorzystywa-
ny w dalszych częściach niniejsze-
go kursu. Drugą aplikacją jest opro-
gramowanie cyfrowego woltomie-
rza, którą weźmiemy na warsztat
w ostatniej części kursu.
Wszystkie przykłady oprogramo-
wania na PC (poza woltomierzem)
będą współpracować z prostym pro-
gramem Example1.c działającym
na mikrokontrolerze. Główna część
tego programu (funkcja main ) zosta-
ła przedstawiona na list. 5 (pomi-
nąłem inicjalizację modułu USART
i inne funkcje pomocnicze). Idea tej
aplikacji polega na stworzeniu pro-
stego systemu zdolnego odpowiadać
na zadawane mu proste pytania.
Taki system pozwoli w łatwy spo-
sób testować różne aplikacje dzia-
łające na komputerze PC.
Sposób działania programu
z list. 5 jest następujący:
1. Mikrokontroler czeka na 1–baj-
towe zapytanie, które wysyła
komputer PC;
2. Po otrzymaniu jednego bajta
mikrokontroler odpowiednio do
jego wartości zapala diody D1
i D2 oraz wysyła via RS232 sto-
sowną odpowiedź. Odbywa się
to według następującej zasady:
Rys. 3. Okno terminala podczas testowania zestawu
Jeśli wartość bajta zapytania mie-
ści się w granicach 0...3, to stan
diod odzwierciedla tę liczbę (D2
– bit nr 1, D1 – bit nr 0), zaś
wysyłana do PC–ta odpowiedź
stanowi nazwę tej wartości zapi-
saną wielkimi literami w języku
angielskim zakończoną sekwencją
bajtów 0x0D i 0x0A. Na przykład
otrzymanie bajta o wartości 1
skutkuje wygaszeniem diody D2,
zapaleniem D1 i wysłaniem odpo-
wiedzi „ONE”+0x0D+0x0A. Dla
bajta o wartości 3 zostaną zapalo-
ne obie diody, a odpowiedzią bę-
dzie „THREE”+0x0D+0x0A.
Jeśli wartość bajta zapytania mie-
ści się w granicach 4...254, to
stan diod nie zmienia się, zaś
wysyłana odpowiedź ma postać
„FOUR OR MORE”+0x0D+0x0A.
Jeśli wartość bajta zapytania
wynosi 255, to stan diod nie
zmienia się, zaś w odpowiedzi
wysyłana jest sekwencja 256
bajtów o wartościach 0...255.
Wywołanie funkcji powitania
Hello powoduje dwukrotne mignię-
cie obiema diodami D1 i D2 tuż po
włączeniu zasilania zestawu lub ze-
rowaniu mikrokontrolera. Rzecz ba-
nalna, ale podczas pierwszego uru-
chomienia systemu pozwala zorien-
tować się, czy zestaw daje jakiekol-
wiek „znaki życia”.
Testowanie zestawu
Poprawnie zmontowany zestaw
działa od pierwszego włączenia i nie
wymaga żadnych czynności urucho-
mieniowych. Warto jednak przetesto-
wać go przed podjęciem prób współ-
pracy z oprogramowaniem pracują-
cym na PC. Do testów można użyć
dowolnego terminala RS232C. Nale-
ży w tym celu ustawić odpowiednie
parametry transmisji (19200, 8N1),
a następnie wysyłać 1–bajtowe zapy-
tania i sprawdzać czy w odpowiedzi
wysyłane są poprawne ciągi znaków.
Na rys. 3 przedstawiłem przykłado-
wy test zestawu za pomocą termina-
la wchodzącego w skład pakietu Ba-
scomAVR Demo, pracującego w sys-
temie Windows.
Arkadiusz Antoniak, EP
arkadiusz.antoniak@ep.com.pl
www.antoniak.ep.com.pl
WYKAZ ELEMENTÓW
Rezystory
R1: 10 V
R2: 100 V
R3, R4: 470 V
Kondensatory
C1: 10nF
C2...C4, C7, C8, C14: 100 nF
C5, C6: 33 pF
C9: 100 m F/16 V
C10...C13: 1...10 m F/16 V
Półprzewodniki
U1: ATmega8
U2: MAX232
U3: 78L05
D1: LED czerwona
D2: LED zielona
Inne
Kwarc: 1,8432 MHz
JP1: złącze DB9F (kabel prosty) lub
DB9M (kabel z przeplotem)
JP2: goldpiny (złącze ISP)
PR1: potencjometr 10 k V A z po-
krętłem
Tab. 10. Ustawienia bezpieczników (fusebit) mikrokontrolera
Fusebit
Wartość
Fusebit LOW
BODLEVEL 1: BODLEVEL 2,7V
BODEN 0: BODEN enabled
SUT1..0 01: fast rising power
CKSEL3..0 1101: Crystal oscillator
Fusebit HIGH
S8515C 1: MEGA8515 mode
WDTON 1: Watchdog timer enabled by software
SPIEN 0: Serial programming enabled
CKOPT 1: Oscillator option
EESAVE 1: Erase EEPROM when chip erase
BOOTSZ1..0 00: 1024 words boot size
BOOTRST 1: Reset vector is $0000
102
Elektronika Praktyczna 4/2006
66534657.017.png 66534657.018.png 66534657.019.png 66534657.020.png 66534657.021.png 66534657.022.png
Zgłoś jeśli naruszono regulamin