cz3

cz3



Programowanie

Programowanie

COMPORT &= g_DaneCom[g_AktWysvrietlacz] ;


COMPORT &=

pgm_read_byte(&g_DaneCom[g_AktWyswietlacz]);


ABC... C

Dostęp do danych w pamięci programu w AVR-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 sposób jak do tej pory: nie spowoduje co prawda zgłoszenia błędu przez kompilator, jednak zachowanie programu 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 pa-które udostępnia nam plik <avr\pgmspace.h>. Mają one postać:

Pgm_read_bytc(atfrasj pgm_re ad_wo rd (iadres) pgm_rcad_dword("«</r(’.vJ

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

Wyprzedzająco warto zwrócić uwagę, że makra tc umożliwiają dostęp tylko do obszaru 64kfl 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 z przyrostkiem _far — zaj mują 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” 16MB.

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

Funkcje z przyrostkiem _P

Warto wiedzieć, że praktycznie wszystkie funkcje standardowe, operujące na danych, mają swoje odpowiedniki z przyrostkiem _P. Przyrostek taki oznacza, że funkcja ta operuje na danych umieszczonych w pamięci programu. Niewiele jeszcze mówiłem o funkcjach samych w sobie, nic przejmuj się więc, jeśli len akapit wydaje się niejasny -lemat zostanie rozwinięty w niedalekiej przyszloś-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ą zmienej. 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_bvte(Sg_DaneCom[0]); pgir._read_byte ( g_DaneCora ) ;

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

Listing 14 Zmiany wprowadzone n-program w celu wyświetlania licznika



g_DareRySwietlocza [0] = pę;m_rsać_byr.e (Sg WzorCyf r [var»(3*4) ] ) ;

•gJJafteKyswietlacza [-1 = pgm_read_byt«<«g WzorCyfrf (var»(ż*a)) a .: J) ; gBsńeWyswiellacza[3] = pgn-_read_byto (Sg_WzorCyf r [ (vai»(i* 1) ) S:;xf ] ) ; g_DaneWyswietlacz« [•) = pgr7._resd_by(.e (SgJizorCyfr [varS0xt]) ;



zaraz za ostatnio zdeklarowaną zmienną (g_DaneCom). 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 wyglą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ę WyswietlHex. Umieść ją nad funkcją main -umożliwi nam to uniknięcie pisania jej deklaracji. Funkcja nic jest optymalna. Ale została napisana w taki sposób, aby nie wykorzystywać nic ponad to, co do tej pory zdołałem przedstawić.

Gdy funkcja ta jest już gotowa, zastanówmy 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\delay.h>. Dodaj więc jeszcze i ten plik do naszego programu za pomocą dyrektywy Uinclude.

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 nłe 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

/ / i t / / / / i i i uu mm / i i i i 1 i i

// /. u '■ ‘ ■

for(;;)

{

WyswietiKea    cmik) ;

cznik+ł ;

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ć walczyć z nim ambitnie aż do zniechęcenia.

Podsumowanie

W tym odcinku opowiedziałem Ci o tym, w jaki sposób korzystać z 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. Czy wiesz w jaki sposób zamiast funkcji _delay_loop_2 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:
cz2 Programowanie Listing 7 Poprawa programu (...) COMPORT = LEDPORT = (l«COMl) ; (1«LED_B
cz3 Programowanieymumuma]^W IMlD ©    c* Najczęściej stosowane, standardowe pliki
cz3 Programowanie wane (następuje to automatycznie przy 5MPTY INTERRUPT (A;azwa_pr zerwania) ;ABC..
cz3 Programowanie Programowanie ing Ii Obsługa w : ą_.ftkt.Myswiet.l -
cz3 Programowanie Rys. 22 Badanie liczby cykli obsługi przerwania że dokładnie co taki czas zmienna
cz3 Programowanie ABC... C Warunki Warunki są to pewne specyficzne wyrażenia, które mogą. przyjąć d
cz3 ProgramowanieZaczynamy tworzyć funkcje Może i Tobie, tak jak i ranie znudziło się przetwarzanie
cz3 Programowanie ■    : -• (Syjli! ■ ,! 1. :rS- II); Dołączenie nagłówków •
poudre et en matiśres grasses du lait) comportant des programmes d’aides dśtaillśs jusqu’ś la moindr
Image37 (5) Programowanie ■ Programowanie ■ sób jak do tej pory: COMPORT &=
skanuj0008 (483) —106 — ORGANIZACJA TURYSTYKI W POLSCE uczestniczenie w tworzeniu i realizacji proje

więcej podobnych podstron