POLITECHNIKA POZNAŃSKA WBMiZ Zakład Urządzeń Mechatronicznych STEROWNIKI URZĄDZEŃ MECHATRONICZNYCH
GPIO
General Purpose Input / Output Jest to podstawowe peryferium służące do komunikacji MCU z układami zewnętrznymi. GPIO może być wejściem lub wyjściem sygnału. GPIO jest urządzeniem cyfrowym ( 0 / 1). Spotykane są GPIO w standardzie: – TTL (0 – 5 V), – CMOS (0 – 3.3 V).
Budowa GPIO
Oznaczenia GPIO GPIO w mikrokontrolerze podzielone są na grupy logiczne zwane PORT. Pojedynczą nóżkę GPIO nazywamy pinem Porty znakowane są literami A,B,C… np.: PORTA, PORTB, itd… Piny są numerowane od 0 do 7 (dla MCU 8 bit) Aby zaadresować GPIO podaje się port i numer pinu np.: PORTA, pin1 lub prościej PA1 (czyli druga nóżka portu A)
GPIO Aby sterować GPIO ustawia się rejestry konfiguracyjne Rejestry konfiguracyjne dla 8 bitowych MCU są 8 bitowymi zmiennymi (unsigned char) W języku GCC zapis rejestru wygląda następująco: – Binarnie: REJESTR=0b ; – Decymalnie: REJESTR=10; – Heksadecymalnie: REJESTR=0x10;
DDRx: Rejestr kierunkowy 0 na danej pozycji rejestru oznacza, że odpowiadający pin jest traktowany jako WEJŚCIE 1 na danej pozycji rejestru oznacza, że odpowiadający pin jest traktowany jako WYJŚCIE DDRC=0b ; software:
Budowa GPIO
PORTx – rejestr WYJŚCIA 0 na danej pozycji rejestru oznacza, że odpowiadający pin ustawiony w stan logicznego 0 (potencjał 0[V]) 1 na danej pozycji rejestru oznacza, że odpowiadający pin ustawiony w stan logicznego 1 (potencjał 5[V]) software:
Budowa GPIO
PINx – rejestr WEJŚCIA Uwaga! Nazwa rejestru PINx może być mylona ze słowem „pin” opisującego potocznie „nóżkę” układu scalonego w j. ang. Jest to rejestr tylko do odczytu. 0 na danej pozycji rejestru oznacza, że przez odpowiadający pin nie płynie prąd. 1 na danej pozycji rejestru oznacza, że przez odpowiadający pin płynie prąd. software:
Podłączenie WYJŚCIA Maksymalna obciążalność prądowa GPIO jest ograniczona (dla ATmega128 wynosi 15-50mA w zależności od wersji i sposobu pracy) Suma wszystkich prądów mikrokontrolera ATmaga128 nie może przekroczyć wartości podanej przez producenta (ok mA dla ATmega128 w zależności od wersji i sposobu pracy) hardware: PA1 PA2 GND +5V R R PORTA=0b ; PORTA=0b ; PORTA=0b ; PORTA=0b ; D1 D2
Maksymalna obciążalność prądowa GPIO jest ograniczona. 1Pin należy podłączyć tak aby prąd przepływał bądź aby był uziemiony Istnieje kilka możliwych rozwiązań – Pull-up zewnętrzny – Pull-up wewnętrzny – Pull-down zewnętrzny – Pull-down wewnętrzny – Floating Na potrzeby zajęć będziemy używać jedynie podłączenia „pull-up zewnętrzny” hardware: Podłączenie WEJŚCIA PA3 R +5V GND
Budowa GPIO
PA3 R +5V GND PA3 R +5V GND R wew. R≈0
Jeśli GPIO jest wejściem i ustawimy rejestr PORTx na odpowiedniej pozycji w stan 1 to załączony zostanie pull-up wewnętrzny.
PA3 R +5V GND
Przykład: przycisk + LED Hardware: PA2 GND R D1 PB3 R +5V GND Software: void main(void) { DDRA=0b ; DDRB=0; PORTA=0b ; PORTB=0b ; while(1) { if(PINB!=0) PORTA=0b ; else PORTA=0b ; } SW1
Maski bitowe &iloczyn bitowy |suma bitowa ~negacja ^XOR >>przesuwanie bitowe w prawo <<przesuwanie bitowe w lewo
& (iloczyn) Bitowo: X & Y = Z X Y Z dec 10dec 2dec Bitowo: 18 & 10 = 2 Logicznie: 18 && 10 = 1 (prawda i prawda = prawda)
| (suma) Bitowo: X | Y = Z X Y Z dec 9dec 25dec Bitowo: 17 | 9 = 25 Logicznie: 17 || 9 = 1 (prawda lub prawda = prawda)
~ (negacja) Bitowo: ~X X ~X dec 238dec Bitowo: ~17=238 Logicznie: !17 =0 (nie prawda = fałsz)
^ (XOR) Bitowo: X ^ Y = Z X Y Z dec 9dec 12dec Bitowo: 17 ^ 9 = 12 Logicznie: brak odpowiednika w języku ANSI C
> Bitowo: X<<Y = Z X Y Z dec 2dec 68dec Bitowo: 145<<2=145*4=580=68 (przepełnienie unsigned char)
Dostęp bitowy PORTA=0b ;//ustawia cały port PORTA=(1<<3);//ustawia cały port PORTA=PORTA|(1<<3);//ustawia jeden pin PORTA|=(1<<3);//prościej PORTA&=(1<<3); PORTA&=~(1<<3);dobrze//kasuje pin PORTA^=0xFF;//neguje cały port PORTA^=0b ;//neguje 4 piny źle//nie kasuje pinu
Przykład 2 Hardware: PA1 GND R D1 PA0 R +5V GND Software: void main(void) { DDRA=0b ; //we/wy PORTA=0b ; //stan pocz. while(1) { //pętla główna if(PINA&0b ==1) //warunek we. { //jeśli prawda PORTA|=(1<<1); //ustaw 1 na poz. 1 PORTA&=~(1<<2); //ustaw 0 na poz 2 } else { //jeśli fałsz PORTA&=~(1<<1); //ustaw 0 na poz. 1 PORTA|=(1<<2); //ustaw 1 na poz. 2 } SW1 PA2 GND R D2
ułatwienie Zapis „PINA&0b ” można zastąpić w języku GCC komendą: bit_is_set(REJESTR,POZYCJA) Np.. If(bit_is_set(PINA,0)) {…} Dostępna jest też komenda bit_is_clear(REJESTR,POZYCJA) Komendy te znajdują się w bibliotece #include
Przykład 2 Hardware: PA1 GND R D1 PA0 R +5V GND Software: #include void main(void) { DDRA=0b ; //we/wy PORTA=0b ; //stan pocz. while(1) { //pętla główna if(bit_is_set(PINA,0)) //warunek we. { //jeśli prawda PORTA|=(1<<1); //ustaw 1 na poz. 1 PORTA&=~(1<<2); //ustaw 0 na poz 2 } else { //jeśli fałsz PORTA&=~(1<<1); //ustaw 0 na poz. 1 PORTA|=(1<<2); //ustaw 1 na poz. 2 } SW1 PA2 GND R D2
Synchronizacja wejścia
Synchronizacja wyjścia
Funkcje alternatywne
zwłoka
Pytania?
Dziękuję (lista)