(5) Mikrokontrolery MSP430: porty I/O, obsługa wyjść
Sterowanie linią I/O w trybie wyjściowym
W programie będziemy sterować wyjściami mikrokontrolera. Żeby zaobserwować zmiany stanów logicznych na liniach będziemy sterować wyjściami do których dołączono diody LED. Schemat elektryczny podłączenia diod LED do linii mikrokontrolera pokazano na rysunku 2. Diody włączamy ustawiając stan wysoki na linii wyjścia mikrokontrolera. Ustawiając stan niski na wyjściu wyłączamy diody.
Rys. 2. Schemat podłączenia diod LED do wyprowadzeń mikrokontrolera
Kod źródłowy programu realizującego sterowanie diodami pokazano na listingu 1.
List. 1. Przykładowy program
// "MSP430 z pamięcią FRAM" // konfiguracja "MSP-EXP430FR5739": // Zadanie numer 5.1. Sterowanie wyjściem. // ( ustawienia fabryczne ) // // w programie wykorzystano // ACLK nieaktywny // zainstalowane w module diody LED // MCLK = SMCLK = DCOCLK ~1MHz // // // działanie programu: // MSP430FR5739 // kolejno włączane, a po // ----------------- // sekundzie wyłączane są diody // LED1 <- | PJ.0 P3.4 | -> LED5 // LED1, LED8 // LED2 <- | PJ.1 P3.5 | -> LED6 // LED4..LED1, LED8..LED5 // LED3 <- | PJ.2 P4.6 | -> LED7 // ( po 3 sekundach przerwy cykl // LED4 <- | PJ.3 P5.7 | -> LED8 Ł.K.'13 // sterowania LED jest powtarzany ) //------------------------------------------------------------------- // // pliki nagłówkowe #include "io430.h" // rejestry procesora #include "intrinsics.h" // instrukcje procesora // // definicje stałych #define CZESTOTLIWOSC_MCLK 1000000 // częstotliwość zegara MCLK (Hz) #define TAKTY_ZEGARA_1_SEK (CZESTOTLIWOSC_MCLK) // takty zegara, opóźnienie 1 sek. // void main( void ) // program główny { // WDTCTL = WDTPW + WDTHOLD; // zatrzymaj układ Watchdog // // konfiguracja linii we/wy P1OUT = 0x00; P2OUT = 0x00; P3OUT = 0x00; P4OUT = 0x00; // ustaw stan niski na liniach PJOUT = 0x00; // ( wszystkie linie pracują w // trybie we/wy, PxSELx wyzerowane ) P1DIR = 0xff; P2DIR = 0xff; P3DIR = 0xff; P4DIR = 0xff; // ustaw linie w kierunku wyjścia PJDIR = 0xff; // // while(1) // pętla główna programu { // PJOUT |= BIT0; // włącz diodę LED1 __delay_cycles(TAKTY_ZEGARA_1_SEK ); // czekaj 1 sekundę PJOUT &=~ BIT0; // wyłącz diodę LED1 // P3OUT |= BIT7; // włącz diodę LED8 __delay_cycles(TAKTY_ZEGARA_1_SEK ); // czekaj 1 sekundę P3OUT &=~ BIT7; // wyłącz diodę LED8 // PJOUT |= (BIT3 + BIT2 + BIT1 + BIT0); // włącz diody LED4/3/2/1 __delay_cycles(TAKTY_ZEGARA_1_SEK ); // czekaj 1 sekundę PJOUT &=~ (BIT3 + BIT2 + BIT1 + BIT0); // wyłącz diody LED4/3/2/1 // P3OUT |= (BIT7 + BIT6 + BIT5 + BIT4); // włącz diody LED8/7/6/5 __delay_cycles(TAKTY_ZEGARA_1_SEK ); // czekaj 1 sekundę P3OUT &=~ (BIT7 + BIT6 + BIT5 + BIT4); // wyłącz diody LED8/7/6/5 // __delay_cycles(TAKTY_ZEGARA_1_SEK * 3); // czekaj 3 sekundy // }; // } //
W pierwszych liniach programu dołączane są pliki nagłówkowe. Następnie definiowana jest stała TAKTY_ZEGARA_1_SEK . Wartość stałej została obliczona na podstawie poniższego i określa liczbę taktów zegara MCLK których czas wykonania trwa sekundę (w MSP430 zegar MCLK taktuje pracę jednostki CPU mikrokontrolera):
xTakty = tCzekaj * fMCLK
gdzie:
xTakty – takty sygnału zegarowego MCLK (argument funkcji __delay_cycles)
tCzekaj – czas trwania opóźnienia [s]
fMCLK – częstotliwości sygnału zegarowego MCLK [Hz]
Obliczona wartość w dalszej części programu zostanie użyta jako argument funkcji __delay_cycles i posłuży do generowania programowego opóźnienia o czasie trwania 1 i 3 sekund. W programie głównym zatrzymywana jest pracy układu watchdog:
WDTCTL = WDTPW + WDTHOLD;
Następnie konfigurowane są linie wejścia/wyjścia mikrokontrolera. Wszystkie linie ustawiane są jako wyjścia w stanie niskim. Najpierw ustawiany jest stan niski na liniach, następnie zmieniany jest kierunek linii z wejścia na wyjście:
P1OUT = 0x00; P2OUT = 0x00; P3OUT = 0x00; P4OUT = 0x00; PJOUT = 0x00; P1DIR = 0xff; P2DIR = 0xff; P3DIR = 0xff; P4DIR = 0xff; PJDIR = 0xff;
W MSP430 żeby zmniejszyć pobór prądu mikrokontrolera należy linie wejścia/wyjścia, do których nie są podłączone urządzenia peryferyjne ustawić w tryb pracy wejścia/wyjścia (nie funkcyjny), a kierunek linii ustawić jako wyjście. Konfiguracja używanych linii uzależniona jest od działania urządzenia peryferyjnego. Na płytce startowej „LaunchPad”:
Linie te należy ustawić jako wyjścia w stanie niskim ! Wówczas peryferia podłączone do linii nie będą „pobierały” prądu. |