Język C dla mikrokontrolerów AVR. Od podstaw do zaawansowanych aplikacji. Wydanie II - Tomasz Francuz

Indeks: KSZ-03153 EAN: 9788324698141

Wydawnictwo: Helion. Książka opisuje zasady programowania mikrokontrolerów AVR w języku C. Książka jest drugim wydaniem popularnej pozycji Język C dla mikrokontrolerów AVR. Uczy od podstaw do zaawansowanych aplikacji.

Język C dla mikrokontrolerów AVR. Od podstaw do zaawansowanych aplikacji. Wydanie II - Tomasz...
99,90 zł
95,14 zł netto
Zapłać później
Producent: Helion

Opis produktu: Język C dla mikrokontrolerów AVR. Od podstaw do zaawansowanych aplikacji

Książka jest drugim wydaniem popularnej pozycji Język C dla mikrokontrolerów AVR. Od podstaw do zaawansowanych aplikacji, w której szeroko opisane są zasady programowania tych popularnych mikrokontrolerów.

W tej pozycji informacje na temat mikrokontrolerów zostały poszerzone o takie zagadnienia jak: wykorzystanie możliwości Atmel Studio z nowym IDE oraz platformy Xplained z ATmega168/328. Z książki czytelnik dowie się o zmianach w kompilatorze avr-gcc, między innymi o nazwanych przestrzeniach adresowych, które ułatwiły dostęp do danych umieszczonych w pamięci FLASH. Nauczysz się także jak połączyć program w języku C z asemblerem oraz  jak obsługiwać wielokolorowe matryce LED WS2812B z wykorzystaniem peryferii.

Przykłady projektów do pobrania.

Język C dla mikrokontrolerów AVR. Od podstaw do zaawansowanych aplikacji. Wydanie II - Tomasz Francuz

Język C dla mikrokontrolerów AVR. Od podstaw do zaawansowanych aplikacji. Wydanie II - Tomasz Francuz.

Język C dla mikrokontrolerów AVR.

Lektura w przejrzysty sposób opisuje takie zagadnienia jak:

  • Mikrokontroler i jego otoczenie, programatory
  • Arytmetyka i operacje bitowe
  • Zarządzanie projektem i preprocesor
  • Kontrola rdzenia i zarządzanie poborem energii
  • Dynamiczna alokacja pamięci i wbudowana pamięć EEPROM
  • Dostęp do pamięci FLASH i portów IO mikrokontrolera
  • Rejestry IO ogólnego przeznaczenia
  • Przerwania i timery
  • Komparator i przetwornik analogowo-cyfrowy
  • Obsługa wyświetlaczy i interfejsy (USART, SPI, TWI, USI, 1-wire)
  • Łączenie kodu C i asemblera
  • Bootloader i debugowanie programu

Spis treści

Wstęp do wydania drugiego (13)

Wstęp (15)

  • Kody przykładów (16)
  • Schematy (16)
  • Wymagane części (16)
  • Wsparcie (18)

Rozdział 1. Jak zacząć, czyli instalacja środowiska (19)

  • Atmel Studio 6 - podstawy (20)
    • Rozpoczynamy pracę - nowy projekt (20)
    • Opcje projektu (22)
  • Atmel Studio - dodatki (27)
    • Naggy (28)
    • MarginOfError (28)
    • Data Size Viewer (29)
    • Doxygen Integrator (29)
    • AnkhSVN (30)
  • AVR w systemie GNU/Linux (30)

Rozdział 2. Mikrokontroler i jego otoczenie (33)

  • Podłączenie zasilania (33)
    • Odsprzęganie zasilania (34)
  • Filtrowanie zasilania dla części analogowej procesora (35)
    • Zasilacz (36)
  • Łączenie mikrokontrolera z układami pracującymi w innej domenie napięciowej (39)
    • Konwersja poziomów logicznych pomiędzy układami pracującymi z różnymi napięciami zasilającymi (40)
    • Piny wejściowe i wyjściowe (40)
    • Łączenie wyjścia procesora z układem pracującym z napięciem 5 V (43)
    • Zastosowanie aktywnego konwertera (45)
    • Konwersja z napięcia wyższego na niższe (45)
    • Dzielnik rezystorowy (46)
    • Użycie do konwersji napięć buforów scalonych (47)
    • Bufor dwukierunkowy stosowany w magistralach typu open drain (47)
  • Oscylatory zegarowe (49)
  • Zasady wykorzystania zewnętrznego kwarcu (50)
  • Generator kwarcowy 32768 Hz (52)

