23_25.pdf

(414 KB) Pobierz
32692485 UNPDF
P R O J E K T Y
16-bitowy port I 2 C
AVT-579
Projektując układy
z mikrokontrolerami, często
natrai amy na problem
niewystarczającej liczby portów,
jaką dysponuje upatrzony
procesor. Wyjściem z kłopotliwej
sytuacji może być zastosowanie
dodatkowego ekspandera
z interfejsem szeregowym.
Czytelnikom dobrze jest znany
układ PCF8574, posiadający port
8-bitowy z interfejsem I 2 C. Tym
razem proponujemy rozwiązanie
z układem MCP23016.
Rekomendacje: proponowany
układ rozwiązuje w bardzo
prosty sposób często spotykany
problem braku portów we/wy
w systemie mikroprocesorowym,
ponadto robi to nie zmniejszając
(w większości przypadków)
zasobów mikrokontrolera.
Przedstawiony w artykule
układ posiada dwa porty, a także
większe możliwości dopasowania
pracy portów do wymagań. Komu-
nikacja z układem odbywa się za
pośrednictwem magistrali I 2
z prędkością 0 do 400kHz.
Każda linia portów może
pracować jako wejściowa
lub wyjściowa. W trybie wyj-
ścia linie mogą być obciążane
prądem maksymalnym 25 mA,
zarówno dla stanu niskiego, jak
i wysokiego. Przy odczycie stanu
portów układ MCP23016 może
podać prosty lub zanegowany
stan występujący na danym wy-
prowadzeniu układu. Zmiana sta-
nu portu w trybie odczytu gene-
ruje przerwanie informujące układ
nadrzędny o tym fakcie. Ponadto
można wybrać koni gurację portów
typu „otwarty kolektor”.
Przedstawiony w artykule
układ posiada dwa porty, a także
większe możliwości dopasowania
pracy portów do wymagań. Komu-
nikacja z układem odbywa się za
2 C
lub wyjściowa. W trybie wyj-
ścia linie mogą być obciążane
prądem maksymalnym 25 mA,
zarówno dla stanu niskiego, jak
ją wejścia układu US1 do plusa
zasilania, w przypadku rozwarcia
danej zworki wymuszają jedynkę
logiczną. Na złącze CON1 zostały
wyprowadzone sygnały magistrali
I 2 C, przerwanie !INT oraz zasilanie,
natomiast na złącze CON2 wypro-
wadzenia portu GP0 i GP1.
Montaż
Układ dodatkowego portu za-
wiera niewiele elementów, dlatego
montaż nie sprawi problemów. Na-
leży go rozpocząć od wlutowania
rezystorów, podstawki pod układ
US1, następnie należy wlutować
kondensatory, a na końcu złącza
CON1 i CON2. Podłączenie ukła-
du do mikrokontrolera sterującego
należy wykonać zgodnie z opisem
sygnałów na złączu CON1.
Budowa
Schemat elektryczny dodatko-
wego portu jest przedstawiony na
rys . 1 . Do pracy układu MCP23016
wymagany jest zewnętrzny sygnał
zegarowy, który jest wytwarzany za
pomocą układu RC (rezystor R4,
kondensator C1). Podstawowy ad-
res, pod którym zgłasza się układ
US1 na magistrali I 2 C, jest równy
0100[A0][A1][A2]0b, gdzie A0, A1
i A2 są zależne od stanów linii
wejściowych układu. Do zmiany
adresu służą zworki JP1, JP2 i JP3.
Rezystory R1, R2, R3 podciąga-
Obsługa układu MCP23016
Ponieważ układ MCP23016
posiada duże możliwości koni -
guracji, do ustalenia wymaganych
Rys. 1. Schemat elektryczny poru I 2 C
Elektronika Praktyczna 6/2004
23
16-bitowy port I 2 C
32692485.010.png 32692485.011.png 32692485.012.png 32692485.013.png 32692485.001.png 32692485.002.png 32692485.003.png 32692485.004.png
16-bitowy port I 2 C
parametrów pracy zastosowano 12
wewnętrznych rejestrów, umożli-
wiających określenie trybu pracy
portów, zapisu i odczytu danych.
Wykaz wszystkich rejestrów oraz
przyporządkowane im adresy znaj-
dują się w tab . 1 .
danych do rejestrów OLAT0
i OLAT1 powoduje wystawie-
nie wpisanych danych na por-
ty GP0 i GP1.
3. Rejestry IPOL0 i IPOL1 umoż-
liwiają odwrócenie polaryzacji
danych wejściowych z portów
GP0 i GP1. Jeśli bit rejestru
jest wyzerowany, to odczyt
z odpowiadającego mu wejścia
portu GP0 (GP1) będzie odpo-
wiadał jego faktycznemu sta-
nowi. Jeżeli bit rejestru IPOL0
(IPOL1) będzie ustawiony, to
odczyt odpowiadającego bitu
z portu GP0 (GP1) będzie za-
negowany.
4. Rejestry IODIR0 i IODIR1 słu-
żą do ustawienia portów GP0
i GP1 w tryb wejściowy lub
wyjściowy. Jeśli bit rejestru
IODIR0 (IODIR1) jest ustawio-
ny, to odpowiadająca mu linia
portu GP0 (GP1) jest skoni-
gurowana jako wejściowa, jeśli
bit będzie wyzerowany, to linia
portu będzie skonigurowana
do pracy jako wyjście.
Tab. 1. Adresy rejestrów układu
MCP23016
Adres
00h GP0
01h GP1
02h OLAT0
03h OLAT1
04h IPOL0
05h IPOL1
06h IODIR0
07h IODIR1
08h INTCAP0 (tylko do odczytu}
09h INTAP1 (tylko do odczytu)
0Ah IOCON0
0Bh IOCON1
Funkcje rejestrów
1. Rejestry GP0 i GP1 służą do
odczytu danych z portów od-
powiednio GP0 i GP1. Poprzez
odczyt tych rejestrów można
sprawdzić stan linii portów
GP0 i GP1. Dodatkowo zapis
do tych rejestrów powoduje
modyikację rejestrów (OLAT0,
OLAT1), a wpisane dane poja-
wiają się na wyjściach portów
GP0 i GP1.
2. Rejestry OLAT0 i OLAT1 służą
do zapisu danych do wyjścio-
wych rejestrów (Latch) portów
GP0 i GP1. Odczyt z tych
rejestrów zwraca wartość tych
rejestrów – nie odpowiada
aktualnym stanom panującym
na portach GP0 i GP1. Zapis
5. Rejestry INTCAP0 i INCAP1
służą do wykrywania źródła
przerwania wygenerowanego na
wyjściu !INT. Odczyt tych re-
jestrów informuje o tym, które
linie portu GP0 (GP1) uległy
zmianie i wywołały przerwanie.
6. Rejestr IOCON0 zawiera tylko
jeden znaczący bit (IOCON0.0),
służący do kontroli szybkości
detekcji zmian na wejściu por-
tów GP0 i GP1. Jeśli bit ten
jest wyzerowany, to maksymal-
ny czas wykrycia zmiany na
portach wynosi 32 ms. Jeżeli
bit zostanie ustawiony, to mak-
symalny czas wykrycia zmian
wyniesie 200 ns.
List.1 Procedury do obsługi układu MCP23016
#deine address 0x40 //adres ukladu I2C
char temp1,temp2;
//**************************************************************//
// Procedura zapisu dwoch bajtow od podanego adresu //
//**************************************************************//
void WriteToMCP(char cmd, char data1, char data2)
{ delay_us(30); //pauza 30us
i2c_start(); //I2C START
delay_us(30);
i2c_write(address); //wyslij adres ukladu I2C
delay_us(30);
i2c_write(cmd); //wyślij adres komendy
delay_us(30);
i2c_write(data1); //wyslij pierwszy bajt danych
delay_us(30);
i2c_write(data2); //wyslij drugi bajt danych
delay_us(30);
i2c_stop();//I2C STOP
}
//**************************************************************//
//**************************************************************//
// Procedura odczytu dwoch bajtow od podanego adresu //
//**************************************************************//
void ReadFromMCP(char cmd)
{
delay_us(30); //pauza 30us
i2c_start(); //I2C START
delay_us(30);
i2c_write(address); //wyslij adres ukladu I2C
delay_us(30);
i2c_write(cmd); //wyslij adres komendy
delay_us(30);
i2c_start(); //ponowny I2C START
delay_us(30);
i2c_write(address|1);//wysli adres ukladu I2C START
delay_us(30); //i przelacz na odczyt
temp1=i2c_read(); //odbierz pierwszy bajt +ACK(potwierdzenie)
delay_us(30); //i zapisz do temp1
temp2=i2c_read(0); //odbierz drugi bajt bez potwierdzenia
delay_us(30); //i zapisz do temp1
i2c_stop();// I2C STOP
}
//**************************************************************//
void main()
{
delay_ms(750); //pauza potrzebna do inicjalizacji MCP23016
WriteToMCP(0x02,0x00,0x00); //wyzeruj porty GP0, GP1
WriteToMCP(0x06,0x00,0xFF); //port GP0 jako wyjscie, GP1 jako wejscie
while(1)
{
ReadFromMCP(0x00); //odczytaj stan portow GP0,GP1
delay_ms(40);
WriteToMCP(0x02,temp2,temp1); //i zapisz stan GP0 do GP1, GP1 do GP0
}
}
//*************************************************************//
Procedury
Komunikacja z układem MCP23016
odbywa się według specyika-
cji I 2 C z jednym ograniczeniem
– po każdej komendzie należy
odczekać około 30 ms, gdyż po
odebraniu komendy układ inter-
pretuje ją i wysłanie kolejnych
danych przed tym czasem może
spowodować błędną pracę układu.
Procedury komunikacji z układem
MCP23016 przedstawione są na
list . 1 . Wszystkie rejestry grupo-
wane są w dwa bajty, z których
pierwszy zawsze dotyczy portu
GP0, drugi portu GP1. Funkcja
o nazwie
WriteToMCP(char cmd, char
data1, char data2)
umożliwia zapis do układu dwóch
bajtów danych, począwszy od ad-
resu podanego jako parametr.
Funkcja ReadFromMCP(char cmd)
odczytuje natomiast dwa bajty
danych z układu, począwszy od
podanego adresu i zapisuje je
w zmiennych temp1 i temp2 .
24
Elektronika Praktyczna 6/2004
Rejestr
32692485.005.png 32692485.006.png 32692485.007.png
16-bitowy port I 2 C
Rys. 2. Rozmieszczenie elementów
na płytce drukowanej
nie spowoduje zmiany stanów na
portach GP0 i GP1, gdyż po włą-
czeniu zasilania są one ustawione
jako wejścia. Następna komenda
ustala dopiero tryb pracy portów,
i tak do rejestru IODIR0 zostaje
wpisana wartość 00h (cały port
GP0 pracuje jako wyjście), a do
rejestru IODIR1 wartość FFh (cały
port GP1 pracuje jako wejście).
Po skonigurowaniu portów nastę-
puje cykliczne odczytywanie stanu
portu GP1 i zapis tego stanu do
portu GP0. Zarówno odczyt, jak
i zapis wykonywany jest na reje-
strach obu portów, jednak odczyt
stanu portu GP0 jest ignorowany,
natomiast zapis danych do portu
GP1 nie powoduje na nim żad-
nych zmian, gdyż znajduje się on
w trybie wejściowym. Przedstawio-
ne procedury można zmodyiko-
wać według potrzeb, na przykład
wykonując jednocześnie operacje
tylko na jednym rejestrze. W tym
celu zamiast wysyłać i odbierać
jednocześnie dane dotyczące oby-
dwu portów, można wysłać tylko
adres rejestru i bajt danych, jaki
WYKAZ ELEMENTÓW
Rezystory
R1...R3: 10k V
R4: 3,9k V
Kondensatory
C1: 33pF
C2: 100nF
Półprzewodniki
US1: MCP23016
Inne
JP1...JP3: goldpin 1x2 + zworka
CON1: goldpin 1x5
CON2: goldpin 1x17
Podstawka DIP28 300mils
Do sprawdzenia pracy układu
służą polecenia zawarte w funkcji
main() , w której dla przedstawio-
nego przypadku odczytywany jest
stan portu GP1 i zapisywany do
portu GP0, do sprawdzenia po-
prawności działania można zastoso-
wać diodę świecącą i mikrowyłącz-
nik, przedstawione na rys. 1. Po
włączeniu zasilania należy odcze-
kać około 750 ms, aż wewnętrzny
układ zerujący układu MCP23016
uruchomi prace oscylatora, dopie-
ro po tym czasie można wysyłać
komendy do układu. Jako pierwsze
zostanie wydane polecenie wyzero-
wania portów. Jest to zrealizowane
przez wpisanie do rejestrów OLAT0
i OLAT1 wartości 00h. Wpis ten
ma być do niego wpisany. W ten
sposób skróci się czas przesyłania
danych w przypadku, gdy modyi-
kacji wymaga rejestr tylko jednego
portu.
Krzysztof Pławsiuk, EP
krzysztof.plawsiuk@ep.com.pl
Wzory płytek drukowanych w for-
macie PDF są dostępne w Internecie
pod adresem: pcb.ep.com.pl oraz na
płycie CD-EP6/2004B w katalogu PCB .
Elektronika Praktyczna 6/2004
25
32692485.008.png 32692485.009.png
Zgłoś jeśli naruszono regulamin