32024 Image154

32024 Image154



Programowanie

ABC... C static, volatile

Oprócz tego, że zmienna może być na przykład typu int czy char. może być jednocześnie zmienną typu static lub voiatile (lub const). Określenie pierwsze odnosi się do tego, ile miejsca zmienna zajmuje w pamięci, jakie jest jej przeznaczenie - czy będzie to przechowywanie liczb, tablicy, łańcucha... Określenie drugie sprawia, że zmienna jest w pewien szczególny sposób traktowana. Aby wymusić to szczególne traktowanie, należy jedno z przedstawionych słów kluczowych umieścić na początku deklaracji zmiennej. Przykłady widać na listingu 15 w punktach O i O . Poniżej przedstawiam działanie poszczególnych typów.

static

Typ siatic może być łączony zc zmienną lokalną, globalną lub nawet funkcją. Dwa ostatnie przypadki mają nieco odmienne działanie od pierwszego. Aktualnie zajmiemy się jedynie zmiennymi lokalnymi.

Zmienne lokalne mają to do siebie, że ieh zawartość jesi bezpowrotnie tracona po zakończeniu działania funkcji Czasami chcemy jednak stworzyć zmienną, która musi zachować swoją wartość z poprzedniego wywołania. 7 różnych powodów niekiedy wygodnie jest, aby nic była to zmienna globalna - chcemy mieć pewność, ze żadna inna funkcja nie będzie miała do niej dostępu. W takim przypadku pomoże nam napisanie słowa kluczowego static przed nazwą zmiennej. Zmienna statyczna tworzy w pamięci kopię swojej wartości. Jest wczytywana zawsze na początku funkcji, a zapisywana z powrotem, gdy funkcja się kończy. Jeśli nadasz takiej zmiennej wartość początkową zostanie ona zainicjowana tylko raz przy starcie całego programu.

Typowy przykład zastosowania widać na listingu 15 w punkcie O .

volatlle