Rozdział 3. Programatory (53)

  • Podłączenie - uwagi ogólne (54)
    • Problemy (56)
  • Programowanie AVR (56)
    • Programatory ISP (57)
  • Programatory (59)
  • Programatory JTAG (60)
    • Programator JTAGICE mkII (62)
    • JTAGICEIII (62)
    • AVROne! (63)
    • AVR Dragon (63)
    • Interfejs debugWIRE (67)
  • Programowanie z poziomu AS6 - dlaczego warto korzystać z plików w formacie elf (68)
  • Kilka procesorów i interfejs ISP (69)
  • Kilka procesorów w jednym układzie (70)
  • Programatory HV i równoległe (71)
  • Tryb TPI (71)
  • Programator Atmel-ICE (72)
    • Uaktualnianie firmware narzędzi (73)
  • Czy nie da się taniej? (73)
  • Programowanie przy pomocy narzędzi dostarczonych przez firmę Atmel (74)
  • Program AVRDUDE (75)

Rozdział 4. Na czym pracujemy, czyli ATmega168/328 Xplained Mini w skrócie (77)

  • Podłączenie modułu (78)
  • Xplained Mini w Atmel Studio (78)
  • Piny IO (79)
  • Pierwszy program (80)
    • Wgrywamy pierwszy program (83)

Rozdział 5. Bity konfiguracyjne (85)

  • Co to takiego? (85)
    • Lockbity (86)
    • Fusebity (86)
  • Sygnatura (90)
  • Konfiguracja fuse- i lockbitów w AVR-libc (90)
    • Lockbity w AVR-libc (91)
    • Fusebity w AVR-libc (91)
  • Konfiguracja w Atmel Studio (92)

Rozdział 6. Arytmetyka i operacje bitowe (95)

  • Arytmetyka (95)
    • Reprezentacja binarna liczb (95)
    • Proste typy danych (97)
    • Arytmetyka stałopozycyjna (102)
    • Arytmetyka zmiennopozycyjna (108)
  • Operacje bitowe (116)
    • Operacja iloczynu bitowego (116)
    • Operacja sumy bitowej (117)
    • Operacja sumy wyłączającej (118)
    • Operacja negacji bitowej (119)
    • Operacje przesunięć bitowych (120)

Rozdział 7. Podstawy języka C na AVR (123)

  • Zasięg zmiennych (123)
    • Zmienne globalne (124)
    • Zmienne lokalne (125)
    • Wskaźniki (127)
    • Tablice (133)
  • Struktury (137)
    • Wskaźniki i struktury (138)
    • Struktury anonimowe (139)
    • Inicjalizacja pól struktury (139)
    • Unie (140)
    • Pola bitowe (141)
    • Definicja a deklaracja (142)
  • Funkcje (143)
    • Przekazywanie parametrów przez wartość i referencję (145)
    • Rekurencyjne wywołania funkcji (145)
  • Słowa kluczowe (146)
    • Operatory (146)
    • Instrukcje sterujące (150)

Rozdział 8. Zarządzanie projektem i preprocesor (155)

  • Preprocesor (155)
    • Dyrektywa #include (156)
    • Dyrektywy kompilacji warunkowej (157)
    • Dyrektywa #define (158)
  • Komentarze (160)
  • Nazewnictwo (161)
    • Literały (163)
  • Podział kodu na pliki (165)
    • Widoczność funkcji (169)
    • Widoczność zmiennych - słowo kluczowe extern (170)
    • Podkatalogi (172)
  • Modyfikator const (173)
  • Słowo kluczowe static (175)
  • Dyrektywa inline (175)
    • inline funkcja(); (177)
    • static inline funkcja(); (178)
    • extern inline funkcja(); (179)
  • Modyfikator register (180)

Rozdział 9. Sekcje programu (183)

  • Sekcje danych (184)
    • Sekcja .text (184)
    • Sekcja .data (184)
    • Sekcja .bss (185)
    • Sekcja .eeprom (186)
  • Sekcje zawierające kod programu (186)
    • Podsekcje .init[0-9] (187)
    • Podsekcje .fini[0-9] (188)
  • Sekcje specjalne (188)
  • Sekcje a opcje kompilacji (188)
  • Sekcje tworzone przez programistę (190)
  • Umieszczanie sekcji pod wskazanym adresem (191)

