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
[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
[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
0
1
0
1
0
1
0
1
0x02
0
0
0
0
0
0
1
0
P1DIR |= 0x02
0
1
0
1
0
1
1
1
Operacja
P1DIR = 0x02
Bit
P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0
P1DIR
0
1
0
1
0
1
0
1
0x02
0
0
0
0
0
0
1
0
P1DIR = 0x02
0
0
0
0
0
0
1
1
Operacja „
&=”
jest funkcją bitowego
and
wykonanego na zawartości rejestru P1DIR.
Operacja ta, także nie zmienia stanu innych bitów.
Bit
P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0
P1DIR
0
1
0
1
0
1
0
1
0x01
0
0
0
0
0
0
0
1
~0x01
1
1
1
1
1
1
1
0
P1DIR &= ~0x01
0
1
0
1
0
1
0
0
[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)
{
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)
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ę