background image

Laboratorium 1 – sterowanie diodami 

1.  Programowanie portów układu MSP 430 

 

2.1 Porty MSP340F149 

 
Układ MSP340F149, zamontowany na płytce rozwojowej EasyWeb2 zawiera 6 8-

bitowych portów, mogących pracować w trybie wejściowym i wyjściowym. Porty te oznacza 
się odpowiednio P1 – P6. Porty P1 i P2 umoŜliwiają dodatkowo pracę w systemie przerwań. 
 
 

 

[msp430f149.pdf] 

W mikrokontrolerze MSP430 wszystkie porty są zmapowane w przestrzeni adresowej 
procesora, a dostęp do poszczególnych rejestrów wszystkich portów odbywa się poprzez 
odwołanie się do wybranego adresu portu. 
 
KaŜdemu z 6 portów układu MSP przyporządkowane są 4 rejestry:  

 

Port Px selection 

 

 

PxSEL 

 

Port Px direction 

 

 

PxDIR 

 

Port Px output  

 

 

PxOUT 

 

Port Px input   

 

 

PxIN 

x= 1..6 

Ponadto porty P1 i P2 posiadają rejestry odpowiedzialne za pracę z przerwaniami: 

 

Port Px interrupt enable  

 

PxIE 

 

Port Px interrupt-edge select   

PxIES 

 

Port Px interrupt flag   

 

PxIFG 

x= 1..2 

 
Przyporządkowanie adresów do poszczególnych portów ilustruje tabela: 

PORT 

REJESTR 

NAZWA 

ADRES 

background image

 

[msp430f149.pdf] 

Pełny zakres rejestrów urządzeń wejścia wyjścia moŜna znaleźć w dokumentacji producenta 
mikrokontrolera MSP430F149. 
 

2.2. Uzyskiwanie dost

ę

pu do portów 

 
Wszystkie 6 portów MSP430 jest zmapowanych na 8-bitowe rejestry dostępne pod 
określonym adresem w pamięci. Rozpatrzmy port P1. Dla portu P1 trzy podstawowe rejestry 
są dostępne pod następującymi adresami 

P1IN 20 jest zmapowany na adres  20 szesnastkowo, 
P1OUT jest zmapowany na adres  21 szesnastkowo, 
P1DIR jest zmapowany na adres  22 szesnastkowo. 

Rejestr P1DIR wskazuje na kierunek działania portu dla poszczególnych bitów i 
przyporządkowanych do nich pinów układu. Piny oznacza się kolejno od P1.0 do P1.7. JeŜeli 
pojedynczy bit rejestru ustawimy na 0, odpowiadający pin pracuje jako układ wejściowy, jeśli 
1, odpowiadający pin pracuje jako układ wyjściowy. 
 
Chcąc ustawić  pin P1.1 do pracy jako wejście, bit 1 rejestru P1DIR ustawiamy na 1, w 
przeciwnym wypadku na 0. 
 

Port P6 

Port P6 selection  

P6SEL  

037h 

 

Port P6 direction  

P6DIR  

036h 

 

Port P6 output  

P6OUT  

035h 

 

Port P6 input  

P6IN  

034h 

Port P5 

Port P5 selection  

P5SEL  

033h 

 

Port P5 direction  

P5DIR  

032h 

 

Port P5 output  

P5OUT  

031h 

 

Port P5 input  

P5IN  

030h 

Port P4 

Port P4 selection  

P4SEL  

01Fh 

 

Port P4 direction  

P4DIR  

01Eh 

 

Port P4 output  

P4OUT 

01Dh 

 

Port P4 input  

P4IN  

01Ch 

Port P3 

Port P3 selection  

P3SEL  

01Bh 

 

Port P3 direction  

P3DIR  

01Ah 

 

Port P3 output  

P3OUT  

019h 

 

Port P3 input  

P3IN  

018h 

Port P2 

Port P2 selection  

P2SEL  

02Eh 

 

Port P2 interrupt enable  

P2IE  

02Dh 

 

Port P2 interrupt-edge select  

 P2IES 

02Ch 

 

Port P2 interrupt flag  

P2IFG  

02Bh 

 

Port P2 direction  

P2DIR  

02Ah 

 

Port P2 output  

P2OUT  

029h 

 

Port P2 input  

P2IN  

028h 

Port P1 

Port P1 selection 

P1SEL  

026h 

 

Port P1 interrupt enable  

P1IE  

025h 

 

Port P1 interrupt-edge select  

P1IES  

024h 

 

Port P1 interrupt flag  

P1IFG  

023h 

 

Port P1 direction  

P1DIR  

022h 

 

Port P1 output  

P1OUT 

021h 

 

Port P1 input  

P1IN  

020h 

background image

 

[http://eleceng.dit.ie/frank/msp430/] 

 

Jeśli podłączmy do Portu P1.0 klawisz, a do portu P1.1 diodę LED, w rejestrze P1DIR tryb 
pracy poru P1.1 ustawiamy na wejściowy (1), a P1.0 na wyjściowy (0) 
W języku 

c

 taka operacja moŜe wyglądać następująco: 

 

typedef unsigned char byte; 
#define P1DIR *((byte *)0x22) 
 
P1DIR |= 0x02;            // Ustawienie bitu P1.1 na 1 (tryb wyj

ś

ciowy) 

P1DIR &= ~0x01;           // Ustawienie bitu P1.0 na 0 (tryb wej

