Skocz do zawartości

Sipeed Tang Nano 4k z ADC - Gowin FPGA Designer


Gieneq

Pomocna odpowiedź

(edytowany)

Cześć @FlyingDutch

Ostatnio krucho u mnie z czasem, wczoraj zrobiłem coś prostego i podłączyłem AD9833 (programowalny generator) z Arduino UNO i ADS1256. Ciekawie wyszło, ale na UNO 7ksps to max. Jednak nie kupuję Teensy, albo może nie w tej iteracji. Ciekaw jestem jak działa, ale może nie wszystko od razu.

Dnia 13.03.2022 o 15:27, FlyingDutch napisał:

dzisiaj wygenerowałem ten zewnętrzny zegar (dla PCM1808) 11.2896 MHz na płytce FPGA Elbert.v2 (tam to było 6 linijek kodu w Verilogu).

Czyli jednak są zadania dla FPGA, które da się łatwo zrobić 🙂 

Tak jeszcze w temacie FPGA, masz opinię na temat układów Altera? Na forum niedawno ktoś wystawił płytkę:

i się zastanawiam jaka jest różnica w porównaniu z produktami Xilinxa. Od kiedy Xilinxa kupił AMD, mamy 2 konkretne fronty podobnie jak jest to z procesorami: albo Intel albo AMD.

Edit: znalazłem taki wpis porównujący technikalia: 

 

Edytowano przez Gieneq
Link do komentarza
Share on other sites

43 minuty temu, Gieneq napisał:

Cześć @FlyingDutch

Ostatnio krucho u mnie z czasem, wczoraj zrobiłem coś prostego i podłączyłem AD9833 (programowalny generator) z Arduino UNO i ADS1256. Ciekawie wyszło, ale na UNO 7ksps to max. Jednak nie kupuję Teensy, albo może nie w tej iteracji. Ciekaw jestem jak działa, ale może nie wszystko od razu.

Czyli jednak są zadania dla FPGA, które da się łatwo zrobić 🙂 

Tak jeszcze w temacie FPGA, masz opinię na temat układów Altera? Na forum niedawno ktoś wystawił płytkę:

i się zastanawiam jaka jest różnica w porównaniu z produktami Xilinxa. Od kiedy Xilinxa kupił AMD, mamy 2 konkretne fronty podobnie jak jest to z procesorami: albo Intel albo AMD.

Edit: znalazłem taki wpis porównujący technikalia: 

 

Cześć,

było kilka wersji tego zestawu. Jeśli to wersja "Altera D2" bez żadnych dodatkowych oznaczeń, to będzie prawdopodobnie ta płytka:

http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=183&No=30&PartNo=2#heading

Jest ona oparta na układzie Cyclone II, który jest już dość zabytkowy. Musiałbyś szukać jakiejś archiwalnej wersji oprogramowania "Quartus Lite". W swoim czasie płytka ta była mocno zaawansowana, dzisiaj nie (popatrz chociażby na wielkość dodatkowej pamięci RAM). Ogólnie układy Altery/Intela nie ustępują układom Xilinx'a. Jednak środowisko do syntezy "Quartus" znacznie się różni od "ISE" czy "Vivado", więc wymagałoby sporo nauki.

BTW: też chciałem się przyjrzeć Tensy, ale teraz ze względu na kurs dolara jest za drogie dla mnie.

Pozdrawiam

Edytowano przez FlyingDutch
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Jak chodzi o płytkę "Altera DE2" to radziłbym mocno się zastanowić nad sensem zakupu. To jakiś muzealny model, jak napisał @FlyingDutch, ciężko o środowisko, mało zasobów -> mało sensu. Warto natomiast popatrzeć na ofertę firmy Terasic, która jest producentem tej płytki: https://www.terasic.com.tw/en/ Znajdziemy w niej o wiele ciekawsze i niewiele droższe płytki. Przykładowo DE10-Lite Board, kosztuje ok 120 USD, więc porównywalnie z ceną nieszczęsnego DE2.

