Język C dla mikrokontrolerów 8051. Podstawy obsługi pakietu RIDE-51.

Język C dla mikrokontrolerów 8051. Podstawy obsługi pakietu RIDE-51.

Pakiet RIDE firmy Raisonance to zbiór narzędzi umożliwiających pisanie i uruchamianie programów w języku C i asemblera dla mikrokontrolerów ST62 firmy STM, XA firmy Philips oraz różnych pochodzących z rodziny 8051. Ze względu na specyfikę artykułu, pominę zagadnienia dotyczące środowiska programowania ST62 i XA – zajmiemy się wyłączenia informacjami dotyczącymi mikrokontrolera 8051. Nie oznacza to jednak, że uwzględniając specyfikę pominiętych mikrokontrolerów nie można tu opisanych metod wykorzystać również i dla nich.

RIDE (Raisonance Integrated Development Environment) zawiera następujące programy przeznaczone dla mikrokontrolerów z rodziny 8051:
- kompilator języka asembler MA-51 (jest to makroasembler),
- kompilator języka C RC-51,
- linker LX-51,
- symulator mający możliwość podłączenia do sprzętowego emulatora,
- edytor przystosowany do składni języków asembler oraz C (wyróżniane są słowa kluczowe obu języków).
Wersję demonstracyjną pakietu można znaleźć w Internecie, na przykład na stronie producenta pod adresem http://www.raisonance.com/.

Instalacja i uruchomienie
Jeśli posiadasz oryginalną płytę od producenta, pakiet zainstaluje się prawie bez twojego udziału. Program instalacyjny znajdujący się na płycie CD uruchamia się automatycznie po umieszczeniu jej w napędzie. Jeśli natomiast pobrałeś wersję instalacyjną z Internetu, poprzez „Plik” i „Uruchom” możesz rozpocząć instalację.
Po zainstalowaniu pakiet gotowy jest do pracy – bez żadnych dodatkowych ustawień, czy też restartowania komputera. Ustawi rozdzielczość ekranu 800x600 lub większą – łatwiej będzie odczytać pewne informacje.  Po pierwszym uruchomieniu zobaczysz tylko menu główne pakietu. Wcześniej nie otwierałeś żadnych plików, więc ekran zawierał będzie wyłącznie otwarte okno programu i szare tło. Na rysunku 1 pokazano pasek menu głównego.

pasek menu głównego
Rys. 1. Menu główne po uruchomieniu programu

Menu główne
Omówmy poszczególne, najbardziej dla nas w tym momencie użyteczne pozycje menu. Nie jest moim celem pisanie instrukcji obsługi – tym niech zajmie się producent. Chcę podać tyle informacji ile jest konieczne aby zacząć pracę.
Do napisania pierwszego programu w języku C wystarczy wybrać „File” – „New”. Następnie wybierz „C Files” i edytor gotowy jest do pracy. Możesz zawsze tak postępować w przypadku prostych programów ale nie jest to metoda zbyt dobra. Dlaczego? Menu zawiera pozycję „Options”. Po jej wyborze ustawić można istotne dla programu źródłowego oraz urządzenia docelowego parametry. W przypadku, gdy nie jest aktywny żaden z projektów (opowiem o nich w dalszej części artykułu) ustawione parametry stają się domyślnymi dla wszystkich tworzonych programów i wszystkich urządzeń, w których mikrokontroler ma funkcjonować. Jest to na przykład typ mikrokontrolera i opcje jego rozszerzeń. Rzadko zdarza się, że są one identyczne dla różnych urządzeń ale jeśli dla przykładu wykorzystujesz tylko i wyłącznie jeden typ mikrokontrolera od określonego producenta oraz twój program nie zawiera modułów w języku asembler – możesz wybrać tę prostą metodę jako styl twojej pracy. Nie polecam tego jednak. Znacznie bardziej efektywne jest posługiwanie się zbiorami projektów.
Każdy tworzony projekt to rodzaj obiektu, dla którego indywidualnie możesz określić właściwości i składowe. Później otwarcie zapamiętanego projektu powoduje przywrócenie cech środowiska, dla którego napisana została dana aplikacja – parametry domyślne zostaną zastąpione właściwymi dla stosowanego przez Ciebie hardware.

nowy projekt

Rys. 2. Tworzenie nowego pliku projtektu

