Image37 (5)

Image37 (5)



Programowanie ■

Programowanie ■

sób jak do tej pory:

COMPORT &= q_DaneCom[g_Ak"Wyświetlacz);

nie spowoduje co prawda zgłoszenia błędu przez kompilator, ednak zachowanie programu


COMFOR? &=

pgn_rsad_bvte (Łg_DaneCorr [g_AktWyswiet LaczJ);


ABC... C

Dostęp do danych

w pamięci programu w AYR-GCC

W AVR-GCC nie ma możliwości wykorzystania „zmiennych” umieszczonych w pamięci programu w taki sam sposób, jakby była to zwykła zmienna. Gdy już umieściliśmy naszą tablicę g DaneCom w pamięci programu, odwołanie się do niej w spo-będzie nieokreślone. Zostanie wykonany dostęp do komórki pamięci RAM o adresie takim, jaki posiada nasza zmienna w obszarze ROM!

Makra pgm_read

Najprostszy dostęp do wartości zapisanych w pamięci programu umożliwiają niewielkie makra, które udostępnia nam plik <avr\pgmspace.h>. Mają one postać:

PKm_read_byterW'-e.vj pgnwen d_w o rd fadres) pgm_read_dwordó7r/resy

Pozwalają one na odczytanie z podanego adresu (kolejno) baitu, słowo oraz podwójnego słowa.

Wyprzedzająco warlo zwrócić uwagę, że makra te umożliwiają dostęp tylko do obszaru 64kB pamięci. Teraz nie ma to znaczenia, ale w przypadku potrzeby dostępu do danych umieszczonych powyżej 64kB w procesorze o większym rozmiarze pamięci (na przykład ATmegal28), konieczne jest wykorzystanie analogicznych makr. jednak 7 przyrostkiem _far - zajmują one więcej zasobów oraz działają wolniej, lecz umożliwiają dostęp do obszaru pamięci o teoretycznym rozmiarze do 4GB, jednak przy uwzględnieniu ich aktualnej implementacji, teoretycznie możliwa do obsłużenia pamięć to „tylko” 1ÓMB.

Jeśli wiesz cokolwiek o asemblerze AVR, proponuję Ci zajrzenie do pliku <a\r\pgmspace.h> i przyjrzenie się, jak wyglądają opisane makra.

Funkcje z przyrostkiem P

Warto wiedzieć, żc praktycznie wszystkie funkcje standardowe, operujące na danych, mają swoje odpowiedniki 7 przyrostkiem _P. Przyrostek taki oznacza, że funkcja ta operuje na danych umieszczonych w oamieci programu. Niewiele jeszcze mówiłem o funkcjach samych w sobie, nie przejmuj się więc. jeśli ten akapit wydaje się niejasny -

temat zostanie rozwinięty w niedalekiej przyszłości.

Operator adresu &

Przy opisie makr dostępu do pamięci beztrosko wspomniałem o tym. że konieczne jest podanie im adresu, pod jakim nasza zmienna się znajduje. Nie wdając się aktualnie w szczegóły, podam Ci jedynie kuchenny przepis .Jak uzyskać potrzebny nam adres jakiejkolwkiek zmiennej”. W tym celu wykorzystujemy operator &. Umieszczamy go przed nazwą zmenęj. Ostrożnie jednak z tablicami. Okazuje się, że z punktu widzenia kompilatora, wszędzie, gdzie użyjemy samej nazwy tablicy, będzie to adres jej pierwszego elementu! Jednak już wykorzystanie nawiasów kwadratowych powoduje dostęp do odpowiedniej wartości. Najlepiej jak zwykle wyjaśnia to przykład. Poniższe zapisy są równoważne: pgm_read_byte (fig_DaneCoir [0]) ; pgm_rcad_byte( g_DaneCom );

W naszym programie prawidłowy dostęp do pamięci programu będzie wyglądał następująco (porównaj z pierwszym przedstawionym w tej ramce listingiem):

Listing 14 Zntiuny wprowadzone w program w celu wyświetlania licznika (•• .)

tinclude <avr\delay.h>

(...)

uintl6_- g_Liczr.iic = 0;

// Funkcja wyświetla w koęz-e heksadecymalnyn podaną liczbę vold WyswietLHex (uintl6_i: var)

1

g_3aneWyswietlacza [ ] = pgm_read_byte (&c_WzorCyf r [var»( * )]); g_DaneWyswietlacz£[:] = pgm read byte(&c WzorCyfr[(var»( *-))&    ]);

gDaneWyswietlaczć[ 1 = pgm_read_byte(ScWzorCyfr[(var»( * ')) &    1);

g_Dan©Wyflwietlacza [ ] = pgm_read_byte (fię_WzorCyf r [vari    1 ) ;

>


int main(vold) f

miunmnnnuuinum

t.. .i

// koniec inici&cli

unnmn/unnnuJiuut

foir(; ;)

Kyswiet.lHex(y_LiczMik) ; _delay_loop_2( xrfr ): c_Licznik++;

)

return ; ł


zaraz za ostatnio zdeklarowaną zmienną (gJDaneCom). Wpisz tutaj kod przedstawiony na listingu 13. Jest to nic innego jak deklaracja nowej tablicy w pamięci programu. Na kolejnych jej pozycjach znajdują się wartości opisujące w'ygląd odpowiedniej cyfry.

Zajrzyj teraz na listing 14. Przedstawiłem te części kodu, które się zmieniły. Nie przepisuj całości od góry do dołu. Spróbujmy napisać to w takiej kolejności, w jakiej kod był tworzony Najpierw przepisz funkcję WyswictlHcx. Umieść ją nad funkcją main -umożliwi nam to uniknięcie pisania jej deklaracji Funkcja nie jest optymalna. Ale została napisana w laki sposób, aby nie wykorzystywać nic ponad to, co do tej pory zdołałem przedstawić.

Gdy funkcja ta jest już gotowa, zastanów my się, co dalej. Chcemy zliczać i wyświetlać wartość aktualnego zliczenia. Procesor oczywiście potrafi dodawać bardzo szybko, więc aby cokolwiek widzieć, będziemy musieli troszkę spowolnić jego działanie. W tym celu skorzystamy z funkcji zawartych w pliku <avr\aela\\h> Dodaj więc jeszcze i ten plik do naszego programu za pomocą dyrektywy Mnclude

Następnie stworzymy zmienną przechowującą aktualnie zliczoną wartość. Ja umieściłem ją zaraz za ostatnio dodaną tablicą, nadając jej nazwę g Licznik.

W funkcji main nic nic zmieniamy w części odpowiedzialnej za inicjację. Po jej zakończeniu usuwamy jednak część odpowiedzialną za wyświetlenie na wyświetlaczach stałych cyfr, a w pętli nieskończonej tworzymy prosty algorytm, jak na listingu 14. Uff... jeśli wszystko się udało - po przeprowadzeniu kompilacji i załadowaniu programu do procesora program zacznie działać zgodnie z naszym aktualnym życzeniem. W razie problemów pełne kody źródłowe możesz pobrać ze strony internetowej Elektroniki dla Wszystkich. Korzystaj z nich śmiało! Czasami lepiej spojrzeć na pełny kod i w ten sposób znaleźć problem, niż próbować wałczyć z nim ambitnie aż do zniechęcenia.

Podsumowanie

W tym odcinku opowiedziałem Ci o tym, w jaki sposób korzystać 7 przerwań, jak umieścić zmienną w pamięci programu i jak się do niej dostać. Poznałeś praktyczne wykorzystanie operatora adresowego &. Opowiedziałem Ci o instrukcji if oraz o specyficznych wyrażeniach, którymi są warunki. Wreszcie zaczęliśmy zajmować się samodzielnym tworzeniem funkcji.

W międzyczasie nasz program został rozwinięty i na końcu stał się czymś w rodzaju szesnastkowego licznika czasu. Pisany program jest coraz ciekawszy, ale oczywiście można napisać go lepiej i bardziej wydajnie. C2y wiesz w jaki sposób zamiast funkcji delayjoop l wykorzystać do generowania opóźnienia nasze przerwanie wyświetlacza, czy wiesz jak poradzić sobie z dwoma przyciskami znajdującymi się na płytce? Razem zrobimy to już w następnym odcinku.

Elektronika dla Wszystkich Lipiec2005 47


Wyszukiwarka

Podobne podstrony:
Image153 ■ ProgramowanieABC... CZmienne lokalne Do tej pory wykorzystywaliśmy zmienne globalne. Jak
110 MICHAŁ TABISZ do odwołania. Było ono zarazem pierwszym i jak do tej pory ostatnim w dziejach bry
Autorami najpełniejszej wersji, jak do tej pory jedynie teoretycznej, koncepcji wartości zindywidual
•    Jeżeli jest kontynuacja, to zasady takie jak do tej pory, jeśli nie ma kontynuac
Jak wynika z monitorowania wdrożeń polityki, większość krajów członkowskich dokonała, jak do tej por
ze konkurencja jest niewielka i co za tym idzie, możliwość pozyskania klientów jest większa Jak do t
Jak do tej pory podatki bezpośrednie pozostawiono całkowicie w gestii krajów członkowskich. Jednakże
laureatem nagrody byt Stanley Matthews. Najwięcej złotych piłek jak do tej pory zgarnęli Michel Plat
A.    Edytować można każdy rok wprowadzony do tej pory do programu oraz wybierać z
Zrozumiec Assembler4 viiiUwaga dla ludzi, którzy nigdy do tej pory nie programowali Książka ta jest

więcej podobnych podstron