Natomiast co do porównania środowisk dla układów Xilinx/AMD oraz Altera/Intel, to warto wspomnieć o czasie syntezy... Porównywałem projekt, który po prostu miga diodą. W przypadku Vivado (Xilinx) zajmowało to jakieś 2-3 minuty. Natomiast Quartus (Altera) taki sam projekt syntetyzuje 20 sekund. Podczas nauki to robi różnicę, tym bardziej, że Vivado nawet o błędzie składniowym jak brak przecinka, czy średnika informuje dopiero po minucie czy dwóch.

W przypadku większych projektów nie ma takiej różnicy i oba narzędzia działają podobnie szybko (albo raczej wolno), ale do nauki podstaw i prostych projektów ja wybieram układy Altery - najwyżej później przenoszę je na Xilinxa.

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Cześć @Gieneq,

chyba zapadnę się ze wstydu pod ziemię. Z tą generacją sygnału 11 MHz (zegar dla ADC I2S  PCM1808) to podłączyłem oscyloskop do pinu nr. 19 zamiast 18. To moje wina bo powinienem to sprawdzić jako pierwsze. Gdy przełączyłem oscyloskop na pin 18 to wszystko jest OK - jest generowany sygnał prostokątny o amplitudzie trochę ponad 3 wolty. Zamieszczam końcową wersję programu dla ESP32 i "Arduino IDE":

#include "ledc.h"

#define CLK_PIN (18)

void setup() { //---------------------------------------------------------------------------------------
  Serial.begin(115200); // use the serial port
  Serial.println("Starting ...");

  gpio_reset_pin((gpio_num_t)CLK_PIN);
  /* Set the GPIO as a push/pull output */
  gpio_set_direction((gpio_num_t)CLK_PIN, GPIO_MODE_OUTPUT);
  gpio_set_drive_capability((gpio_num_t)CLK_PIN, GPIO_DRIVE_CAP_3);

  ledc_timer_config_t ledc_timer;
  ledc_channel_config_t ledc_channel;
  
  //params ledc_timer
  ledc_timer.speed_mode = LEDC_HIGH_SPEED_MODE;//LEDC_HIGH_SPEED_MODE;
  ledc_timer.timer_num  = LEDC_TIMER_0;
  ledc_timer.bit_num    = (ledc_timer_bit_t) LEDC_TIMER_1_BIT; //LEDC_TIMER_2_BIT;
  ledc_timer.freq_hz    = 11289600;
  ledc_timer.clk_cfg    = LEDC_USE_APB_CLK;
  
  //params ledc_channel
  ledc_channel.channel    = LEDC_CHANNEL_0;
  ledc_channel.gpio_num   = 18;  //WAS 18
  ledc_channel.speed_mode = LEDC_HIGH_SPEED_MODE;
  ledc_channel.timer_sel  = LEDC_TIMER_0;
  ledc_channel.duty       = 1;

  //Generacja zegara dla PCM1808
  ledc_timer_config(&ledc_timer);
  ledc_channel_config(&ledc_channel);

  Serial.println("Program Started");
  
}//---------------------------------------------------------------------------------------

void loop() {
  
}

Może ktoś będzie potrzebował wygenerować sygnał prostokątny o dużej częstotliwości na ESP32, wtedy ten kod mu się przyda. W kodzie przestawiłem też "slew rate" dla pinu 18 na maksymalną wartość, co powoduje, że zbocza są bardziej ostre - patrz linie programu:

 gpio_reset_pin((gpio_num_t)CLK_PIN);
  /* Set the GPIO as a push/pull output */
  gpio_set_direction((gpio_num_t)CLK_PIN, GPIO_MODE_OUTPUT);
  gpio_set_drive_capability((gpio_num_t)CLK_PIN, GPIO_DRIVE_CAP_3);