Konieczność zastosowania zmiennej typu vola-tile pojawia się wszędzie tam, gdzie dana zmienna może zmienić się w każdej chwili, na przykład za pomocą przerwania. Słowc yolatilc przed zmienną zakazuje kompilatorowi optymalizacji dostępu do niej. Zobacz na wykorzystanie zmiennej gbDełay na listingu 15 w punktach O, 0i0. (Jdy zostanie wpisana do mej jakaś wartość, w przerwaniu wyświetlacza będzie ona stopniowo zmniejszana dc zera. Gdyby była to zwyczajna zmienna, program zawiesiłby się w pętli czekającej na wyzerowanie jej wartości. Jest to związane z tym, że normalną zmienną kompilator pr2ed użyciem załaduje do rejestru (do którego dostęp jest dużo szybszy i wymaga mniejszej Ilości kodu). Tak więc nas za pętla while nie dostałaby się do zmiennej g_bDelay umieszczonej w pamięci, lecz do jej kopii umieszczonej w' rejestrze. Przerwanie zmniejsza natomiast zmienną umieszczoną w pamięci danych i nic ma nawet dostępu do wspomnianej kopii.

Listing 17 Funkcja obsługi przycisku.

VOid ObsloiPrzycisk(uint3_t maska, VOld(*prc«c)(void))

c

1fi(l(swpin & rnaska))

{

// usuwanie drgań styków g_bDclay * 6; //50ms while(ybDelay !» 0) {} if(l(SWPIN & maska))

{

procQ ;

g_bDelay - 120; //ls do {

i f(g_b Dela y**0)

{

g_bDelay = 6; //50ms proc();

ł

}while(l(SWPIN A maska));

}

>

}


temat sprawdzania stanu wyprowadzenia portu umieszczone są w ramce „ABC... C -odczyt portów”.

Pojawienie się stanu niskiego (logiczne 0) na odpowiedniej pozycji w rejestrze SWPIN (porównaj z definicją wyprowadzeń, na początku pliku) jest sygnałem, żc przycisk został naciśnięty. W punkcie O odbywa się odczekanie kilkudziesięciu milisekund oraz ponowne badanie portu. Jest to typowy sposób radzenia sobie z drganiami styków Jeśli drugi raz stwierdzono niski stan portu, wartość zmiennej licznikowej jest zwiększana, do zmiennej g_bDelay ładowana jest wartość odpowiadająca opóźnieniu rozpoczęcia automatycznego powtarzania naciśnięcia klawisza i rozpoczyna się pętla trwająca tak długo, aż klawisz zostanie puszczony. Zauważ, żc nic złego się nic stanic, jeśli między zwiększeniem zawartości zmiennej g_Licznik a rozpoczęciem wspomnianej pętli przycisk zostanie puszczony. Program wyjdzie z pętli przycisku, a nowa wartość zmiennej zostanie wyświetlona w pętli głównej.

Gdy zmiennagJbDelay dojdzie do wartości 0. wartość licznika ponownie jest zwiększana. Teraz jednak opóźnienie będzie znacz-

nic krótsze, co sprawi, że rozpocznie się szybka zmiana wartości.

Proponowane rozwiązanie działa prawidłowo, jednak w praktyce ma kilka wad. które za chwilę postaramy się wyeliminować.

Poprawa obsługi klawiatury

Sprawa, która jako pierwsza rzuca się w oczy. to fakt, że mamy bardzo podobne procedury, które praktycznie się powtarzają.

Można spróbować połączyć je w jedną funkcję.

Drugim nieefektywnym elementem jest ciągłe wywoływanie funkcji Wy-swietlDEC Co prawda procesor i tak nie ma z tym wiele pracy i użytkownik praktycznie tego nic zauważa, jednak nie zawsze możemy zagwarantować, żc wyświetlanie będzie tak prostą funkcją. Elegancko byłoby wywoły wać funkcję wyświetlania tylko

wtedy, gdy wartość zmiennej gJLicznik ulegnie zmianie.

Utworzymy funkcję obsługi przycisków podobną do BASCOM-owego DEBOUNCE. Podobną ponieważ nic aż tak uniwersalną, ale za to dającą możliwość automatycznego powtarzania przytrzymanego klawiszu. Aby,

ABC... C odczyt portów

Standardowo w mikrokontrolerach AVR rzeczywisty stan wyprowadzeń danego portu jest dostępny w rejestrze o r.azwie PINx (x = duża litera portu). Odczyt z tego właśnie rejestru jest jednoznaczny zc sprawdzeniem fizycznego stanu odpowiedniego portu. Często będziemy chcieli sprawdzić nie tyle cały port, ile tylko jedno wyprowadzenie. Znów podobnie jak to miało miejsce ze zmianą stanu pojedynczego wyprowadzenia C nie posiada instrukcji bitowych. Zauważmy jednak, że wyrażenie:

PIND & l«7

będzie miało wartość 0 tylko wtedy, jeśli wyprowadzenie 7 portu D jest wyzerowane. Dla wszelkich instrukcji wykorzystujących warunki 0 oznacza fałsz, każda inna wartość prawdę. Możemy wykorzystać to do testowania, czy na wyprowadzeniu jest star. 1. if(PIND & I«7) (...)

Jest stan 0:

if(!(f:nd & 1«7)) (...)

Podobnie możemy czekać, dopóki na porcie istnieje stan 1 lub 0: while(piND & 1«7) {} while(!(PlND & 1«/)) {>

Co bardzo ważne, wszystkie przedstawione tutaj rozwiązania, pozornie wymagające wielu obliczeń, zostaną zamienione na pojedyncze instrukcje asemblera:

SB1S - skok, jeśli bit w rejestrze 10 ustawhony; SBIC skok, jeśli bit w rejestrze IO wyzerowany.

Elektronika dla Wszystkich Wrzesień2005 45


Wyszukiwarka

Podobne podstrony:
cz4 Programowanie ABC... C static, volatile Oprócz tego, że zmienna może być na przykład typu int c
Całe wydarzenie, oprócz tego, że było dla nas dużą atrakcją, pozwoliło zapoznać się dokładniej z
Wstyd i przemo0087 Rozdział VIIJak i dlaczego zwiększyć przemoc System kamy — oprócz tego, że zajmuj
damy, rycerze,?ministki7 Konstytucja nowej tożsamości Oprócz tego, że w literaturze romantycznej za
ScanImage78 (2) Praca w sektorze IT, oprócz tego, że jest całkiem dobrze płatna, może wiązać się z w
skanuj0121 (14) 250 pogodzić się z nadzorem reżysera. Sama Berillat znana jest z tego, że nie znosi
27709 Obywatelskie nieposłuszeństwo0016 I I 0    ile prawda silniejsza jest od fałszu
Max Weber - rozpatrywał moralność pod względem jej wpływu, a raczej tego, że nie powinna wpływać na
404,405 / Po pierwsze, wobec tego, że dramat może być percypowany w sposób dwojaki: jako dzido liter
to z tego ze produkcja nastawiona jest na okr produkt w przedziale czasowych. Problem; powinno się p
27709 Obywatelskie nieposłuszeństwo0016 I I 0    ile prawda silniejsza jest od fałszu
Obywatelskie nieposłuszeństwo0016 I I 0    ile prawda silniejsza jest od fałszu, ani
Razizial 2. Programowania w MATLAI-ia 15 Razizial 2. Programowania w MATLAI-ia 15 Zauważ, że wyrażen
9152S6801 Karola?.....oto dla tego, że Childeryk już nie na ko niu wśród swojego ukazywał się ludu
24166 sr5 Ale oprócz tego miodunka jest rośliną jadalną. Na wiosnę z Jej liści przy korzeniu można

więcej podobnych podstron