Image216

Image216



Programowanie

Koniec pierwszej tury

W ten oto sposób kończymy prostą obsługę wyświetlacza. Napisane przez nas funkcje me dają w tej chwili ogromnych możliwości, jednak działają. Zajmują przy tym stosunkowo niewiele zasobów. Stanowią także świetną bazę do dalszego rozwoju. Ważne jest, że za sobą mamy już część sprawiającą często największy problem sprawiliśmy, że wyświetlacz zaczął się „odzywać”.

Na koniec umieszczam obiecaną ramkę na lemat jednego ze sposobów tworzenia wstawek asemblerowych. Ramka ta zamyka w pewien sposób jedną całą część cyklu. Mam nadzieję, że do tej pory oswoiłem Cię ze składnią C, pewnymi specyficznymi elementami dotyczącymi GCC oraz programowania mikrokontrolerów w tym języku Jeśli to właśnie razem udało nam się osiągnąć - to znakomicie.

Jeśli zainteresowanie będzie wystarczająco duże, dalsze części kursu będą kontynuowane już na nowej płytce prototypowej, która da nam większe możliwości. Coraz większy nacisk kładziony będzie na konkretne algorytmy, obsługę ciekawych elementów, że wspomnę, dla zaostrzenia apetytu, o działającym już na moim stole wyświetlaczu kolorowym z NOKU 351 Oi.

Osoby, którym zależy przede wszystkim na informacjach o C jako takim, a nie na algorytmach, zainteresuje zapewne wiadomość, że informacji o tym języku zostało jeszcze bardzo dużo i nieznacznej zmianie ulegnie tylko sposób ich przedstawiania.

Wiem już dziś, że pierwsza część kursu została pozytywnie oceniona, chciałbym poznać Twoje zdanie na temat całości przedstawionego do tej pory materiału. To czy kurs będzie kontynuowany, jaką przyjmie dalej formę, zależeć może od Ciebie. Opinię, tak pozytywną jak i negatywną, uwagi o czym chciałbyś przeczytać, a co Cię nie zainteresowało, możesz przesłać na adres redakcyjny edw@edw\ com.pl. Na forum El portalu, w dziale „Uwagi na temat bieżącego numeru”, zostanie utworzony także odpowiedni temat.

Radosław koppel

radoslaw.koppel@edw>. com.p

ABC... C

Łańcuchy w pamięci programu

Pamiętasz może, jak w części 3 pisałem o wykorzystaniu pamięci programu? Zauważyliśmy wtedy, że niektóre ze stałych zajmują zarówno pamięć danych, jak i pamięć programu. Dokładnie ten sam problem dotyczy napisów. Przy korzystaniu z napisów tak jak miało to miejsce do tej pory zawsze przed jego użyciem w pamięci RAM musi zostać utworzona zmienna tymczasowa, do której, przed wykorzystaniem, skopiowane zostaną dane z pamięci ROM. Jak łatwo się domyślić, jest to rozwiązanie nieekonomiczne. Spróbujmy, tak jak robiliśmy to poprzednio, dosrać się bezpośrednio do pamięci programu

Od strony funkcji, która ma napis bezpośrednio z pamięci przyjąć, będziemy go odczytywać w podobny sposób, jak dostawaliśmy się do tablic przy pierwszym spotkaniu z pamięcią programu: wykorzystamy makro

ABC... C Inline asembler

Na samym początku zaznaczam, że sposób pisania wstawek asemblerowych każdy producent kompilatora rozwiązuje we własnym zakresie. Oznacza to, że sposób ich tworzenia w innym niż AVR-GCC kompilatorze będzie przebiegał w inny sposób.

Przedstawione tutaj informacje z konieczności nie wyczerpują tematu. Nie opisuję tutaj także asemblera jako takiego, a przedstawiam jedynie informację, jak korzystać z niego w naszym kompilatorze. Jeśli będziesz potrzebował więcej wiedzy na przedstawiony temat odsyłam Cię do dokumentacji Win.WR.

Ogólna składnia do stworzenia wstawki asemblerowej jest następująca: asm(“kod" rwyjście rwejście

[:tracone rejestry]); gdzie:

„kod” oznacza asemblerowy kod wstawki.

pgm_read_hyte Jedyną nowością będzie więc stworzenie stosownego napisu.

Makro PSTR