W archiwum zip pełny kod projektu dla Arduino IDE (z potrzebnymi plikami nagłówkowymi. Mogę już powrócić do próby podłączenia przetwornika ADC z I2S do ESP32.

FFT_on_ESP32_PCM1808_03.zip

Pozdrawiam

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

@FlyingDutch widzę, że projekt dalej stwarza problemy 😅 najpierw przeszkoda w implementacji na FPGA a teraz takie cuda. Ja właśnie słucham serii o FreeRTOS na ESP32 i szczerze myślę, żeby zdjąć mój kod z githuba bo trochę wstyd. Ale to dobry objaw, uczenia się.

 

22 minuty temu, FlyingDutch napisał:

W kodzie przestawiłem też "slew rate" dla pinu 18 na maksymalną wartość, co powoduje, że zbocza są bardziej ostre

 O ciekawe, sprawdzę jak będę w domu na oscyloskopie jak to wygląda. Funkcje jak rozumiem z ESP-IDF, kod pisałeś w Arduino IDE albo platformio z frameworkiem Arduino czy jakoś bardziej profesjonalnie?

1 godzinę temu, Elvis napisał:

oba narzędzia działają podobnie szybko (albo raczej wolno),

Dzięki za info, przyda się ta wiedza. Po skończeniu tego projektu, który pewnie zajmie z 2-3 miesiące, mam jeszcze kilka książek do przeczytania i wtedy siadam do FPGA.

Link do komentarza
Share on other sites

2 minuty temu, Gieneq napisał:

Funkcje jak rozumiem z ESP-IDF, kod pisałeś w Arduino IDE albo platformio z frameworkiem Arduino czy jakoś bardziej profesjonalnie?

Tak z ciekawości: co jest nieprofesjonalnego w użyciu funkcji z ESP-IDF we frameworku Arduino?

  • Lubię! 1
Link do komentarza
Share on other sites

@ethanak Może to jakieś uprzedzenie ale nie wyobrażam sobie firmy embedded pracującej z frameworkiem Arduino. Z drugiej strony w nowym Elektroniku jest wspomniane, że Arduino coraz bardziej nadaje się cytuję "do zastosowań półprofesjonalnych" i firmy wspierają rozwój projektu, ale to odnosi się bardziej do stosowanych układów. Sama założenia frameworku wyglądają na dobre, ale tu się nie wypowiadam, nie znam się.

 

Link do komentarza
Share on other sites

1 minutę temu, Gieneq napisał:

nie wyobrażam sobie firmy embedded pracującej z frameworkiem Arduino

Być może... ale ja programistę, który sprawdzałby czy dany pin w ESP32 obsługuje pullup/pulldown i zależnie od tego bawił się w programowanie rejestrów RTC zamiast użyć wiringowego pinMode wywalił na zbity pysk za marnowanie czasu.

Link do komentarza
Share on other sites

31 minut temu, Gieneq napisał:

@FlyingDutch widzę, że projekt dalej stwarza problemy 😅 najpierw przeszkoda w implementacji na FPGA a teraz takie cuda. Ja właśnie słucham serii o FreeRTOS na ESP32 i szczerze myślę, żeby zdjąć mój kod z githuba bo trochę wstyd. Ale to dobry objaw, uczenia się.

 O ciekawe, sprawdzę jak będę w domu na oscyloskopie jak to wygląda. Funkcje jak rozumiem z ESP-IDF, kod pisałeś w Arduino IDE albo platformio z frameworkiem Arduino czy jakoś bardziej profesjonalnie?

Dzięki za info, przyda się ta wiedza. Po skończeniu tego projektu, który pewnie zajmie z 2-3 miesiące, mam jeszcze kilka książek do przeczytania i wtedy siadam do FPGA.

Cześć @Gieneq,

kod pisałem w "Arduino IDE", które lubię ze względu na jego prostotę (platformio próbowałem, ale nie przypadło mi do gustu). "ESP-IDF" chciałem zainstalować, ale mam dużo zależności w Windows10, które mi się z nim kłócą, np. nowsza wersja Pythona i z tego powodu zrezygnowałem. "Arduino IDE" jest dla mnie "odskocznią" od dużo bardziej złożonych środowisk, które używam w pracy.

Pozdrawiam

Edytowano przez FlyingDutch
Link do komentarza
Share on other sites

@ethanak to chyba zależy jakie projekty się robi. Python zyskał na popularności nie dzięki wydajności tylko łatwości implementacji. Więc może nie tyle marnowanie czasu tylko niebycie na odpowiednim stanowisku.

Link do komentarza
Share on other sites

Poza tym na Arduino IDE i PlatformIO świat się nie kończy.

Do pisania używam Geany. Do kompilacji/uploadu robię sobie Makefile. Kompiluję używając arduino-buildera (wewnątrz Makefile). Upload robię esptoolem (takoż wewnątrz).

Bardzo nieprofesjonalnie...

Do tego jeszcze do pisania różnych "poważnych" programów takoż używam Geany, a katalogi z serwera montuję przez Gigolo... no to już w ogóle amatorszczyzna! Prawdziwi Profesjonaliści używają Vima (lub Emacsa, tu zdania są podzielone) 🙂

  • Lubię! 1
Link do komentarza
Share on other sites

@FlyingDutch z jednego kanału, na razie nie utrudniajmy 🙂 

@ethanak oj, nie mam na myśli że profesjonalne = bardzo skomplikowane. Np. to że nie trzeba tworzyć makefile to już dla mnie oznaka profesjonalizmu. Ale jednak jak wyobrażam sobie programowanie w środowiskach Jetbrains albo Visualu to wygląda to jakoś tak inaczej.

Tak przy okazji chyba trzeba zmienić nazwę tematu, ale nie wiem na jaką.

  • Lubię! 1
Link do komentarza
Share on other sites

15 minut temu, Gieneq napisał:

to że nie trzeba tworzyć makefile to już dla mnie oznaka profesjonalizmu

Nie trzeba != nie można.

Nie można != nie należy.

Profesjonalizm to raczej umiejętność najlepszego (najbardziej efektywnego) wykorzystania posiadanych narzędzi - chyba że się mylę?

23 minuty temu, Gieneq napisał:

Tak przy okazji chyba trzeba zmienić nazwę tematu, ale nie wiem na jaką.

 

E... niekoniecznie, stare czasy usenetu mi się przypominają i to, co można było znaleźć na p.c.o.l. w temacie "dlaczego windows jest lepszy od linuksa" 🙂

 

  • Lubię! 1
Link do komentarza
Share on other sites

Cześć,

dopiero dzisiaj mam znowu czas, aby usiąść ponownie do tematu. Czyli powracam do próby podłączenia przetwornika I2S (PCM1808) do płytki ESP32. Znalazłem całkiem fajny darmowy program do między innymi generacji przebiegów w kanałach lewym i prawym karty dźwiękowej. Program nazywa się "Daqarta" - tutaj link do niego:

https://www.daqarta.com/dqdown.htm

A tutaj zrzut ekranu:

Daqarta_LeftRightChan.thumb.png.04aba5c13e1a7eefd1847e04e55dded7.png

W lewy kanale jest sinusoida o częstotliwości 440 Hz a w prawym 4800 Hz. W programie można także podejrzeć widmo sygnału (czyli wynik DTF).

Tak sygnał (dwa kanały wygląda na oscyloskopie:

ScopeLeftRightChan_.thumb.png.698856f6d17b27ccfab73be56cabf8b8.png

Dużo też wyjaśniło się z tym, jak podłączyć płytkę z PCM1808 do ESP32 - otóż:

1) Gdy piny MD0=1 i MD1=1

2) Pin FMT=0  wtedy format wyjścia DOUT jest I2S  - gdzie: 0 to połączenie z masą a 1 połączenie z Vdd