folder przechowywania

Rys. 3. Wpisanie nazwy i wybór folderu przechowywania


Aby utworzyć projekt, wybierz z menu pozycję „Project” – „New” (rysunek 2). Pojawi się okienko z pytaniem o miejsce, gdzie na dysku ma być zapamiętany twój projekt i jak ma się on nazywać (rysunek 3). Miejsce, które wskażesz zawierać będzie również zbiory wynikowe typu HEX czy BIN. Osobiście przechowuję wszystkie projekty w jednym katalogu. Ułatwia mi to ich archiwizację a selekcją zbiorów zajmuje się RIDE. System Windows oferuje nam możliwość tworzenia nazw opisowych, więc należy z nich korzystać. Nazywaj swoje zbiory w taki sposób, abyś mógł po jakimś czasie je rozpoznać. Tu jedna ważna uwaga – zbiór projektu nie może mieć takiej samej nazwy jak któryś z jego składników. To znaczy jeśli twój projekt nazywa się „Kontroler-LCD”, to żaden z modułów nie może mieć tej samej nazwy. Nie powinieneś tworzyć zbiorów „Kontroler-LCD.c” albo też „Kontroler-LCD.a51”. Wytłumaczenie jest bardzo proste. Kompilator nie przetwarza całego kodu źródłowego, lecz poszczególne jego moduły jeden po drugim. Na początku na przykład może być kompilowany ten napisany w języku C, potem w języku asemblera. Na podstawie zbiorów, nazwijmy je tak przejściowych, linker tworzy pojedynczy zbiór w formacie HEX (czy BIN) przeznaczony do zapisania w pamięci mikrokontrolera. I tu docieramy do sedna sprawy. Kompilator generując zbiory przejściowe używa tej samej nazwy, którą ma zbiór źródłowy zmieniając jedynie rozszerzenia. Czyli wynikiem kompilacji „Kontroler-LCD.a51” będzie „Kontroler-LCD.obj”, podobnie jak „Kontroler-LCD.c”... Łatwo jest więc wysnuć wniosek, że nowo tworzone zbiory będą zastępowały te starsze. Być może ta wada kompilatora RC-51 została usunięta w najnowszej wersji pakietu, jednak w tym momencie opisuję stan faktyczny. Aby było zabawniej linker w czasie pracy wyświetla mnóstwo komunikatów o zduplikowanych nazwach zmiennych, mimo iż teoretycznie wszystko jest w porządku! Żmudne poszukiwania do niczego nie doprowadzają, mimo iż rozwiązanie jest w zasięgu ręki...

Ustawianie opcji zbioru projektu
Po otwarciu okienka nowego projektu, wpisz jego nazwę i wybierz model mikrokontrolera. Ten wybór to bardziej wybór rodzaju kompilatora, aniżeli na przykład nazw rejestrów. Te zdefiniujesz później dołączając zbiory definicji oraz określając pewne własności sprzętu. Zakładam, że utworzyłeś już nowy projekt i że dotyczy on mikrokontrolera z rdzeniem podobnym do 80C51. Wybierz OK. Teraz ustaw opcje środowiska, dla którego pisany jest program. Wybierz „Option” – „Target” (rysunek 4).

wybór mikrokontrolera

Rys. 4. Wybór typu mikrokontrolera

Zaznacz „Harvard achitecture”, wybierz typ mikrokontrolera. Załóżmy, że do pierwszego projektu będziesz używał AT89S8252 – wybierz więc na liście 8052. Nie jest to dokładnie ten sam mikrokontroler, ale bardzo do niego podobny. Kliknij OK.
Teraz kolejna grupa opcji, znacznie bardziej rozbudowana ale nie martw się – typowo potrzebujesz ustawić tylko kilka z nich. Wybierz „Options” – „Project”. Raczej nie musisz nic zmieniać w „Environment” i „Directories”. Są tam nastawy dotyczące dołączanych zbiorów bibliotek oraz kolorów, czcionek i sposobów w jaki wyświetla komunikaty kompilator. Najbliższą „gałęzią” drzewa „Options” , którą powinieneś się zainteresować jest „RC51”. Zawiera ona wiele istotnych informacji dotyczących sposobu funkcjonowania kompilatora:
- jeśli nie używasz liczb zmiennopozycyjnych, zaznacz „No floating point”, w przeciwnym wypadku proponuję „IEEE standard” (rysunek 5),