Tytułowe makro jest zdefiniowane w pliku <avr\pgmspace.h>. Tworzy ono napis w pamięci programu i zwraca wskaźnik do niego. Zapobiega umieszczeniu kopii napisu w pamięci programu. Jeśli mamy już stworzoną funkcję, która działa na napisie bezpośrednio z pamięci programu, jej wywołanie może przebiegać jak niżej: LCDstr_P(P3TR(“witaj!"));

Jeśli nasza funkcja zostanie już przystosowana do operowania na pamięci programu, pominięcie makra PSTR jest błędem.

„Zmienne” w pamięci programu

Uwaga: pamiętaj, że jeśli inicjujesz zmienną łańcuchową umieszczoną w pamięci programu, użycie makra PSTR jest błędem! Jedyny sens jego wykorzystania pokazany został na wcześniejszym przykładzie. Łańcuchy w pamięci

Piszemy go w formie łańcucha znaków. Tekst ten zostanie następnie przekazany do kompilatora asemblera.

wyjście - parametry wyjściowe To pojęcie może być trochę mylące. Oznacza ono. żc kompilator po wykonaniu programu skopiuje dane z wskazanych tutaj miejsc do wybranych zmiennych. Jeśli jednak chcemy we wstawce pisać przykładowo do portu - port ten nie będzie parametrem wyjściowym! Podany adres portu należy uznać za parametr wejściowy, wejście - lista parametrów wejściowych. Jeśli to konieczne, kompilator skopiuje przed wykonaniem programu odpowiednie dane do podanych miejsc.

tracone rejestry - część, która zwykle może być pominięta. Tutaj informujemy kompilator, jakie dodatkowe rejestry traci nasza wstawka.

Najlepiej będzie od razu wykorzystać przykład zaczerpnięty z dokumentacji:

char a;

asm("in    %0,    561"

:”l"( $fr to AnnR(poRTR)));

programu obsługujemy tak samo. jak obsługiwaliśmy tablice:

proq_char g_napispgm[] = “Łańcuch z FLASHa”; //globalna! (...)

LCDstr_P(g__napispgm);

Funkcje kończące się na _P

Zgodnie z tym, o czym wspominałem w- części 3, funkcje manipulujące łańcuchami mają swoje specjalne wersje zdeklarowane w' nagłówku <avr\pgmspace.h>. Znajdujące się tam funkcje mają przyrostek _P. Działają przy założeniu, że element źródłowy umieszczono w pamięci programu. Oczywiście dotyczy to tych funkcji, dla których ma to sens. przykładowo: strcpy_P kopiuje z pamięci programu do pamięci danych, strcmpP - porównuje napis z pamięci danych z napisem z pamięci programu. Nie istnieją jednak funkcje takie jak striwr P czy strrev_P.

Zadaniem tego prostego programu jest wczytanie danej z portu B oraz jej umieszczenie w zmiennej a. Na przykładzie tego programu widzimy składnię parametrów wejściowych oraz wyjściowych. Między znakami cudzysłowii umieszczamy informację, gdzie znajdzie się odpowiednia dana. W naszym przypadku „r” oznacza rejestr. Umieszczony przed nim modyfikator ’ oznacza, że do podanego parametru będziemy jedynie pisać - nic będziemy odczytywać z niego wartości. Modyfikatora tego używa się prawie zawsze dla parametrów wyjściowych. „I” oznacza stałą liczbę w zakresie 0-63. Następnie w nawiasie nadajemy parametrom odpowiednią wartość. Nasz zapis oznacza, żc wybrany rejestr ma być po zakończeniu wstawki skopiowany do zmiennej a - w praktyce, ponieważ zmienna a jest zmienną lokalną po prostu w wstawce zostanie wykorzystany ten sam rejestr, który przechowuje naszą zmienną. Naszej stałej nadajemy wartość adresu odpowiedniego portu w ;' =r" (a) przestrzeni IO Ponieważ PORTB jest tłumaczony na adres w przestrzeni adreso

Elektronika dla Wszystkich Październik2005 47


Wyszukiwarka

Podobne podstrony:
Image216 ProgramowanieKoniec pierwszej tury W ten oto sposób kończymy prostą obsługę wyświetlacza. N
cz5 8 ProgramowanieKoniec pierwszej tury W ten oto sposób kończymy prostą obsługę wyświetlacza. Napi
i humanitarnych warunków jej uprawiania. W ten oto sposób wszelkie tego typu wynalazki kulturowe, po
ROZDZIAŁ 1. PODSTAWY ?- ciezszy(pomarańcz,jabłko). Yes W ten oto sposób otrzymujemy twierdzącą
IMGP9480 W ten oto sposób prześledziliśmy najistotniejsze wątki kształtowania się antropologii jako
PICT5461 w ten sam sposób, jak w zajęciu pierwszym. Zasadnicze ćwiczenia ruchowo-słuchowe polegały n
82464 Image224 (3) Programowanie Unię tworzymy tyczny sposób jak strukturę. zamiast słowa kluczowego
6465yo7 Kiedv V masz przyjaciół, tworzysz paczkę, kV ten właśnie sposób spędziłem pierwsze miesi;]cc
OBLICZENIA Ta część programu została zaprojektowana w ten sposób, aby użytkownik mógł dokonywać

więcej podobnych podstron