Wtedy  układ PCM1808 pracuje jako Master i pin SCKi jest wejściem zegara 256*Fs (gdzie Fs to f=44,1 KHz), a piny BCK i LRCK są wyjściami.

Podłączyłem płytkę z ADC PCM1808 do ESP32 na wejście SCKI podałem zegar o częstotliwości 11 289 600 Hz a na wejścia analogowe L+R wyjścia kanału lewego i prawego z karty dźwiękowej PC (pracuje program generatora sygnału na PC).  Układ PCM1808 pracuje z ustawieniami, jak podane były wyżej (jako Master). Do wyjść PCM1808: BCK, DOUT, LRCK podłączyłem analizator stanów logicznych.

BCK - zegar audio - fioletowy

DOUT - wyjście cyfrowe I2S - niebieski

LRCK - wybór kanału audio L,R - pomarańczowy

Poniżej przebiegi z analizatora stanów logicznych:

PCM1808_MasterOK.thumb.png.662c651c58abee89ff5558ac5813635a.png

Jak widać na przedstawionym zrzucie ekranu, wydaje mi się, że przetwornik analogowo-cyfrowy I2S działa całkowicie poprawnie.

Pozostała trudniejsza część zadania, napisanie programu na ESP32, który odbierał by sample z przetwornika ADC PCM1808 (protokółI2S) i liczył na nich Transformatę Fouriera za pomocą algorytmu FFT.