ś

ciowy) 

 

 
Operacja „

|=” 

jest funkcją bitowego 

or

 wykonanego na zawartości rejestru P1DIR. Operacja 

ta, w odróŜnieniu od przypisania „=” nie zmienia stanu innych bitów. 
 
Operacja 

P1DIR |= 0x02

 

Bit 

P1.7  P1.6  P1.5  P1.4  P1.3  P1.2  P1.1  P1.0 

P1DIR 

0x02  

P1DIR |= 0x02 

Operacja 

P1DIR = 0x02

 

Bit 

P1.7  P1.6  P1.5  P1.4  P1.3  P1.2  P1.1  P1.0 

P1DIR 

0x02  

P1DIR = 0x02 

 
Operacja „

&=” 

jest funkcją bitowego 

and

 wykonanego na zawartości rejestru P1DIR. 

Operacja ta, takŜe nie zmienia stanu innych bitów. 

background image

Bit 

P1.7  P1.6  P1.5  P1.4  P1.3  P1.2  P1.1  P1.0 

P1DIR 

0x01 

~0x01 

P1DIR &= ~0x01 

 
 

 

 
 

[http://eleceng.dit.ie/frank/msp430/] 

 
 
JeŜeli w układzie z rysunku xx2 chcemy kontrolować stan klawisza przyłączonego do pinu b0 
portu P1, konieczne jest odczytanie stanu portu P1.0. Jeśli naciśnięcie klawisza ma sterować 
zapaleniem diody przyłączonej do pinu b1 portu P1, naleŜy na port P1.1 wysłać odpowiedni 
sygnał. Aby załączyć diodę, bit 1 portu P1 musi być ustawiony na 0, wyłączenie uzyskamy 
ustawiając ten bit na 1. Podobnie odczytany stan bitu portu P1.1 równy 0 informuje o 
wciśniętym klawiszu, a stan bitu równy 1 mówi, Ŝe klawisz nie jest wciśnięty. 
 
Program, zapalający diodę w zaleŜności od stanu klawisza  moŜe wyglądać następująco: 
 

typedef unsigned char byte; 
#define P1IN  *((byte *)0x20) 
#define P1OUT *((byte *)0x21) 
#define P1DIR *((byte *)0x22) 
// Definicje dotycz

ą

ce Watchdog timer 

#define WDTCL *((short *)0x120) 
#define WDTHOLD 0x0080 
#define WDTPW 0x5a00 
 
void main(void) 
{  

background image

  WDTCTL = WDTPW + WDTHOLD; // Zatrzymanie watchdog timera  
  P1DIR |= 0x02;            // Ustawienie bitu P1.1 na 1 (tryb wyj

ś

ciowy) 

  P1DIR &= ~0x01;           // Ustawienie bitu P1.0 na 0 (tryb wej

ś

ciowy) 

       
  while( 1==1 ) 
  { 
    if( (P1IN & 0x01) != 0) {       // Odczcytanie stanu bitu P1.0  
 

 // je

ś

li klawisz był naci

ś

ni

ę

ty ... 

      P1OUT = P1OUT | 0x02; 

 

// zga

ś

 diod

ę

 

    } else { 
      P1OUT = P1OUT & 0xfd;        // zapal diod

ę

 

    }     
  } 

 

2.3. Poł

ą

czenia portów w układzie EasyWeb2 

 

W układzie EasyWeb2 mamy do dyspozycji 4 klawisze, podłączone do portów P4.4 – 

P4.7 oraz 3 diody LED:  

 

Dioda status, podłączona do portu P2.1 

 

Dioda przyłączona równolegle z przekaźnikiem 1, podłączona do portu P1.5 (REL1) 

 

Dioda przyłączona równolegle z przekaźnikiem 2, podłączona do portu P1.6 (REL2) 

 

 

background image

 

 

Potrzebne definicje portów P1, P2 i P4 moŜna przygotować bazując na opisie w tabeli 1 lub 
dołączając zdefiniowany przez twórców plik nagłówkowy o nazwie msp430x14x.h 

#include msp430x14x.h 

2.4. Zadania 

 

1.

 

Zdefiniuj funkcje słuŜące do zapalania wybranej diody i do gaszenia wybranej diody. 

2.

 

Zdefiniuj funkcje słuŜące do cyklicznego zapalania i gaszenia wybranej diody z 
określonym interwałem czasowym. Opóźnienie dobierz doświadczalnie poprzez 
odpowiednią liczbę iteracji pustej pętli for. 

3.

 

Napisz dla układu EasyWeb2 program, który za pomocą trzech klawiszy będzie 
kontrolował zapalanie i gaszenie trzech diod. 

4.

 

Napisz dla układu EasyWeb2 program, działający w 2 trybach: konfiguracji i pracy. 

Klawisz 1 wybiera tryb działania (konfiguracja, praca) 
 

W trybie konfiguracji: 

 

 

2 klawisz wybiera aktywną diodę (jedna z trzech) 
3 klawisz wybiera tryb pracy aktywnej diody (włączona, wyłączona, 
bistabilna, astabilna, cykliczne zapalanie ) 

 

 

W trybie pracy 

 

 

 

2 klawisz aktywuje 1 diodę 

 

 

 

3 klawisz aktywuje 2 diodę 

 

 

 

4 klawisz aktywuje 3 diodę 

background image