Rozdział 10. Kontrola rdzenia i zarządzanie poborem energii (193)

  • Źródła sygnału RESET (193)
    • Power-on Reset (195)
    • Zewnętrzny sygnał RESET (195)
    • Brown-out Detector (195)
    • Układ watchdog (196)
  • Zarządzanie poborem energii (201)
    • Usypianie procesora (201)
    • Wyłączanie układu BOD (202)
    • Wyłączanie podsystemów procesora (203)
    • Preskaler zegara (203)
    • Inne sposoby minimalizowania poboru energii (204)

Rozdział 11. Dynamiczna alokacja pamięci (207)

  • Alokacja pamięci w bibliotece AVR-libc (209)
    • Funkcja malloc (212)
    • Funkcja calloc (212)
    • Funkcja realloc (212)
    • Funkcja free (214)
  • Wycieki pamięci i błędne użycie pamięci alokowanej dynamicznie (214)
  • Wykrywanie kolizji sterty i stosu (216)
    • Metoda I - własne funkcje alokujące pamięć (217)
    • Metoda II - sprawdzanie ilości dostępnej pamięci (217)
    • Metoda III - marker (217)
    • Metoda IV - wykorzystanie interfejsu JTAG lub debugWire (217)
    • Metoda V - wzór w pamięci (219)

Rozdział 12. Wbudowana pamięć EEPROM (223)

  • Kilka słów, czym jest EEPROM (223)
  • Dostęp do EEPROM w AVR (224)
  • Zapobieganie uszkodzeniu zawartości pamięci EEPROM (225)
  • Kontrola odczytu i zapisu do pamięci EEPROM (226)
    • Odczyt zawartości komórki pamięci (226)
    • Zapis do komórki pamięci (226)
  • Dostęp do EEPROM z poziomu AVR-libc (228)
    • Deklaracje danych w pamięci EEPROM (228)
    • Funkcje realizujące dostęp do pamięci EEPROM (230)
    • Inne funkcje operujące na EEPROM (232)
  • Techniki wear leveling (233)
  • EEPROM i awaria zasilania (235)
  • Problem atomowości przy dostępie do EEPROM (241)
  • Zapis do EEPROM z użyciem przerwań (241)

Rozdział 13. Dostęp do pamięci FLASH (245)

  • Wskaźniki wykorzystujące przestrzenie adresowe (248)
  • Jak to bywało dawniej... (252)
  • Dostęp do pamięci FLASH > 64 kB (253)
  • Typy 24-bitowe (254)

Rozdział 14. Dostęp do 16-bitowych rejestrów IO (255)

  • Dostęp do 16-bitowego rejestru ADC (255)
  • Dostęp do 16-bitowych rejestrów timerów (256)

Rozdział 15. Zwalniamy, czyli kiedy opóźnienia są konieczne (259)

  • Opóźnienia przy zmiennym taktowaniu (263)
  • Wykorzystanie timerów do realizacji opóźnień (265)

Rozdział 16. Pliki z danymi - jak je dodawać do projektu? (267)

  • Kompilacja plików binarnych (268)
  • Łączenie plików obiektowych z projektem (270)
  • Dostęp do danych binarnych (273)
    • Dostęp do danych z wykorzystaniem przestrzeni adresowych (275)

Rozdział 17. Dostęp do portów IO mikrokontrolera (277)

  • Konfiguracja pinu IO (278)
  • Manipulacje stanem pinów IO (282)
    • Zmiana stanu portu na przeciwny (282)
    • Ustawianie linii IO (283)
    • Zerowanie linii IO (283)
    • Makrodefinicja _BV() (283)
    • Użycie pól bitowych (284)
  • Synchronizator (285)
  • Przekazywanie rejestru jako parametru funkcji (286)
  • Przykłady praktyczne (287)
    • Sterowanie wyświetlaczem 7-segmentowym (287)
    • Podłączenie przycisków (290)
    • Enkoder obrotowy (294)
    • Klawiatura matrycowa (299)

Rozdział 18. Rejestry IO ogólnego przeznaczenia (303)

  • Wykorzystanie innych rejestrów jako GPIOR (305)

