Mikrokontrolery ARM cz17


K U R S
Mikrokontrolery z rdzeniem ARM,
część 17
Interfejsy szeregowe: UART
W związku z tymi trudnościami W każdym systemie mikroprocesorowym zachodzi potrzeba wymiany
w dzisiejszych czasach daje siÄ™ za-
informacji z otoczeniem  na przykład z innymi komputerami,
uważyć duże zainteresowanie magi-
czy urządzeniami peryferyjnymi podłączanymi do systemu.
stralami szeregowymi (na przykład
Najbardziej naturalnym sposobem przesyłania danych są magistrale
w komputerach PC równoległą ma-
gistrala dyskowa ATA została zastą- równoległe, w których dane przesyłane są jednocześnie w porcjach
piona przez wydajniejszÄ… magistra-
odpowiadających długości słowa maszynowego mikroprocesora.
le szeregową Serial ATA), w któ-
Jednak taki sposób przesyłania danych jest kłopotliwy ze względu
rych dane przesyłane są bit po
bicie za pomocą kilku przewodów. na dużą liczbę połączeń, gdzie już nawet w przypadku prostego
Najprostsze mikrokontrolery, takie
8 bitowego systemu mikroprocesorowego musimy podłączyć 8
jak 8051 posiadajÄ… interfejs szere-
linii danych, 16 linii adresowych i kilkanaście linii sterujących.
gowy UART, służący do komuni-
W przypadku połączenia równoległego z innymi urządzeniami
kacji z zewnętrznymi urządzeniami,
na przykład innymi komputerami.
zewnętrznymi na przykład dwoma systemami mikroprocesorowymi
Mikrokontrolery LPC21xx posiada-
znajdującymi się na przeciwnych końcach pomieszczenia wiązałoby
ją na swoim pokładzie dwa inter-
się z koniecznością użycia drogich wielożyłowych przewodów.
fejsy transmisji szeregowej UART
służące najczęściej do komunikacji
z innymi systemami mikroproceso- którym przesyłane są poszczególne strony programowej nie są kom-
rowymi, dwa interfejsy szeregowe bity danych, począwszy od bitu patybilne z żadnymi standardami.
SPI wykorzystywane do komunika- najmniej znaczącego do najbardziej Twórcy mikrokontrolerów LPC213x/
cji z pojemnymi urządzeniami pa- znaczącego, a na koniec przesyła- 214x poszli trochę inną drogą
mięci masowych (karty MMC) czy ny jest jeden lub dwa bity stopu i zamiast wymyślać kolejny nowy
innych urządzeń, w których wyma- (1). Liczba bitów danych w znaku wspaniały interfejs szeregowy, się-
gane jest przesyłanie dużej ilości może być zmienna i wynosi od 5 gnęli po doskonale sprawdzone
danych, dwa interfejsy I2C wyko- do 8, jednak najczęściej przesy- rozwiązanie i we wnętrzu mikro-
rzystywane do komunikacji z wol- Å‚a siÄ™ jeden bajt danych. Ponad- kontrolera zaimplementowali dwa
niejszymi urządzeniami peryferyj- to na końcu, przed bitem stopu, UARTY zgodne programowo ze
nymi takimi jak pamięci EEPROM, może być wysłany dodatkowy bit standardem przemysłowym 16550.
pomiarowe przetworniki A/C itp. służący do kontroli parzystości. Do charakterystycznych cech tego
Dodatkowo w mikrokontrolerach Sposób i szybkość przesyłania jed- układu możemy zaliczyć: 16 bi-
LPC214x wbudowano interfejs uni- nego znaku musi być jednakowo tową nadawczo odbiorczą kolejkę
wersalnej magistrali szeregowej zdefiniowany w nadajniku i od- FIFO, zapewniajÄ…cÄ… odpowiednie
(USB) wykorzystywanej do komu- biorniku. W przypadku transmisji buforowanie znaków oraz wbudo-
nikacji z komputerami PC. Z uwagi z komputerami, jako standardowe wany mechanizm sprzętowej lub
na duży stopień skomplikowania przyjmuje się następujące prędko- programowej kontroli przepływu.
programowego magistrali USB, spo- ści transmisji (1200, 2400, 4800, Dodatkowo drugi UART mikrokon-
soby programowania kontrolera za- 9600, 19200, 57600, 115200 b/ trolerów LPC21x4/21x6/21x8 posia-
wartego w: LPC214x zostaną omó- s). Prędkość transmisji wyznacza da standardowe linie modemowe
wione w oddzielnym cyklu poświe- się poprzez podział częstotliwo- (RTS/CTS) obsługiwane całkowi-
conym temu zagadnieniu. ści taktującej układy peryferyjne cie w sposób sprzętowy. W tab. 4
danego mikrokontrolera w dzielni- przedstawiono zbiór linii interfejsu
Porty szeregowe UART ku. Nawet proste mikrokontrolery UART0 i UART1 mikrokontrolera:
Dla przypomnienia UART (Uni- 8 bitowe, takie jak 80C2051 czy Linie zaznaczone kolorem sza-
versal Asynchronous Receiver Trans- większość AVR ów posiadają wbu- rym występują tylko w drugim
mitter) jest kontrolerem szeregowej dowane sprzętowe kontro-
transmisji asynchronicznej w której lery transmisji szeregowej,
dane przesyłane są bit po bicie umożliwiające duplek-
w sposób asynchroniczny (rys. 34), sową transmisję danych
czyli poszczególne bity informacji bez udziału mikrokontro-
przesyłane są w ściśle określonych lera. Są one zazwyczaj
odstępach czasu. autorskimi rozwiązaniami
Transmisja znaku rozpoczyna producentów danego mi- Rys. 34. Jedna z możliwych ramek przesyłanych
się od wysłania bitu startu (0), po krokontrolera, dlatego od asynchronicznie za pomocą UART a
Elektronika Praktyczna 4/2007
105
K U R S
BRE- PAR_ PAR_ STOP_ WORD_
Tab. 4. Linie interfejsów UART0 i UART1 w mikrokontrolerach LPC21xx
DLAB
AK SEL EN SEL SEL
Sygnał Linia Linia Opis
7 6 5 4 3 2 1 0
(UART0) (UART1)
RXD P0.1 P0.9 Linia po której odbierane są dane RS232
Rys. 36. Rejestr U1LCR (0xE001000C)
TXD P0.0 P0.8 Linia po której nadawane są dane RS232 U0LCR (0xE000C00C)
CTS  P0.11 Stan niski na tej linii informuje, że modem jest gotowy do odbio-
ru danych nadawanych po linii TXD
BREAK  ustawienie tego bitu
DCD  P0.14 Stan niski na tej linii informuje, że modem pomyślnie nawiązał
powoduje natychmiastowe ustawie-
połączenie i dane ze zdalnym hostem mogą być wymieniane.
nie linii TXD w stan 0, co skutku-
DSR  P0.12 Stan niski na tej linii informuje o gotowości modemu do nawiąża-
je natychmiastowym przerwaniem
nia połączenia.
transmisji.
DTR  P0.13 Stan niski informuje, że UART jest gotowy do nawiązania połącze-
DLAB  ustawienie tego bitu
nia z modemem.
umożliwia dostęp do rejestrów
RI  P0.15 Stan niski na tej linii informuje, że modem odbiera sygnał dzwo-
dzielnika taktujÄ…cego sterownik
nienia.
transmisji szeregowej.
RTS  P0.10 Stan niski na tej linii informuje, że UART chce przesłać dane do
Najczęściej rejestr ten będzie-
modemu
my konfigurować w taki sposób,
aby przesyłać 8 bitów danych, bez
kontrolerze (UART1) w bardziej 5 V napięcia zasilającego. Z punktu kontroli parzystości i z jednym bi-
rozbudowanych mikrokontrolerach widzenia mikrokontrolera nie stano- tem stopu. W prostych UART ach
2134/2136/2139/2144/2146/2148. wi to problemu, gdyż jego wejścia mikrokontrolerów 8 bitowych naj-
Nie stanowi to jednak problemu, tolerują napięcie 5 V, jednak wy- częściej nie występuje bufor zna-
gdyż w 99% przypadków wykorzy- maga to stosowania dodatkowego ków i w przypadku, gdy procesor
stywać będziemy tylko linie RXD zasilacza. W przypadku gdy zależy nie odczyta z rejestru zawartości
i TXD. Sygnały elektryczne wycho- nam na stosowaniu jednego napię- znaku zanim zostanie odebrany
dzące z mikrokontrolera mają war- cia zasilającego należy użyć układu kolejny znak, zostanie on bez-
tości 0 i 3 V, natomiast w standar- MAX3232, który jest przystosowa- powrotnie stracony. Aby zapobiec
dzie RS232 wymagane jest napię- ny do zasilania napięciem 3,3 V. utracie danych w układzie 16550
cie ą12V, dlatego konieczne jest Podczas konfigurowania UART ów wprowadzono bufor (kolejkę FIFO)
podłączenie konwertera poziomów należy pamiętać, aby wybrać odpo- o długości 16 znaków. Do sterowa-
napięć standardu RS232, chociaż- wiednią funkcję alternatywną portu nia działaniem kolejki FIFO służy
by takiego, jak przedstawiono na za pomocą rejestrów PINSEL. Do rejestr FCR (FIFO Control Register)
rys. 35. konfiguracji parametrów transmisji  rys. 37.
Jeden układ MAX232 posiada takich jak liczba bitów danych, EN  Ustawienie tego bitu po-
dwa kanały wejściowe i dwa ka- liczba bitów stopu oraz przesyła- woduje włączenie kolejki FIFO
nały wyjściowe, a więc za pomocą nie bitu kontroli parzystości służy RX_RST  Ustawienie tego bitu
jednego układu możemy podłączyć rejestr U0LCR (UART0) lub U1LCR powoduje skasowanie wszystkich
dwa porty szeregowe. Wadą tego (UART1) w skrócie LCR (Line Con- znaków znajdujących się w kolejce
rozwiązania jest to, że do prawi- trol Register), którego zawartość odbiornika.
dłowej pracy układ ten wymaga przedstawiono na rys. 36. TX_RST  Ustawienie tego bitu
WORD_SEL  umoż- powoduje skasowanie wszystkich
liwia ustawienie długości znaków znajdujących się w kolejce
znaku od 5 bitów dla nadajnika.
00b do 8 bitów dla 11b RX_LEVEL  Określa po ilu
STOP_SEL  ustawie- znakach znajdujÄ…cych siÄ™ w kolejce
nie tego bitu powoduje, odbiornika zostanie wygenerowanie
że nadawane będą dwa przerwanie:
bitu stopu, natomiast 00b  przerwanie zostanie zgło-
wyzerowanie tego bitu szone po każdym odebranym zna-
spowoduje nadawanie ku.
jednego bitu stopu. 01b  przerwanie zostanie zgło-
PAR_EN  ustawie- szone po 4 odebranych znakach.
nie tego bitu powoduje 10b  przerwanie zostanie zgło-
sprawdzanie i generowa- szone po 8 odebranych znakach.
nie bitu parzystości. 11b  przerwanie zostanie zgło-
PAR_SEL  bity te szone po 14 odebranych znakach.
określają rodzaj bitu ge- Dodatkową zaletą wprowadzenia
nerowanego parzystości: bufora jest możliwość skonfiguro-
00b  nieparzysta wania układu tak, aby nie zgła-
liczba bitów w znaku
RX_LEVEL    TX_RST RX_RST EN
01b  parzysta liczba
7 6 5 4 3 2 1 0
bitów w znaku
Rys. 35. Schemat elektryczny prostego konwertera 10b  zawsze  1 Rys. 37. Rejestr U1FCR (0xE0010008)
napięć TTL LV< >RS232 11b  zawsze  0 U0FCR (0xE000C008)
Elektronika Praktyczna 4/2007
106
Pclk
Bd żÿ
K U R S
16 żÿ (16 żÿ DLL żÿ DLM )
DLL
niem dodatkowego rejestru możemy (Line Status Register) służy spraw-
7 6 5 4 3 2 1 0
wyznaczyć według wzoru: dzenia statusu układu i umożliwia
Rys. 38. Rejestr U1DLL (0xE0010000) określenie wyżej
Pclk
U0DLL (0xE000C000) Bd żÿ wspomnianych sta-
DIVADDVAL
nów, oraz określenie
16 żÿ (16 żÿ DLL żÿ DLM ) żÿ (1 żÿ )
DLM
MULVAL
błędów w transmisji.
7 6 5 4 3 2 1 0
Rejestr ten nie występuje w ory- RDR  Stan wysoki oznacza,
Rys. 39. Rejestr U1DLM (0xE0010004) ginalnym układzie 16550, ani że rejestr RBR zawiera prawidło-
U0DLM (0xE000C004) w mikrokontrolerach LPC213x, jed- wÄ… danÄ…. W momencie odczytania
nak oprogramowanie napisane dla wszystkich danych z kolejki FIFO
szał on przerwania wraz z każdym LPC213x będzie działać prawidło- zostaje on automatycznie wyzero-
nadchodzącym znakiem, ale dopie- wo w układach LPC214x, ponieważ wany.
ro po odebraniu określonej liczby domyślnie rejestr FDR jest ustawio- OE (Overrun Error)  Bit ten
znaków. Uważnemu Czytelnikowi ny tak, by nie wpływał na pręd- jest ustawiany, gdy kolejka FIFO
nasuwa się pewnie wątpliwość co kość transmisji ustawioną za po- odbiornika zostaje przepełniona
się stanie, gdy odebrane zostanie mocą rejestrów DLL:DLM. i odebrany znak został utracony,
mniej znaków niż liczba, która Jeżeli chcemy wysłać jakieś wyzerowanie tego bitu następu-
powoduje wygenerowanie przerwa- dane przez port szeregowy, mu- je w momencie odczytania rejestru
nia? Mianowicie po czasie równym simy je wpisać na koniec kolejki LSR.
3& 4 znaków zostanie wygenerowa- FIFO zapisując THR, który stanowi PE (Parity Error)  Bit ten jest
ne przerwanie od przeterminowania wierzchołek kolejki (rys. 41). ustawiany w przypadku gdy włą-
(timeout). Do określenia prędko- czona jest kontrola parzystości
THR
ści transmisji portów szeregowych i stwierdzono odebranie błędnego
7 6 5 4 3 2 1 0
służą rejestry DLL (rys. 38) oraz znaku. Odczytanie rejestru LSR po-
DLM (rys. 39). Rys. 41. Rejestr U1THR (0xE0010000) woduje wyzerowanie tego bitu.
Prędkość transmisji szeregowej U0THR (0xE000C000) FE (Framing Error)  Bit ten
możemy wyznaczyć według nastę- jest ustawiany w przypadku odebra-
pującego wzoru: Po zapisaniu tego rejestru dane nia błędnego bitu stopu, a zerowa-
trafiajÄ… do kolejki FIFO i sukcesyw- ny jest automatycznie w momencie
Pclk
Bd żÿ
nie zostają wysyłane poprzez port odczytania rejestru LSR.
16 żÿ (16 żÿ DLL żÿ DLM )
szeregowy za pomocÄ… linii TX. Od- BI (Break Interrupt)  Bit ten
gdzie: Bd  prędkość transmi- czytu danych odebranych poprzez jest ustawiany w momencie gdy
sji, P  częstotliwość taktowania linię RX portu szeregowego może- wszystkie odebrane bity posiadają
clk
układów peryferyjnych. my dokonać odczytując zawartość stan  0 . Wyzerowanie tego bitu
Należy zwrócić uwagę, że do- rejestru RBR, który zawiera najstar- następuje w wyniku odczytania re-
Pclk
stęp do rejestrów DLL i DLM jest szy znak odebrany poprzez port jestru LSR.
Bd żÿ
możliwy tylko w przypadku gdy żÿbit żÿ DIVADDVAL znajdujÄ…cy siÄ™ w kolejce THRE  Ustawienie tego bitu
szeregowy
16 żÿ (16 żÿ DLL żÿ DLM ) (1 )
DLAB w rejestrze LCR jest ustawio- FIFO (rys. 42). oznacza, że rejestr nadajnika THR
MULVAL
ny. Uzyskanie dokładnych standar- jest pusty i możemy do niego wpi-
RBR
dowych prędkości transmisji: 9600, sać daną do nadania.
7 6 5 4 3 2 1 0
19200, 115200 itp. jest możliwe TEMT  Bit ten jest ustawiany,
tylko w przypadku użycia rezonato- Rys. 42. Rejestr U1RBR (0xE0010000) gdy wszystkie dane znajdujące się
ra kwarcowego o częstotliwości ta- U0RBR (0xE000C000) w kolejce FIFO zostały wysłane.
kiej, by dzieliła się ona bez reszty RXFE  Ustawienie tego bitu
przez standardowe prędkości trans- Jak można łatwo zauważyć, reje- oznacza wystąpienie jakiegoś błędu
misji (np. 11,0592 MHz). Czasami stry RBR i THR mają taki sam ad- transmisji odbiornika, określenie
nie jest to zbyt wygodne rozwią- res bazowy a rozróżnienie następuje o jaki błąd chodzi jest możliwe
zanie i chcielibyśmy mieć możli- za pomocą sygnału zapisu/odczytu. poprzez zbadanie innych bitów.
wość użycia rezonatora o dowol- Oprócz tego, adresy tych rejestrów Bit ten jest zerowany w momencie
nej częstotliwości. Konstruktorzy pokrywają się z rejestrami DLL odczytania rejestru LSR.
Philipsa zauważyli ten problem i DLM wyznaczającymi prędkość Poznaliśmy już wszystkie reje-
i w najnowszych mikrokontrolerach transmisji, a wyboru rejestrów RBR/ stry niezbędne do napisania pro-
LPC214x wprowadzili rejestr (FDR) THR dokonujemy poprzez wyzero- cedur służących do transmisji sze-
umożliwiający uzyskanie w zasa- wanie bitu DLAB w rejestrze LCR. regowej, dlatego teraz napiszemy
dzie dowolnej prędkości transmisji Sam dostęp do rejestrów umoż- program (ep8a.zip) (list. 8), który
z użyciem rezonatora kwarcowego liwiających wysyłanie i odbieranie będzie pobierał znaki z termina-
o dowolnej częstotliwości. danych nie umożliwia poprawnego la i wyświetlał je na wyświetlaczu
W mikrokontrolerach LPC214x przesyłania danych, ponieważ nie LCD zestawu ZL6ARM.
prędkość transmisji z uwzględnie- znamy statusu układu portu sze-
regowego i nie możemy określić
MULVAL DIVADDVAL RXFE TEMT THRE BI FE PE OE RDR
czy rejestr RBR zawiera odebrane
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
dane, albo czy kolejka FIFO nadaj-
Rys. 40. Rejestr U1FDR (0xE0010028) nika jest pusta i możemy przesyłać Rys. 43. Rejestr U1LSR (0xE0010014)
U0FDR (0xE000C028) do niej kolejne znaki. Rejestr LSR U0LSR (0xE000C014)
Elektronika Praktyczna 4/2007
107
K U R S
Procedura Uart0Init inicjalizuje
List. 8. Przykładowy program demonstrujący działanie UART a
#include  lpc213x.h pierwszy port szeregowy mikrokon-
#include  CLcdDisp.h
trolera, z prędkością transmisji prze-
//Ustawienia kontrolera VIC
kazywaną jako parametr. Prędkość
#define TXD0_P00_SEL (1<<0)
#define RXD0_P01_SEL (1<<2)
tę można wyznaczyć za pomocą
//Czetotliwosc PCLK
#define PCLK 60000000
makra UART_BAUD, które określa
//Wyznaczenie predkosci
#define UART_BAUD(baud) (unsigned short)(PCLK/(baud*16.0) + 0.5) wartość podzielnika DLL i DLM.
#define U0LCR_8Bit_Data 3
W procedurze najpierw ustawiane
#define U0LCR_1Bit_Stop 0
#define U0LCR_No_Parity 0
sÄ… funkcje alternatywne dla linii
#define U0FCR_14Char_Fifo (3<<6)
RXD0 i TXD0, ustawiana jest pręd-
/* Inicjalizacja Uart0 */
static void Uart0Init(unsigned short BaudRate) kość oraz tryb transmisji na 8 bi-
{
tów danych, 1 bit stopu, bez kon-
//Wybor RXD i TXD jako funkcja alternatywna
PINSEL0 |= TXD0_P00_SEL | RXD0_P01_SEL;
troli parzystości. Następnie włącza-
//Ustawianie predkosci transmisji
U0LCR = U0LCR_Divisor_Latch_Access_Bit;
ny jest bufor FIFO, który zabezpie-
//Ustaw predkosci transmisji
U0DLL = (unsigned char)BaudRate;
cza nas przed utratÄ… danych. Pro-
U0DLM = (unsigned char)(BaudRate>>8);
//Ustawienie 8,n,1 cedura Uart0Puts wysyła poprzez
U0LCR = U0LCR_8Bit_Data | U0LCR_1Bit_Stop | U0LCR_No_Parity;
port szeregowy poszczególne znaki
//Wlacz fifo
U0FCR = U0FCR_FIFO_Enable | U0FCR_14Char_Fifo;
łańcucha tekstowego, aż do napo-
//Wylacz przerwania i kasuj flagi przerwan
U0IER = 0;
tkania znaku końca łańcucha (\0).
U0IIR = 0;
//Wszystkie znaczniki odebrania znaku
Przed wpisaniem znaku do rejestru
U0LSR = 0;
} THR, w pętli while oczekujemy na
zwolnienie miejsca w kolejce FIFO,
//Nadawanie znaku
static void Uart0Puts(const char *str)
co następuje w momencie, gdy bit
{
//Wysylaj kolejne znaki
THRE w rejestrze U0LSR przyjmu-
while(*str)
{
je wartość 1. Funkcja Uart0Gets,
//Czekaj az bedzie mozna zapisac do bufora nadajnika
while(!(U0LSR & U0LSR_THRE)); pobiera łańcuch tekstowy z portu
//Wyslij znak i przejdz do nast znaku
szeregowego, ponieważ dane wpi-
U0THR = *str++;
}
sywać będziemy z terminala, koniec
}
łańcucha możemy określić w mo-
//Odbior znaku
mencie, gdy odbierzemy znak (\r).
static void Uart0Gets(char *str)
Procedura sprawdza stan bitu RDA
{
char c;
w rejestrze U0LSR, którego usta-
do
{
wienie informuje o odebraniu zna-
//Czekaj na znak
while(!(U0LSR & U0LSR_RDR));
ku, następnie przepisuje ten znak
//Odbierz znak
c = U0RBR; z rejestru U0RDR do bufora i ocze-
//Zapisz znak do bufora
kuje na zwolnienie miejsca w bu-
*str++ = c;
//Czekaj na nadajnik
forze nadajnika, po czym przesy-
while(!(U0LSR & U0LSR_THRE));
//Nadaj zwrotnie znak
Å‚a ten znak z powrotem poprzez
U0THR = c;
}
port szeregowy. Dzieje siÄ™ tak do
while(c !=  \r );
*(str 1) = 0; momentu napotkania znaku końca
}
linii (\r). Przesyłanie odebranego
znaku z powrotem do portu szere-
//Obiekt wyswietlacza LCD
CLcdDisp cout;
gowego umożliwia zobaczenie tego
//Bufor odebranych znakow
char buf[256];
co piszemy na terminalu. W funk-
/* Funkcja glowna main */ cji głównej main() inicjalizujemy
int main(void)
port szeregowy z prędkością 9600,
{
Uart0Init(UART_BAUD(9600));
inicjalizujemy wyświetlacz LCD,
Uart0Puts( Mikrokontrolery z rdzeniem ARM cz VIII\r\n );
Uart0Puts( Uart bez systemu przerwan\r\n );
a następnie wypisujemy napis po-
Uart0Puts( Wpisz cos i nacisnij Enter\r\n );
while(1)
witalny na terminalu. Pętla głów-
{
na programu odczytuje liniÄ™ tekstu
//Pobierz linie
Uart0Gets(buf);
z terminala, i sprawdza pierwszy
//Czy pierwszy znak to 1
if(buf[0] ==  1 )
znak łańcucha, który może zawie-
{
//Tak wypisz na lcd wiersz 1
rać numer linii, w której mamy
cout << pos(1,1) << (buf+1);
} wyświetlić tekst. Jeżeli stwierdzono,
//Czy pierwszy znak to 2
że pierwszy znak łańcucha zawiera
else if(buf[0] ==  2 )
{
liczbę 1 lub 2, wówczas kolejne
//Tak wypisz na lcd wiersz 2
cout << pos(1,2) << (buf+1);
znaki wyświetlane są w pierwszej
}
//ani 1 ani 2
lub drugiej linii wyświetlacza LCD,
else
{ natomiast w przeciwnym przypad-
//Jezeli ani 1 ani 2 to wypisz w 1 wierszu
ku tekst odebrany z portu szerego-
cout << pos(1,1) << buf;
}
wego jest domyślnie wypisywany
//Wypisz potwierdzenie
Uart0Puts( \r\nOK\r\n );
w pierwszej linii.
}
return 0;
Lucjan Bryndza, EP
}
lucjan.bryndza@ep.com.pl
Elektronika Praktyczna 4/2007
108


Wyszukiwarka