typ arytmetyki

Rys. 5. Wybór typu liczb, a tym samym biblioteki dołączanej do programu.

- wybierz zakładkę „Memory Model” i zdecyduj, jakiego rodzaju modelu pamięci będzie używał mikrokontroler (typowo wystarczy ci „Small”: tego rodzaju nastawy używam dla AT89S8252, gdy planowany rozmiar programu nie wykracza poza 8kB pamięci FLASH), zaznacz opcje specjalne – dla AT89S8252 jest to „Dual DPTR ATMEL” (rysunek 6),

model pamięci

Rys. 6. Wybór modelu pamięci

- wskaż zakładkę „Optimizer” i zaznacz, czy kod wynikowy ma być optymalny pod względem rozmiaru („Size”), czy też szybkości wykonywania programu („Speed”); zazwyczaj zaznaczam „Speed”; nastawę „Optimizer level” możesz pominąć (rysunek 7),

metoda optymalizacji

Rys. 7. Wybór metody optymalizacji

- reszta parametrów właściwych RC51 nie jest aż tak ważna, przejdź teraz do grupy „LX51” i wybierz „Linker”, znajdziesz tu szereg bardzo istotnych nastaw; typowo większość programatorów korzysta ze zbiorów wynikowych w formacie Intel Hex, tak więc zostaw zaznaczoną opcję „Generate an Intel Hex file”, jeśli natomiast twój programator wymaga zbioru w formacie binarnym, zaznacz również „Generate a Binary file” (BIN); wpisz rozmiar pamięci „RAM size”, „Initialized RAM size” – dla AT89S8252 jest to 256 bajtów; na dole okienka masz jeszcze możliwość określenia od jakiego miejsca w pamięci FLASH czy RAM umieszczony zostanie kod wynikowy i zmienne – typowo nie potrzebujesz jednak zmieniać tych nastaw (rysunek 8),

parametry linkera

Rys. 8. Ustawianie parametrów linkera

Na tym możesz zakończyć ustawianie opcji projektu – wybierz OK. Jak zdążyłeś się zapewne zorientować, w poszczególnych zakładkach znajduje się jeszcze wiele innych użytecznych opcji, jednak do napisania pierwszej aplikacji w języku C dla AT89S8252 wystarczy to, co już poznałeś.

Dołączanie zbiorów źródłowych do projektu
Poprzednio utworzyłeś zbiór projektu. Jest on jednak pusty, oprócz właściwości nie zawiera żadnych składowych. Teraz postaram się nauczyć cię, jak do projektu dodać już istniejące oraz nowe zbiory źródłowe. Utworzenie nowego zbioru wymaga wybrania „File” – „New”. W zależności od rodzaju tworzonego zbioru wybierz jego typ. Załóżmy, że tym pierwszym tworzonym przez ciebie zbiorem będzie kod źródłowy programu w języku C. Wybierz więc „C Files” (rysunek 9).

tworzenie c-files

Rys. 9. Tworzenie plików źródłowych w C

Na ekranie pojawi się okienko edytora, w którym będziesz mógł wpisać program. Na wszelki wypadek zapamiętaj dopiero co utworzony zbiór, wybierając „File” – „Save as”. Pamiętaj, aby zapisywany na dysku zbiór źródłowy miał inną nazwę niż projekt. Zapisywane zbiory typu „C Files” mają domyślnie nadawane rozszerzenie „c”. Zapamiętując zbiór na dysku nie musisz podawać rozszerzenia – zostanie one dodane automatycznie. Inaczej jest ze zbiorami nagłówkowymi typu „h”. Tutaj po nazwie musisz dopisać rozszerzenie. Ja zapamiętałem swój zbiór projektu pod nazwą „programator-ISP” a moduł w języku C pod nazwą „programator-C-moduł”.
Utworzenie nowego zbioru i zapamiętanie na dysku nie powoduje dodania go do projektu! Aby dodać zbiór musisz posłużyć się „Project” – „Add node Source / Application” (skrót klawiszowy Alt + Insert). Nazwa dodanego w ten sposób zbioru powinna pojawić się na liście w okienku „Project” znajdującym się zazwyczaj na dole ekranu (rysunek 10). Podobnie postępuj z innymi zbiorami projektu. Ja dołączyłem jeszcze „programator-asm-modul.a51”. Dołączaj tylko zbiory źródłowe nie wymienione po dyrektywie #include  w tekście programu: te dołączą się automatycznie przy pierwszym użyciu.