Rozdział 19. Przerwania (307)

    • Czym są przerwania? (307)
    • Przerwania maskowalne (308)
    • Źródła przerwań (309)
    • Wektory przerwań (311)
  • Obsługa przerwań (312)
    • Puste wektory przerwań (314)
    • Puste przerwania (314)
    • Współdzielenie kodu przez przerwania (315)
    • sei()/cli() (316)
    • Atrybut naked i obsługa przerwań w asemblerze (317)
    • Modyfikator volatile (319)
    • Atomowość dostępu do danych (324)
    • Funkcje reentrant (327)
  • Przykłady praktyczne (328)
    • Wyświetlanie multipleksowane (329)
    • Wyświetlanie multipleksowane z regulacją jasności wyświetlacza (333)
    • Obsługa przycisków (336)
    • Obsługa enkodera (339)
    • Klawiatura matrycowa (340)

Rozdział 20. Timery (343)

  • Sygnał taktujący (344)
    • Wewnętrzny sygnał taktujący (344)
    • Zewnętrzny sygnał taktujący (345)
  • Licznik (346)
  • Układ porównujący (346)
    • Wpływ na piny IO (347)
  • Moduł przechwytywania zdarzeń zewnętrznych (348)
    • Eliminacja szumów (349)
    • Komparator jako wyzwalacz zdarzenia ICP (349)
  • Tryby pracy timera (349)
    • Tryb prosty (349)
    • Tryb CTC (352)
    • Tryby PWM (353)
    • Układ ochronny (358)
    • Modulator sygnału wyjściowego (359)
  • Miernik częstotliwości i wypełnienia (360)

Rozdział 21. RTC - czyli trochę o zegarach (365)

    • Realizacja sprzętowa (366)
    • Realizacja programowa (366)
  • Czas drogą radiową, czyli DCF77 (369)
    • Trochę więcej o DCF77 (369)
    • Dekodowanie danych (370)
    • Funkcje konwersji czasu (372)
    • Moduł odbiornika DCF77 (372)

Rozdział 22. Komparator (379)

  • Funkcje dodatkowe (380)
    • Blokowanie pinów (380)
    • Wyzwalanie zdarzeń timera (380)
    • Wybór wejścia komparatora (380)
    • Wyzwalanie przetwornika ADC (381)

Rozdział 23. Przetwornik analogowo-cyfrowy (383)

  • Wybór napięcia referencyjnego (384)
  • Co to jest LSB? (385)
  • Kalibracja ADC (386)
  • Nadpróbkowanie (387)
    • Uśrednianie (388)
    • Decymacja i interpolacja (389)
  • Jak zwiększyć precyzję pomiarów? (389)
  • Multiplekser (390)
  • Blokowanie pinów cyfrowych (391)
  • Przetwornik ADC (392)
    • Tryb pojedynczej konwersji (393)
    • Tryb ciągłej konwersji (393)
  • Wejścia pojedyncze i różnicowe (394)
  • Wynik (395)
  • Wyzwalacze (395)
  • Przerwania ADC (396)
  • Precyzyjne pomiary przy pomocy ADC (397)
  • Przykłady (399)
    • Termometr analogowy LM35 (399)
    • Klawisze (401)

Rozdział 24. Obsługa alfanumerycznych wyświetlaczy LCD (407)

  • Obsługa wyświetlaczy alfanumerycznych (408)
    • Funkcje biblioteczne (413)
    • Definiowanie własnych znaków (418)
  • Transakcyjna obsługa LCD (420)
    • Przykład - menu (430)

Rozdział 25. Monochromatyczne wyświetlacze graficzne (439)

  • Wizyta w muzeum, czyli wyświetlacze wykorzystujące KS0108 (441)
  • Moduły wykorzystujące kontroler ST7565R (450)
  • Budowa i funkcje kontrolera ST7565R (451)
  • Funkcje specjalne kontrolera (457)
    • Obracanie obrazu (457)
    • Regulacja kontrastu (458)
    • Numer pierwszej wyświetlanej linii (459)
  • Czcionki (460)
  • Mała optymalizacja (465)
  • Podwójne buforowanie (467)
    • Adres początku wyświetlania obrazu (468)
  • Menu (469)
    • Menu oparte na piktogramach (471)