Mam napisaną bardzo prostą wersję kodu z obsługą przetwornika IS2 (PCM1808) przez ESP32 - tutaj kod głównego programu:

#include "ledc.h"
#include "driver/i2s.h"

#define CLK_PIN (18)
const i2s_port_t I2S_PORT = I2S_NUM_0;

void setup() { //---------------------------------------------------------------------------------------
  Serial.begin(115200); // use the serial port
  Serial.println("Starting ...");
  esp_err_t err;

  gpio_reset_pin((gpio_num_t)CLK_PIN);
  /* Set the GPIO as a push/pull output */
  gpio_set_direction((gpio_num_t)CLK_PIN, GPIO_MODE_OUTPUT);
  gpio_set_drive_capability((gpio_num_t)CLK_PIN, GPIO_DRIVE_CAP_3);

  ledc_timer_config_t ledc_timer;
  ledc_channel_config_t ledc_channel;
  
  //params ledc_timer
  ledc_timer.speed_mode = LEDC_HIGH_SPEED_MODE;//LEDC_HIGH_SPEED_MODE;
  ledc_timer.timer_num  = LEDC_TIMER_0;
  ledc_timer.bit_num    = (ledc_timer_bit_t) LEDC_TIMER_1_BIT; //LEDC_TIMER_2_BIT;
  ledc_timer.freq_hz    = 11289600;
  ledc_timer.clk_cfg    = LEDC_USE_APB_CLK;
  
  //params ledc_channel
  ledc_channel.channel    = LEDC_CHANNEL_0;
  ledc_channel.gpio_num   = 18;  //WAS 18
  ledc_channel.speed_mode = LEDC_HIGH_SPEED_MODE;
  ledc_channel.timer_sel  = LEDC_TIMER_0;
  ledc_channel.duty       = 1;

  //Generacja zegara dla PCM1808
  ledc_timer_config(&ledc_timer);
  ledc_channel_config(&ledc_channel);
  //---------------------------------------------
  
  // The I2S config as per the example
  const i2s_config_t i2s_config = {
      .mode = i2s_mode_t(I2S_MODE_SLAVE | I2S_MODE_RX), // Receive, not transfer
      .sample_rate = 44100,                         // 44,1KHz
      .bits_per_sample = I2S_BITS_PER_SAMPLE_24BIT, // could only get it to work with 32bits
      .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, // use both channel
      .communication_format = i2s_comm_format_t(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),
      .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,     // Interrupt level 1
      .dma_buf_count = 4,                           // number of buffers
      .dma_buf_len = 8                              // 8 samples per buffer (minimum)
  };

    // The pin config as per the setup
  const i2s_pin_config_t pin_config = {
      .bck_io_num = 26,   // Serial Clock (SCK)
      .ws_io_num = 25,    // Word Select (WS)
      .data_out_num = I2S_PIN_NO_CHANGE, // not used (only for speakers)
      .data_in_num = 33   // Serial Data (SD)
  };

  // Configuring the I2S driver and pins.
  // This function must be called before any I2S driver read/write operations.
  err = i2s_driver_install(I2S_PORT, &i2s_config, 0, NULL);
  if (err != ESP_OK) {
    Serial.printf("Failed installing driver: %d\n", err);
    while (true);
  }
  err = i2s_set_pin(I2S_PORT, &pin_config);
  if (err != ESP_OK) {
    Serial.printf("Failed setting pin: %d\n", err);
    while (true);
  }
  
  Serial.println("I2S driver installed.");
  Serial.println("Program Started");
  
}//---------------------------------------------------------------------------------------

