KARTOS 8–bitowe jądro czasu rzeczywistego, część 3


P R O G R A M Y
OS
8 bitowe jądro czasu
rzeczywistego, część 3
W poprzedniej części cyklu zaprezentowano pierwszą aplikację List. 6. Parametry konfiguracji ob-
sługi portu szeregowego zawarte
demonstracyjną dla systemu KaRTOS. Składała się z dwóch prostych
w pliku KaRTOSUart.h
zadań migających LED ami oraz trzeciego, które korzystając
#define UART_ROZM_BUF_OUT 10
#define UART_ROZM_BUF_IN 5
z systemowego modułu obsługującego port szeregowy wyświetlało
#define UART_OKRES_WYSYLANIA_MS 10
#define UART_OKRES_ODBIERANIA_MS 10
na terminalu ekran powitalny  Hello World tu KaRTOS! . Teraz
dokończymy prezentację wspomnianego modułu oraz poznamy
u16timeout). Przyjmuje ona nastę-
kolejny odpowiedzialny za odmierzanie czasu rzeczywistego. Na
pujące parametry:
zakończenie zaimplementujemy aplikację zegara, który wyświetla na  u08 u08EndBajt  zmienna za-
wierająca znak kończący odbiera-
ekranie terminala aktualną datę i godzinę.
nie ciągu,
 u08 u08IleBajtowEnd  zmien-