dodawanie do projektu

na liscie

Rys. 10. Dodowanie zbiorów do projektu oraz efekt dodania zbioru programator-c-modul.c

Kompilowanie zbioru projektu

Aby skompilować tak utworzony projekt, zapamiętaj wszystkie jego zbiory wybierając „File” – „Save all”. Następnie z menu „Project” wybierz „Make all” lub posłuż się przyciskiem umieszczonym w menu (rysunek 11).

make all

skrót do make all

Rys. 11. Uruchomienie kompilacji - Make all

Jeśli napisałeś program poprawnie i kompilacja przebiegła bez błędów, na dysku powstaną zbiory wynikowe o nazwie identycznej z nazwą projektu i rozszerzeniem „HEX” („BIN”). W innych przypadkach na dole ekranu wyświetli się informacja o błędach.

Symulacja pracy programu
RIDE, jak wskazuje na to sama nazwa, to kompletne środowisko służące do tworzenia, testowania i uruchamiania programów. Ma możliwość współpracy z emulatorem sprzętowym ale w przypadku jego braku, potrafi również programowo symulować pracę mikrokontrolera. Aby uruchomić tryb symulacji programu z menu „Debug” wybierz „Start” (rysunek 12). Możesz również nacisnąć kombinację klawiszy Ctrl+D. Tryb ten zostanie uruchomiony pod warunkiem, że twój program jest napisany bezbłędnie.

symulator

Rys. 12. Uruchomienie trybu debugowania aplikacji

Pojawi się okno właściwości uruchamianego programu. Zaznacz „Virtual machine” (rysunek 13), chyba że dysponujesz sprzętowym emulatorem Raisonance. Wcześniej już wybrałeś typ mikrokontrolera, teraz tylko wpisz częstotliwość zegara, którego używasz. Będzie ona brana jako parametr do obliczeń czasów wykonywania rozkazów, funkcji i pętli.

virtual machine

Rys. 13. Wybór opcji symulacji programu - Virtual machine

Naciśnij OK. Pojawi się okienko (rysunek 14), w którym możesz wpisać wielkość pamięci programu i danych. Możesz również te wartości pozostawić bez zmian. Nie będą one miały większego wpływu na uruchamiany program.

wybór pamięci

Rys. 14. Wpisanie wielkości pamięci

Wybierz OK i po zamknięciu okienka „Application options” ponownie OK. Przejdziesz do trybu symulacji programu. Pojawi się nowe menu i szereg różnych opcji. Nie sposób w wąskich ramach artykułu opisać je wszystkie i sposobów w jaki działają. To suma twoich doświadczeń pomoże ci poprawnie przeprowadzać symulację. Ja spróbuję opisać poszczególne opcje menu tak, abyś mógł się nimi posługiwać. Bardzo pomocne są klawisze w górnej części ekranu. Gdy przez około dwie sekundy potrzymasz nad danym klawiszem z obrazkiem kursor myszy, pokaże się etykietka z opisem jego funkcji (rysunek 15).

pasek debuggera

Rys. 15. Pasek narzędzi debugera