Rozdział 26. Interfejs USART (477)

  • Interfejsy szeregowe (477)
  • Interfejs USART (478)
  • Format transmisji danych (480)
  • Interfejs USART mikrokontrolera AVR (482)
    • Szybkość transmisji (482)
    • Dobór kwarcu (484)
    • Formaty ramek danych (484)
    • Nadajnik i odbiornik USART (485)
  • Kontrola poprawności danych (486)
  • USART z Xplained Mini (487)
  • Terminal (487)
  • Wykorzystanie przerwań (488)
  • Równoczesny dostęp do USART z wielu "wątków" (493)
  • Dostęp do USART z wykorzystaniem strumieni (495)
    • Metoda get (496)
    • Metoda put (496)
    • Otwieranie strumienia (497)
  • Połączenie mikrokontroler - mikrokontroler (498)
    • Tryb synchroniczny pracy USART (499)
  • RS485 (504)
  • Tryb MPCM (506)
    • Komputer w charakterze urządzenia master MPCM (509)

Rozdział 27. Interfejs SPI (511)

  • Inicjalizacja interfejsu (513)
    • Ustawienie pinów IO (514)
    • Zegar taktujący (516)
    • Procesor w trybie Master SPI (516)
    • Procesor w trybie slave SPI (516)
  • Przykłady (517)
    • Połączenie AVR - AVR (517)
    • Połączenie AVR - rejestr szeregowy (522)
  • Interfejs USART w trybie SPI (526)
    • Taktowanie magistrali SPI (527)
    • Tryb pracy SPI (528)
    • Format ramki danych (528)
    • Konfiguracja interfejsu (528)

Rozdział 28. Interfejs TWI (531)

  • Tryb multimaster (534)
  • Inicjalizacja interfejsu (535)
  • Mikrokontroler w trybie I2C master (535)
    • Bity START i STOP (535)
    • Podstawowe funkcje do współpracy z I2C (536)
    • Współpraca z zewnętrzną pamięcią EEPROM (539)
    • Współpraca z zewnętrzną pamięcią FRAM (544)
    • Umieszczanie zmiennych w zewnętrznej pamięci EEPROM (545)
    • Współpraca z zegarem RTC (547)
    • Obsługa ekspandera IO PCF8574 (551)
  • Procesor w trybie I2C slave (552)
    • Przykład (555)

Rozdział 29. Interfejs USI (563)

  • 4-bitowy licznik i zegar (563)
  • Przerwania USI (564)
  • Zmiana pozycji pinów (565)
  • Wykorzystanie interfejsu USI w trybie SPI (566)
    • Tryb SPI master (566)
    • Tryb SPI slave (567)

Rozdział 30. Interfejs 1-wire (569)

  • Realizacja master 1-wire na AVR (572)
    • Realizacja master 1-wire przy pomocy pinów IO (573)
    • Realizacja master 1-wire przy pomocy interfejsu UART (576)
    • Wysokopoziomowe funkcje obsługi 1-wire (581)
  • Termometr cyfrowy DS1820 (584)

Rozdział 31. Dużo LED-ów, dużo zabawy (587)

  • Matryce LED (587)
    • Projekt PCB i zasilanie (588)
    • Układ z matrycą dwukolorową (590)
    • Sterowanie matrycą (591)
  • Sterownik WS2812B (593)
    • Zasilanie (595)
    • Bit banging (596)
    • Wykorzystanie SPI (597)

Rozdział 32. Piloty TV (601)

  • Część sprzętowa, czyli odbiornik IR (603)
  • Część programowa, czyli standardy kodowania (604)
    • Standard NEC i pokrewne (604)
  • RC5 (610)
    • Kod Manchester (610)
    • Dekoder RC5 (611)
    • Inne standardy kodowania (615)

Rozdział 33. Łączenie kodu C i asemblera (617)

  • ABI (618)
  • Słowo kluczowe asm (621)
    • Typy operandów (623)
    • Dostęp do portów IO (625)
    • Dostęp do danych wielobajtowych (626)
    • Dostęp do wskaźników (627)
    • Lista modyfikowanych rejestrów (627)
    • Wielokrotne użycie wstawki asemblerowej (628)
  • Pliki .S (629)
    • Definicje (630)
    • Definicja symboli globalnych (630)
    • Dyrektywy asemblera (635)
    • Wywołanie funkcji języka C z asemblera (637)