KaRTOS_UART  systemowy UART_ROZM_BUF_OUT oraz UART_ na określająca po ilu wystąpie-
moduł obsługi portu ROZM_BUF_IN wyznaczają rozmia- niach w ciągu odbieranych danych
szeregowego ry buforów UART a, odpowiednio: ustalonego bajtu należy zakończyć
Można zaryzykować twierdzenie, nadawczego i odbiorczego. odbieranie danych,
że najpopularniejszym (jak dotąd) in- W jaki sposób określamy wielko-  u16 u16timeout  szesnastobi-
terfejsem wykorzystywanym do obsłu- ści buforów i od czego one zależą? towa zmienna określająca maksy-
gi przewodowej komunikacji szerego- Prościej jest udzielić jednoznacznej malny czas w milisekundach, przez
wej jest doskonale znany wszystkim odpowiedzi na drugą część pytania, jaki funkcja będzie oczekiwać na
Czytelnikom uniwersalny asynchro- ponieważ ograniczeniem systemowym odebranie żądanego ciągu.
niczny odbiornik nadajnik (UART). jest wielkość bufora nie przekraczają- Na pierwszy rzut oka funkcja
Umożliwia on prowadzenie komu- ca 255 bajtów. Istnieje jednak jeszcze przedstawiona powyżej może wyda-
nikacji z wykorzystaniem popular- ograniczenie związane z rozmiarem wać się zbyt skomplikowana i zagma-
nych standardów RS232, RS485 lub pamięci RAM dostępnej w mikro- twana, ale jak zaraz pokażemy na
RS422. Właściwie każdy mikrokontro- kontrolerze. Z pewnością pozbawio- przykładzie, jest bardzo elastyczna
ler jest obecnie wyposażany w inter- ne sensu jest (poza wyjątkowymi i użyteczna. Załóżmy, że chcemy ode-
fejs UART, dlatego też jego obsługa sytuacjami) zadeklarowanie buforów brać z portu dwie dane, po których
przez system jest niezbędna. nadawczego i odbiorczego o rozmia- występuje znak nowej linii (naciśnię-
Konfiguracji obsługi portu szerego- rze 250 bajtów każdy, mając do dys- cie na klawiaturze powodu-
wego w systemie KaRTOS dokonuje- pozycji kontroler ATmega8 (posiada je wysłanie dwóch znaków   powrót
my ustawiając odpowiednie wartości 1 kB pamięci RAM). Niemal połowa karetki ( \r ) i  nowa linia ( \n )). Ciąg
zmiennych kompilatora zawartych dostępnej pamięci RAM zostałaby na który oczekujemy ma więc postać
w pliku KaRTOSUart.h, który znaj- w tym przypadku wykorzystana przez np.:  123 \r 4567 \r  . A tak będzie wy-
duje się w katalogu \KaRTOS\ATMe- moduł obsługi portu szeregowego. glądało wywołanie wyżej przedstawio-
ga8\. Interesującą nas aktualnie część W jaki sposób zatem optymalnie wy- nej funkcji, która zrealizuje postawio-
wspomnianego pliku przedstawio- brać rozmiar bufora? Aby odpowie- ne zadanie:
no na list. 6. Przystąpimy teraz do dzieć na to pytanie należałoby po- KaRTOSUartGet( \r ,2,1000)
omówienia znaczenia poszczególnych znać sposób działania modułu KaR- czyli odbierz ciąg znaków, aż do
parametrów. Wartości zmiennych: TOS_UART w przypadku odbierania wystąpienia drugiego znaku  \r ,
i wysyłania danych. lecz oczekuj nie dłużej niż 1 sekun-
dę (1000 ms). Funkcja w odpowiedzi
Odbieranie danych z portu zwraca liczbę odebranych znaków
szeregowego w systemie (w naszym przykładzie 9). Prześledz-
KaRTOS
Wywołanie funkcji pozwalają-
Autor zachęca Czytelników do kształtowania
cej odebrać ciąg bajtów z portu treści kolejnych odcinków cyklu. Napisz w mailu
czy bardziej interesuje Cię teoria działania czy
szeregowego ma postać: KaRTO-
raczej wolisz aby prezentowane były przykła-
SUartGet(u08 u08EndBajt,
dowe aplikacje i projekty dla systemu KaRTOS.
Rys. 12. Algorytm działania funkcji KaRTO- u08 u08IleBajtowEnd, u16
Inne uwagi również mile widziane.
SUartGet
Elektronika Praktyczna 7/2008
101
P R O G R A M Y
my teraz co dzieje się po wywołaniu
List. 7. Ciąg instrukcji odbierających dane zakończone znakiem  #
powyższej funkcji (algorytm przedsta- KaRTOSUartInit(12,0); // 38,4 kbps dla zegara 8,00 MHz
for(;;) // pozostań w nieskończonej pętli
wiono na rys. 12):
{
1. Przeglądany jest cały bufor odbior- KaRTOSUartOpen(); // otwórz port
KaRTOSUartStartRec(); // uruchom odbiornik
czy. Jeśli znajduje się w nim żą-
i = KaRTOSUartGet( # ,1,1000); // odbierz dane
KaRTOSUartClose(); // zamknij port
dana liczba (u08IleBajtowEnd)
};
znaków końca ciągu (u08End-
Bajt), funkcja zakończy swoje
działanie zwracając liczbę odebra- Następnie w nie-
nych bajtów. skończonej pętli do-
2. Sprawdzany jest czas, który upły- konujemy: otwarcia
nął już w oczekiwaniu na dane. portu (funkcja KaR-
Jeśli przekroczył on zadaną war- TOSUartOpen), uru-
tość (u16 u16timeout), funkcja chomienia odbiorni-
kończy działanie zwracając wartość ka funkcją KaRTO-
0  nie odebrano żądanego ciągu SUartStartRec i ocze-
znaków. kujemy na nadejście
3. Funkcja oddaje procesor innemu danych przez 1
zadaniu na określony w milise- sekundę. Zamykamy
kundach zmienną UART_OKRES_ port, a w zmiennej
ODBIERANIA_MS czas, po czym i znajduje się liczba
rozpoczyna działanie określone bajtów odebranych Rys. 13. Algorytm wysyłania danych poprzez port szere-
w punkcie 1. z portu. gowy w systemie KaRTOS
Po przedstawieniu i przeanalizo-
waniu powyższego przykładu może- Wysyłanie danych do portu 4. Sprawdzenie czy pozostały jeszcze
my teraz określić, jaki powinien być szeregowego w systemie dane do wysłania nie przepisane
minimalny rozmiar bufora odbiorcze- KaRTOS do bufora nadawczego. Jeśli nie,
go z punku widzenia naszej aplikacji. Sposób wysyłania danych przez to funkcja kończy swoje działanie.
Zwróćmy uwagę, że gdyby był on port szeregowy pobieżnie przedsta- Jeśli natomiast w buforze buf po-
mniejszy niż 9 bajtów, to nigdy nie wiono w poprzedniej części artykułu. zostały jeszcze dane, które należy
odebralibyśmy powyżej przedstawione- Teraz skupimy się na przeanalizowa- wysłać, wracamy do punktu 1.
go ciągu znaków. Wniosek: wielkość niu algorytmu wysyłającego dane. Analizując przedstawiony powy-
bufora odbiorczego nie może być Działanie funkcji wysyłającej żej algorytm można zauważyć relacje
mniejsza od wielkości maksymalnego dane prześledzmy na przykładzie. panujące pomiędzy rozmiarem bufo-
ciągu danych, jaki chcemy jednorazo- Załóżmy, że w buforze buf[30] ra nadawczego określonego zmienną
wo odebrać. Pozostało jeszcze pochy- znajduje się 25 bajtów danych, któ- kompilatora UART_ROZM_BUF_OUT
lić się nad wspomnianym powyżej re chcemy wysłać przez port sze- a ilością danych przeznaczonych do
parametrem UART_OKRES_ODBIERA- regowy. Wywołujemy zatem funkcję wysłania. Możliwe są dwie sytuacje:
NIA_MS. Określa on, jak często nastę- KaRTOSUartSend(buf,25,SEND_RAM),  liczba bajtów do wysłania jest
puje przeglądanie bufora odbiorczego która wyśle nasze 25 bajtów z bufo- mniejsza lub równa rozmiarowi
w poszukiwaniu znaków kończących ra znajdującego się w pamięci RAM systemowego bufora nadawczego.
odbieranie danych. Oczywiście im zgodnie z algorytmem przedstawio- W tej sytuacji po skopiowaniu da-
częściej przeglądamy bufor, tym szyb- nym na rys. 13: nych do wysłania ze wskazanego
ciej zauważymy nadejście oczekiwa- 1. Sprawdzenie czy zakończyła się bufora do bufora nadawczego i ini-
nych danych, lecz również mocniej poprzednia transmisja danych cjacji procesu wysyłania funkcja
obciążamy procesor. Ustalenie odpo- (wszystkie dane z bufora nadaw- kończy swoje działanie,
wiedniej wartości jest więc kompro- czego zostały wysłane). Jeśli  liczba bajtów do wysłania jest
misem pomiędzy szybkością reakcji nie, następuje okres oczekiwania większa niż rozmiar systemowe-
po odebraniu oczekiwanych danych, o długości zadeklarowanej zmien- go bufora nadawczego. W tym
a mocą obliczeniową, którą możemy ną kompilatora UART_OKRES_WY- przypadku dane przeznaczone do
poświęcić bez zaburzenia pracy po- SYLANIA_MS, wysłania nie zmieszczą się w bu-
zostałych zadań. Oczywistym jest, że 2. Do bufora nadawczego ładowane forze nadawczym. Funkcja wysyła-
przeglądanie bufora co 1 milisekundę są kolejne bajty ze wskazanego jąca skopiuje zatem ich część (do
nie ma sensu jeśli dane przesyłane podczas wywołania funkcji bufo- zapełnienia bufora nadawczego)
są z prędkością poniżej 9600 b/s, gdyż ra (w naszym przykładzie buf), i zainicjuje wysyłanie. Następnie co
w tym przypadku przesłanie jednego aż do momentu wypełnienia go jakiś czas (określony w zmiennej
bajtu wraz z bitem startu i stopu trwa w całości lub załadowania wszyst- kompilatora UART_OKRES_WYSY-
ponad 1 milisekundę. kich danych przeznaczonych do LANIA_MS) będzie sprawdzać czy
Na list. 7 przedstawiono ciąg in- wysłania, skopiowane uprzednio dane zosta-
strukcji umożliwiających odbieranie 3. Inicjacja procesu wysyłania da- ły już wysłane. Jeśli tak, nastąpi
z portu szeregowego ciągu danych nych z bufora nadawczego do ładowanie i wysyłanie następnej
zakończonych znakiem  # . Najpierw portu USART mikrokontrolera. partii danych. Proces ten zakoń-
następuje inicjalizacja portu i konfigu- Wysyłanie to realizowane jest za czy się po skopiowaniu ostatniej
racja do pracy z prędkością 38,4 kb/s. pomocą przerwań, ich części do bufora nadawczego.
Elektronika Praktyczna 7/2008
102
P R O G R A M Y
Wtedy po zainicjowaniu wysyłania
List. 8. Ciąg instrukcji wysyłających dane poprzez port szeregowy
funkcja zakończy swoje działanie. u08 i;
KaRTOSUartInit(12,0); // 38400 bps dla 8,0 MHz
Z przedstawionych powyżej infor-
for(;;)
macji na temat sposobu obsługi wy- {
KaRTOSUartOpen(); // otwórz port
syłania danych realizowanym w sys-
KaRTOS_UART_PRINT( \r\n Zmienna i =  ); // wypisz
KaRTOSUartSendByteBCD(i); // wyślij wartość i
temie KaRTOS łatwo można podjąć
KaRTOSUartClose(); // zamknij port
decyzję o tym jakie wartości przypi-
i++; // inkrementuj wartosc i
TimeSleepms(2000); // zaczekaj 2 sekundy
sać zmiennym: UART_ROZM_BUF_OUT
};
i UART_OKRES_WYSYLANIA_MS. Propo-
nujemy zastosowanie następu-
jących kryteriów: rozmiar bu-
fora nadawczego (UART_ROZM_
BUF_OUT) niech będzie równy
rozmiarowi średniej wielkości
ciągu danych, które zamierza-
my wysyłać. Jeśli najdłuższym
ciągiem w naszej aplikacji jest
przykładowo  Witamy w pro-
gramie demonstracyjnym (roz-
miar: 34 bajty), a najkrótszym
 Podaj liczbę (rozmiar: 12
bajtów), rozmiar bufora wyzna-
czamy na: (34+12)/2=23 baj-
ty. W większości jednak apli-
kacji projektowanych na małe
mikrokontrolery ograniczeniem
wielkości bufora nadawczego
jest niewielki rozmiar dostęp-
nej pamięci RAM. Nadmienić
należy, że jedyną konsekwen-
cją zmniejszenia rozmiaru bu- Rys. 15. Schemat ideowy układu na którym uruchomiono aplikację KaRTOS CLOCK
fora nadawczego jest wydłu-
żenie czasu potrzebnego na wysłanie stępnie co dwie sekundy wysyłamy na rys. 15. Na list. 9 przedstawio-
danych o rozmiarze przekraczającym w formacie BCD wartość zmiennej no główną pętlę aplikacji pobiera-
rozmiar tego bufora. Zmienna UART_ i inkrementowanej w każdym obie- jącej czas systemowy i wysyłającej
OKRES_WYSYLANIA_MS powinna mieć gu pętli. Wynik działania powyższej go do portu szeregowego. Funkcja
wartość nie mniejszą niż iloczyn mini aplikacji przedstawia zrzut ekra- TimeGetSystime jest częścią modułu
czasu potrzebnego na wysłanie jed- nowy na rys. 14. KaRTOSTime i pozwala pobrać czas
nego bajtu i rozmiaru bufora nadaw- systemowy oraz datę (sam czas lub
czego. Dla przykładu wysyłamy dane Systemowe funkcje KaRTOS-a samą datę) i zapisać go we wskaza-
ośmiobitowe z jednym bitem startu do obsługi portu szeregowego nym buforze. Wywołanie funkcji ma
i jednym bitem stopu (w sumie 10 Aby móc efektywnie wykorzy- postać:
bitów) z prędkością 38400 b/s. Skoro stać moduł obsługi portu szeregowe- TimeGetSystime(u08 *ptr,
w sekundzie w powyższych warun- go, niezbędne jest poznanie funkcji u08 opcja), gdzie:
kach możemy wysłać maksymalnie umożliwiających odbieranie i wysyła-  u08 *ptr  jest wskaznikiem
3840 bajtów (38400 b/s/10b), zatem nie danych w różnorodnym formacie do bufora, w którym zastanie za-
czas potrzebny na wysłanie jednego i na różne sposoby. Wszystkie funkcje pisana data i/lub czas systemowy,
jest równy 1/3840 sekundy=0,27 ms. dostępne w wersji 3.01 systemu wraz  u08 opcja  jeśli ma wartość
Jeśli rozmiar bufora nadawczego z opisem ich działania i przyjmowany- równą 0, do bufora zostanie po-
ustaliliśmy przykładowo na 10 baj- mi zmiennymi zebrano w tab. 3. brana tylko data (3 bajty) w for-
tów to UART_OKRES_WYSYLANIA_MS macie dzień/miesiąc/rok; jeśli ma
nie powinien być mniejszy niż 3 ms Aplikacja demonstracyjna wartość 1, do bufora trafi data
(10x0,27 ms = 2,7 ms).  KaRTOS_CLOCK i czas (8 bajtów) w formacie go-
Na list. 8 przedstawiono kod Napiszemy teraz aplikację zega- dzina/minuta/sekunda/milisekunda
wysyłający dane przez port szerego- ra kalendarza, który będzie wyświe- starszy bajt/milisekunda młodszy
wy. Najpierw inicjalizujemy kontro- tlał w oknie terminala aktualną datę bajt/dzień/miesiąc/rok; jeśli nato-
ler USART znaną już funkcją, a na- i godzinę z dokładnością jednej mi- miast ma inną wartość, pobrany
lisekundy. Ustawianie zegara odby- zostanie tylko czas (5 bajtów)
wać się będzie przez wprowadzenie w formacie godzina/minuta/sekun-
z klawiatury aktualnej daty i czasu. da/milisekunda starszy bajt/milise-
Nasza aplikacja będzie działać na kunda młodszy bajt.
mikrokontrolerze, który był już przez W prezentowanej aplikacji wywo-
nas wykorzystywany  ATmega8(L). łujemy funkcję z parametrem  opcja
Rys. 14. Wynik działania kodu z list. 6 Schemat elektryczny zegara pokazano o wartości 1 pobierając datę i czas.
Elektronika Praktyczna 7/2008
103
P R O G R A M Y
Tab. 3. Funkcje obsługi UART dostępne w wersji 3.01 systemu
Lp. Nazwa funkcji Opis działania i parametrów
Ustawia porty mikrokontrolera wykorzystywane przez USART, inicjalizuje sterownik USART.
Void KaRTOSUartInit Funkcja przyjmuje:
1.
(u16 u16Baudrate,u08 u08doubleSpeed) u16Baudrate  wartość ładowana do rejestru UBRRL/UBRRH określająca prędkość transmisji danych,
u08doubleSpeed  jeśli równa 1 włącza, jeśli różna od 1 wyłącza podwojenie prędkości transmisji,
2. void KaRTOSUartOpen(void) Otwiera port szeregowy do transmisji danych (wysyłania/odbioru).
3. void KaRTOSUartClose(void) Zamyka port szeregowy po zakończeniu transmisji danych.
Wysyła ciąg danych z określonej lokalizacji w pamięci ROM lub RAM. Funkcja przyjmuje:
*pu08Bufor  wskaznik do bufora zawierającego dane do wysłania,
void KaRTOSUartSend
4. u08liczba  liczba danych w bajtach do wysłania ze wskazanego bufora,
(u08* pu08Bufor,u08 u08liczba,u08 opcja)
opcja  jeśli równa 0  dane wysyłane z pamięci programu (ROM), jeśli 1  z pamięci RAM (SEN)
SEND_PROG 0; SEND_RAM 1
void KaRTOSUartSendByteASCII Wysyła bajt przez port szeregowy. Funkcja przyjmuje:
5.
(u08 u08Bajt) u08Bajt  bajt do wysłania.
void KaRTOSUartSendByteBCD Wysyła bajt przez port szeregowy w formacie BCD. Funkcja przyjmuje:
6.
(u08 u08Bajt) u08Bajt  bajt do wysłania.
Wysyła liczbę szesnastobitową przez port szeregowy w formacie dziesiętnym.
u16Liczba  liczba do wysłania.
void KaRTOSUartSendDEC
7. u08poz  zmienna określająca minimalną liczbę pozycji wyświetlania. (np. jeśli równe 3, to: u16Licz-
(u16 u16Liczba,u08 u08poz)
ba = 4  > wysłane zostanie:  004 ; u16Liczba = 16  > wysłane zostanie:  016 ; u16Liczba =
125  > wysłane zostanie:  125 ; u16Liczba = 1895  > wysłane zostanie:  1895
Rozpoczyna nasłuchiwanie portu szeregowego. Dane pojawiające się na magistrali przed wywołaniem
8. void KaRTOSUartStartRec(void)
tej funkcji nie zostaną zapisane w systemowym buforze odbiorczym.
Odbiera z portu żądany ciąg bajtów. Funkcja zwraca liczbę odebranych bajtów pomniejszoną o jeden.
Funkcja przyjmuje:
u08 KaRTOSUartGet
u08EndBajt  wartość bajtu będącego flagą końca transmisji,
9. (u08 u08EndBajt, u08 u08IleBajtowEnd, u16
u08IleBajtowEnd  liczba wystąpień flag końca transmisji powodujących zakończenie odbierania
u16timeout)
danych,
u16timeout  maksymalny czas oczekiwania na nadejście żądanych danych (w milisekundach).
Odbiera z portu jeden bajt. Funkcja zwraca kod ASCII odebranego znaku lub zero jeśli upłynął
10. u08 KaRTOSUartGetChar(u16 u16timeout) timeout. Funkcja przyjmuje:
u16timeout  maksymalny czas oczekiwania na nadejście bajtu (w milisekundach).
Warto tutaj zwrócić uwagę, iż bufor, go do komputera PC. Po zamknięciu list. 10. Pobrane z portu szeregowe-
do którego zostaną zapisane pobiera- portu realizujemy oczekiwanie o tak go dwanaście znaków interpretowane
ne przez funkcję dane nie może być dobranym czasie trwania, aby prze- są kolejno jako godzina (0& 23), mi-
mniejszy niż 8 bajtów. W przeciwnym bieg całej pętli zajmował dokładnie nuta (0& 59), sekunda (0& 59), dzień
wypadku nastąpi nadpisanie przypad- 1 sekundę, co skutkuje regularnym (1& 31), miesiąc (1& 12) i rok (0& 99).
kowych obszarów pamięci. Popełnio- odświeżaniem informacji na ekranie Na rozpoczęcie wprowadzania powyż-
ne błędy tego typu są jednymi z naj- terminala. Zrzut ekranowy obrazujący szych danych mamy 20 sekund, a po
trudniejszych do wykrycia. W dalszej działanie aplikacji KaRTOS CLOCK upływie tego czasu funkcja zwróci
części programu używamy dobrze już przedstawiono na rys. 16. Pozostało wartość 0xFE i zegar wystartuje z do-
znanych funkcji wysyłając w zgrab- jeszcze zaimplementowanie funkcji, myślnymi ustawieniami, tj. o północy
nej wizualnie formie dane z bufora która pozwoli ustawić czas naszego pierwszego stycznia 2000 roku (zrzut
do portu szeregowego podłączone- zegara. Funkcję tę przedstawiono na z rys. 17). Jeśli podczas wprowadzania
danych popełnimy błąd (którakolwiek
z wprowadzonych danych przekroczy
List. 9. Główna pętla aplikacji KaRTOS CLOCK
dopuszczalny zakres), funkcja zwróci
for(;;)
{
pozycję w buforze na której wystąpił
TimeGetSystime(u08Bufor,1); // pobierz czas systemowy
// prezentacja czasu i daty na terminalu błąd (zrzut z rys. 18  dzień miesią-
KaRTOSUartOpen();
KaRTOS_UART_PRINT( \r );
KaRTOS_UART_PRINT( data:  );
KaRTOSUartSendDEC((u16)(u08Bufor[5]),2);
KaRTOS_UART_PRINT( . );
KaRTOSUartSendDEC((u16)(u08Bufor[6]),2);
KaRTOS_UART_PRINT( . );
KaRTOSUartSendDEC((u16)(u08Bufor[7]),2);
KaRTOS_UART_PRINT( czas:  );
KaRTOSUartSendDEC((u16)(u08Bufor[0]),2);
KaRTOS_UART_PRINT( : );
KaRTOSUartSendDEC((u16)(u08Bufor[1]),2);
KaRTOS_UART_PRINT( : ); Rys. 16. Uruchomiony KaRTOS CLOCK
KaRTOSUartSendDEC((u16)(u08Bufor[2]),2);
KaRTOS_UART_PRINT( : );
temp = (u16)(u08Bufor[3]);
temp >>=8;
temp += (u16)(u08Bufor[4]);
KaRTOSUartSendDEC(temp,3);
KaRTOSUartClose();
TimeSleepms(970);
};
Rys. 17. Timeout wprowadzania czasu
Elektronika Praktyczna 7/2008
104
P R O G R A M Y
ca ma wartość 52). Jeśli wprowadza- Implementacja kodu zadań
nie danych przebiegnie pomyślnie, Została już zaprezentowana powyżej.
funkcja zwróci wartość 0xFF, a ze-
gar systemowy zostanie ustawiony Kompilacja
za pomocą kolejnej funkcji z modu- Przebiega standardowo. Po uru-
łu KaRTOSTime o nazwie TimeSetSy- Rys. 18. Błędnie wprowadzony czas chomieniu konsoli systemu Windows
stime. Przyjmuje ona jako argument (Menu Start >Programy >Akcesoria
sześć bajtów oznaczających kolejno Konfiguracja pinów >Wiersz Poleceń), przejściu do kata-
rok, miesiąc, dzień, godzinę, minutę mikrokontrolera logu projektu (polecenie cd) i wyda-
i sekundę. Siódmy z argumentów jest Jedyne piny kontrolera jakie wy- niu polecenia make etap kompilacji
szesnastobitowy i może mieć wartość korzystuje aplikacja KaRTOS CLOCK, mamy za sobą.
w zakresie 0& 999 a określa milisekun- to te używane do transmisji szere-
dę. Po ustawieniu czasu zobaczymy gowej. Są one jednak odpowiednio Programowanie
działającą aplikację (rys. 16). ustawiane przez funkcję systemową Za pomocą swojego ulubionego
inicjalizującą UART i nie ma potrze- programatora ładujemy plik wynikowy
Konfiguracja systemu do by edytowania pliku KaRTOS\ATMe- kompilacji do pamięci kontrolera oraz
uruchomienia aplikacji ga8\Initm8.c. Jeśli Czytelnik chciałby ustawiamy odpowiednio opcje zegara
KaRTOS CLOCK wykorzystać jedną lub obie diody taktującego. (rezonator zewnętrzny lub
Co jeszcze pozostało do wyjaśnie- podłączone do PORTU C (np. jako oscylator wewnętrzny o częstotliwości
nia, a właściwie przypomnienia? Oczy- wizualizacja upływającego czasu), na- 8,0 MHz).
wiście sposób skonfigurowania samego leżałoby ustawić odpowiednio wspo- Gotowy projekt jest zawarty w pli-
systemu, aby możliwe było urucho- mniany port. DDRC = 0x03 oraz ku archiwum KaRTOS CLOCK.zip.
mienie naszego najnowszego zegara. PORTC = 0x03  piny 0 i 1 portu Mariusz Żądło
Kolejne etapy przedstawione są po- są wyjściami w stanie wysokim. iram@poczta.onet.pl
niżej w porządku przyjętym podczas
prezentacji poprzednio uruchamianej
aplikacji zaprezentowanej w poprzed- List. 3.5. Funkcja ustawiająca zegar
u08 PobierzCzas(void)
niej części cyklu.
{
u08 i, j, wsk;
Konfiguracja zadań
KaRTOSUartOpen();
Ponieważ aplikacja zegara składa KaRTOS_UART_PRINT( \rPodaj Czas [gg,mm,ss,dd,mm,rr] <  );
się z jednego zadania, w pliku main.c
for(wsk=0; wsk<12; wsk++)
{
należy uruchomić systemowy proces
KaRTOSUartStartRec();
bezczynności oraz Task_1:
i = KaRTOSUartGetChar(20000); //-timeout 20sek
if(i != 0)
KaRTOSTaskInit(&KaRTOSIdleTa-
{
sk,1,255,50);
u08Bufor[wsk] = i;
KaRTOSTaskInit(&(Task_1),TASK_1_PI-
KaRTOSUartSendByteASCII(i);
D,TASK_1_PRIORITY,TASK_1_STACK);
}else
Konfiguracji zadania Taski_1 doko- {
KaRTOS_UART_PRINT( brak danych > );
nujemy w pliku main.h, na przykład
KaRTOSUartClose();
w taki sposób: return(0xFE);
}
#define TASK_1_PID 10
}
#define TASK_1_STACK 150
#define TASK_1_PRIORITY 10
KaRTOS_UART_PRINT( > );
KaRTOSUartClose();
Konfiguracja systemu
i =0;
Dokonujemy jej edytując plik KaR- j = KaRTOSStringASCII2DEC(u08Bufor[i],u08Bufor[i+1]); //-godziny
if(j > 24) return(i);
TOS.conf, który znajduje się w katalo-
u08Bufor[0] = j;
gu KaRTOS\ATMega8. Należy urucho- i +=2;
j = KaRTOSStringASCII2DEC(u08Bufor[i],u08Bufor[i+1]); //-minuty
mić następujące moduły systemu:
if(j > 59) return(i);
u08Bufor[1] = j;
 KaRTOS_RTC  moduł zegara
i +=2;
RTC odmierzającego czas,
j = KaRTOSStringASCII2DEC(u08Bufor[i],u08Bufor[i+1]); //-sekundy
if(j > 59) return(i);
 KaRTOS_EXT_TIME  rozszerzenie
u08Bufor[2] = j;
modułu zegara o datę,
i +=2;
j = KaRTOSStringASCII2DEC(u08Bufor[i],u08Bufor[i+1]); //-dzień
 KaRTOS_UART_ON  do komuni-
if(j > 31) return(i);
kacji,
if(j == 0) return(i);
u08Bufor[3] = j;
 KaRTOS_STRING  umożliwia
i +=2;
operowanie na ciągach danych, j = KaRTOSStringASCII2DEC(u08Bufor[i],u08Bufor[i+1]); //-miesiac
if(j > 12) return(i);
w nim zawarta jest np. funkcja:
if(j == 0) return(i);
u08Bufor[4] = j;
KaRTOSStringASCII2DEC.
i +=2;
Wartości pozostałych zmiennych
j = KaRTOSStringASCII2DEC(u08Bufor[i],u08Bufor[i+1]); //-rok
u08Bufor[5] = j;
jak w projekcie Hello_world_tu_KaR-
TOS:
TimeSetSystime(u08Bufor[5],u08Bufor[4],u08Bufor[3],u08Bufor[0],u08Bufor[
1],u08Bufor[2],0);
#define SYS_STACK 20
#define NO_TASKS_RAM_ADDR 619
return(0xFF);
#define KaRTOS_1MS_OCR_WART 125
}
Elektronika Praktyczna 7/2008
105


Wyszukiwarka

Podobne podstrony:
KARTOS 8–bitowe jądro czasu rzeczywistego, część 2
KARTOS 8–bitowe jądro czasu rzeczywistego, część 4
Systemy czasu rzeczywistego
tomasz szmuc programowanie systemow czasu rzeczywistego wyklad
RTLinux system czasu rzeczywistego
Systemy czasu rzeczywistego
MikroTik jako monitor ruchu czasu rzeczywistego
DS1307ZN zegar czasu rzeczywistego do zegarka do auta
systemy rozproszone i czasu rzeczywistego
Część II Wykorzystanie metod entomologicznych do oceny czasu zgonu – opis przypadków
Część I Wykorzystanie metod entomologicznych do oceny czasu zgonu – opis przypadków

więcej podobnych podstron