- „Animated mode” : w tym trybie poszczególne linie programu wykonywane są automatycznie w pewnych odstępach czasu zależnych od położenia suwaka „Speed” znajdującego się przy zielonym napisie „GO”,
- „Display executed lines” : normalnie po wybraniu „Animated mode” i naciśnięciu „GO”, linie programu nie są wyświetlane, tylko na dole ekranu w linii statusu pojawia się informacja o czasie, który upłynął od uruchomienia programu; po wybraniu klawisza „Display executed lines” symulator wskazuje również, która linia programu jest aktualnie wykonywana,
- „Refresh” : służy do odświeżenia ekranu symulatora,
- „Reset” : wywołuje wykonanie funkcji Power On Reset,
- „Step into” : powoduje wykonanie pojedynczej instrukcji,
- „Step over” : powoduje pominięcie instrukcji; z mojej praktyki wynika jednak, że nie zawsze instrukcja ta działa tak, jak się tego po niej spodziewałem – być może jest to skutkiem jakiegoś błędu w programie symulatora,
- „Add watch” : powoduje otwarcie okienka podglądu zmiennych używanych w programie; aby wyświetlić wartość zmiennej należy ją wybrać z listy i nacisnąć OK; istnieje również inna metoda – w okienku źródła programu zaczernij nazwę zmiennej, którą chcesz wyświetlić – wybierz „Add watch”,
- okienko „Watch” umożliwia również modyfikację zmiennych; wskaż kursorem nazwę zmiennej i naciśnij prawy klawisz na myszy – będziesz miał do wyboru szereg różnych opcji; możesz zmienić wartość zmiennej (Evaluate), możesz również usunąć ją z okienka (Delete) lub dodać nową (Add),
-„Toggle breakpoint” : powoduje zaznaczenie w programie miejsca zatrzymania; wskaż przy pomocy kursora do jakiego momentu ma dojść program w trybie „Run” lub „Animated Mode” i wybierz tę opcję – pojawi się czerwona linia oznaczająca punkt zatrzymania programu (rysunek 16),

breakpoint

Rys. 16. Zaznaczenie pułapki programowej

- „Toggle trace” : ustaw kursor na linii programu, od której szczegółowo chcesz śledzić jego wykonywanie, wybierz przycisk „Toggle Trace” – pojawi się zielona linia znacznika; teraz uruchom program w trybie „Animated Mode” lub  „Run”; po wybraniu klawisza Stop lub osiągnięciu „Breakpoint” wyświetli się okienko zawierające szczegółowy zapis czynności wykonanych przez mikrokontroler w języku asembler wraz ze stanem licznika rozkazów (od „zielonej linii” znacznika, rysunek 17),

pozycja w src

Rys. 17. Pozycja w kodzie wraz oraz odpowiadające mu miejsce w programie w asemblerze

klawisz „GO” i suwak „Speed” służą do sterowania wykonywaniem programu w trybie „Animated Mode”; „GO” – uruchamia a suwak reguluje szybkość wykonywania programu,
- „Editor view code” : umożliwia podglądanie kodu programu w języku C przetłumaczonego na język asemblera, szara linia wskazuje aktualną pozycję kursora (rysunek 18),

pozycja w src

Rys. 18. Aktuana pozycja kursora

- „Symbols” : wyświetli okienko z globalnymi symbolami używanymi w programie; będzie można zobaczyć jak nazywa się zmienna czy stała (NAME), z jakiego modułu pochodzi (FILE), jakiego jest typu (TYPE), jaką ma wartość (VALUE), pod jakim adresem jest umieszczona (ADDRESS) oraz w której z pamięci (SPACE); pokazano to na rysunku 19,

symbole globalne

Rys. 19. Okno podglądu symboli globalnych

- „Watch” : otwiera okienko podglądu zmiennych – opisywałem je przy okazji polecenia „Add watch”.
Symulację programu przerywa wybranie „Debug” – „Stop”. Następuje wówczas powrót do normalnego trybu edycji.
Garść podanych tutaj informacji nie wyczerpie wszystkich aspektów pracy z RIDE. Jest to pakiet o dużych możliwościach, jednocześnie prosty w użyciu i przyjazny. Jak wcześniej wspomniałem, nic nie zastąpi doświadczeń zdobytych w czasie użytkowania. Instrukcję obsługi pakietu znaleźć można na stronie internetowej firmy Raisonance. Nosi nazwę „Getting started”. Niestety, mimo iż dostępna jest jej nowa wersja jest ona raczej skromna i uboga w przykłady. Znacznie bardziej użyteczne jest forum użytkowników dostępne w Internecie pod adresem http://www.raisonance.com/phorum/.

 

Jacek Bogusz
j.bogusz@easy-soft.net.pl

http://www.tomaszbogusz.blox.pl/

Odpowiedzi

Język C dla mikrokontrolerów 8051. Podstawy obsługi pakietu

I get pleasure from, result in I discovered exactly whast I used to be looking for.

You've ended my four day lengthy hunt! God Bless you
man. Have a great day. Bye

Język C dla mikrokontrolerów 8051. Podstawy obsługi pakietu

My family members always say that I am wasting my
time here at net, however I know I am getting familiarity daily by reading thes
pleasant posts.

Dodaj nowy komentarz

Zawartość pola nie będzie udostępniana publicznie.