STM32 Migracja do Standard Peripheral Library wer 3 1 0
KURS STM32 Migracja do Standard Peripheral Library wer. 3.1.0 We wczeÅ›niejszych numerach EP wielokrotnie przedstawiane byÅ‚y szej części artykuÅ‚u. Poniżej przedstawione informacje mogÄ… być przydatne podczas mi- aplikacje pisane dla mikrokontrolerów STM32 z wykorzystaniem gracji do nowej wersji biblioteki. biblioteki API dostarczanej przez ST Microelectronics. Jednak w myÅ›l Biblioteka FWLib jest podzielona na słów: kto nie idzie naprzód, ten siÄ™ cofa firma ST przygotowaÅ‚a wiele plików, każdy jest odpowiedzialny nowÄ… wersjÄ™ biblioteki. W artykule przedstawiono skrótowo na obsÅ‚ugÄ™ jakiegoÅ› elementu systemu mi- informacje dotyczÄ…ce zarówno starszej wersji biblioteki (V2.0.3), oraz kroprocesorowego (ukÅ‚adu peryferyjnego). szczegółowej nowej wersji 3.1.0. Omówiono ponadto sposób Na przykÅ‚ad plik stm32f10x_usart.c zawiera migracji projektu ze starej wersji biblioteki do nowej. wszystkie niezbÄ™dne funkcje do skonfigu- rowania portu USART oraz do nawiÄ…zania Operowanie bezpoÅ›rednio na rejestrach dobrej znajomoÅ›ci architektury mikrokon- komunikacji. Plików bibliotecznych nie jakiekolwiek 32 bitowego procesora lub mi- trolera. Firma ST Microelectronics zauwa- edytujemy, jedynie w nagłówkowym pliku krokontrolera nie należy do zadaÅ„ Å‚atwych. żyÅ‚a ten problem i udostÄ™pnia kompletne stm32f10x_conf.h, używajÄ…c komentarzy Mimo, iż samo napisanie (nawet stosunko- biblioteki API, które pozwalajÄ… na peÅ‚nÄ… można wÅ‚Ä…czać lub wyÅ‚Ä…czać obsÅ‚ugÄ™ po- wo zaawansowanych) aplikacji przy użyciu kontrolÄ™ nad mikrokontrolerami STM32. szczególnych urzÄ…dzeÅ„. Ważnym elemen- nazw rejestrów jest możliwe, to wprowa- W pewnych przypadkach może oczywiÅ›cie tem biblioteki FWLib jest plik stm32f10x_ dzanie zmian do istniejÄ…cego kodu po upÅ‚y- zajść potrzeba bezpoÅ›redniego odwoÅ‚ania it.c, w którym umieszczane sÄ… wszystkie wie na przykÅ‚ad kilku miesiÄ™cy, dodatkowo siÄ™ do rejestru, we wszystkich pozostaÅ‚ych funkcje obsÅ‚ugi przerwaÅ„. przez osobÄ™, która nie jest autorem progra- funkcje API znacznie skracajÄ… czas potrzeb- mu, jest w zasadzie niemożliwe do wyko- ny na napisanie i uruchomienie aplikacji. CMSIS nania w sensownym czasie. Z powyższych Biblioteka STM32F10x Standard Periphe- wzglÄ™dów, jeÅ›li to możliwe, czyli np. czas STM32F10x firmware library rals Library V3.1.0 wykorzystuje standard wykonania kodu nie jest krytyczny, pro- V2.0.3 CMSIS, a wiÄ™c warto siÄ™ nieco z nim zapo- gramiÅ›ci wykorzystujÄ… funkcje o mniej, lub Biblioteka firmy STMicroelectronics dla znać. Standard CMSIS (Cortex Microcontrol- bardziej kojarzÄ…cych siÄ™ nazwach, do opera- mikrokontrolerów STM32 w wersji V2.0.3 ler Software Interface Standard) jest to uni- cji czÄ™sto na zespoÅ‚ach wielu rejestrów. (FWLib) zostaÅ‚a zastÄ…piona przez nowszÄ… wersalny interfejs programowy, stworzony Jeżeli mamy do czynienia z bardzo wersjÄ™ i nie jest już dalej rozwijana. Mimo to, przez firmÄ™ ARM, który umożliwia komuni- skomplikowanym projektem, wykorzystu- nadal można ze strony producenta pobrać tÄ™ kacjÄ™ z peryferiami i rdzeniem Cortex za po- jÄ…cym wiele peryferiów mikrokontrolera, wersjÄ™ biblioteki, jednak tworzÄ…c nowy pro- mocÄ… ustandaryzowanych funkcji i definicji. to napisanie stosownych funkcji jest praco- jekt należy już raczej skorzystać z nowszej CMSIS dostarcza mechanizmów do obsÅ‚ugi i czasochÅ‚onne, ponadto wymaga bardzo wersji 3.1.0, która zostaÅ‚a omówiona w dal- ukÅ‚adów peryferyjnych, systemów opera- cyjnych czasu rzeczywistego oraz aplikacji wykorzystujÄ…cych interfejsy komunikacyjne: Ethernet, UART oraz SPI. StrukturÄ™ interfejsu CMSIS i jego miejsce w aplikacji przedstawiono na rys. 1. CMSIS ma docelowo obejmować caÅ‚a rodzinÄ™ rdze- ni z grupy Cortex-M, natomiast na chwilÄ™ obecnÄ… jest dostosowany do rdzeni Cortex -M0, oraz Cortex-M3. Ustandaryzowane in- terfejsu dostÄ™pu do ukÅ‚adów peryferyjnych oraz samego rdzenia ma na celu uÅ‚atwienie przenoszenia aplikacji pomiÄ™dzy mikrokon- trolerami różnych producentów, jak również uproszczenie procesu tworzenia aplikacji. Standard CMSIS zostaÅ‚ podzielony na dwie podstawowe warstwy: Core Peripheral Access Layer oraz Middleware Access Layer. Pierwsza warstwa zawiera definicje nazw oraz umożliwia dostÄ™p do rejestrów rdzenia oraz urzÄ…dzeÅ„ peryferyjnych, natomiast dru- ga udostÄ™pnia mechanizmy do współpracy Rys. 1. Budowa interfejsu CMSIS i jego miejsce w aplikacji z interfejsami komunikacyjnymi. 100 ELEKTRONIKA PRAKTYCZNA 10/2009 Migracja do Standard Peripheral Library zbudowanego w oparciu o szablon projektu dla Å›rodowiska µVision przedstawiono na rys. 2. JeÅ›li szablon projektu zostanie skopiowa- ny do innego katalogu, to należy poinformo- wać kompilator, gdzie ma szukać stosownych plików oraz należy dodać wykorzystywane zródÅ‚a do projektu. Dokonujemy tego (w Å›ro- dowisku µVision) poprzez prawe klikniÄ™cie na nazwie projektu i wybór z menu kontek- stowego opcji Manage Components patrz rys. 2. NastÄ™pnie odszukujemy na dysku wÅ‚a- Å›ciwe pliki i je dodajemy. Rys. 2. Struktura plików Å›rodowiska Jak wyżej wspomniano, aby projekt µVision dla projektu wykorzystujÄ…cego poprawnie siÄ™ kompilowaÅ‚, należy zaktu- przetwornik A/C alizować miejsca (Å›cieżeki), gdzie kompi- lator bÄ™dzie szukaÅ‚ plików nagłówkowych Dodatkowo, wymienione wyżej warstwy *.h. W tym celu wybieramy menu Project/ zostaÅ‚y rozszerzone przez producentów mi- Options for Target& , po czym otworzy siÄ™ krokontrolerów, którzy współpracowali przy okno, w którym na zakÅ‚adce C/C++ edy- tworzeniu CMSIS, o dwie warstwy : Device tujemy Å›cieżkÄ™ poszukiwania plików na- Peripheral Access Layer oraz Access Func- główkowych. W ten sposób przygotowany tions for Peripherals. projekt, jeÅ›li kod aplikacji jest pozbawiony bÅ‚Ä™dów, powinien siÄ™ bez bÅ‚Ä™dów zbudować STM32F10x standard peripheral i zaÅ‚adować do pamiÄ™ci mikrokontrolera. library V3.1.0 Szybkie rozpoczÄ™cie pracy z mikrokon- Biblioteka STM32F10x Standard Periph- trolerami STM32 znacznie uÅ‚atwiajÄ… doÅ‚Ä…czo- erals Library v3.1.0. (StdPeriph_Lib) zostaÅ‚a ne do biblioteki StdPeriph_Lib przykÅ‚adowe napisana zgodnie z formatem Doxygen, co aplikacje, które pozwalajÄ… w krótkim czasie Rys. 4. Struktura moduÅ‚u STM32F10x_ znacznie upraszcza proces tworzenia doku- zapoznać siÄ™ z możliwoÅ›ciami tych ukÅ‚adów. StdPeriph_Driver mentacji oraz jej używanie. Cala dokumenta- cja omawianej biblioteki zostaÅ‚a umieszczo- Struktura biblioteki StdPeriph_ trzy dla trzech najpopularniejszych kompi- na w pliku pomocy, a nie, jak byÅ‚o to dotych- Lib latorów: Keil, IAR oraz GCC. czas praktykowane przez STMicroelectro- Pliki w bibliotece API zostaÅ‚y podzie- Plik system_stm32f10x.c zawiera defini- nics, w pliku pdf. Nowy sposób dostarczania lone na dwa bloki (moduÅ‚y). SÄ… to katalogi cje i funkcje, które mogÄ… być wykorzystane dokumentacji uÅ‚atwiÅ‚ przeglÄ…danie jej zawar- STM32F10x_StdPeriph_Driver oraz CMSIS. do konfiguracji sygnaÅ‚u zegarowego mikro- toÅ›ci, oraz wyszukiwanie informacji. Drzewo plików i katalogów moduÅ‚u CMSIS kontrolera. KorzystajÄ…c z funkcji zawartych Wraz z archiwum biblioteki StdPeriph_Lib biblioteki Standard Peripherals Library po- w pliku należy w pierwszej kolejnoÅ›ci wy- otrzymujemy szablony projektów do trzech kazano na rys. 3, natomiast drzewo moduÅ‚u brać, używajÄ…c komentarzy, z jakÄ… czÄ™stotli- najpopularniejszych kompilatorów (Å›rodo- STM32F10x_StdPeriph_Driver na rys. 4. woÅ›ciÄ… MCU ma pracować. Fragment, który wisk), a sÄ… to: IAR, Keil oraz darmowy kompi- Dla każdej z rodzin mikrokontrolerów należy w tym celu edytować zostaÅ‚ przed- lator GCC. Programista jest zatem zwolniony STM32 zostaÅ‚y przygotowane oddzielne pli- stawiony na list. 1. W kodzie aplikacji wy- z obowiÄ…zku samodzielnego tworzenia projek- ki startowe. W tab. 1 przedstawiono, który starczy teraz wywoÅ‚ać funkcjÄ™ SystemInit(), tu od podstaw. Struktura plików projektu, dla plik startowy należy wykorzystać z jakÄ… ro- a jej wykonanie spowoduje skonfigurowanie przykÅ‚adu wykorzystujÄ…cego przetwornik A/C, dzinÄ… STM32. Takich zestawów plików star- wszystkich sygnałów zegarowych (zegar sys- towych otrzymujemy wraz z bibliotekÄ… API temowy, HCLK, PCLK2, PCLK1). Do moduÅ‚u STM32F10x_StdPeriph_Dri- ver należą pliki, które, wzorem starszej wer- List. 1. Fragment pliku system_ stm32f10x.c definicje czÄ™stotliwoÅ›ci sji biblioteki V2.0.3, zgodnie ze swojÄ… nazwÄ… zegara systemowego, wykorzystywane zawierajÄ… funkcje API zwiÄ…zane z poszcze- przez funkcjÄ™ SystemInit() gólnymi urzÄ…dzeniami peryferyjnymi patrz /* #define SYSCLK_FREQ_HSE HSE_ Value */ rys. 4. Tych plików bibliotecznych nie nale- /* #define SYSCLK_FREQ_24MHz ży edytować. 24000000 */ /* #define SYSCLK_FREQ_36MHz Do każdego projektu sÄ… doÅ‚Ä…czone jesz- 36000000 */ /* #define SYSCLK_FREQ_48MHz cze dwa istotne pliki: stm32f10x_conf.h oraz 48000000 */ stm32f10x_it.c. W pierwszym pliku nagłów- /* #define SYSCLK_FREQ_56MHz 56000000 */ kowym za pomocÄ… komentarzy wÅ‚Ä…czamy #define SYSCLK_FREQ_72MHz 72000000 lub wyÅ‚Ä…czamy doÅ‚Ä…czanie do projektu pli- ków nagłówkowych z moduÅ‚u STM32F10x_ Tab. 1. Pliki startowe dla poszczegól- StdPeriph_Driver patrz list. 2. nych rodzin mikrokontrolerów STM32 Z punktu widzenia programisty jednym Plik Rodzina STM32 z najważniejszych plików jest stm32f10x_ startup_stm32f10x_cl.s Connectivity line it.c, w którym umieszcza siÄ™ wszystkie funk- startup_stm32f10x_hd.s High Density cje obsÅ‚ugi przerwaÅ„. Jego nieco zedytowa- startup_stm32f10x_ld.s Low Density ny fragment wraz z pustymi funkcjami jest startup_stm32f10x_md.s Medium Density Rys. 3. Struktura moduÅ‚u CMSIS przestawiony na list. 3. Jak widać, jest to ELEKTRONIKA PRAKTYCZNA 10/2009 101 KURS okreÅ›lonego zdarzenia. Takie podejÅ›cie spra- List. 2. Obszar pliku stm32f10x_conf.h, List. 5. Konfiguracja timera SysTick w którym za pomocÄ… komentarzy wiÅ‚o, że projekt jest przejrzysty, a obsÅ‚uga z wykorzystaniem biblioteki STM32F10x wÅ‚Ä…cza siÄ™ lub wyÅ‚Ä…cza doÅ‚Ä…czanie firmware library wszystkich wyjÄ…tków znajduje siÄ™ w jednym // SysTick bedzie taktowany z f = plików nagłówkowych pliku i nie ma potrzeby, jak to zwykle bywa, // 72MHz/8 = 9MHz /* #include stm32f10x_adc.h */ SysTick_CLKSourceConfig(SysTick_ /* #include stm32f10x_bkp.h */ samodzielnego definiowania funkcji wy- CLKSource_HCLK_Div8); /* #include stm32f10x_can.h */ woÅ‚ywanych w chwili, gdy system wykryje /* #include stm32f10x_crc.h */ // Przerwanie ma byc co 1ms, f = /* #include stm32f10x_dac.h */ nadejÅ›cie przerwania. Znacznie upraszcza // 9MHz czyli liczy od 9000 /* #include stm32f10x_dbgmcu.h */ SysTick_SetReload(9000); #include stm32f10x_dma.h i przyÅ›piesza to prace nad projektem, jednak /* #include stm32f10x_exti.h */ nie należy zapominać, że aby tworzyć dobre /* #include stm32f10x_flash.h */ // Odblokowanie przerwania od timera /* #include stm32f10x_fsmc.h */ i niezawodne aplikacje to trzeba bardzo do- // SysTick #include stm32f10x_gpio.h SysTick_ITConfig(ENABLE); brze rozumieć to, co siÄ™ robi. /* #include stm32f10x_i2c.h */ /* #include stm32f10x_iwdg.h */ // Wlaczenie timera /* #include stm32f10x_pwr.h */ SysTick_CounterCmd(SysTick_Counter_ #include stm32f10x_rcc.h Migracja ze starszej wersji Enable); /* #include stm32f10x_rtc.h */ biblioteki STM32F10x firmware /* #include stm32f10x_sdio.h */ #include stm32f10x_spi.h library /* #include stm32f10x_tim.h */ Najistotniejsze zmiany w stosunku do /* #include stm32f10x_usart.h */ List. 6. Konfiguracja timera SysTick /* #include stm32f10x_wwdg.h */ poprzedniej wersji biblioteki API to kompa- z wykorzystaniem biblioteki STM32F10x /* #include misc.h */ Standard Peripherals Library tybilność nowej wersji z omówionym wyżej // SysTick bedzie taktowany standardem CMSIS. Z punktu widzenia pro- // z f = 72MHz/8 = 9MHz List. 3. Fragment pliku stm32f10x_it.c SysTick_CLKSourceConfig(SysTick_ gramisty, który wczeÅ›niej pracowaÅ‚ z biblio- void UsageFault_Handler(void) CLKSource_HCLK_Div8); { tekÄ… STM32F10x firmware library ważne jest, while (1) // Przerwanie ma byc co 1ms,f = {} że nowa wersja (z perspektywy wykorzysta- // 9MHz / 1000, czyli liczy od 9000 } if (SysTick_Config(SysTick_Frequency nia funkcji API) w sumie nie wiele różni siÄ™ / 1000)) void SVC_Handler(void) od swojej poprzedniczki. { { // W razie bledu petla Biblioteka STM32F10x Standard Periphe- } // nieskonczona while (1); rals Library zostaÅ‚a tak napisana, aby uaktu- void DebugMon_Handler(void) } { alnienie projektów wykorzystujÄ…cych starszÄ… } wersjÄ™ biblioteki (STM32F10x firmware library) void PendSV_Handler(void) nie nastrÄ™czaÅ‚o problemów. Ze strony interne- przeorganizowanie struktury plików biblio- { } towej firmy STMicroelectronics można pobrać teki. archiwum o nazwie an2953 zawierajÄ…ce apli- PrzykÅ‚adowy fragment kodu, napisa- void SysTick_Handler(void) { kacjÄ™ MigrationScript, która po uruchomieniu ny z wykorzystaniem starszej biblioteki } automatycznie zmienia kod w plikach tak, STM32F10x firmware library przedstawiono aby byÅ‚ możliwie jak najbardziej kompatybil- na list. 5, natomiast dla kontrastu na list. 6 zestaw pustych funkcji, które jeżeli wystÄ…pi ny z nowÄ… bibliotekÄ…. Niestety te fragmenty przedstawiono program napisany przy uży- odpowiednie przerwanie, sÄ… wywoÅ‚ywane. kodu, które wykorzystujÄ… funkcje caÅ‚kowicie ciu nowej biblioteki Standard Peripherals W stosunku do wersji tego pliku dostarczanej zmienione, lub usuniÄ™te w nowej bibliote- Library. Zadanie obydwu programów jest przez firmÄ™ STMicroelectronics zostaÅ‚y usu- ce STM32F10x Standard Peripherals Library identyczne i polega na skonfigurowaniu do niÄ™te komentarze, które jak pokazaÅ‚a prakty- należy edytować rÄ™cznie. Dotyczy to przede pracy systemowy timer SysTick. ka okazaÅ‚y siÄ™ w tym miejscu zbÄ™dne. Nazwa wszystkim systemowego timera SysTick. funkcji obsÅ‚ugi danego przerwania jest już Zmiany, jakie zostanÄ… wprowadzone do Konfiguracja urzÄ…dzeÅ„ sama w sobie dość wymowna. W efekcie kodu plików za pomocÄ… aplikacji Migration- peryferyjnych uzyskano bardziej zwiÄ™zÅ‚y kod, nie tracÄ…c Script, sÄ… opisane w pliku config.ini, a jego Dla każdego urzÄ…dzenia, czy jest to tym samym na jego czytelnoÅ›ci. fragment zostaÅ‚ przedstawiony na list. 4. GPIO, kontroler przerwaÅ„, czy jakikolwiek Zadaniem dewelopera jest umieszczenie Z perspektywy programisty wykorzystu- inny element systemu, sÄ… stworzone odrÄ™bne w odpowiedniej funkcji obsÅ‚ugi przerwania jÄ…cego funkcje API, najistotniejszymi zmia- typy danych. W przypadku portów wejÅ›cia/ kodu, jaki ma siÄ™ wykonać po wystÄ…pieniu nami sÄ…: wyjÅ›cia nazywajÄ… siÄ™ one: GPIO_TypeDef, inne definicje typów zmiennych, np. typ oraz wykorzystywany do inicjalizacji typ u32 w nowej bibliotece jest reprezento- GPIO_InitTypeDef. Dla programisty najwiÄ™k- List. 4. Fragment pliku config. wany przez uint32_t, sze znaczenie ma typ inicjujÄ…cy, ponieważ to ini, który opisuje zmiany, jakie zostanÄ… wprowadzone do kodu po nowe nazwy funkcji obsÅ‚ugi przerwaÅ„ wÅ‚aÅ›nie zmiennÄ… tego typu jawnie tworzymy uruchomieniu aplikacji MigrationScript systemowych, np. NMIException() zosta- w pisanym kodzie. u32<;,;>uint32_t Å‚a zmieniona na NMI_Handler(), Typ GPIO_TypeDef zapewnia dostÄ™p do u16<;,;>uint16_t u8<;,;>uint8_t funkcje i makra asemblerowe zwiÄ…zane poszczególnych rejestrów mikrokontrolera uc32<;,;>const uint32_t uc16<;,;>const uint16_t z obsÅ‚ugÄ… rdzenia, kontrolera przerwaÅ„ i jest wykorzystywany przede wszystkim uc8<;,;>const uint8_t NVIC i timera SysTick zostaÅ‚y zmienio- volatile const<;,;>__I volatile<;,;>__IO ne i zamieszczone w pliku misc.c, core_ List. 7. Wykorzystanie API konfiguracja NMIException<;,;>NMI_Handler portu GPIOB HardFaultException<;,;>HardFault_ cm3.c oraz core_cm3.h. // Wyprowadzenia PB8, PB9 jako Handler Ponadto zmienione zostaÅ‚y nazwy // wyjscia push - pull MemManageException<;,;>MemManage_ GPIO_InitStructure.GPIO_Pin = GPIO_ Handler zwiÄ…zane z przerwaniami i tak na przykÅ‚ad Pin_8 | GPIO_Pin_9; BusFaultException<;,;>BusFault_ GPIO_InitStructure.GPIO_Mode = GPIO_ przerwanie EXTI0 nazywa siÄ™ EXTI0_IRQn, Handler Mode_Out_PP; UsageFaultException<;,;>UsageFault_ w miejsce EXTI0_IRQChannel. Aktualizacji GPIO_InitStructure.GPIO_Speed = Handler GPIO_Speed_50MHz; SVCHandler<;,;>SVC_Handler wymagajÄ… również pliki zwiÄ…zane bezpo- DebugMonitor<;,;>DebugMon_Handler Å›rednio z wykorzystywanym Å›rodowiskiem GPIO_Init(GPIOB, &GPIO_ PendSVC<;,;>PendSV_Handler InitStructure); programistycznym, ustawienia projektu oraz 102 ELEKTRONIKA PRAKTYCZNA 10/2009 Migracja do Standard Peripheral Library przez funkcje API, natomiast zmienna typu W przedstawianej sytuacji w naszym Podsumowanie GPIO_InitTypeDef musi istnieć w każdej apli- krÄ™gu zainteresowaÅ„ leżą trzy pola struktury Wykorzystywanie gotowych bibliotek kacji wykorzystujÄ…cej porty wejÅ›cia/wyjÅ›cia, GPIO_InitStructure. W pierwszej kolejnoÅ›ci jest bardzo przyjemne, ale nie zwalnia to ponieważ jest wykorzystywana do inicjalizo- ustalamy, które z pinów bÄ™dÄ… konfigurowa- programisty z obowiÄ…zku rozumienia, co wania i konfigurowania portów. Na list. 7 jest ne, nastÄ™pnie wybieramy żądany tryb pracy wÅ‚aÅ›ciwie (i w jaki sposób) poszczególne przedstawiony kluczowy fragment kodu od- w tym przypadku bÄ™dzie to wyjÅ›cie typu funkcje robiÄ…. Jest to bardzo ważne i zawsze powiedzialny za konfiguracjÄ™ portu GPIOB. push-pull. NastÄ™pnie ustalamy maksymalna należy o tym pamiÄ™tać. Z tego powodu, je- Utworzona na poczÄ…tku zmienna GPIO_ prÄ™dkość, z jakÄ… bÄ™dÄ… mogÅ‚y pracować piny. Å›li konstruktor chce w peÅ‚ni panować nad InitStructure jest, strukturÄ…. Inicjowanie pi- Tak przygotowanÄ… zmiennÄ… należy przeka- wszystkimi elementami systemu, to i tak nów, lub w szczególnym przypadku caÅ‚ego zać przez podanie jej adresu w argumencie musi dokÅ‚adnie zapoznać siÄ™ z dokumen- portu odbywa siÄ™ w ten sposób, że wypeÅ‚nia do funkcji inicjujÄ…cej GPIO_Init(). Drugim ar- tacjÄ… technicznÄ… mikrokontrolera, a tym sa- siÄ™ poszczególne pola struktury, a nastÄ™p- gumentem, jaki należy funkcji przekazać jest mym poznać jego architekturÄ™. nie przekazuje siÄ™ adres tak przygotowanej nazwa portu, do jakiego majÄ… być zastosowa- Krzysztof Paprocki zmiennej do funkcji inicjujÄ…cej. ne wybrane ustawienia. paprocki.krzysztof@gmail.com R E K L A M A MIERNIKI SZKOLNE MIERNIKI SZKOLNE ACA-1 AMPEROMIERZ ANALOGOWY AC cena: 33,80 zÅ‚ zakresy pomiarowe: 0...500 mAAC, 0...1 AAC, 0...5 AAC ACV-1 WOLTOMIERZ ANALOGOWY AC cena: 26,70 zÅ‚ zakresy pomiarowe: 0...15 VAC, 0...150 VAC DCG-1 GALWANOMETR ANALOGOWY DC cena: 26,70 zÅ‚ zakresy pomiarowe: 35 mA...0...+35 mADC DCV-1 WOLTOMIERZ ANALOGOWY DC cena: 26,70 zÅ‚ zakresy pomiarowe: 0...3 VDC, 0...30 VDC, 0...300 VDC DCV-2 WOLTOMIERZ ANALOGOWY DC cena: 26,70 zÅ‚ zakresy pomiarowe: 0...300 mVDC, 0...3 VDC, 0...30 VDC DCA-1 AMPEROMIERZ ANALOGOWY DC cena: 26,70 zÅ‚ zakresy pomiarowe: 0...50 mADC, 0...500 mADC, 0...5 ADC www.sklep.avt.pl " tel 022 257 84 50 ELEKTRONIKA PRAKTYCZNA 10/2009 103