Interfejs I2C slave w AVR - BascomAVR.pdf

(528 KB) Pobierz
686083815 UNPDF
NotatNik koNstruktora
w mikrokontrolerach AVR
Zaprojektowany przez Philipsa interfejs I 2 C pozwala prowadzić
komunikację pomiędzy inteligentnymi modułami, a  nawet
pojedynczymi układami systemów cyfrowych, przy wykorzystaniu
bardzo prostej, dwuprzewodowej magistrali szeregowej. Interfejs ten
stał się jednym z  najbardziej popularnych standardów stosowanych
przez wielu światowych producentów, choć z  przyczyn licencyjnych
nie zawsze występuje jako I 2 C.
Rekomendacje: przykłady przedstawione w  artykule należy
traktować jako wskazówkę i  inspirację przydatną podczas realizacji
własnych projektów.
Dodatkowe materiały na CD i FtP:
host: ep.com.pl , user: 12235 , pass: 60u61csy
• listingi do artykułu
widłowe przesłanie bajtu danych jest sygnali-
zowane sekwencją potwierdzenia (ACK).
Urządzenia konstruowane współcześnie
najczęściej budowane są jako zespół spe-
cjalizowanych bloków połączonych ze sobą
w jeden system. Każdy z takich bloków reali-
zuje przydzieloną mu funkcję, a wszystkim
steruje najczęściej mikrokontroler. Aby urzą-
dzenie takie mogło działać prawidłowo, ko-
nieczne jest komunikowanie się między sobą
poszczególnych bloków, czasami bezpośred-
nio, czasami poprzez nadzorujący mikrokon-
troler. Do prowadzenia takiej łączności moż-
na stosować wiele istniejących standardów.
Jednym z najlepszych w tym zakresie jest
I 2 C. W celu uniknięcia chaosu jeden z tych
bloków pełni funkcję master, pozostałe bloki
(każdy z nich może zawierać własny mikro-
kontroler) są podporządkowane.
Wiele specjalizowanych układów ma
fabrycznie zaimplementowany interfejs I 2 C,
pracujący najczęściej jako slave. Nie zawsze
jednak układy takie nadają się do bezpośred-
niego zastosowania w danym urządzeniu.
Jednym ze sposobów poradzenia sobie z tego
typu problemami może być implementacja
podrzędnego interfejsu I 2 C w mikrokontro-
lerze. Dzięki takiemu rozwiązaniu (głównie
dzięki możliwości dość swobodnego przy-
stosowania oprogramowania) można uzy-
skać dowolny algorytm działania układu
podrzędnego.
Poniżej zostanie przedstawiona progra-
mowa oraz sprzętowa implementacja pod-
rzędnego interfejsu I 2 C w zasobach mikrokon-
trolera AVR. Należy zwrócić uwagę na to, że
niektóre mikrokontrolery AVR mają wbudo-
wany interfejs I 2 C (nazywany przez i rmę At-
mel – TWI), mogący pracować jako układ nad-
rzędny lub podrzędny. Programowy interfejs
I 2 C slave można wykorzystywać zwłaszcza
w małych mikrokontrolera niezawierających
sprzętowego TWI. Zostaną przedstawione
przykłady realizacji układu slave, z którego
układ nadrzędny może odczytać stan dwóch
linii wejściowych portu, wysłać do niego stan
dwóch linii wyjściowych portu, odczytać
wartość napięcia zmierzoną przez przetwor-
nik A/C układu slave oraz wysłać do niego
wartość wypełnienia generowanego przebie-
gu PWM również przez układ slave. Obie
realizacje, programowa i  sprzętowa, będą
Sposób dołączania układów do magistrali
I 2 C pokazano na rys. 1 . Układy mogą praco-
wać w trybach master (nadrzędnym) lub slave
(podrzędnym). Układ master steruje transmi-
sją, slave tylko transmituje dane w odpowie-
dzi na rozkazy układu nadrzędnego. W jednej
magistrali I 2 C może pracować kilka układów
nadrzędnych i podrzędnych. Stosowane są
dwa standardy interfejsu – pierwszy przewi-
duje prowadzenie transmisji z prędkościami
do 100 kbit/s (tryb normalny), w drugim pręd-
kość transmisji może dochodzić do 400 kbit/s
(tryb szybki). Dopuszczalna długość połączeń
oraz prędkość transmisji ograniczone są po-
jemnościami pasożytniczymi występującymi
w magistrali. Do transmisji używa się dwóch
linii: SDA – linia danych i SCL – linia zega-
rowa. Każdy układ slave z magistralą I 2 C jest
rozpoznawany przez unikatowy adres, nie-
zależnie od tego, czy jest to mikrokontroler,
pamięć, czy inny układ. Obydwie linie (SDA
i SCL) są liniami dwukierunkowymi i muszą
być podciągane do plusa zasilania przez rezy-
story zewnętrzne (rys. 1 ) . Ich rezystancja wy-
nosi zazwyczaj 4,7 kV. W stanie spoczynku
(gdy dane nie są przesyłane) na obu liniach
występuje wysoki poziom logiczny. Dane
przesyłane magistralą I 2 C są 8-bitowe. Każda
wymiana danych rozpoczyna się sekwencją
startu, a kończy sekwencją stopu. Każde pra-
rys. 1. Łączenie układów do magistrali i 2 C
rys. 2. Przykładowy schemat układu i 2 C slave
78
ELEKTRONIKA PRAKTYCZNA 12/2009
Interfejs I 2 C slave
686083815.085.png 686083815.096.png 686083815.107.png 686083815.118.png 686083815.001.png 686083815.012.png 686083815.023.png 686083815.034.png 686083815.040.png 686083815.041.png 686083815.042.png 686083815.043.png 686083815.044.png 686083815.045.png 686083815.046.png 686083815.047.png 686083815.048.png 686083815.049.png 686083815.050.png 686083815.051.png 686083815.052.png 686083815.053.png 686083815.054.png 686083815.055.png 686083815.056.png 686083815.057.png 686083815.058.png 686083815.059.png 686083815.060.png 686083815.061.png 686083815.062.png 686083815.063.png 686083815.064.png 686083815.065.png 686083815.066.png 686083815.067.png 686083815.068.png 686083815.069.png 686083815.070.png 686083815.071.png 686083815.072.png 686083815.073.png 686083815.074.png 686083815.075.png 686083815.076.png 686083815.077.png 686083815.078.png 686083815.079.png
Interfejs I 2 C slave w mikrokontrolerach AVR
identyczne pod względem funkcjonalnym.
Przykłady interfejsu slave w  mikrokontro-
lera AVR zostaną przedstawione w oparciu
o oprogramowanie BASCOM AVR. Pokazana
zostanie również programowa i  sprzętowa
realizacja układu master z  interfejsem I 2 C
zaimplementowanego w  zasoby mikrokon-
trolera. Będzie on odczytywać z układu slave
stan linii wejściowych portu i zapisywać je
do linii wyjściowych układu slave. Układ ten
będzie również odczytaną z przetwornika A/C
wartość wysyłał do układu slave, traktując ją
jako wartość wypełnienia przebiegu PWM ge-
nerowanego przez układ slave. Odczytywane
wartości z układu slave będą wyświetlane na
wyświetlaczu LCD dołączonym do mastera.
Komunikacja z układem slave będzie się od-
bywać z wykorzystaniem prostego protokołu,
składającego się z adresu układu slave, adre-
su komendy i odczytywanej lub zapisywanej
danej. Układ slave zrealizowany w oparciu
o mikrokontroler umożliwia także wybór jego
adresu, na który będzie odpowiadał układ.
nikacja z układem slave (odczyt i zapis da-
nych) może się odbywać za pomocą komend.
W przykładzie będą potrzebne 2 komendy,
które będą służyć do zapisu i odczytu sta-
nu portów mikrokontrolera oraz do odczytu
wartości z przetwornika A/C i zapisu war-
tości do generatora PWM. Przykładowe ko-
mendy dla opisywanego układu slave przed-
stawiono w  tab.   1 . Specyi kacja interfejsu I 2 C
umożliwia wykorzystanie jednej komendy
do zapisu i odczytu danych do różnych reje-
strów. Rodzaj operacji (zapis lub odczyt) jest
rozróżniany w adresie układu slave. W przy-
padku odczytu, adres układu slave jest o je-
den większy niż podczas zapisu danych
do układu. Przykładowo: jeśli adres zapisu
układu jest równy 64, to przy odczycie bę-
dzie wykorzystywany adres 65. Oczywiście
w przypadku interfejsu I 2 C należy wcześniej
zapisać do układu adres komendy, która bę-
dzie informowała układ Slave, którą wartość
rejestru ma wysłać do układu master. Na
list.   1 (wszystkie listingi zamieszczono na
CD-EP12/2009) pokazano przykład progra-
mowej realizacji interfejsu I 2 C slave. Do po-
prawnej pracy programowego interfejsu I 2 C
slave wymagana jest biblioteka i2cslave.lib .
Do koni guracji programowego interfejsu I 2 C
służy komenda CONFIG I2CSLAVE . Składnia
tej komendy jest następująca:
CONFIG I2CSLAVE = address , INT =
interrupt , TIMER = tmr
gdzie:
ADDRESS – adres układu slave, musi
być wartością parzystą (nieparzyste wartości
adresu służą do odczytu danych z układu
slave),
INT – domyślny parametr, który wskazu-
je na numer wykorzystywanego przerwania
(domyślnie wykorzystywane jest zewnętrzne
przerwanie INT0),
TIMER – domyślny parametr, który
wskazuje na numer wykorzystywanego time-
ra (domyślnie wykorzystywany jest Timer0).
Pomimo że nazwa wykorzystywanego
przerwania jak i timera może być dodatko-
wo podana, to aby skorzystać z innego prze-
rwania lub timera, należy przekonstruować
zawartość biblioteki i2cslave.lib . Użycie li-
nii PD.4 (T0), która jest wejściem Timera0
oraz linii PD.2 (INT0), która jest wejściem
zewnętrznego przerwania jako linii interfej-
su I 2 C slave, wymagane jest przez bibliote-
i2cslave . Timer oraz przerwanie INT0 są
wykorzystywane do realizacji programowego
interfejsu I 2 C Slave. Wynika z tego wniosek,
że programowy interfejs I 2 C slave będzie
działał tylko na tych mikrokontrolerach,
które mają przynajmniej wejścia T0 i INT0.
W programie z list. 1 w instrukcji confi g i2c-
slave został podany tylko adres, jaki ma mieć
układ podrzędny. Ustalono go na wartość
parzystą, równą 64. Kompilator automatycz-
nie generuje bajt _i2c_slave_address , w któ-
rym przechowywany jest adres układu sla-
ve. Zmieniając zawartość tego bajtu, można
zmienić adres układu slave. Zostało to wyko-
rzystane w przykładowym programie. Adres
układu slave został uzależniony od stanu li-
nii wejściowych PC1 i PC2 mikrokontrolera.
Zmianę adresu układu slave zrealizowano
w następujący sposób:
Adres_sl = Pinc And &B00000110
‚odczyt stanu linii PC1 i PC2
określających adres Slave
_i2c_slave_address = 64 + Adres_sl
‚zapis adresu Slave
tab.   2 pokazano możliwe do wyboru
wartości adresów w zależności od stanów
na liniach PC1 i PC2 mikrokontrolera. Ge-
nerowana jest także zmienna _i2c_slave_ad-
dress_received , w której jest przechowywa-
ny odebrany od układu master adres. Kod
biblioteki I 2 C slave wywołuje dwa podpro-
gramy, których zawartość należy samemu
przygotować i od której będzie zależeć dzia-
łanie układu slave. Jeśli układ Master żąda
odczytania bajtu, wtedy wywoływany jest
podprogram oznaczony etykietą I2c_master_
needs_data . Wysyłane dane do mastera na-
leży umieszczać w zmiennej _a1 , która jest
odzwierciedleniem rejestru R16 mikrokon-
trolera. W tym podprogramie umieszczono
kod, który umożliwia w zależności od wysła-
nej przez master komendy, odczytanie war-
tości z przetwornika A/C oraz stanu dwóch
linii portu PB. Jeśli układ master przesyła
dane, wtedy wywoływany jest podprogram
oznaczony etykietą I2c_master_has_data .
Przesyłane przez master dane są zapisywa-
ne w zmiennej _a1 . W tym podprogramie,
w ramach przykładu, odczytywane są dwie
wartości przesyłane przez master, które zo-
stają zapisane do tablicy. Pierwszą wartością
jest komenda, a drugą wartość zapisywana
do rejestru adresowanego otrzymaną komen-
dą. Gdy zostaną odebrane dwa bajty danych,
zapisanie wartości do dwóch linii wyjścio-
wych portu PB oraz generatora PWM na-
stępuje w programie głównym i jest zależne
od otrzymanej komendy (pierwszego bajtu).
W programie głównym, oprócz zapisu otrzy-
manych od układu master danych, następuje
również odczyt wartości z przetwornika A/C
i konwersja odczytanej wartości 10-bitowej
do postaci 8-bitowej. Jak można się prze-
konać, program układu slave nie jest zbyt
skomplikowany i można go w prosty sposób
rozbudować, dostosowując do własnych po-
trzeb. W przykładzie z układem slave będzie
się on komunikował z prostym układem ma-
ster, którego schemat pokazano na rys.   3 . Do
mikrokontrolera został dołączony jedynie
wyświetlacz LCD. Do magistrali I 2 C dołączo-
no wymagane rezystory podciągające R1, R2.
Potencjometr P1 umożliwia regulację kontra-
stu wyświetlacza. Na list.   2 przedstawiono
przykład programowej realizacji interfejsu
I 2 C master. Pierwszą operacją wykonywaną
w programie jest odczyt dwóch linii wejścio-
wych układu I 2 C slave. Ich stan jest następ-
nie wyświetlany w pierwszej linii wyświetla-
Programowa realizacja interfejsu
I 2 C slave
Na rys.   2 został pokazany przykładowy
schemat układu I 2 C slave. Porty, do których
zostały dołączone przyciski S1 i S2, są skon-
i gurowane jako wejściowe. Ich stan może
odczytywać układ master. Porty, do których
zostały dołączone diody D1 i D2, pracują
w trybie wyjściowym. Ich stanem również
może sterować układ master. Wejściowa li-
nia PC0 stanowi wejście 10-bitowego prze-
twornika A/C wbudowanego w mikrokon-
troler. Potencjometr P1 umożliwia zmianę
napięcia mierzonego przez przetwornik A/C.
Elementy L1, C1 i C2 są wymagane do zasila-
nia przetwornika A/C i związanego z nim na-
pięcia referencyjnego, które zostało ustalone
na wartość 5 V. Wyjście sterujące diodą D3
pracuje w trybie generatora PWM. Jasność
świecenia diody D3 będzie zależeć od wy-
pełnienia przebiegu PWM. Zworki JP1 i JP2
umożliwiają wybór adresu układu slave.
W przypadku programowej realizacji inter-
fejsu I 2 C, linia SCL jest dołączona do portu
PD4 mikrokontrolera, a linia SDA do PD2.
Taki wybór linii mikrokontrolera związany
jest z budową biblioteki i2cslave.lib znaj-
dującej się w pakiecie Bascom AVR. Komu-
Tab. 1. Komendy układu slave
Komenda
Adres
Odczyt Zapis
1 PB4, PB5 PB2, PB3
2 ADC PWM
Tab. 2. Adresy układu slave
A0 A1 Adres
0
0 64
1
0 66
0
1 68
1
1 70
ELEKTRONIKA PRAKTYCZNA 12/2009
79
686083815.080.png 686083815.081.png 686083815.082.png
 
