pondělí 3. srpna 2026

Tester DS3231

    Zadání: Budeme přesně měřit předpokládanou frekvenci krystalu 32768,0Hz modulu [DS3231]. Pak čip zahřejeme – stačí přiložit prst – dojde k teplotnímu dritfu (třeba jen 0.025Hz) tuto malinkou změnu frekvence detekujeme. Vyvoláme nucenou teplotní kompenzaci a ověříme, jestli proběhla.
    pico_DS3231_tester.ino [k náhledu] [ke stažení] 

    Dílčí úkol: Přesné měření frekvence mikrokontrolerem. Procesor RP2040 s PIO stavovými automaty jako reciproční frekvenční čítač. Řešení jsem našel, ale úplně snadná cesta to nebyla viz článek [reciproční frekvenční čítač].

Jak oddělit zrno od plev

    Chceme ověřit, že křemíkové srdce DS3231 tepe na správné frekvenci a změřit, že čip má funkční teplotní kompenzaci. Potřeboval jsem přesný čas do pár drobných projektů, vylovil jsem ze šuplíku pár kusů modulů a pak jsem zjistil, že některé vůbec nejsou tak přesné jak by měly být. Ne každý čip je originál a ne každý klon je funkčním klonem.

    DS3231 má vyvedený pin 32K, kde se po zapnutí napájení objeví aktuální takt krystalu. V ideálním světě by byl přesně 32768.0 Hz

Ideální hodinový takt byl-li by, byl by takto krásný.

    Tedy připojím k čítači, zahřeju s vidím, jestli se frekvence srovná... Ale to je zdlouhavé a není to plně prokazatelné a opakovatelné měření. Navíc, kdo má na stole čítač frekvence?
Postavme tester DS3231. Čip má automatickou teplotní kompenzaci každý 64 sekund nebo ji lze vyvolat příkazem.
reálná frekvence na které tepe krystal uvnitř čipu

Tester DS3231 na Raspberry Pi Pico (RP2040)

    Modul testujeme bez baterie. Po připojení RP2040 k USB dostane napájení. Tím bude zajištěno, že první automatická teplotní kompenzace přijde za 64 sekund. Za tu dobu stihneme měření. Tester komunikuje textově do sériového terminálu.

Připojení modulu ZS-042 nebo HW-084 k Raspberry Pi Pico
  32K ... GP17    (pin číslo 22)
  SWQ ... nepřipojujeme
  SCL ... GP5     (pin číslo 7)
  SDA ... GP4     (pin číslo 6)
  GND ... GND     (pin číslo 38)
  VCC ... 3V3 Out (pin číslo 36)

Další info k logice programu a měření obsahují podrobné komentáře viz [pico_DS3231_tester]. Je nezbytné mít vyřešený reciproční frekvenční čítač viz [blog].

Mezi asi dvaceti hodinovými moduly jsem našel šest vadných, co měly už při startu ujetou frekvenci a pak jeden, který nereagoval na teplotní kompenzaci a jak se zahřál, tak už měl frekvenci mimo už od začátku.


úspěšný test



selhání s frekvencí mimo toleranci

frekvence plave už od začátku


sobota 1. srpna 2026

Frekvenční čítač přímý nebo reciproční?

Frekvenční čítač má změřit frekvenci vstupního signálu. Na Raspberry Pi Pico (RP2040) postavíme frekvenční čítač, který měří do 70MHz. Umí být přesný i pro frekvence menší než 100kHz.

pico_citac_autorange.ino [ke stažení] 

    Komunikuje přes sériový monitor.  Při spuštění vyžaduje zadat hledanou frekvenci, kterou měříme, aby mohl dopočítat chybu ppm. Pokud zadáme 0, tak se spustí automatické měření, které zobrazí pouze frekvenci, kdy změří frekvenci vstupního signálu pomocí PWM periferie a pokud vychází menší než 100kHz zvolí přesnější metodu recipročního měření frekvence.

hledáme 70MHz


Přímé měření frekvence 

    Obvykle si čítač frekvence představím tak, že po stanovenou dobu počítame náběžné hrany signálu a pak spočteme frekvenci. Obecně N pulzů za t sekund f = N/t. Když budeme počítat pulzy po dobu jedné sekundy, tak počet hran je roven frekvenci v Hz. 

Přímý frekvenční čítač pomocí Raspberry Pi Pico (RP2040)

    Použijeme periferii PWM, procesor má 8 nezávislých bloků, každý blok má 2 kanály (A,B).  Každý blok je 16bitový čítač (0 – 65535). Čítač bloku B nemusí tikat podle systémových hodin, ale dá se přepnout do režimu, kdy se inkrementuje pouze, když přijde náběžná hrana pulzu z vnějšího zdroje.
    Drobné hardwarové omezení je, že počítání hran funguje výhradně na kanálu B, což jsou liché piny GPIO. Aby nám fungovalo počítání frekvence musíme vyřešit přetečení. PWM registr má jen 16bitů, takže když napočítá do 65535, musí vyvolat přerušení a inkrementovat 32bitovou proměnnou.
    Finální počet pulzů získáme jako počet přetečení × 65536 + zbytek, který zůstal v hardwarovém čítači.
Více v komentářích přímo v programu viz [pico_primy_citac].

Problém pomalých signálů

    Možný problém u měření pomalých signálů je kvantizační šum. Vstupní signál měříme procesorem. Hodinový takt procesoru není nijak synchronizován či jinak propojen s generátorem vstupního signálu. Na okrajích měřícího okna se může dít to, že pokud se hrana signálu objeví před zavřením počítacího okna, napočítáme N pulzů, ale pokud hrana uteče třeba jen o nanosekundu až po zavření okna, už napočítáme N–1 pulsů. Chybě říkáme ±1 count error.   


f vstupního signálu v Hz
t čas měření v sekundách

pro signál 10Hz měřený v okně 1s
1/10=0,1=10% 
ppm je 0,1 × 1E6 =  ±100000ppm

Reciproční měření frekvence

    Otočíme logiku měření. Nečekáme až se pomalé pulzy naskládají do časového okna, ale pomalý signál je časové okno do kterého natlačíme takty interních hodin procesoru. Kvantizanční chyba bude záviset pouze na frekvenci procesoru a délce měření.
f cpu v Hz
t čas měření v sekundách

pro signál 10Hz a takt procesoru 200MHz, délka meření 1s
10Hz za sekundu má 10 period
takt procesoru trvá 5ns, za sekundu napočítá 20 000 000 taktů
±1 pulz bude nejistota 1/20000000= 0,00000005 
ppm je 0,00000005 × 1E6 = ±0,05ppm 
Srovnejme s předchozí chybou ±100000ppm. Ano, je to opravdu o tolik lepší!

Příklad praktický, měření hodinového krystalu

signál 32768Hz měřený v okně 16 sekund

Přímé měření
počet napočítaných pulsů 32768 × 16 = 524 288
chyba ±1 pulz ≈ 1/524288 = 1,9073486E-6 
ppm 1,9073486E-6 × 1E6 = ±1,91ppm
1,9073486E-6 × 32768= ±0,0625Hz (to je minimální krok s jakým umí přímý čítač měřit; tedy menší odchylka např 0,01Hz se ztratí v kvantizačním šumu)

Reciproční měření
kvantizační chyba ±1 takt procesoru ±1/(200E6 × 16)= 3,125E-10 
ppm je 3,125E-10 × 1E6 = ±0,0003125ppm
odchylka Hz 3,125E-10 × 32768 = ±0, 00001024Hz

Charakteristiky čítačů viz [kapitola 3].
Pro přesné měření nízkých frekvencí (cca do 100kHz) je výhodnější použít reciproční frekvenční čítač, který dosahuje výrazně vyšší přesnosti.

Reciproční frekvenční čítač pomocí Raspberry Pico (RP2040)

RP2040 má programovatelné stavové automaty PIO, které běží deterministicky. Jsou zcela nezávislé na procesoru. Takt PIO je takt procesoru, při 200MHz je to 5ns. 

Přesnému změření délky jedné celé periody vstupního signálu (tedy doby, po kterou je signál ve stavu HIGH + doby ve stavu LOW) pomocí počítání hodinových taktů mikrokontroléru. Program funguje tak, že si nastaví počítadlo (registr X) na maximum a neustále od něj odečítá jedničku, dokud se nedokončí celá jedna perioda signálu.


 0: wait 0 pin 0 
 1: wait 1 pin 0 
 2: set x, 0       
 3: mov x, ~x      
 4: jmp pin 6      
 5: jmp 8          
 6: nop            
 7: jmp x-- 4      
 8: jmp pin 11     
 9: jmp 10         
10: jmp x-- 8      
11: mov isr, x     
12: push           

Jak to přesně funguje?
0: wait 0 pin 0
Synchronizace
PIO automat čeká, dokud měřený pin (index 0) neklesne do logické nuly (LOW). Pokud už na nule je, okamžitě pokračuje dál. Zajišťuje to, že měření nezačne uprostřed již probíhajícího pulzu.
1: wait 1 pin 0
Detekce startu měření
Automat vyčkává na náběžnou hranu – okamžik, kdy se pin překlopí z logické 0 na logickou 1 (HIGH). Přesně v tento moment začíná nová perioda a odstartuje se počítání.
2: set x, 0
Inicializace počítadla
Nastaví hodnotu v interním 32bitovém pracovním registru X na nulu (0x00000000).
3: mov x, ~x
Příprava maxima
Provede bitovou inverzi registru X. Ze samých nul se rázem stane maximální 32bitová hodnota, tedy 0xFFFFFFFF (desítkově 4 294 967 295). Registr se používá jako odpočítávadlo (od maxima směrem dolů).
4: jmp pin 6
Smyčka pro úroveň HIGH
Zkontroluje aktuální stav pinu, který byl nastaven jako skokový (jmp_pin v C kódu). Pokud je na pinu stále logická 1, program skočí na instrukci 6. Pokud je na pinu už logická 0 (začala druhá půlka periody), instrukce neprovede skok a program pokračuje na řádek 5.
5: jmp 8
Opuštění HIGH smyčky
Tento řádek se vykoná pouze ve chvíli, kdy měřený signál spadl z HIGH do LOW. Jedná se o nepodmíněný skok na instrukci 8, čímž se opustí první měřící smyčka a plynule se přejde do druhé měřící smyčky.
6: nop
Vyrovnání taktu (Smyčka HIGH)
Prázdná operace (No Operation), která nedělá nic, ale spotřebuje přesně 1 hodinový takt procesoru. Slouží k tomu, aby jeden oběh HIGH smyčky trval přesně stejný počet taktů bez ohledu na to, kudy kód prochází (udržuje precizní a konstantní časování celého čítače).
7: jmp x-- 4
Odkrojení taktu (Smyčka HIGH)
Sníží hodnotu v registru X o 1 (dekrementuje). Následně skočí zpět na instrukci 4, čímž uzavírá smyčku, která počítá takty, dokud je signál v úrovni HIGH.
8: jmp pin 11
Smyčka pro úroveň LOW
Jsme v měření úseku, kdy je signál dole (LOW). Tato instrukce se ptá: "Naskočil už signál znovu na logickou 1?" Pokud ano (detekována další náběžná hrana = celá perioda je u konce!), skočí se na instrukci 11 a měření se ukončí. Dokud je signál stále v nule, pokračuje se dál na řádek 9.
9: jmp 10
Vyrovnání taktu (Smyčka LOW)
Znovu trik pro udržení stejného počtu taktů. Skočením rovnou na následující řádek 10 se úmyslně spotřebují (spálí) hodinové takty procesoru, aby byla délka LOW smyčky naprosto symetrická (trvala stejný čas) jako HIGH smyčka výše.
10: jmp x-- 8
Odkrojení taktu (Smyčka LOW)
Sníží hodnotu v registru X o 1 a skočí zpět na instrukci 8. Toto uzavírá smyčku, která běží po celou dobu, kdy je signál na logické nule.
11: mov isr, x
Uložení výsledku
Jakmile perioda skončila (na pinu se objevila jednička), program se dostal sem. Hodnota z registru X (od čísla 0xFFFFFFFF se mezitím v obou smyčkách odečetl počet uplynulých taktů procesoru) se překopíruje do vstupního posuvného registru (ISR).
12: push
Odeslání výsledku
Hodnota z ISR se protlačí do RX FIFO paměťové fronty. Z této paměti si už výsledek přečte hlavní C kód (pio_sm_get). Po provedení push se program – díky wrap v hlavním programu – automaticky a bez jakéhokoliv zdržení zacyklí zpět na začátek měření pro další periodu.

Další informace jsou v komentářích viz program [pico_reciprocni_citac] pro Arduino IDE.

pátek 31. července 2026

RTC DS3231

    Hodiny reálného času - čip DS3231 přišel s koncem roku 2005. Obsahuje teplotní kompenzaci (TCXO) krystalu, který je součástí čipu. Uvnitř čipu je digitální teploměr. Čip neustále měří svou vlastní teplotu a na základě toho automaticky přidává nebo ubírá vnitřní kapacitu připojenou ke krystalu. Tím zajistí, aby krystal kmital na naprosto přesné frekvenci bez ohledu na teplotu okolí. Přesnost ±3,5 ppm v rozsahu -40 °C do +85 °C. V praxi to znamená maximální odchylku ±2 minuty za celý rok, což je v této cenové kategorii velmi přesné. Integrovaný teplotní senzor má přenost ±3 °C.
    DS3231 komunikuje po sběrnici I²C na pevné adrese 0x68.
    
    Běžně se dají koupit levné čínské moduly ZS-042 dostupné od roku 2014 nebo HW-084 (2019). Kromě hodinové čipu obsahují i 4kB EEPROM (AT24C32) na defaultní adrese 0x57 (lze změnit).

Moduly obvykle obsahují konstruční vadu při které hrozí problém se záložní baterií. Náprava je snadná a nezbytná.
vždy je třeba odstranit tento rezistor

rezistor U4 odstranit, aby se přerušilo napájení baterie [zdroj]

    Nabídka modulů s DS3231 je větší [1][2].

Ověření teplotní kompenzace

    Jak poznat vadný nebo fake čip DS3231, který nemá potřebnou přesnost nebo teplotní kompenzaci?
Viz [článek] zde na blogu.

Kalibrace čipu

    Podrobně o tom, jak by se dala udělat [kalibrace]?

čtvrtek 30. července 2026

Montezumova pomsta na CoCo3

  


    Vyšel port Montezumovy pomsty pro  Tandy Color Computer 3 [CoCo 3]. Vyžaduje 512K paměti. Podrobnosti a otisk disku ke stažení na [montezuma.retrohome.info]

    18. června byl moc pěkný stream[1], kde se řešila i tato hra.

    Loni jsme si mohli s chutí zahrát režisérský sestřih[2] a letos máme nový port. Je skvělé, že ta hra stále inspiruje k portům a úpravám.

ONLINE spuštění této hry v emulátoru
1) stáhneme otisk disku [dsk]
2) sputíme emulátor [online]
3) tlačítko LOAD vložím stažený disk
4) příkazy
DIR (vypíše obsah diskety)
LOAD "MONTREV.BAS"
RUN


neděle 26. července 2026

Generátor krabiček pro 3D tisk

    Nějakou dobu používám jednoduchý nástroj na tvorbu krabiček pro 3D tisk. Není to nic sofistikovaného, ale je to instatní a rychlé. Určitě je spousta jiných generátorů  [1][2][3] v OpenSCAD,  [4] v Pythonu nebo kombinace s AI, která umožní zadat popis v přirozeném jazyce[5]. V naší české kotlině máme nový webový [krabix], který se postupně etabluje a získává na popularitě. Žel, žádný z parametrických generátorů, co jsem vyzkoušel, nebyl úplně ideální; hlavně jsou všechny příšerně komplexní a mně pro tvorbu jednoduchých krabiček na elektroniku nezbylo než si udělat vlastní. Je ve verzi 0.2 a nemyslím, že je potřeba jít dál.

Co umí takový krabičkovač

    Výstup v STL pro tisk, výstup ve STEP pro další úpravy v modelovacích programech. Potřebuji jen pár drobností - zadám vnitřní rozměry krabičky. Můžu přidat díry hranaté nebo kulaté, větrací otvory, text a na dně krabičky přidat montážní sloupky. Víčko krabičky je zacvakávací, lze přidat šoubovací verzi víka a přidat dole uši pro přistoubování na zeď nebo pod stůl.

Ke stažení

[krabickovac] je spustitelná aplikace, která s sebou nese všechno, co je potřeba ke spuštění. Pokud by byl nějaký problém, napište. Kontaktní formulář je tady někde kolem.
V balíčku s sebou nese všechyn potřebná knihovny Build 123D i OCP CAD Vieweru, takže je to obrovské.
Podrobná dokumentace [PDF].
- krabickovac-0.2-windows-x64.zip [stažení] pro Windows
- krabickovac-0.2-linux-x86_64.tar.gz [stažení] pro Linux
- krabickovac-python.zip [stažení] pouze program

Grafické rozhraní pro nastavení parametrů

    Na krabičku se díváme ve 2D, vždy na vybranou stranu zepředu. Kolem je pravítko, přidávám prvky nebo pole prvků, můžu s nimi hýbat a umístit je na stěně. Jestli jste někdy používali [RoomArranger], tak logika je stejná. Výsledek je ve 3D, ale my nastavím každou stěnu zvlášť.
    Rozpracovanou krabičku lze uložit ve formátu json do souboru s příponou .krab

    Uznávám, že Tkinter, který je dostupný v každém Pythonu vypadá jak z Windows 95, ale je to použitelné a nemám důvod to tvořit v něčem jiném.
    Vložený prvek lze vybrat a když je aktivní, dají se použít šipky na klávesnici k přesunutí.
nastavení parametrů
    Vpravo nahoře píše, co právě dělá - Generuje 3D model - v době kdy posílá model pro zobrazení v 3D náhledu je již na disku uložený STL i STEP celé krabičky.

3D náhled v prohlížeči

Vyzkoušejte sami

    Stačí stáhnout [krabickovac], rozbalit a spustit. 
Spustí si vlastní webový server ocp_vscode, otevře webovou stránku pro 3D náhleded. Otevře grafické rozhraní pro návrh krabičky a na kliknutí zobrazí náhled krabičky ve 3D a zároveň uloží STL pro tisk a STEP pro další zpracování v jakémkoli modelovacím programu.
    Při načtení .krab souboru je k dispozici ukazka1.krab

šoubovací víčko a uši k našroubování
sloupky pro šrouby víčka jsou tisknutelné bez podpor

ukazka2.krab

Ruční generování v Pythonu

    Ruční spuštění v linuxu nebo windows - gui_nastaveni_parametru.py - je grafické rozhraní pro tvorbu krabičky; umí projekt uložit v json do souboru .krab
Nastavené parametry uložíme do souboru konfigurace.py
Program generator_kabicek.py importuje uloženou konfiguraci a uloží STL a STEP

Jak to funguje uvnitř

    Build123d je Python implementace Open Cascade. Díky Pythonu je to výrazně stravitelnější než OpenSCAD. 
    Podrobný popis podporovaných parametrů ve v  souboru test_generator_krabicek.py [stažení]. Vše je podrobně komentováno, ať je jasné jak to funguje. Když se k něčemu vracím po delší době, tak komentáře jsou kotvou i záchranou.
    Pro VS Code existuje rozšíření OCP CAD Viewer, které umí zobrazit přímo ve VS Code 3D náhled.

    Starosti s Build 123d. Sdílím celý balíček krabičkovače s vším, co potřebuje, abych ostatní dělný lid ušetřil utrpení. Pro aktuální verzi Pythonu nebyla funkční verze knihovny dostupná, tak jsem musel sáhnout do repozitáře mrtvých hadů [6] a lovit tam.

    Podrobný popis všech parametrů je v dokumentaci[7].

neděle 12. července 2026

Game over 3

    Končily jarní prázdniny, březen, nedělní podvečer asi hodinu poté, co měla zavřít retroherna a v sále muzea sedělo stále osm lidí. Pařili na Atari s multijoy Mashed Turtles[1]. Než jsme se rozloučili, slíbil jsem mladým a nadějným retrohráčům, že retro video herna Game over bude zase otevřena až se začátkem velkých prázdnin.
    Tak se také stalo. Rok se sešel s rokem a v kině Máj v Uherském Brodě jsme strávili poctivé dva týdny se starými hrami. Hernu navštívilo necelých tři sta návštěvníků a ti nejmenší to brali skoro jako nějaký příměstský tábor; přišli s otevíračkou, zaběhli si domů na oběd; pitný režim máme zajištěný; a vydrželi hrát až do pozdního odpoledne.

    V prvním týdnu nás navštívila delegace z olomouckého atariklubu a druhý týden bylo poctou uvítat profesionální znalce retroher. Jejich dojmy jsou v [reportáži] na highvoltage.cz[2].

středa 1. července 2026

Druhá baterie pro elektrický longboard

 

    Ctihodný pan Ježek, přišel s nápadem, že by na svůj elektrický longboard potřeboval přidat další baterii. Mechanický přepínač by byl příliš velký, elektronický přepínač zase v případě selhání fatálně rizikový. 
antispark konektory XT90

Volíme sedláckou cestu – konektory XT90, které si jezdec ručně přepojí. Zastaví, sundá krytku, přecvakne konektor, vrátí krytku a pokračuje v cestě.
    Longboard má baterii 13S2P, plně nabito 54,6V; pro připojování baterie vyžaduje antispark konektory, aby se předešlo jiskření a vypalování kontaktů.
    Nakonec to bylo to docela snadné, stačilo vymodelovat a vytisknout krabičku a celé to propojit silikonovými kabely AWG12. 
    Baterie je v boxu vlepená na neutrální silikon.

Každý pájený spoj je třeba změřit, protože při stálém proudu 25A a špičkovém proudu 50A je každá desetina miliohmu znát. Spoj se považuje za skvělý, když má odpor menší než 0,3mΩ.

celý box je nalepený Mamutem

tloušťka lepidla je vymezena na 2mm

zaslepený konektor jako ochrana proti prachu

celé řešení

tisknuto tak, aby mechanické namáhání nešlo po vrstvách

Další [fotky].
Krabička k tisku [thingiverse].

blog se přestěhoval...

Začátkem srpna 2026 se blog přestěhoval na novou adresu. Mělo by automaticky dojít k přeměrování na novou adresu, pokud se to nestalo, musít...