Znacząca większość osób rozpoczynających naukę programowania zaczyna swoją zabawę od napisania programu wyświetlającego napis „Hello world!”. Podobnie jest w przypadku nauki programowania mikrokotrolerów, tylko z jedną małą różnicą – pierwszy napisany program ma powodować miganie diody LED. Z tego względu pierwszym zagadnieniem, z którym spotyka się każdy z nas jest konieczność obsługi portów I/O – Input/Output, czyli po polsku: wejścia i wyjścia.
W przypadku mikrokontrolerów AVR obsługę portów I/O przeprowadza się poprzez odpowiednie wpisywanie „0” lub „1” do trzech rejestrów:
DDRx – rejestry kierunku
PORTx – rejestry wyjściowe
PINx – rejestry wejściowee
Ilość rejestrów w danym rodzaju mikrokontrolera jest zależna od jego fizycznych rozmiarów. Dla przykładu ATmega8 posiada 3 rejestry kierunku DDRB, DDRC oraz DDRD, 3 rejestry wyjściowe PORTB, PORTC, PORTD oraz 3 rejestry wejściowe PINB, PINC, PIND. Jak łatwo skojarzyć oznaczenia literowe B,C,D odpowiadają oznaczeniom nóżek mikrokontrolera. Należy pamiętać, że każdy rejestr składa się z ośmiu bitów, które swoją numeracją odpowiadają numerom pinów w odpowiednim porcie procka, np.:
DDRB2, PORTB2, PINB2 – odpowiada za nóżkę procesora oznaczoną symbolem PB2
W tabeli przedstawiłem możliwe konfiguracje rejestru kierunku i wyjściowego:
Rejestr PINxn służy tylko do odczytania stanu logicznego panującego fizycznie na nóżce procesora w momencie odczytu.
PRZYKŁADY:
UWAGA! Należy pamiętać, aby w nagłówku pliku main.c zainkludować bibliotekę:
#include <avr/io.h>
- nóżka PD1 ustawiona jako wyjście + ustawiony stan niski:
DDRD |= (1<<PD1); PORTD &= ~(1<<PD1);
- nóżka PC2 i PC3 ustawiona jako wyjście + ustawiony stan wysoki:
DDRC |= (1<<PC2) | (1<<PC3); PORTC |= (1<<PC2) | (1<<PC3);
- ustawienie całego portu B jako wyjścia (ustawiamy „1” we wszystkich bitach rejestru):
DDRB = 0xFF;
- nóżki od PD0 do PD3 jako wyjścia + stan wysoki + nóżki od PD4 do PD7 jako wejścia + rezystor podciągający do Vcc:
DDRD = 0b00001111; // lub szesnastkowo 0x0F PORTD = 0b11111111; // lub szesnastkowo 0xFF
- nóżka PD4 ustawiona jako wejście + rezystor podciągający do Vcc:
DDRD &= ~(1<<PD4); PORTD |= (1<<PD4);
- nóżka PB4 ustawiona jako wejście + rezystor podciągający do Vcc + sprawdzenie stanu:
DDRB &= ~(1<<PB4); PORTB |= (1<<PB4); if (! (PINB & (1<<PB4))) {wykonaj, jeżeli panuje stan niski}; else {wykonaj, jeżeli panuje stan wysoki};
KILKA WAŻNYCH UWAG:
- po resecie mikrokontrolera domyślnie wszystkie piny ustawione są jako WEJŚCIA i panuje na nich stan wysokiej impedancji Hi_Z,
- należy pamiętać, aby wszystkie piny mające pełnić funkcje WEJŚCIA podłączyć programowo poprzez rezystor podciągający do napięcia zasilania mikrokontrolera – ten zabieg zapobiega wielu niechcianym sytuacjom m.in. samoczynnemu resetowaniu się procka.
Sorry, the comment form is closed at this time.