|
|
mikrokontrolery.net |
|||||||||||||||||||||||
|
Kurs programowania w asemblerze - część 1 Wszystkie programy zostały napisane dla zestawu ewaluacyjnego EVBST7-01 firmy Propox. Środowiskiem programistycznym, w którym powstawały programy był ST Visual Develop, który mozna pobrac ze strony : http://mcu.st.com/contentid-44.html. Do programowania mikrokontrolera użyłem programatora ICPcable I, również produkowanego przez firmę Propox. Zastosowałem mikrokontroler ST7Flite05, ale nie powinno byc problemów z uruchomieniem programu na innych mikrokontrolerach serii ST7Flite0. Jedyną zmianą najprawdopodobniej będzie inna nazwa pliku dołączanego za pomocą dyrektywy #INCLUDE. Program pierwszy : Nasz pierwszy program będzię realizował bardzo proste zadanie zaświecenia odpowiedniej kombinacji diod LED znajdujących się na płytce zestawu EVBST7-01. Na początku należy wykonać odpowiednie połączenia. Złącza PA0-PA7 łaczymy kabelkami ze złączami LD0-LD7. Następnie podłączamy programator ICPcableI. Następnie uruchamiamy program ST Visual Develop i po stworzeniu nowego projektu wpisujemy następujący kod :
Pierwsza linijka kodu jest bardzo krótka :
Jest ona zarezerwowana do okreslenia pliku *.tab docelowego
procesora i nie może ona zawierać żadnych innych informacji. Druga linia
kodu zawiera dyrektywę .nolist, która wyłącza
umieszczanie instrukcji znajdujących się po tej dyrektywie w pliku listingu.
Najczęsciej stosowana jest do wyeliminowania umieszczenia w pliku listingu
zawartości dołączanych plików nagłówkowych. Trzeci wiersz kodu zawiera
dyrektywę dołączenia plku nagłówkowego właściwego dla wykorzystywanego
mikrokontrolera. W czwartym wierszu włączamy za pomocą dyrektywy .list
opcję umieszczania zawartości pliku w listingu. W piątym i szóstym wierszu
definiujemy adresy wykorzystywanych przez nas segmentów. Najważniejszy
z segmentów, to segment, w którym umieszczony jest kod programu - segment
pamieci programu. W mikrokontrolerach ST7FLite umieszczony jest pod adresem
FA00h przestrzeni adresowej mikrokontrolera. Kolejnym ,niezmiernie ważnym
segmentem jest segment wekorów przerwań. W segmencie tym należy umieszczać
adresy procedur obsługi poszczególnych prezrwań. I tutaj ciekawostka :
w mikrokontrolerach ST7 wektor obsługi przerwanie od sygnału zerowania
RESET (czyli faktyczny początek programu) jest umieszczony nie w pierwszym
słowie pamięci, jak to było np. w mikrokontrolerach AVR, lecz w ostatnim.
I właśnie ostatnie słowo pamięci powinno zawierać adres początku programu
głównego. Ósmy wiersz zawiera dyrektywę określającą początek segmentu
pamięci programu. Wszystkie instrukcje oraz dane umieszczone po tej dyrektywie
(oczywiście do momentu napotkania innego segmentu) bedą umieszczone w
segmencie kodu programu. Dziesiąty wiersz zawiera etykietę określającą
początek programu głównego. Właśnie ta etykieta określa adres początku
programu po wyzerowaniu mikrokontrolera.
W zasadzie cały program składa się z ciągu instrukcji LD (Load). Nie ma tutaj rozróżnienia, czy ładujemy stałą czy zawartość rejestru ani czy ładujemy do rejestru roboczego czy do rejestru We/Wy, jak to miało miejsce w mikrokontrolerach AVR. Jednak podobnie jak w AVR musimy przed użyciem skonfigurowac porty We/Wy. Do określenia kierunku transmisji (wejście/wyjście) służy rejestr PxDDR, gdzie x jest numerem portu. Wartość "0" wpisana do rejestru kierunku ustawia dane wyprowadzenie mikrokontrolera jako wejście, natomiast wartość "1" jako wyjście. Oprócz rejestru kierunku (DDR) jest jeszcze jeden rejestr - OR (Option Register) - chociaż nie zawsze jest on zaimplementowany. Zależy to od alternatywnych funkcji pełnionych przez dane wyprowadzenia. W naszym przypadku wpisanie do rejestru PAOR samych zer spowoduje skonfigurowanie wyjść jako wyjściaz otwartym drenem. Po skonfigurowaniu wyprowadzeń mikrokontrolera pozostaje już tylkoi wysłąć na port A odpwoeidnią kombinację zer i jedeynek w celu włączenia odpowiednich diod LED. Na koniec musimy zatrzymać program w miejscu, co zrealizujemy przez zastosowanie instrukcji JP (Jump) wykonującej skok do samej siebie - pętla nieskończona w miejscu. Po porgramie właściwym znajduje segment wektorów przerwań, w którym określamy tylko jeden wektor - RESET. Określenie wektora następuje przez zdefniowanie za pomocą dyrektywy DC.W (definiuj słowo w pamięci) jednego słowa w pamieci zawierającego adres początku programu głownego. Adres ten jest dostępny przez etykietę main. Program drugi : Na początku należy zmodyfikować połączenia na naszej płytce. Połaczenia PA0-PA3 z LD0-LD3 pozostawiamy bez zmian, natomiast rozłączamy PA4-PA7 z LD4-LD7. Następnie łaczymy PB0-PB3 z SW0-SW3. Program bedzie przepisywał stan portu B do portu A co objawi się zaświeceniem diody LED po nacisnieciu przycisku na klawiaturze.
Port A jest skonfigurowany jako wyjściowy, natomiast port B jako wejściowy. Konfiguracji portu B dokomnujemy w nastepujący sposób : do rejestru kierunku PBDDR wpisujemy same zera - ustawiamy w ten sposób port jako wejście, następnie włączamy wewnętrzne rezystory podciągające - przez wpisanie do rejestru PBOR samych jedynek. Ponieważ przyciski przy naciśnięciu zwierają wyprowadzenie mikrokontrolera do masy, to stanem aktywnym jest stan niski(0). Dzięki temu odczytaną wartość możemy bezpośrednio i bez żadnych konwersji wysłać od razu do wyświetlenia na diodach LED. Efektem działani programu będzie zapalenie diody LED o numerze odpowiadającym numerowi wciśniętego przycisku. Oczywiście można przycisnąć kilka przycisków jednocześnie.
|
Ostatnio na forum: |
||||||||||||||||||||||
|
|
||||||||||||||||||||||||
|
||||||||||||||||||||||||
|
(c) 2004-2008 Radosław Kwiecień |