Laboratorium Systemów wbudowanych Ćwiczenie nr l Podstawy ...

Laboratorium Systemów wbudowanych Ćwiczenie nr l Podstawy ... Laboratorium Systemów wbudowanych Ćwiczenie nr l Podstawy ...

artemis.wszib.edu.pl
from artemis.wszib.edu.pl More from this publisher
11.07.2015 Views

Laboratorium Systemów Wbudowanych – Wyższa Szkoła Zarządzania i Bankowości w Krakowie• wykorzystywany już wcześniej rejestr wyjściowy PORTx• rejestr wejściowy PINx(za x należy wstawić odpowiednią nazwę portu. I tak dla Portu A mamy dedykowanerejestry PORTA, PINA, DDRA itp.). Pozwala to praktycznie dowolnie konfigurowaćposzczególne linie.Odczytywanie stanu poszczególnych linii portów wiąże się z manipulacjami napojedynczych bitach. W związku z tym warto przypomnieć sobie w jaki sposób iz użyciem jakich operatorów języka C takie manipulacje można wykonywać.W języku C jest sześć operatorów bitowych:|,&,^,,~. Zasadę ich działanianajprościej jest objaśnić na przykładach. Liczby używane w przykładach przedstawionesą w postaci dwójkowej.operator "|" - bitowa alternatywa lub inaczej suma logiczna (OR)0 1 0 1 0 1 0 1| 0 0 1 1 0 0 1 1= 0 1 1 1 0 1 1 1operator "&" - bitowa koniunkcja lub inaczej iloczyn logiczny (AND)0 1 0 1 0 1 0 1& 0 0 1 1 0 0 1 1= 0 0 0 1 0 0 0 1operator "^" - bitowa alternatywa wykluczająca (XOR)0 1 0 1 0 1 0 1^ 0 0 1 1 0 0 1 1= 0 1 1 0 0 1 1 0operator ">" określa o ile bitów należy przesunąć. Przy przesuwaniu o każdy bit,na najbardziej znaczącej pozycji wpisywana jest wartość 0)operator "~" - dopełnienie jedynkowe lub inaczej negacja każdego bitu~ 1 0 0 1 1 0 0 1= 0 1 1 0 0 1 1 0Aby móc odczytać stan przycisków SW0-3 podłączonych do linii PB0-PB3mikrokontrolera musimy zacząć od odpowiedniego skonfigurowania portu PB.Wykonuje się to poprzez wpisanie do rejestru DDRB odpowiedniej wartości. Zasadykonfiguracji linii portów są identyczne dla każdego z nich. Wpisanie do rejestru DDRx,na odpowiadającej danemu wyprowadzeniu pozycji bitowej wartości 1, konfiguruje tąlinię jako wyjście, natomiast umieszczenie tam wartości 0 ustawia linię jako wejście.4

Laboratorium Systemów Wbudowanych – Wyższa Szkoła Zarządzania i Bankowości w Krakowie(polecenie DDRB = 0x0F; konfiguruje cztery starsze linie – PB4-PB7 jako wejścia, acztery młodsze linie – PB0-PB3 jako wyjścia).Odczyt stanu linii wejściowych portu wykonuje się poleceniem PINx :DDRB = 0x00; // konfiguracja wszystkich linii PB jako wejsciaprzyciski = PINB; // przypisanie zmiennej wynik aktualnego// linii portu PB stanuJak wspomniano wcześniej, wciśnięcie przycisku powoduje, że na odpowiednim bicie wrejestrze PINx jest ustawiana wartość 0. Aby zatem stwierdzić fakt wciśnięciaktóregokolwiek przycisku należy sprawdzić, które bity w momencie odczytu stanu portuB miały wartość 0 (powiedzmy, ze będziemy rozważać wciśnięcie przycisku S2podłączonego do linii PB2).Pierwszym krokiem jest odrzucenie zbędnych informacji o stanie pozostałych liniiportu. Najczęściej stosowanym rozwiązaniem jest tu wyzerowanie wszystkich bitówz wyjątkiem tego, który nas interesuje (w rozważanym przykładzie interesuje nas stanlinii PB2 odwzorowywany na drugim bicie wartości odczytanej z portu B – dlaprzypomnienia bity w bajcie numerujemy od 0).Wyzerowania bitów dokonuje się poprzez operację iloczynu logicznego (operator &) naodczytanej poleceniem PINB wartości z tzw. maską. W rozważanym przypadku maskaposiada wyłącznie jeden bit o wartości 1 na pozycji, która ma pozostać nie zmieniona.Na pozostałych pozycjach bitowych umieszczone są zera. Zatem dla sprawdzenia stanulinii PB2 maska będzie miała wartość 0b00000100 lub 0x04 w zapisie szesnastkowym.Stan przycisku S2 podłączonego do portu PB2 można zatem ustalić, jako wyniknastępującej operacji:przycisk_s2 = przyciski & 0b00000100; //w zm. przyciski// przechowywany jest stan portu B odczytany wcześniej// poleceniem PINBjeśli zmienna przycisk_s2 przyjmie wartość 0 oznaczać to będzie, że bit 2 w rejestrzePINB miał wartość 0 co prowadzi do wniosku, że przycisk S2 był wciśnięty. Jeślinatomiast wynik tej operacji będzie różny od zera oznacza to, że przycisk wciśnięty niebył.Aby nie marnować pamięci mikrokontrolera na deklaracje niepotrzebnych zmiennych,sprawdzenia zwykle dokonuje się za pomocą pojedynczej instrukcji if:if ( (przycisk_s2 & 0b00000100) == 0 ){// tu będzie procedura obsługi naciśnięcia przycisku S2}lub jeszcze prościejif (!((przyciski &0b00000100))){// tu będzie procedura obsługi naciśnięcia przycisku S2}5

