Przydatne linki:


Jak zacząć? - blog
Forum Atnel
AVR M.Kardaś
SunDuino - blog
Kurs HTML
Sklep ATNEL
PATRONITE
Polak Potrafi

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...

Twoje IP to:
3.231.167.166
Logujesz się z hosta:
ec2-3-231-167-166.co
mpute-1.amazonaws.co
m
Jest 1 gości online.
Tyle osób już odwiedziło
278725