wrz 272015
 

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:

Tabela_I_O

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>

  1. nóżka PD1 ustawiona jako wyjście + ustawiony stan niski:
    DDRD |= (1<<PD1);
    PORTD &= ~(1<<PD1);
  2. nóżka PC2 i PC3 ustawiona jako wyjście + ustawiony stan wysoki:
    DDRC |= (1<<PC2) | (1<<PC3);
    PORTC |= (1<<PC2) | (1<<PC3);
  3. ustawienie całego portu B jako wyjścia (ustawiamy „1” we wszystkich bitach rejestru):
    DDRB = 0xFF;
  4. 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
  5. nóżka PD4 ustawiona jako wejście + rezystor podciągający do Vcc:
    DDRD &= ~(1<<PD4);
    PORTD |= (1<<PD4);
  6. 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.