<strong>Laboratorium</strong> Systemów Wbudowanych – Wyższa Szkoła Zarządzania i Bankowości w Krakowie(polecenie DDRB = 0x0F; konfiguruje cztery starsze linie – PB4-PB7 jako wejścia, acztery młodsze linie – PB0-PB3 jako wyjścia).Odczyt stanu linii wejściowych portu wykonuje się poleceniem PINx :DDRB = 0x00; // konfiguracja wszystkich linii PB jako wejsciaprzyciski = PINB; // przypisanie zmiennej wynik aktualnego// linii portu PB stanuJak wspomniano wcześniej, wciśnięcie przycisku powoduje, że na odpowiednim bicie wrejestrze PINx jest ustawiana wartość 0. Aby zatem stwierdzić fakt wciśnięciaktóregokolwiek przycisku należy sprawdzić, które bity w momencie odczytu stanu portuB miały wartość 0 (powiedzmy, ze będziemy rozważać wciśnięcie przycisku S2podłączonego do linii PB2).Pierwszym krokiem jest odrzucenie zbędnych informacji o stanie pozostałych liniiportu. Najczęściej stosowanym rozwiązaniem jest tu wyzerowanie wszystkich bitówz wyjątkiem tego, który nas interesuje (w rozważanym przykładzie interesuje nas stanlinii PB2 odwzorowywany na drugim bicie wartości odczytanej z portu B – dlaprzypomnienia bity w bajcie numerujemy od 0).Wyzerowania bitów dokonuje się poprzez operację iloczynu logicznego (operator &) naodczytanej poleceniem PINB wartości z tzw. maską. W rozważanym przypadku maskaposiada wyłącznie jeden bit o wartości 1 na pozycji, która ma pozostać nie zmieniona.Na pozostałych pozycjach bitowych umieszczone są zera. Zatem dla sprawdzenia stanulinii PB2 maska będzie miała wartość 0b00000100 lub 0x04 w zapisie szesnastkowym.Stan przycisku S2 podłączonego do portu PB2 można zatem ustalić, jako wyniknastępującej operacji:przycisk_s2 = przyciski & 0b00000100; //w zm. przyciski// przechowywany jest stan portu B odczytany wcześniej// poleceniem PINBjeśli zmienna przycisk_s2 przyjmie wartość 0 oznaczać to będzie, że bit 2 w rejestrzePINB miał wartość 0 co prowadzi do wniosku, że przycisk S2 był wciśnięty. Jeślinatomiast wynik tej operacji będzie różny od zera oznacza to, że przycisk wciśnięty niebył.Aby nie marnować pamięci mikrokontrolera na deklaracje niepotrzebnych zmiennych,sprawdzenia zwykle dokonuje się za pomocą pojedynczej instrukcji if:if ( (przycisk_s2 & 0b00000100) == 0 ){// tu będzie procedura obsługi naciśnięcia przycisku S2}lub jeszcze prościejif (!((przyciski &0b00000100))){// tu będzie procedura obsługi naciśnięcia przycisku S2}5

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!