(6) Mikrokontrolery MSP430: porty I/O, obsługa wejść
W artykule przedstawiamy przykład obsługi linii I/O mikrokontrolerów MSP430FR w trybie wejściowym. Przykład został zrealizowany na bazie modułu startowego LaunchPad MSP-EXP430FR5739, który wyposażono w mikrokontroler z pamięcią FRAM.
Galeria zdjęć zestawu MSP-EXP430FR5739 jest dostępna pod adresem. |
Po włączeniu zasilania modułu LaunchPad wszystkie linie I/O mikrokontrolera MSP430FR5739 pracują w trybie wejścia/wyjścia i są ustawione w kierunku wejściowym.
Konfiguracja trybu pracy linii wejścia/wyjścia, oraz wybór kierunku linii omawiane były w poprzednim odcinku kursu: (5) Mikrokontrolery MSP430: porty I/O, obsługa wyjść. |
Stan linii wejściowych w mikrokontrolerze MSP430FR5739 możemy odczytać z rejestru PxIN. Gdy bit w rejestrze ma wartość „0” to odpowiadająca mu linia jest w stanie niskim. Jeśli bit ma wartość „1” to na linii jest stan wysoki.
Tab. 1. Budowa rejestru PxIN
PxIN |
Stanu wejścia |
0 |
Niski |
1 |
Wysoki |
Wejścia mikrokontrolera wyposażono w wewnętrzne, włączane programowo rezystory pull-up , pull-down . Rezystory włączane są przy pomocy bitów z rejestru PxREN. Rodzaj rezystora konfigurują bity z rejestru PxOUT. Gdy bit w rejestrze PxREN ma wartość „0”, to na odpowiadającej mu linii wejściowej obsługa rezystorów pull-up , pull-down jest wyłączona. Ustawienie bitu na wartość „1” włącza możliwość aktywizacji rezystorów. Wówczas ustawiając w rejestrze PxOUT bit o wartości „0” na wejściu włączamy rezystor pull-down . Ustawiając w rejestrze bit o wartości „1” na wejściu włączamy rezystor pull-up .
Tab. 2. Bity rejestrów PxDIR, PxREN, PxOUT
PxDIR |
PxREN |
PxOUT |
Konfiguracja rezystorów pull-up i pull-down |
0 |
0 |
x |
wejście bez rezystorów |
0 |
1 |
1 |
wejście z rezystorem pull-up |
0 |
1 |
0 |
wejście z rezystorem pull-down |
Wejścia portów P1, P2, P3, P4 mogą pracować w trybie przerwań (port PJ nie obsługuje przerwań). Obsługę przerwań konfigurujemy przy pomocy rejestrów PxIE, PxIES, PxIFG.
Korzystając z rejestru PxIE możemy włączyć obsługę przerwań. Gdy bit w rejestrze ma wartość „1” to odpowiadająca mu linia ma włączoną obsługę przerwań. Jeśli bit ma wartość „0” to obsługa przerwań jest wyłączona.
Tab. 3. Funkcje bitów rejestru PxIE
PxIE |
Przerwania |
0 |
wyłączone |
1 |
włączone |
Korzystając z rejestru PxIES możemy zdefiniować w jaki sposób zmiana sygnału na wejściu wpływa na ustawienie flagi przerwania. Gdy bit w rejestrze ma wartość „0” to flagę przerwania ustawia zmiana sygnału na wejściu ze stanu niskiego na stan wysoki (narastające zbocze sygnału). Jeśli bit ma wartość „1” to flagę przerwania ustawia zmiana sygnału na wejściu ze stanu wysokiego na stan niski (opadające zbocze sygnału).
Tab. 4. Funkcje bitów rejestru PxIES
PxIES |
Zbocze sygnału, które powoduje ustawienie flagi przerwania |
0 |
narastające (stan niski –> stan wysoki) |
1 |
opadające (stan wysoki -> stan niski) |
Flaga przerwania zapisywana jest w rejestrze PxIFG. Może być także ustawiona przez programistę. Najwyższy priorytet wykonania ma flaga przerwania od linii numer zero, a najniższy flaga od linii numer siedem portu I/O mikrokontrolera.
Tab. 5. Funkcje bitów rejestru PxIFG
PxIFG |
Flaga przerwania. |
0 |
brak reakcji |
1 |
wywołanie procedury obsługi przerwania (*) |
* gdy obsługa przerwania dla wejścia jest włączona, a przerwania maskowalne są odblokowane
Jeśli wejście ma włączoną obsługę przerwań, a w mikrokontrolerze odblokowano obsługę przerwań maskowalnych, to ustawienia flagi przerwania na wartość „1” rozpoczyna wykonanie procedury obsługi przerwania.
Przerwania od wejść mikrokontrolera MSP430FR5739 są przerwaniami maskowalnymi. Po starcie mikrokontrolera obsługa przerwań maskowalnych jest wyłączona. Obsługę przerwań maskowalnych włączamy ustawiając w rejestrze SR bit GIE. W środowisku IAR rejestr SR konfigurujemy używając instrukcji: * __bis_SR_register(GIE) – ustawienie bitu GIE w rejestrze SR * __bic_SR_register(GIE) – wyzerowanie bitu GIE w rejestrze SR Obie instrukcje zdefiniowano w pliku intrinsics.h. |
Szablon procedury obsługi przerwania dla portów P1, P2, P3 i P4 pokazano na listingu 1.
List. 1. Szablon procedury obsługi przerwania dla portów P1, P2, P3 i P4
#pragma vector=PORTX_VECTOR __interrupt void Port_X(void) { }
* w miejsce znaku „X” należy wstawić numer portu mikrokontrolera
W procedurze obsługi przerwania przetwarzane są przerwania dla wszystkich 8 wejść portu mikrokontrolera (jedna procedura obsługuje 8 wejść portu). Żeby sprawdzić, które przerwanie wymusiło wywołanie procedury obsługi przerwania należy w rejestrze PxIFG sprawdzić ustawienie flag przerwań. Obsługując przerwania od wejść mikrokontrolera należy pamiętać, żeby w procedurze obsługi przerwania wyzerować flagę obsługiwanego przerwania (flagi przerwań nie są czyszczone automatycznie). Na listingu 2 pokazano procedurę obsługi przerwania dla portu P4, obsługującą przerwania dla wejścia numer 0 oraz numer 1.
List. 2. Procedura obsługi przerwania dla portu P4
#pragma vector=PORT4_VECTOR __interrupt void Port_4(void) { if(P4IFG & BIT0) // gdy przerwanie od wejścia 0 { P4IFG &=~ BIT0; // wyzeruj flagę obsługi przerwania // tutaj obsługa przerwania dla wejścia numer 0 } else if(P4IFG & BIT1) // gdy przerwania od wejścia 1 { P4IFG &=~ BIT1; // wyzeruj flagę obsługi przerwania // tutaj obsługa przerwania dla wejścia numer 1 } }