void loop() {
   // Read a single sample and log it for the Serial Plotter.
  int32_t sample = 0;
  int bytes_read = i2s_pop_sample(I2S_PORT, (char *)&sample, portMAX_DELAY); // no timeout
  if (bytes_read > 0) {
    Serial.println(sample);
  }
}

Jak widać ESP32 (driver I2S) pracuje jako slave (więc zegar BCK i wybór kanału "Word select" ) są generowane przez scalak przetwornika I2S. Tutaj ustawienia drivera I2S z ESP32:

 const i2s_config_t i2s_config = {
      .mode = i2s_mode_t(I2S_MODE_SLAVE | I2S_MODE_RX), // Receive, not transfer
      .sample_rate = 44100,                         // 44,1KHz
      .bits_per_sample = I2S_BITS_PER_SAMPLE_24BIT, // could only get it to work with 32bits
      .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, // use both channel
      .communication_format = i2s_comm_format_t(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),
      .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,     // Interrupt level 1
      .dma_buf_count = 4,                           // number of buffers
      .dma_buf_len = 8                              // 8 samples per buffer (minimum)
  };

Jak widać I2S driver pracuje jako slave, fs=44,1 Khz, 24-bity na próbkę i format wejścia I2S. Program skompilował się poprawnie i uruchamia się bez błędów. Sample w głównej pętli sa sukcesywnie pobierane. Aby chociaż trochę się zorientować, czy sample są poprawne wyłączyłem prawy kanał w programie generatora przebiegów, a w lewym kanale zmieniałem częstotliwość na : 2Hz, 18Hz i 340 Hz. Poniżej zrzuty ekranów z plotera portu szeregowego (gdzie są sample) dla podanych wyżej częstotliwości:

2Hz_plotter.thumb.png.5e2573f97c70415da4e718d758dddd71.png

18Hz_.thumb.png.4915bfbc24f0d0001a4d2741538210fd.png

340HzPlotter_.thumb.png.18a5d9937f8d1665699bf2e5ef6921de.png

Jak widać te zmiany częstotliwości są odwzorowane w wykresach wyświetlanych przez ploter portu szeregowego (więc taki podstawowy test jest zdany). Pozostaje więc tylko dodać kod do liczenia FFT z tych sampli i zobaczyć jak wygląda widmo przebiegów z generatora. W archiwum zip cały kod projektu (z header files) dla "Arduino IDE".

FFT_on_ESP32_PCM1808_04.zip

BTW: ponieważ protokół I2S jest bardzo prosty, nie powinno nastręczać problemu podłączenia ADC PCM1808 do układu FPGA i napisanie w Verilog'u kodu do odbioru danych z przetwornika.

Pozdrawiam

Edytowano przez FlyingDutch
  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.