Aktualizacja Styczeń 2019.
Ustawianie rejestrów, pinów i portów.
DDRx - rejestr kierunku
PORTx - rejestr wyjściowy
PINx - rejestr wejściowy
Na początek nauczymy się prawidłowo ustawiać kierunki rejestrów (pinów i portów).
Rejestr DDRx jest rejestrem kierunku na porcie x (A,B,C,D). Piny liczymy nie od 1 a od 0, czyli
pierwszy pin to nie np: PA1 lecz PA0 i o tym zawsze musimy pamiętać.
Jeżeli chcemy ustawić port x, np. port A
jako port wejściowy, wtedy musimy ustawić rejestr DDR w sposób podany poniżej:
DDRA = 0x00;
W ten sposób ustawimy cały port A jako wejście. W sytuacji gdy nie ustawialiśmy wcześniej danego portu a
chcemy by był on cały jako wejście, to nawet nie musimy go ustawiać, ponieważ domyślnie jest on ustawiony jako wejście.
Jeżeli chcemy np: ustawić tylko bit 4 jako wejście, to
robimy to w następujący sposób:
DDRA &= ~ (1 << PA4);
Jeżeli jednak zechcemy ustawić np: 3 piny jako wejścia a pozostałe 5 pinów jako wyjścia wtedy stosujemy taki zapis:
DDRA = 0xCD; lub binarnie DDRA = 0b11001110;
Jak widzimy w powyższym zapisie piny PA1, PA2, PA3, PA6, PA7 będą ustawione jako wyjścia pozostałe zaś będą wejściami. Jeżeli chcemy
ustawić piny jako wyjścia to robimy to tak:
DDRA = 0x3B; dla pinów PA0, PA1, PA3, PA4, PA5
DDRA = 0b00111011; jak przykład powyżej
DDRA = 0xFF; dla całego portu lub
DDRA |= (1 << PA5); dla pinu PA5
Zajmijmy się teraz portami a konkretnie wystawianiem zera lub jedynki na dany port.
Wystawiamy stan wysoki czyli logiczna 1-ka na pin 4 portu B.
PORTB |= (1 << PB4);
Wystawiamy stan niski czyli logiczne 0 na pin 0 portu C.
PORTB &= ~(1 << PC0);
A teraz zmieniamy stan pinu na przeciwny czyli jeśli na pinie mamy stan wysoki to wystawiamy
stan niski i odwrotnie. Robimy to za pomocą komendy:
PORTB ^= (1 << PC0);
Kolejnym krokiem będzie sprawdzanie jaki stan panuje na danym pinie a więc zaczynamy.
DDRD &= ~(1 << PD3);
PORTD |= (1 << PD3);
if( !(PIND & (1 << PD3) ) LED_ON;
else LED_OFF;
Co oznaczają powyższe linijki kodu? Otóż:
Linijka pierwsza ustawia kierunek 3 pinu na porcie D jako wejściowy.
Linijka druga to programowe podciąganie pinu PD3 wewnętrznym rezystorem mikrokontrolera do VCC czyli do zasilania tegoż mikrokontrolera. Musimy pamiętać o tym,
że w przypadku ustawiania pinu jako wejściowy np: w celu podłączenia przycisku, musimy ten pin podciągnąć do VCC. W tym przypadku jest to zrobione programowo i
odpowiedzialna za to jest właśnie druga linijka kodu.Jeśli natomiast okazało by się, że z powodu zakłóceń podciągnięcie to jest niewystarczające, to
wtedy zamiast programowego podciągnięcia robimy podciągnięcie zewnętrzne polegające na wpięciu rezystora ok. 10kΩ między danym pinem a masą układu GND.
Trzecia linia kodu sprawdza czy na pinie PD3 jest stan niski a jeśli tak to wykonaj instrukcję LED_ON. LED_ON to po prostu makro ułatwiające
programowanie ale o tym później. Z kolei czwarta linia kodu to dalsza część warunku (if). Czyli jeśli warunek (if) w trzeciej lini kodu nie jest spełniony
to wykonują się zadania zapisane w czwartej linijce kodu po instrukcji else czyli w tym przypadku LED_OFF.
To by było na tyle odnośnie ustaiania kierunku rejestrów oraz ustawiania portów i pinów.
Teraz zajmiemy się tym jak napisać własne makra, ułatwiające programowanie.
Przyjżyjmy się linijce nr 13 w kodzie. Definiujemy sobie makro LED_PIN, do którego przypisujemy wartość (1 << PC0) i od teraz wszędzie w kodzie możemy użyć tego makra.
Od teraz zawsze gdzie w kodzie kompilator napotka zapis LED_PIN , to podstawi on zamiast tego powyższą wartość.
W następnych linijkach mamy takie makra jak LED_ON , LED_OFF i LED_TOG. Tak jak powyżej kompilator zamiast tych makr podstawi nam podczas kompilacji
wartość LED_PIN a do tego makra mamy już podstawioną przecież wcześniej wartość (1 << PC0).
To działa tak jaby zapomocą instrukcji #define przypisać jakąś wartość do zmienne.
Na przykład : #define A 5.
To nic innego jak przypisanie wartości 5 wszędzie tam gdzie w programie wystąpi litera A.
Dzięki takiemu zastosowaniu makr, łatwo możemy zmienić dany port czy pin procesora tylko raz na początku programu, nie szukając poszczególnych
instrukcji w całym jego kodzie. Ot takie sobie ułatwienie programowania. CDN...