LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
Artykuły

(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

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 P4.0, P4.1 podłączone są do przycisków S1, S2
  • linia P2.7 steruje zasilaniem: akcelerometru ADXL, termistora NTC, fotorezystora LDR (nie jest montowany na płytce układu)
  • linie P3.0–P3.2 obsługują kanały pomiarowe X,Y,Z akcelerometru ADXL
  • linia P1.4 dołączona jest do wyjścia analogowego termistora NTC, a linia P3.3 do wyjścia analogowego fotorezystora LDR (nie jest montowany na płytce układu)
  • linie PJ.0-PJ.3 dołączone są do diod LED1-LED4
  • linie P3.4–P3.7 dołączone są do diod LED5–LED8

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.