Rozdział 34. Bootloader (639)

  • Pamięć NRWW i RWW (640)
  • Bity konfiguracyjne bootloadera (641)
    • Konfiguracja lockbitów z poziomu aplikacji (642)
  • Programowanie pamięci FLASH (643)
  • Wykorzystanie przerwań w kodzie bootloadera (645)
    • Usuwanie tablicy wektorów przerwań (645)
    • Skrócenie tablicy wektorów przerwań (647)
  • Start bootloadera (650)
    • Wykorzystanie dodatkowego przycisku/zworki (650)
    • Wykorzystanie markerów w pamięci EEPROM (651)
    • Oczekiwanie na specjalny znak w wybranym kanale komunikacji (652)
    • Start aplikacji (652)
  • Współdzielenie kodu aplikacji i bootloadera (653)
    • Wywoływanie funkcji bootloadera w procesorach ATMega256x (655)
    • Wywoływanie funkcji obsługi przerwań zawartych w kodzie bootloadera (658)
    • Współdzielenie zmiennych pomiędzy aplikacją a bootloaderem (658)

Rozdział 35. Debugowanie programu (661)

  • Konfiguracja debuggera (663)
  • Konfiguracja projektu do debugowania (664)
  • Debugger sprzętowy (665)
  • Debugger programowy (symulator) (667)
    • Plik stymulacji (668)
  • Pułapki (674)
    • Pułapki na dane (678)
    • Punkty śledzenia (679)
    • Pułapki warunkowe (681)
  • Podgląd pamięci (683)
  • Podgląd stosu wywołań (684)
  • Określenie czasu symulacji (684)
  • Okno dezasemblera (685)
  • Okno podglądu zmiennych (686)
    • Łańcuchy formatujące (687)
  • Makrodefinicja ASSERT (688)
  • Przerwania w trakcie debugowania (692)
  • _delay_xx i symulator (693)

Skorowidz (695)

Wszystko, co chciałbyś wiedzieć o mikrokontrolerach AVR! 

Jak przetwornik ADC zamienia napięcie na wartość bitową? Co to jest przerwanie sprzętowe? Dlaczego synchronizacja mikrokontrolerów jest tak ważna? Czym się różni programator USB-ASP od ISP? Jak ustawić fusebity w kodzie mojego programu? Jakie możliwości oferuje program AVRDude? Oraz najważniejsze – jak programować mikrokontrolery? Na te i inne pytania odpowiedzi znajdziesz w oferowanym przez nas drugim wydaniu książki autorstwa Tomasza Francuza.

Praktyczne ujęcie możliwości sprzętowo-programowych mikrokontrolerów AVR

Treść książki pt. “Język C dla mikrokontrolerów AVR. Od podstaw do zaawansowanych aplikacji” obejmuje szeroko omówione zagadnienia związane z budową i funkcjonalnością sprzętową poszczególnych podzespołów mikrokontrolerów AVR. Autor w szczegółowy sposób omawia również zasadę działania mikrokontrolerów AVR w świetle przykładowych programów w języku C. Ponadto, treść tej książki, daje wiele cennych wskazówek dotyczących praktycznej obsługi układów peryferyjnych mikrokontrolerów AVR.

Książka - Autor Tomasz Francuz
Książka - ISBN 978-83-246-9814-1
Książka - Oprawa miękka
Książka - Wydawnictwo Helion
Tematyka C / C++ / C#
Szerokość opakowania 16 cm
Wysokość opakowania 3 cm
Głębokość opakowania 23.5 cm
Masa opakowania 0.2 kg

Jako pierwszy zadaj pytanie dotyczące tego produktu!

Opinie o produkcie

Język C dla mikrokontrolerów AVR. Od podstaw do zaawansowanych aplikacji. Wydanie II - Tomasz Francuz

4.8/5

Średnia Ocena

4

Opinie Klientów
Poniższe opinie zbieramy
i weryfikujemy przy pomocy
zewnętrznego partnera Trustmate
i pochodzą z procesu pozakupowego.
Karol 20.02.2023 Potwierdzony zakup
.................................
Robert 27.09.2022 Potwierdzony zakup
Dobra lektura od wprowadzenia po początki zaawansowanych wdrożeń.
Rafał 23.01.2023 Potwierdzony zakup
Sławomir 10.11.2022 Potwierdzony zakup

Klienci którzy zakupili ten produkt kupili również:

Produkty z tej samej kategorii: