Skocz do zawartości

Sinozębny szuka pilota i kluczy


Pomocna odpowiedź

(edytowany)
Dnia 15.02.2023 o 21:14, pmochocki napisał:

Należy nadmienić, że nRF52805, który chcę użyć jest tak low cost, że nie ma HW PWMa 🙂 . Wygląda więc na to, że jak chcę oprogramować ten moduł w starym NRF5 SDK muszę sam napisać jakieś rozwiązanie.

Przemyślałem trochę jak bym chciał podejść to tego zagadnienia. Najprościej było użyć jakiegoś timera i w przerwaniu robić toggle na pinie (pinach). To, że takie podejście jest siermiężne i pozbawiane finezji to jest do przeżycia, ale czy ja na prawdę chcę budzić CPU 8 tysięcy razy na sekundę? Troszkę słabe z punktu widzenia "low power" jak uwzględni się jaki jest narzut procedury obsługi przerwania do tak prostego zagadnienia.

Jak można podejść do problemu? Można użyć modułu RTC:

image.thumb.png.c934681af29505faa4ac9d503252d21e.png

Jakie są wyzwania? W nRF52805 jest tylko RTC0 i RTC1. SoftDevice blokuje RTC0. A RTC1 jest używany przez AppTimer. Z SoftDevice zrezygnować się nie da, a praca bez AppTimera, to jak praca bez ręki. Odmierzanie czasu, debouncing - to wszystko ogarnianie jest za pomocą biblioteki AppTimer:

image.thumb.png.9b4389a6ea0bf8a99823d6abc5239f71.png

nRF52832 czy nRF52840 ma RTC2 no ale nRF52805 nie ma...

Równoczesne włącznie po AppTimer i RTC Device w NRF5 SDK powoduje następujący problem:

multiple definition of `RTC1_IRQHandler';

Tu trzeba będzie chyba trochę wykręcić rączki SDK, które się skutecznie broni. To jest problem praktyczny. Dziś skupiam się na teoretycznych rozważaniach jakie są możliwości...

Gdy w RTC1 ustawimy prescaler na 1/4 dostaniemy 8192 ticków na sekundę.  

image.thumb.png.26b0ffc8ecaa5761612f188f7eec3a32.png

Następnie należy uruchomić Tick Event (EVTEN), ale nie włączać przerwania (INTEN), aby nie wybudzać CPU. Zamiast tego trzeba stworzyć kanał PPI (Programmable Peripheral Interconnect) i podłączyć event do niego:

image.thumb.png.d2f9b526d3f45db389b0c3df8d6192d5.png

Nawet ten low cost układ nRF52805 ma aż 10 kanałów, które nie są fixed:

image.thumb.png.add00d43ce429b390a5854aeb3b95bd7.png

Kanały fixed są używane przez SoftDevice, bo są ściśle związane z obsługą "radia" i time'ingem BLE:

image.thumb.png.abc903668e9a9cdf5d021bb08be3e1a3.png

Do kanału PPI należy podłączyć pin i task toggle.

image.thumb.png.cbbeb9bbae33ee4e4acdcc71a02bee5c.png

W nRF52 nie mamy GPIO, ale GPOITE (General Purpose Input/Output Tasks and Events) pin potrafi wygenerować event, albo obsłużyć task. Taski, Eventy i kanały PPI nie powodują wybudzania CPU.

"A więc rozwiązanie istnieje!" - W ten sposób powinienem dostać falę prostokątną o częstotliwości 4096 Hz. Czas iść spać - w inżyniera pobawię się jutro.

PS:
Inżynier, fizyk i matematyk wynajęli pokoje w hotelu.
Inżynier budzi się, i czuje dym. Wychodzi z pokoju na korytarz i widzi pożar. A więc biegnie do pokoju, napełnia kosz na śmieci wodą, gasi płomienie i wraca do pokoju.
Jakiś czas później fizyka budzi zapach dymu. Otwiera drzwi i widzi pożar w korytarzu. Idąc po gaśnicę, oblicza szybkość rozprzestrzeniania się płomieni, ciśnienie pianki gaśniczej, trajektorię i tak dalej, po czym gasi płomienie przy minimalnym nakładzie energii i środków.
Na końcu dym budzi się matematyka. Wychodzi na korytarz, widzi pożar i gaśnicę, myśli chwilę i mówi do siebie "A więc rozwiązanie istnieje!" i wraca do łóżka.

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

(edytowany)
Dnia 20.02.2023 o 21:47, pmochocki napisał:

w inżyniera pobawię się jutro.

Jak obiecałem to trzeba dotrzymać słowa.

Dnia 20.02.2023 o 21:47, pmochocki napisał:

Równoczesne włącznie po AppTimer i RTC Device w NRF5 SDK powoduje następujący problem:

multiple definition of `RTC1_IRQHandler';

Tu trzeba będzie chyba trochę wykręcić rączki SDK, które się skutecznie broni.

Gdyby to był komercyjny projekt, to pewnie bym się zastanowił jeszcze dwa razy, czy na pewno zmieniać SDK.  Nie chcę pisać, że takie zmiany są złą praktyką, bo czasami jest to nieuniknione, ale zawsze należy zadbać o to, aby zmiany były minimalne, dobrze udokumentowane i łatwe w utrzymaniu.

Na tym etapie uznaję zmiany, które przygotowałem w SDK za akceptowane, szczególnie że jest to też forma poznawania samego NFR5 SDK.

Oto moja funkcja, która realizuje plan opisany dwa posty wyżej:

/**@brief Function for initializing the 4kHz wave for the buzzer.
 *
 * @details This function initializes the PPI and checks if GPIOTE is initialized. 
 *          If not GPIOTE will be initialized, too.
 *          A PPI channel will be created and the RTC1 tick event will be connected to a pin toggle task.
 *
 * @note This function assumes that the Aplication Timer will be used and that it uses the RTC1 instance.
 *       The following settings must be set in the sdk_config.h:
 *       RTC1_ENABLED 1
 *       APP_TIMER_ENABLED 1
 *       APP_TIMER_CONFIG_RTC_FREQUENCY 3
 *       APP_TIMER_KEEPS_RTC_ACTIVE 1
 *       APP_TIMER_ENABLE_RTC_TICK_EVENT 1
 */
static void sw_4k_wave_setup()
{
    uint32_t tick_evt_addr;
    uint32_t gpiote_task_addr;
    nrf_ppi_channel_t sw_pwm_ppi_channel;
    ret_code_t err_code;

    // RTC1_ENABLED needs to be set to 1 in the sdk_config.h
    // This is required for SDK macros to generate the RTC1 instance name.
    // This seems a better solution than just hardcoding it here.
    // Please note that RTC_ENABLED and NRFX_RTC_ENABLED cannot be set to 1. 
    // Setting RTC_ENABLED or NRFX_RTC_ENABLED to 1 interferes with the Application Timer
    // when RTC1_ENABLED is set to 1 because the Application Timer uses RTC1.
    const nrf_drv_rtc_t rtc = NRF_DRV_RTC_INSTANCE(1);

    err_code = nrf_drv_ppi_init();
    APP_ERROR_CHECK(err_code);

    if(!nrf_drv_gpiote_is_init())
    {
      err_code = nrf_drv_gpiote_init();
      NRF_LOG_INFO("GPIOTE initialized");
      APP_ERROR_CHECK(err_code);
    }
    else
    {
      NRF_LOG_INFO("GPIOTE already initialized");
    }

    // The parameter defines the initial pin state - init_high?
    // true - init high, false - init low
    nrf_drv_gpiote_out_config_t config = GPIOTE_CONFIG_OUT_TASK_TOGGLE(true);

    err_code = nrf_drv_gpiote_out_init(SW_4K_WAVE, &config);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_ppi_channel_alloc(&sw_pwm_ppi_channel);
    APP_ERROR_CHECK(err_code);

    // nrf_drv_rtc_tick_enable can not be used as RTC driver enabling interferes with the App Timer.
    // APP_TIMER_ENABLE_RTC_TICK_EVENT 1 needs to be used to enable RTC tick event during app_timer_init().
    // If you can not find the APP_TIMER_ENABLE_RTC_TICK_EVENT in sdk_config.h this means you are missing
    // the needed NRF5 SDK patches prepared by pmochocki.

    // nrf_drv_rtc_tick_enable(&rtc, false);

    tick_evt_addr = nrf_drv_rtc_event_address_get(&rtc, NRF_RTC_EVENT_TICK);

    gpiote_task_addr = nrf_drv_gpiote_out_task_addr_get(SW_4K_WAVE);

    err_code = nrf_drv_ppi_channel_assign(sw_pwm_ppi_channel, tick_evt_addr, gpiote_task_addr);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_ppi_channel_enable(sw_pwm_ppi_channel);
    APP_ERROR_CHECK(err_code);

    nrf_drv_gpiote_out_task_enable(SW_4K_WAVE);
}

Żeby funkcja działała poprawnie muszę uruchomić tick event na liczniku RTC1. Nie mogę użyć funkcji API do drivera RTC, bo RTC1 jest używane przez App Timer i jego włączenie powoduje różnego rodzaju komplikacje - jak na przykład podwójna deklaracja funkcji obsługi przerwania. 

Dopisałem więc kilka linijek w funkcji inicjalizującej App Timer:

ret_code_t app_timer_init(void)
{
    ret_code_t err_code;
    drv_rtc_config_t config = {
        .prescaler          = APP_TIMER_CONFIG_RTC_FREQUENCY,
        .interrupt_priority = APP_TIMER_CONFIG_IRQ_PRIORITY
    };

    err_code = NRF_ATFIFO_INIT(m_req_fifo);
    if (err_code != NRFX_SUCCESS)
    {
        return err_code;
    }

    err_code = drv_rtc_init(&m_rtc_inst, &config, rtc_irq);
    if (err_code != NRFX_SUCCESS)
    {
        return err_code;
    }
    
#ifdef APP_TIMER_ENABLE_RTC_TICK_EVENT
    drv_rtc_tick_enable(&m_rtc_inst, false); 
    NRF_LOG_WARNING("pmochocki changes to Application  Timer used!!!");
    NRF_LOG_WARNING("You are NOT using vanilla NRF5 SDK anymore!!!");
    NRF_LOG_WARNING("RTC: Tick event enabled.");
#endif

    drv_rtc_overflow_enable(&m_rtc_inst, true);
    drv_rtc_compare_set(&m_rtc_inst, 1, DRV_RTC_MAX_CNT >> 1, true);
    if (APP_TIMER_KEEPS_RTC_ACTIVE)
    {
        drv_rtc_start(&m_rtc_inst);
    }

    m_global_active = true;
    return err_code;
}

Całość jest pod ifdefem APP_TIMER_ENABLE_RTC_TICK_EVENT. Dodałem odpowiednie warningi, które powinny zapalić czerwoną lampkę, gdyby ktoś użył tego nieświadomie. Sam ifdef też odpowiednio udokumentowałem w NRF5 SDK, tak aby zmiany były widoczne jak zmienia się sdk_config.h manualnie jak i za pomocą konfiguratora CMSIS:

image.thumb.png.527833b1350f71c7096c2fb746c4a242.png

Najważniejszą zaletą tego podejścia jest to, że gdy opcja nie jest włączona, to SDK zachowuje się jak oryginalne. W związku z tym zmiany nie powinny przeszkadzać w innych projektach. W moim przypadku to nie jest kluczowe, ale gdybym rozwijał projekt z kilkoma osobami, to takie podejście do zmian w SDK byłoby niezbędne. 

A wynik działania:
image.thumb.png.8947df79108b63de50d002a38f8bd1a2.png

Wszystko działa zgodnie z założeniami i nie ma negatywnego wpływu na połączenie BLE czy debounce przycisku. 🙂 

image.thumb.png.5c6951f81787ae607d54952bb79a4368.png

 

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

Po dość długim czasie dziś udało mi się wrócić do tego projektu.

Do tej pory bawiłem się NRF52 DK. Ale chciałem wreszcie przejść na zakupione moduły. No i znów troszkę się zdziwiłem. Przeszedłem z NRF Connect SDK na NDR5 SDK, bo na tym nowym z Zephyr OS brakowało mi RAMu. Ale okazuje się, że NRF52805 nie jest oficjalnie wspierany w NRF5 SDK. W dokumentacji znajdujemy taką informację:

image.thumb.png.2ec21474535550e2f1e823977764ff7b.png

A jak już wejdziemy na stronę: https://devzone.nordicsemi.com/guides/short-range-guides/b/getting-started/posts/developing-for-the-nrf52805-with-nrf5-sdk to okazuje się, że SDK trzeba sobie samemu spatchować. Co więcej patche nie są kompletne, bo sam znalazłem błąd odnośnie ilości kanałów PPI, który musiałem poprawić.

Jak już ogarnąłem poprawki do SDK i ustawień projektu, to zdefiniowałem własną płytkę w components/boards.

Mogłem wreszcie złożyć wszystko na płytce stykowej i podjąć pierwszą próbę podłączenia modułu do programatora:

IMG_20230411_235259.thumb.jpg.5f62746109a00e0fe22f77122b73d8c1.jpg

Na szczęście udało się za pierwszym razem.

Connecting ‘J-Link’ using ‘USB’
Loaded D:/SEGGER/SEGGER Embedded Studio for ARM 7.10a/bin/JLink_x64.dll
Firmware Version: J-Link OB-nRF5340-NordicSemi compiled Dec  3 2021 15:46:49
DLL Version: 7.84`
Hardware Version: V1.00
Target Voltage: 3.300
Device "NRF52810_XXAA" selected.
Current Speed: 2000 kHz
InitTarget() start
InitTarget() end
Found SW-DP with ID 0x2BA01477
DPIDR: 0x2BA01477
CoreSight SoC-400 or earlier
Scanning AP map to find all available APs
AP[2]: Stopped AP scan as end of AP map has been reached
AP[0]: AHB-AP (IDR: 0x24770011)
AP[1]: JTAG-AP (IDR: 0x02880000)
Iterating through AP map to find AHB-AP to use
AP[0]: Core found
AP[0]: AHB-AP ROM base: 0xE00FF000
CPUID register: 0x410FC241. Implementer code: 0x41 (ARM)
Found Cortex-M4 r0p1, Little endian.
FPUnit: 6 code (BP) slots and 2 literal slots
CoreSight components:
ROMTbl[0] @ E00FF000
[0][0]: E000E000 CID B105E00D PID 000BB000 SCS
[0][1]: E0001000 CID B105E00D PID 003BB002 DWT
[0][2]: E0002000 CID B105E00D PID 002BB003 FPB

Uruchomiłem logowanie po RTT wgrałem program i ... nic. Nic się nie loguje i klapa. Zacząłem więc uruchamiać program po kolei pod debuggerem. Okazało się że zwis następuje podczas inicjowania soft device. Stwierdziłem, że problemem może być kwarc zegarkowy. Zmieniłem więc konfigurację NRF_CLOCK_LF_SRC na NRF_CLOCK_LF_SRC_RC. Pojawił się warning podczas budowania projektu:

10> D:\nrf_sdk\nRF5_SDK_17.1.0_ddde560\components\softdevice\common\nrf_sdh.c:78:6: warning: #warning Please select NRF_CLOCK_LF_ACCURACY_500_PPM when using NRF_CLOCK_LF_SRC_RC [-Wcpp]
10>    78 |     #warning Please select NRF_CLOCK_LF_ACCURACY_500_PPM when using NRF_CLOCK_LF_SRC_RC
10>       |      ^~~~~~~

Ustawiłem więc NRF_CLOCK_LF_ACCURACY na NRF_CLOCK_LF_ACCURACY_500_PPM. Wszystko się skompilowało i załadowało bez problemu, ale teraz zamiast zwisu miałem Fatal error:

<info> app: Initialize: 'Blatand find my remote!'
<info> app_timer: RTC: initialized.
<warning> app_timer: pmochocki changes to Application  Timer used!!!
<warning> app_timer: You are NOT using vanilla NRF5 SDK anymore!!!
<warning> app_timer: RTC: Tick event enabled.
<error> app: Fatal error

Wyglądało na to, że przekompilowanie w trybie debug da więcej informacji:

image.thumb.png.2d9a52f185c5a762220f02bb9f02d08b.png

No i się udało trochę więcej informacji uzyskać:
 

<info> app: Initialize: 'Blatand find my remote!'
<info> app_timer: RTC: initialized.
<warning> app_timer: pmochocki changes to Application  Timer used!!!
<warning> app_timer: You are NOT using vanilla NRF5 SDK anymore!!!
<warning> app_timer: RTC: Tick event enabled.
<error> app: ERROR 7 [NRF_ERROR_INVALID_PARAM] at D:\nrf_sdk\nRF5_SDK_17.1.0_ddde560\examples\workspace\ble_app_blinky_4\main.c:472
PC at: 0x000196C9
<error> app: End of error report

Funkcja nrf_sdh_enable_request pod linią 472 zwraca NRF_ERROR_INVALID_PARAM. Funkcja ta woła:

/**@brief Enables the SoftDevice and by extension the protocol stack.
 *
 * @note Some care must be taken if a low frequency clock source is already running when calling this function:
 *       If the LF clock has a different source then the one currently running, it will be stopped. Then, the new
 *       clock source will be started.
 *
 * @note This function has no effect when returning with an error.
 *
 * @post If return code is ::NRF_SUCCESS
 *       - SoC library and protocol stack APIs are made available.
 *       - A portion of RAM will be unavailable (see relevant SDS documentation).
 *       - Some peripherals will be unavailable or available only through the SoC API (see relevant SDS documentation).
 *       - Interrupts will not arrive from protected peripherals or interrupts.
 *       - nrf_nvic_ functions must be used instead of CMSIS NVIC_ functions for reliable usage of the SoftDevice.
 *       - Interrupt latency may be affected by the SoftDevice  (see relevant SDS documentation).
 *       - Chosen low frequency clock source will be running.
 *
 * @param p_clock_lf_cfg Low frequency clock source and accuracy.
                         If NULL the clock will be configured as an RC source with rc_ctiv = 16 and .rc_temp_ctiv = 2
                         In the case of XTAL source, the PPM accuracy of the chosen clock source must be greater than or equal to the actual characteristics of your XTAL clock.
 * @param fault_handler Callback to be invoked in case of fault, cannot be NULL.
 *
 * @retval ::NRF_SUCCESS
 * @retval ::NRF_ERROR_INVALID_ADDR  Invalid or NULL pointer supplied.
 * @retval ::NRF_ERROR_INVALID_STATE SoftDevice is already enabled, and the clock source and fault handler cannot be updated.
 * @retval ::NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION SoftDevice interrupt is already enabled, or an enabled interrupt has an illegal priority level.
 * @retval ::NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN Unknown low frequency clock source selected.
 * @retval ::NRF_ERROR_INVALID_PARAM Invalid clock source configuration supplied in p_clock_lf_cfg.
 */
SVCALL(SD_SOFTDEVICE_ENABLE, uint32_t, sd_softdevice_enable(nrf_clock_lf_cfg_t const * p_clock_lf_cfg, nrf_fault_handler_t fault_handler));

 Nie ma w SDK źródeł do soft device, ale widać, że jest problem z konfiguracją zegara:

NRF_ERROR_INVALID_PARAM Invalid clock source configuration supplied in p_clock_lf_cfg.

Sprawdziłem więc pod debuggerem co jest w strukturze p_clock_lf_cfg podczas wołania sd_softdevice_enable: 

image.thumb.png.10d016a04388b582cf3d35bbcc1376b9.png

Wszystko wygląda poprawianie source == 0 czyli RC i accurancy == 1 czyli 500 ppm.

Zacząłem więc szukać informacji o rc_ctiv i rc_temp_ctiv. I co się okazało, że jest w dokumentacji notatka, która dokładnie mówi, jak te parametry powinny być ustawione:

image.thumb.png.dac76bcca1f7567801a332ca3edb74fc.png

Po odpowiednim skonfigurowaniu wszystko zadziałało jak trzeba. Mój smartfon się łączy bo BLE i wszystko działa zgodnie z oczekiwaniem.

<info> app: Initialize: 'Blatand find my remote!'
<info> app_timer: RTC: initialized.
<warning> app_timer: pmochocki changes to Application  Timer used!!!
<warning> app_timer: You are NOT using vanilla NRF5 SDK anymore!!!
<warning> app_timer: RTC: Tick event enabled.
<info> app: 'Blatand find my remote!' started.
<info> app: GPIOTE already initialized
<info> app: Connected
<info> app: Received LED ON!
<info> app: Received LED OFF!
<info> app: Disconnected

Może pora na na pierwszą wersję płytki...

Na koniec wnioski:

  • NRF52805 nie działa out of the box z NRF5 SDK. Z jednej strony rozumiem, że NRF5 SDK nie jest już aktywnie rozwijane, ale jakiś summer intern mógłby jednak nanieść odpowiednie poprawki. Wyglądałoby to o wiele lepiej niż link do zewnętrznej strony w oficjalnej dokumentacji. Wiem, że jest nowy NRF Connect SDK, ale dla tych małych okrojonych układów chyba starsze SDK bez RT OS sprawdza się lepiej.
  • Muszę zrozumieć czemu kwarc zegarkowy na płytce stykowej nie zadziałał.
  • Zmarnowana godzina na debugowanie - Oczywiście mógłbym twierdzić, że SDK, podobnie jak z accuracy, mogłoby sprawdzić te parametry podczas kompilacji... Jednak prawda jest taka, że zazwyczaj problem jest pomiędzy krzesłem a klawiaturą. Przenosiłem projekt z development kit na inny moduł, zmieniałem parametry, aby nie używać kwarcu zegarkowego, ale nie chciało mi się doczytać szczegółów w dokumentacji i się zemściło. Ponad godzina debugowania zamiast 10 minut czytania. Więc kolejny raz ta sama nauczka: RTFM!!!
  • Lubię! 2
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

34 minuty temu, pmochocki napisał:

Muszę zrozumieć czemu kwarc zegarkowy na płytce stykowej nie zadziałał.

Ze względu na pojemności pasożytnicze? Myślę że lepszym rozwiązaniem byłoby przylutowanie go bezpośrednio na pcb. No i kwestia czy nie potrzebuje on dodatkowych elementów do wzbudzenia. Tak czy owak, gratki że udało się ten moduł uruchomić! 

Link do komentarza
Share on other sites

4 minuty temu, _LM_ napisał:

Ze względu na pojemności pasożytnicze?

No właśnie dlatego nie dodawałem już kondensatorów, bo te kilka pico faradów na stykówce jest za free. Zazwyczaj ten trick działał. 

6 minut temu, _LM_ napisał:

Myślę że lepszym rozwiązaniem byłoby przylutowanie go bezpośrednio na pcb.

No właśnie chyba przetestuje buzzer na stykówce i przygotuje już pierwszą wersję płytki, którą przyczepię do pilota, tam będzie miejsce na kwarc.

Link do komentarza
Share on other sites

Tak, tyle że te pojemności są mocno rozproszone niby to tylko 32kHz ale kto wie jakimi ścieżkami tamte sygnały podążają. Druga sprawa to nie widzę odsprzęgania zasilania, myślę że nawet te 100n jak najbliżej nrfa mogłoby poprawić ogólną niezawodność prototypu. 

Link do komentarza
Share on other sites

6 godzin temu, _LM_ napisał:

Tak, tyle że te pojemności są mocno rozproszone niby to tylko 32kHz ale kto wie jakimi ścieżkami tamte sygnały podążają.

Tu pełna zgoda i mam nadzieję, że zlutowanie tego na płytce rozwiąże problemy. 

6 godzin temu, _LM_ napisał:

Druga sprawa to nie widzę odsprzęgania zasilania, myślę że nawet te 100n jak najbliżej nrfa mogłoby poprawić ogólną niezawodność prototypu. 

Te kondensatory są w samym module pod metalową obudową. Dodanie jeszcze jednego na zewnątrz nie zaszkodzi... 

Link do komentarza
Share on other sites

(edytowany)
Dnia 12.04.2023 o 00:53, pmochocki napisał:

Muszę zrozumieć czemu kwarc zegarkowy na płytce stykowej nie zadziałał.

Znalazłem kwarc zgodny ze specyfikacją 12.5pF i ruszyło - nawet bez podpiętych pojemności na płytce stykowej. 

Edytowano przez pmochocki
  • Lubię! 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.