NotatNik koNstruktora
cza LCD. Po przeliczeniu, stan linii wejścio-
wych jest wysyłany z powrotem do układu
slave i tu jest zapisywany do dwóch linii
wyjściowych. Naciśnięcie któregoś z przy-
cisków S1 lub S2 w układzie slave będzie
więc powodować zaświecenie diod LED
dołączonych do wyjść układu I 2 C slave.
W dalszej kolejności w programie odczy-
tywana jest wartość zmierzona przez prze-
twornik A/C. Po jej wyświetleniu w drugiej
linii wyświetlacza, jest ona z  powrotem
wysyłana do układu slave, gdzie jest zapi-
sywana do rejestru wypełnienia przebiegu
PWM. Ustawiając napięcie potencjometrem
P1 w układzie slave, można więc regulo-
wać jasność diody D3 sterowanej przebie-
giem PWM. Opisywany algorytm działania
układu master działa w pętli wykonywanej
co około 200 ms. Master komunikuje się
z układem slave, wykorzystując adres 64.
Adres 65 jest używany podczas odczytu
wartości z układu slave. Warto zauważyć,
że wartość zmiennej adres_c jest adresem
komendy zgodnym z tab. 1. Na rys.   4 poka-
zano format zapisu danych do układu I 2 C
slave. Wysyłane są kolejno: znacznik startu,
adres układu, kod komendy i wartość ko-
mendy. Na rys.   5 pokazano format odczytu
danych z układu slave. W tym przypadku
najpierw wysyła się znacznik startu, ad-
res slave do zapisu i komendę. Następnie
po ponownym wysłaniu znacznika startu
wysyłany jest adres odczytu z układu slave
i dalej można już odebrać wartość poprzed-
nio zaadresowaną wartością komendy. Od-
czyt danych z układu slave jest kończony
znacznikiem NACK, po którym następuje
znacznik stopu. Najmniej znaczący bit ad-
resu układu slave wskazuje, czy dane będą
zapisywane, czy odczytywane.
rys. 3. Przykładowy układ master
rys. 4. Format zapisu danych do układu i 2 C slave
rys. 5. Format odczytu danych z układu slave
Koniguracja sprzętowego interfejsu TWI tak,
aby pracował jako slave, umożliwia komen-
da CONFIG TWISLAVE , której składnia jest
następująca:
CONFIG TWISLAVE = address , BTR =
value , BITRATE = value SAVE=option
gdzie:
Addresss – parzysty adres układu sla-
ve,
BTR – liczba odbieranych danych (układ
slave będzie oczekiwał na podaną liczbę od-
bieranych danych),
Sprzętowa realizacja interfejsu I 2 C
slave
Niektóre większe mikrokontrolery AVR
wyposażono w moduł TWI, który jest zgod-
ny ze specyikacją I 2 C. Układ TWI umożliwia
pracę w trybie nadrzędnym oraz podrzęd-
nym, z prędkością transmisji do 400 kbps.
W przypadku sprzętowej realizacji interfej-
su I 2 C zostanie przedstawiony identyczny
przykład działania, jak w poprzednim przy-
kładzie interfejsu I 2 C zrealizowanego progra-
mowo. Przy sprzętowej realizacji interfejsu
I 2 C slave linie interfejsu I 2 C (w przypadku
mikrokontrolera ATmega8) są dołączone do
portów PC4 (SD) i PC5 (SC), co zostało za-
znaczone na schemacie z rys. 2. Na rys.   6
przedstawiono schemat blokowy sprzę-
towego interfejsu I 2 C (TWI). W jego skład
wchodzą: jednostka kontrolna interfejsu,
jednostka adresowa oraz generator prędkości
transmisji. Na list.   3 przedstawiono przykład
programu realizującego układ I 2 C slave z wy-
korzystaniem TWI. W Bascomie do tego celu
wymagana jest biblioteka i2c_twi–slave.lbx .
rys. 6. schemat blokowy sprzętowego interfejsu i 2 C (tWi)
80
ELEKTRONIKA PRAKTYCZNA 12/2009
686083815.083.png 686083815.084.png 686083815.086.png 686083815.087.png 686083815.088.png 686083815.089.png 686083815.090.png 686083815.091.png 686083815.092.png 686083815.093.png 686083815.094.png 686083815.095.png 686083815.097.png 686083815.098.png 686083815.099.png 686083815.100.png 686083815.101.png 686083815.102.png 686083815.103.png 686083815.104.png 686083815.105.png 686083815.106.png 686083815.108.png 686083815.109.png 686083815.110.png 686083815.111.png 686083815.112.png 686083815.113.png 686083815.114.png 686083815.115.png 686083815.116.png 686083815.117.png 686083815.119.png 686083815.120.png 686083815.121.png 686083815.122.png 686083815.123.png 686083815.124.png 686083815.125.png 686083815.126.png 686083815.127.png 686083815.128.png 686083815.002.png 686083815.003.png 686083815.004.png 686083815.005.png 686083815.006.png 686083815.007.png 686083815.008.png 686083815.009.png 686083815.010.png 686083815.011.png 686083815.013.png 686083815.014.png 686083815.015.png 686083815.016.png 686083815.017.png 686083815.018.png 686083815.019.png 686083815.020.png 686083815.021.png 686083815.022.png 686083815.024.png 686083815.025.png 686083815.026.png 686083815.027.png 686083815.028.png 686083815.029.png 686083815.030.png 686083815.031.png 686083815.032.png 686083815.033.png 686083815.035.png
 
Interfejs I 2 C slave w mikrokontrolerach AVR
BITRATE – wartość częstotliwości zegara
(100000 oznacza 100 kHz),
SAVE – informuje kompilator, czy pod-
czas przerwania mają być zapisywane reje-
stry mikrokontrolera.
Kompilator automatycznie tworzy
zmienne Twi , Twi_btr Twi_btw . Zmienna
Twi przechowuje otrzymany lub wysyłany
bajt danych. Zmienna Twi_btr jest indek-
sem otrzymanych danych. Za jej pomocą
można w prosty sposób otrzymywane dane
umieszczać w  tablicy. Zmienna Twi_btw
może być wykorzystywana do sprawdza-
nia, której wartości potrzebuje master.
Ponieważ w  TWI wykorzystywane jest
przerwanie, należy odblokować globalny
system przerwań. W przykładowym pro-
gramie koniguracja interfejsu TWI slave
jest następująca:
Conig Twislave = 64 , Btr = 1 , Bitrate
= 100000
Adres układu slave jest równy 64, ocze-
kiwany będzie jeden bajt danych, a często-
tliwość przebiegu zegarowego będzie równa
100 kHz. Adres układu slave jest przecho-
wywany w rejestrze Twar i za jego pomocą
można zmienić adres układu slave, który
w przykładzie jest zależny od linii PC1
i PC2 mikrokontrolera. Gdy master wysyła
dane, wywoływany jest podprogram Twi_
gotdata , w którym odbierane są dwa bajty
danych. Po zdekodowaniu są one następnie
w pętli głównej programu zapisywane albo
do rejestru PWM, albo linii wyjściowych
portu PB – w zależności od komendy. Gdy
master odczytuje dane z układu slave, wy-
woływany jest podprogram oznaczony ety-
kietą Twi_master_needs_byte . W zależności
od zapisanej komendy następuje w  nim
wysłanie do mastera stanów linii wejścio-
wych portu PB bądź zmierzonej wartości
przez przetwornik A/C. Zawartość pod-
programów wywoływanych przez interfejs
TWI jest prawie identyczna jak w przy-
padku procedur wywoływanych przez
programowy interfejs I 2 C slave. Sprzętowy
interfejs I 2 C slave wywołuje kilka innych
podprogramów, które zazwyczaj nie będą
wykorzystywane, a o których można się
więcej dowiedzieć z pomocy Bascom AVR.
Na list.   4 został przedstawiony przykład
sprzętowej realizacji układu I 2 C master.
W przypadku sprzętowej realizacji interfej-
su I 2 C pracującego jako master wymagana
jest koniguracja częstotliwości sygnału ze-
garowego sprzętowego interfejsu I 2 C (TWI).
Nie można również zapomnieć o konigu-
racji linii interfejsu I 2 C. Informacją dla
kompilatora, że będzie używany sprzętowy
interfejs I 2 C, jest załączenie w programie
biblioteki i2c_twi.lbx . Do koniguracji czę-
stotliwości zegara sprzętowego interfejsu
TWI służy instrukcja CONFIG TWI, której
parametrem jest częstotliwość linii zegaro-
wej. Wartość 100.000 będzie informować
o  częstotliwości 100  kHz. Częstotliwość
sygnału zegarowego magistrali I 2 C nie po-
winna być większa niż 400 kHz. Instrukcje
wykorzystywane do komunikacji z inter-
fejsem I 2 C slave są identyczne jak w przy-
padku programowej realizacji interfejsu I 2 C
master.
Podsumowanie
Wykorzystanie interfejsu I 2 C do połą-
czenia ze sobą kilku bloków urządzenia
jest wyborem prostym i tanim. W małych
mikrokontrolerach AVR z wejściami INT0
i T0, ale niemających interfejsu TWI, moż-
na zastosować programowy interfejs I 2 C
slave lub master. W większych mikrokon-
trolerach AVR, choćby z rodziny ATmega,
bez problemu można wykorzystać zawarty
w nich blok TWI pracujący w koniguracji
slave. Dzięki implementacji interfejsu I 2 C
slave w mikrokontrolerach, można zbudo-
wać układ podrzędny, który w elastyczny
sposób będzie mógł być dostosowany do
własnych potrzeb.
Marcin Wiązania, EP
marcin.wiazania@ep.com.pl
R
E
K
L
A
M
A
ELEKTRONIKA PRAKTYCZNA 12/2009
81
686083815.036.png 686083815.037.png 686083815.038.png 686083815.039.png
Zgłoś jeśli naruszono regulamin