rs232 bascom.pdf

(169 KB) Pobierz
Bascomowe porady - obsługa interfejsu RS232
B A S C O M O W E P O R A D Y
W bascomowym „kąciku” będziemy się starać w miarę przystępnie przedstawiać rozwiązania problemów
napotykanych przez naszych Czytelników podczas pisania programów w Bascomie. Rubryka ta powstała
z myślą o rozwiązywaniu problemów, jakie najczęściej napotykają programiści, zatem zachęcamy wszystkich
Czytelników do zgłaszania problemów, na jakie się natknęli podczas tworzenia własnych programów.
Obsługa interfejsu RS232
Na pocz¹tek parÍ s³Ûw wstÍpu na
temat interfejsu RS232, ktÛry jest
spotykany w†wiÍkszoúci typowych
aplikacji mikrokontrolerowych. Naj-
czÍúciej w†praktyce problemy wyni-
kaj¹ z†b³Ídnego za³oøenia, øe mikro-
kontroler naleøy ìwprostî po³¹czyÊ
trzema przewodami z†RS-em kompu-
tera i†to wystarczy do wymiany da-
nych. Trzeba jednak wzi¹Ê pod uwa-
gÍ, øe w†liniach interfejsu RS232
wystÍpuj¹ inne napiÍcia niø†typowe
dla standardu TTL - mikrokontroler
jako logiczne ì0î traktuje napiÍcie
0...0,8 V, natomiast logiczn¹ ì1î jest
napiÍcie +2,0...5 V. Zgodnie z†zale-
ceniami normy opisuj¹cej RS232 na-
piÍcia dla logicznych ì0î i†ì1î wy-
nosz¹ odpowiednio >+3 V oraz <-3
V. Øeby uruchomiÊ komunikacjÍ miÍ-
dzy procesorem a†komputerem, nie-
zbÍdny jest konwerter napiÍÊ ze
standardu TTL na RS232. Najbardziej
popularnym scalonym konwerterem
jest uk³ad MAX232 i†jego odpowied-
niki, ktÛre maj¹ wbudowan¹ ³adun-
kow¹ przetwornicÍ napiÍcia. Czasami
moøna sobie takøe poradziÊ, stosuj¹c
rÛøne sztuczki np. robi¹c interfejs na
tranzystorach. Na rys. 1 przedstawio-
no schemat typowego uk³adu kon-
wertera TTL<->RS232.
Tu ma³a uwaga - na przedstawio-
nym schemacie, jak i†w†notach apli-
kacyjnych uk³adÛw, podawane s¹
rÛøne wartoúci kondensatorÛw wyma-
ganych do poprawnej pracy uk³adu
(od 0,1
F do 10
µ
F). Przed zmon-
towaniem uk³adu naleøy sprawdziÊ
w†nocie katalogowej stosowanego
uk³adu, kondensatory o†jakiej pojem-
noúci naleøy zastosowaÊ.
Jeszcze jedna uwaga na temat
po³¹czenia mikrokontrolera z†interfej-
sem RS znajduj¹cym siÍ w†kompu-
terze: masy ³¹czy siÍ razem, ale
styki oznaczone TxD ( Transmit Da-
ta - nadawanie danych) oraz RxD
( Receive Data - odbiÛr danych) ³¹-
czymy ìna krzyøî: TxD mikrokont-
rolera ³¹czymy ze stykiem RxD
komputera i†na odwrÛt.
Aby skorzystaÊ z†transmisji RS232,
na pocz¹tek naleøy skonfigurowaÊ
UART/USART mikrokontrolera (wyma-
ga to napisania odpowiedniego progra-
mu) oraz w†komputerze - naleøy usta-
wiÊ jednakowe parametry transmisji
(jednakow¹ prÍdkoúÊ oraz pozosta³e
parametry, np.: 8†bitÛw danych, 1†bit
stopu, bez parzystoúci - co czÍsto jest
zapisywane jako 8n1). W†Bascomie do
deklaracji prÍdkoúci pracy interfejsu
jest uøywana nastÍpuj¹ca instrukcja
dyrektywy kompilatora:
$baud = 9600
Naleøy j¹ uøyÊ na pocz¹tku pro-
gramu (prÍdkoúÊ moøna takøe ustawiÊ
w†menu Options>Compiler>Communi-
cation , ale lepiej zadeklarowaÊ w†pro-
gramie). Bardzo waøn¹ rzecz¹ jest
takøe poznanie zaleønoúci szybkoúci
RS-a od czÍstotliwoúci uøytego kwar-
cu. Naj³atwiej sprawdziÊ to w†Basco-
mie, ustawiaj¹c w†menu Op-
tions>Compiler>Communication ø¹da-
n¹ prÍdkoúÊ transmisji oraz czÍstotli-
woúÊ kwarcu i w†dolnej czÍúci okna
(ramka ERROR ) bÍdziemy mieli po-
dan¹ úredni¹ stopÍ b³ÍdÛw lup napis
Not Possible , czyli niemoøliwe do
ustawienia - tak jest np. dla 1200
bodÛw i†kwarcu powyøej 4†MHz. Z³e
dopasowanie czÍstotliwoúci kwarcu do
wymaganej prÍdkoúci transmisji jest
jedn¹ z†czÍstych przyczyn b³ÍdÛw lub
wrÍcz braku transmisji.
W† tab. 1 przedstawiono niektÛre
zaleønoúci b³ÍdÛw dla danych czÍs-
totliwoúci kwarcÛw przy rÛønych
prÍdkoúciach.
Podstawowym poleceniem w†Bas-
comie s³uø¹cym do wys³ania danych
z†mikrokontrolera przez RS232 jest
instrukcja print . Uøywa siÍ jej
w†najprostszy z†moøliwych sposo-
bÛw, czyli:
Print zmienna
gdzie zmienna to dowolna zmienna
(lub sta³a) zadeklarowana w†progra-
mie. Moøna podawaÊ wartoúci sta³e
bezpoúrednio w†instrukcji print . Np.:
Print “To jest tekst testowy”
Jak widaÊ, wysy³any tekst zawar-
to w†cudzys³owach. Tu ma³a dygres-
ja - jeúli mamy zadeklarowan¹
zmienn¹ typu byte , a†jej wartoúÊ wy-
niesie 255, to polecenie:
Print zmienna
ìwydrukujeî nam 255 (czyli wartoúÊ
dziesiÍtn¹). Czasem potrzebne s¹ da-
ne w†formacie szesnastkowym - tu
Bascom pomaga nam poleceniem:
Print Hex(zmienna)
i†takie polecenie zamiast 255 ìwy-
drukujeî nam FF. Czasem potrzebu-
jemy takøe wydrukowaÊ znak ASCII,
znaj¹c kod danej liczby np. 66, czy-
li ìbî - do tego celu moøemy uøyÊ
instrukcji:
Print Chr(66)
ktÛra to instrukcja ìwydrukujeî znak
b . Polecenie print zakoÒczone úred-
nikiem nie wyúle domyúlnie znaku
koÒca wiersza i†przejúcia do nastÍp-
nej linii (odpowiednik ENTER -
ìCRî - #13î), natomiast bez úredni-
ka terminal zawsze przejdzie do na-
stÍpnej linii.
Do odbierania danych przez
RS232 Bascom ma dedykowanych
kilka instrukcji. Pierwsza z†nich to
instrukcja input . Sk³adnia instrukcji
input jest nastÍpuj¹ca:
INPUT “tekst”,zmienna1,zmienna2....
Rys. 1. Schemat typowego konwertera z wykorzystaniem MAX232
Elektronika Praktyczna 11/2003
93
µ
39647680.011.png 39647680.012.png 39647680.013.png 39647680.014.png
B A S C O M O W E P O R A D Y
Tab. 1. Przykłady wartości błędów przy różnych wartościach prędkości
transmisji i oscylatorów kwarcowych
Czêstotliwoœæ
kwarcu/prêdkoœæ 1200
2400 4800
9600 19200 57600 115200
znaki ìFUî, to wtedy w†zmiennej a
znajdzie siÍ wartoúÊ 255, czyli ìFUî
szesnastkowo. Polecenie to umoøliwia
wprowadzanie znakÛw w†formie szes-
nastkowej. Jedna uwaga: kaødy spo-
úrÛd dot¹d†wymienionych rozkazÛw
z†rodziny input zatrzymuje dzia³anie
programu i†oczekuje na podanie zna-
ku. W³aúnie ta cecha powoduje, øe
polecenia te nie nadaj¹ siÍ do wy-
korzystania przy odbiorze danych
gdzieú np. w†g³Ûwnej pÍtli programu,
ktÛry nie moøe byÊ wstrzymywany.
Natomiast znakomicie nadaj¹ siÍ do
konkretnych zastosowaÒ takich jak
np.: programowanie pamiÍci danych
programu za pomoc¹ dedykowanej
aplikacji, odbioru danych wywo³ywa-
nych zewnÍtrznym impulsem (np.
int0 lub int1, czy podanym na ja-
kiekolwiek wejúcie).
Poniøej przedstawiono przyk³ad
odbioru danych przez RS232, ktÛre
s¹ przeznaczone do zapisania z†pa-
miÍci EEPROM pod przes³any wczeú-
niej adres:
$regfile = “m8def.dat”
'powiadomienie o wykorzystywanym
'procesorze atmega8
$crystal = 8000000
'częstotliwość oscylatora
$baud = 9600 'prędkość transmisji
transmisji
1,000000 0,16% 0,16% 0,16% 7,84% 7,84% 7,84% 45,75%
1,843200 0,00% 0,00% 0,00% 0,00% 0,00% 0,00% 0,00%
2,457600 0,00% 0,00% 0,00% 0,00% 0,00% 25,00% 25,00%
3,276000 0,37% 0,37% 1,54% 1,54% 6,23%
3,686000 4,16%
4,000000 0,16% 0,16% 0,16% 0,16% 0,16% 7,84% 7,84%
4,096300 2,51%
4,194000 1,12%
4,433618 3,00%
4,433618 3,00%
4,915200 0,00% 0,00% 0,00% 0,00% 0,00% 6,25% 6,26%
6,144000 x 0,00% 0,00% 0,00% 0,00% 10,00% 10,00%
6,553600 x 0,39% 0,39% 1,56% 1,56% 1,56% 15,63%
7,372800 0,00% 0,00% 0,00% 0,00% 0,00% 0,00% 0,00%
7,680000 0,00% 0,00% 0,00% 0,00% 0,00% 4,00% 4,00%
8,000000 x
8,860000 x 0,16% 0,16% 0,16% 0,16% 7,84% 7,84%
x - wartoœæ niemo¿liwa do otrzymania
Jako ì tekst î†podajemy dowolny
tekst, ktÛry ma siÍ ukazaÊ jako ko-
munikat o†oczekiwaniu na podanie
danych (moøe go nie byÊ) np.:
Dim A As Byte
Dim Ciag As String * 36
INPUT “Podaj A:”, a
'oczekiwać będzie na wpisanie
'liczby typu byte (0-255)
INPUT “A teraz wpisz tekst (max. 36
znaków):”, ciag
'oczekiwać będzie na wpisanie
'tekstu o długości max. 36 ‘znaków
Oczywiúcie moøna stosowaÊ kilka
zmiennych naraz np.:
INPUT “Podaj A oraz tekst:”, a
,ciąg
'oczekiwać będzie na wpisanie
'liczby typu byte (0-255) oraz
'na wpisanie tekstu o długości 36
'znaków
Aby zakoÒczyÊ odbiÛr danych po-
przez polecenie input , naleøy na za-
koÒczenie zawsze wys³aÊ znak CR
(#13 - ENTER) - co w†przypadku po-
dawania danych rÍcznie np. z†kla-
wiatury PC poprzez terminal nie jest
z†regu³y problemem i†jest wygodne,
natomiast moøe siÍ zdarzyÊ, øe chce-
my odbieraÊ dane z†jakiegoú pod³¹-
czonego urz¹dzenia, ktÛre np. nie
wysy³a znakÛw koÒca wiersza. Tutaj
twÛrca Bascoma przyszed³ z†pomoc¹
i†stworzy³ wiele instrukcji. Jedn¹
z†nich jest polecenie inputbin , ktÛre
odbiera kaødy znak niezaleønie od
tego, czy jest to litera, czy kod ste-
ruj¹cy (np. #13, ktÛrego nie inter-
pretuje w†øaden sposÛb, czyli po
prostu zapisuje go do zmiennej).
Sk³adnia tego polecenia jest nastÍpu-
j¹ca:
INPUTBIN zmienna1,zmienna2....
Polecenie to nie posiada ìtekstu
zachÍtyî i†oczekuje na tyle znakÛw,
ile jest w†definicji zmiennych. Na
przyk³ad:
Dim Ciag As String * 36
INPUTBIN ciag
W†tym przypadku instrukcja in-
putbin bÍdzie czekaÊ na odebranie
36 znakÛw i†zakoÒczy odbiÛr dopie-
ro po odebraniu wszystkich znakÛw.
Jest to bardzo pomocne, jeúli zawsze
odbieramy z†urz¹dzenia zewnÍtrznego
dane o†takim samym rozmiarze.
W†przypadku gdy liczba ta jest
zmienna, to lepiej uøyÊ innej kon-
strukcji procedury odbioru. Polecenie
inputbin moøe takøe s³uøyÊ do od-
bioru znakÛw bezpoúrednio do tabli-
cy - naleøy wÛwczas z†gÛry okreúliÊ,
ile bajtÛw naleøy odebraÊ oraz od
ktÛrego miejsca w†tablicy naleøy za-
cz¹Ê zapisywaÊ dane:
Inputbin tablica(3), 6
'do tablicy trafi 6 bajtów, jako
'pierwsza zostanie zapisana komórka
'nr 3
Kolejn¹ instrukcj¹ z†rodziny input
godn¹ wspomnienia jest instrukcja
inputhex . Nie rÛøni siÍ ona sk³adni¹
od polecenia input , rÛøni siÍ nato-
miast jedn¹ zasadnicz¹ cech¹: odbie-
ra znaki w†formacie szesnastkowym
wprowadzanym jako zwyk³y tekst,
czyli jeúli podamy jako odpowiedü
na poniøszy przyk³ad:
Dim A As Byte
INPUTHEX “Podaj wartość szesnastkowa”,a
dim dana as byte
dim adres as byte
Do
Input “Adres:”, Adres
'czeka na adres
INPUTHEX “Dana:”, Dana
'czeka na dana
Print Adres; “:”; Dana
'wysyła odebrany adres oraz dana
'do komputera
Writeeeprom Dana, Adres
'zapisuje do eeprom otrzymana
'dana pod otrzymanym ‘adresem
Loop
End
W†przedstawionym przyk³adzie
mikrokontroler czeka na odebranie
adresu, pod ktÛrym ma byÊ zapisa-
na dana, oraz na zapisywan¹ dan¹.
Odebrana dana nastÍpnie zostaje za-
pisana w†pamiÍci EEPROM pod
otrzymanym wczeúniej adresem.
W†przedstawionym przyk³adzie do
odbioru danych zosta³a wykorzystana
instrukcja inputhex , ktÛra odbiera
dane szesnastkowo - moøna je od
razu zapisaÊ do pamiÍci EEPROM.
W†tym przyk³adzie do kontroli po-
prawnoúci odebranych danych wysy-
³any jest adres oraz odebrana dana
poprzez instrukcjÍ print . Bascom
udostÍpnia takøe funkcje umoøliwia-
94
Elektronika Praktyczna 11/2003
39647680.001.png
B A S C O M O W E P O R A D Y
j¹ce odbieranie pojedynczych znakÛw
przez RS232. Do tych funkcji moøna
zaliczyÊ waitkey() , ktÛra czeka na
odebranie znaku (wstrzymuje dzia³a-
nie programu do czasu pojawienia
siÍ w†buforze transmisji szeregowej
odebranego znaku), oraz funkcje in-
key() , ktÛra zwraca kod ASCII pier-
wszego znaku znajduj¹cego siÍ w†bu-
forze transmisji szeregowej bez
wstrzymywania dzia³ania programu.
Na list. 1 przedstawiono przyk³ad
programu ilustruj¹cego rÛønice
w†dzia³aniu wymienionych funkcji.
Jeøeli zostanie przez mikrokontro-
ler odebrana ìjedynkaî potwierdzona
enterem , wykonana zostanie funkcja
waitkey() , ktÛra czeka na znak, czyli
wstrzymuje dzia³anie programu. Po
odebraniu znaku przez funkcje wait-
key() odebrany znak jest wysy³any
z†powrotem do PC (w kodzie ASCII).
Jeúli zostanie odebrana z†portu RS232
wartoúÊ 2, to zostanie zaprezentowa-
ne dzia³anie funkcji inkey() . Jest ona
wykonywana, aø odebrany zostanie
znak o†kodzie 27 (ESC). Jeøeli ode-
brany znak ma kod wiÍkszy od 0,
to do PC zostaje wys³any kod ASCII
odebranego znaku oraz sam znak.
Tak wiÍc do PC bÍd¹ wysy³ane ode-
brane znaki ASCII od 1†do 255. Po-
niewaø funkcja inkey() pobiera znak
z†bufora sprzÍtowego uk³adu UART,
moøe ona zwrÛciÊ 0, gdy odebranym
znakiem bÍdzie znak o†kodzie ì0î.
Powoduje to, øe†nie nadaje siÍ ona
do odbierania danych binarnych, ktÛ-
re mog¹ przecieø zawieraÊ bajty ze-
rowe. Moøna temu zaradziÊ, stosuj¹c
dodatkowo funkcjÍ ischarwaiting , ktÛ-
ra sprawdzi, czy znak rzeczywiúcie
zosta³ odebrany. Jeúli funkcja ta
zwrÛci ì1î, moøna odebraÊ znak
przez inkey() lub waitkey() , ktÛry mo-
øe mieÊ takøe wartoúÊ 0. Bascom
prÛcz transmisji typowej umoøliwia
transmisjÍ buforow¹ z†wykorzystaniem
przerwaÒ od wbudowanego UART-u/
USART-u w†mikrokontrolerze.
Poniewaø transmisja buforowa
uøywa przerwaÒ od UART-u/USART-
u, wiÍc nie jest moøliwe jej wyko-
rzystanie przy programowej realizacji
interfejsu RS232 tylko sprzÍtowej.
Transmisja buforowa z†wykorzysta-
niem przerwaÒ ma wiele zalet. Od-
bieranie oraz nadawanie danych moøe
przebiegaÊ w†obs³udze przerwania,
czyli w†tle programu g³Ûwnego. Moøe
byÊ wykonywany program g³Ûwny,
ktÛrego kolejne instrukcje nie musz¹
czekaÊ, aø dany ci¹g znakÛw zosta-
nie odebrany lub wys³any. DziÍki bu-
forowi odbieranie danych czy nada-
wanie moøe byÊ przeprowadzone
w†programie g³Ûwnym, kiedy bÍdzie
do tego sposobnoúÊ. Jeøeli nie zosta-
nie przekroczona zadana pojemnoúÊ
bufora, øaden odebrany czy nadany
ci¹g znakÛw nie zostanie zgubiony,
co mia³oby miejsce przy wykonywa-
niu jakichú d³ugoczasowych instrukcji
w†programie g³Ûwnym. W†przypadku
transmisji buforowej odbierane czy
nadawane znaki s¹ ³adowane i†brane
z†bufora w†przerwaniu, czyli niezaleø-
nie od dzia³ania programu g³Ûwnego.
Po prostu transmisji buforowej moøna
uøywaÊ, gdy potrzebne bÍdzie wysy-
³anie oraz odbieranie znakÛw w†tle
dzia³ania programu g³Ûwnego (ktÛra
wykorzystuje przerwanie od UART-u/
USART-u). BÍdzie uøywana zw³aszcza
wtedy, gdy zadania wykonywane
w†programie g³Ûwnym bÍd¹ czaso-
ch³onne, a†nie bÍdzie moøna prze-
oczyÊ øadnych odebranych przez
RS232†znakÛw. Do konfiguracji sprzÍ-
towego uk³adu UART/USART, by
uøywa³ bufora wejúciowego, s³uøy†po-
lecenie konfiguracyjne config serialin .
Gdy uøyte zostanie to polecenie, au-
tomatycznie zostan¹ stworzone trzy
zmienne, ktÛrych znaczenie jest na-
stÍpuj¹ce:
- _RS_HEAD_PTR0 bajt - wskaünik
okreúlaj¹cy, gdzie znajduje siÍ
pierwszy jeszcze nieodebrany bajt,
- _RS_TAIL_PTR0 bajt - wskaünik
okreúlaj¹cy, gdzie znajduje siÍ
ostatni jeszcze nieodebrany bajt,
- _RS232INBUF0 tablica bajtÛw
pe³ni¹ca rolÍ wejúciowego bufora
ko³owego.
Przy transmisji buforowej (odbior-
czej) po kaødym odebranym znaku
wywo³ywana jest procedura przerwa-
nia, w†ktÛrej ³adowany jest odebrany
znak do bufora. Gdy nie ma miejsca
w†buforze, odebrany znak nie jest
umieszczony w†buforze. Dlatego bu-
for musi byÊ oprÛøniany cyklicznie,
podczas odczytywania instrukcjami
inkey() lub input . Poniewaø transmis-
ja odbiorcza - buforowa wykorzystu-
je przerwanie URXC, nie jest moøli-
we uøywanie tego ürÛd³a przerwania
w†programie uøytkownika. Aby poka-
zaÊ dzia³anie transmisji buforowej,
przedstawiony zostanie przyk³ad pro-
gramu, ktÛry odbiera znaki z†portu
RS232 oraz wyúwietla je na LCD. Je-
øeli przekroczona zostanie pojemnoúÊ
pierwszej linii wyúwietlacza LCD,
wyúwietlacz jest czyszczony i†kolejne
odebrane znaki s¹ wyúwietlane od
pocz¹tku linii. Na rys. 2 przedsta-
wiono schemat ideowy systemu,
w†ktÛrym zastosowano wyúwietlacz
LCD oraz konwerter poziomÛw na-
piÍʆTTL<->RS232. Wykorzystany zo-
sta³ mikrokontroler ATmega8.
Przyk³adowy program ( list. 2 ) od-
biera znaki przez RS232 oraz wy-
úwietla je na wyúwietlaczu z†opÛü-
nieniem 1†sekundy. Wprowadzone
opÛünienie 1†sekundy ma na celu
pokazanie poprawnoúci dzia³ania
transmisji buforowej.
Jak widaÊ na list. 2, sprzÍtowy
UART/USART jest konfigurowany
w†taki sposÛb, aby uøywa³ bufora
wejúciowego (odbiorczego). Wykorzys-
tano do tego celu instrukcjÍ config
serialin ustalaj¹c¹ rozmiar bufora od-
biorczego o†wielkoúci 50 bajtÛw. Aby
by³o moøliwe poprawne dzia³anie
transmisji buforowej, koniecznie nale-
øy odblokowaÊ globalny system prze-
rwaÒ, co w†przyk³adowym programie
zosta³o uczynione. Naleøy o†tym pa-
miÍtaÊ, bo w†przeciwnym wypadku
transmisja buforowa nie bÍdzie dzia-
³aÊ. W†nieskoÒczonej pÍtli do-loop
odbierany jest znak z†bufora transmi-
List. 1. Przykład programu pokazującego działanie funkcji waitkey() oraz
inkey()
$regfile = „m8def.dat”
$crystal = 8000000
$baud = 9600
'predkosc transmisji
Dim A As Byte
'definicje zmiennych
Do
'petla glowna programu
Print „Program testowy”
Print „1. Instrukcja waitkey()”
Print „2. Instrukcja inkey()”
Input „Wybierz opcje i nacisnij enter:”, A
If A = 1 Then 'jesli odebrano 1 to
A = Waitkey() 'czekaj na znak
Print A; „ - „; Chr(a) 'wyslij do terminala odebrany znak oraz jego kod ascii
End If
If A = 2 Then 'jesli odebrano 2 to
Do 'poczatek warunkowej petli do-loop
A = Inkey() 'odebranie znaku
If A > 0 Then 'jesli odebrany znak wiekszy od 0 (kod ascii) to
Print „Nacisniete (kod ASCII):”; A; „ czyli znak „; Chr(a)
'wysli do terminala kod ascii odebranego znaku oraz znak
End If
Loop Until A = 27 'jesli odebrany znak ma kod 27 (esc) to zakoncz petle do-loop
End If
Loop
End
Elektronika Praktyczna 11/2003
95
39647680.002.png
B A S C O M O W E P O R A D Y
Rys. 2. Schemat przykładowego układu testowego
sji funkcj¹ inkey() i†jeøeli kod ASCII
odebranego znaku jest wiÍkszy od 31,
to odebrany znak zostaje wyúwietlo-
ny na LCD oraz zwiÍkszona zostanie
o†jeden wartoúÊ zmiennej poz . Jeøeli
zmienna poz osi¹gnie wartoúÊ 17,
czyli zape³niony zostanie znakami ca-
³y wiersz wyúwietlacza 2*16 znakÛw,
to nastÍpuje czyszczenie LCD oraz
wpisanie do zmiennej poz wartoúci
pocz¹tkowej 1. OpÛünienie 1†sekundy
zosta³o wprowadzone w†celu spowol-
nienia dzia³ania programu g³Ûwnego,
co ma na celu pokazanie zalet trans-
misji buforowej - odbiorczej. Po uru-
chomieniu tego programu wysy³ane
poprzez terminal znaki, np. przez ten
w†jaki zosta³ wyposaøony Bascom,
wszystkie odebrane (øaden nie zosta-
nie zgubiony) i†wyúwietlone na LCD,
oczywiúcie jeúli nie zostanie przekro-
czona pojemnoúÊ zadeklarowanego bu-
fora. Aby zobaczyÊ dzia³anie tego
programu bez uøycia transmisji bufo-
rowej, naleøy wykasowaÊ z†programu
instrukcjÍ konfiguracyjn¹ config seria-
lin . Po tym zabiegu i†po za³adowa-
niu programu wysy³ane znaki przez
terminal czÍúciej niø co sekundÍ bÍ-
d¹ po prostu tracone i†nie do odzys-
kania. Aby mÛc np. odbieraÊ znaki
ASCII od 0†do 255 (oczywiúcie
w†przypadku buforowego odbierania
znakÛw), moøna pos³uøyÊ siÍ dodat-
kowymi zmiennymi _RS_HEAD_PTR0
oraz _RS_TAIL_PTR0 , ktÛre s¹ two-
rzone automatycznie podczas uøywa-
nia odbiorczej transmisji buforowej.
Jeøeli wartoúci tych zmiennych s¹
rÛøne, to wiadomo, øe w†buforze od-
biorczym znajduje siÍ nieodebrany
znak/i. Natomiast gdy s¹ rÛwne, zna-
czy, øe w†buforze odbiorczym nie ma
øadnych nieodebranych znakÛw. Re-
alizacja nadawania przez UART/
USART z†wykorzystaniem bufora
przebiega podobnie jak odbiÛr bufo-
rowy, tylko zamiast instrukcji config
serialin naleøy wykorzystaÊ instrukcjÍ
config serialout . W†przypadku bufora
nadawczego takøe naleøy obowi¹zko-
wo odblokowaÊ globalny system
przerwaÒ. Oczywiúcie jest moøliwe
jednoczesne uøywanie bufora wejúcio-
wego, jak i†wyjúciowego. Bascom
prÛcz obs³ugi sprzÍtowej RS232
umoøliwia takøe realizacjÍ programo-
w¹ interfejsu RS232. Programowy
UART bÍdzie wykorzystywany
zw³aszcza gdy mikrokontroler nie bÍ-
dzie zawiera³ sprzÍtowego UART-u/
USART-u, a†bÍdzie potrzebny, lub
gdy bÍdzie potrzebny drugi port
RS232. Bascom posiada takøe in-
strukcje realizuj¹ce dynamiczny pro-
gramowy UART, dziÍki czemu moø-
liwe jest dowolne wykorzystanie
w†kaødej chwili koÒcÛwek mikrokon-
trolera do nadawania lub odbioru
danych przez RS232. Dynamicznie
moøna zmieniaÊ uøywane do trans-
misji koÒcÛwki mikrokontrolera oraz
parametry transmisji. Jeúli bÍdzie za-
interesowanie, zostanie poúwiÍcona
czÍúÊ miejsca w†tej rubryce na za-
gadnienia zwi¹zane z†programowym
UART-em. Oczywiúcie RS232 moøna
nie tylko wykorzystywaÊ do komuni-
kacji z†komputerem, ale takøe z†inny-
mi mikrokontrolerami czy urz¹dzenia-
mi wyposaøonymi w†taki port.
Marcin Wi¹zania
marcin.wiazania@ep.com.pl
Artur Starz
artur.starz@ep.com.pl
List. 2. Realizacja odbierania znaków przez RS232 z wykorzystaniem
transmisji buforowej
'Przykład buforowego odbioru danych przez RS232 (w przerwaniu)
'predkosc transmisji 9600 bodow
$regfile = „m8def.dat”
'informuje kompilator o pliku dyrektyw
'wykorzystywanego mikrontrolera
$crystal = 8000000
'informuje kompilator o czestotliwosci rezonatora
'kwarcowego
$baud = 9600
'informuje kompilator o predkosci transmisji
Config Lcd = 16 * 2 'konfiguracja organizacji znakow wyswietlacza LCD
Config Lcdpin = Pin, Db4 = Portc.3, Db5 = Portc.2, Db6 = Portc.1, Db7 = Portc.0, E
= Portc.4, Rs = Portc.5
'konfiguracja pinow mikrokontrolara do ktorych dolaczone zostaly linie wyswietlacza
Config Serialin = Buffered, Size = 50 'konfiguracja bufora wejsciowego
Dim Znak As String * 1
'definicja zmiennej znak typu string
Dim Poz As Byte
'definicja zmiennej poz typu byte
Enable Interrupts
'odblokowanie przerwan globalnych
Cls
'czysc lcd
Poz = 1
'wartosc poczatkowa zmiennej poz
Do 'nieskonczona petla do-loop
Znak = Inkey() 'odbierz znak z bufora wejsciowego
If Asc(znak) > 31 Then 'jezeli wartosc ascii odebranego znaku wieksza niz 0 to
If Poz = 17 Then
'jesli zmienna poz=17 to
Cls
'czysc lcd
Poz = 1
'zapisz do poz wartosc 1
End If
Lcd Znak
'wyswietl na lcd odczytany z bufora znak
Incr Poz
'zwieksz o jeden wartosc zmiennej poz
End If
Wait 1
'czekaj 1 sekunde
Loop
'koniec nieskonczonej petli
End
'koniec programu
96
Elektronika Praktyczna 11/2003
39647680.003.png 39647680.004.png 39647680.005.png 39647680.006.png 39647680.007.png 39647680.008.png 39647680.009.png 39647680.010.png
Zgłoś jeśli naruszono regulamin