Překlad a nahrávání
V kapitole Příprava prostředí máme nainstalované nástroje
a v kapitole Konfigurace sestavení
je popsané,
co má být v CMakeLists.txt nebo Makefile.
Tady už budeme jen spouštět příkazy.
U běžného programu na počítači často stačí spustit výsledek překladu. U mikrokontroléru je cesta delší:
Soubor .elf je výsledek pro linker a nástroje jako avr-size nebo avr-nm.
Soubor .hex je formát,
který se typicky používá pro nahrání programu do paměti čipu.
Překlad přes CMake
Projekt sestavíte například takto:
cmake -S . -B build -G Ninja
cmake --build build
Ve složce build/ vzniknou typicky dva důležité soubory:
attiny_blink.elfje výsledek pro linker a ladicí nástroje,attiny_blink.hexje soubor vhodný pro nahrání do čipu.
Když chcete změnit cílový čip,
můžete hodnotu MCU předat při konfiguraci:
cmake -S . -B build -G Ninja -DMCU=attiny1626
Stejným způsobem můžete nastavit i F_CPU:
cmake -S . -B build -G Ninja -DF_CPU=3333333UL
Když změníte MCU, F_CPU nebo port programátoru,
je často nejjednodušší smazat složku build/
a nechat CMake vytvořit konfiguraci znovu.
UPDI linka
Novější ATtiny se často programují přes
UPDI,
tedy Unified Program and Debug Interface.
Je to jednovodičové rozhraní pro programování a ladění.
Microchip ho popisuje jako jednovodičovou half-duplex komunikaci založenou na UARTu.
To znamená,
že data tečou po jednom vodiči oběma směry,
ale ne současně.
Tento typ komunikace se také označuje jako 1-Wire (používá se 1 komunikační vodič).
Chvíli mluví programátor,
chvíli odpovídá čip.
Není to stejné jako běžný UART se samostatným TX a RX.
Spíš je to UARTová komunikace nacpaná na jednu společnou linku.
Jednoduchý UPDI adaptér se dá udělat z USB-UART převodníku.
Zapojení používané nástrojem
pymcuprog
vypadá takto:
Prakticky to znamená,
že RX převodníku je připojený přímo na UPDI linku
a TX převodníku jde na stejnou linku přes odpor.
Na nepájivém poli to často vypadá jako odpor mezi TX a RX,
přičemž uzel u RX pokračuje na UPDI pin čipu.
Odpor je důležitý. Když by převodník i čip omylem táhly linku proti sobě, odpor omezí proud. Bez něj by to byla zbytečně drsná hádka dvou výstupů na jednom drátu.
Použijte USB-UART převodník se stejnou logickou úrovní,
jakou má napájený ATtiny.
Když čip běží na 3.3 V,
neposílejte do něj 5 V logiku.
Společná zem (GND) je povinná.
U některých ATtiny může být UPDI pin sdílený s resetem nebo GPIO. Když si špatným nastavením vypnete běžné UPDI, může být potřeba vysokonapěťová aktivace. Tu jednoduchý USB-UART adaptér neumí. Proto si dobře rozmyslete změny fuse bitů a nastavení reset/UPDI pinu.
Kontrola spojení
Než začnete nahrávat,
ověřte,
že počítač vidí programátor a že programátor vidí čip.
Pokud máte v CMakeLists.txt target updi-ping,
spustíte ho takto:
cmake --build build --target updi-ping
Pokud příkaz selže, zkontrolujte hlavně:
- správný port, například
/dev/ttyUSB0, - zapojení
UPDI,GNDa napájení, - jestli máte práva k sériovému zařízení,
- jestli v
MCUpoužíváte správný typ čipu.
Port programátoru se dá předat při konfiguraci:
cmake -S . -B build -G Ninja -DUPDI_PORT=/dev/ttyUSB0
Nahrání programu
Pokud máte v CMakeLists.txt target flash,
program nahrajete příkazem:
cmake --build build --target flash
Typický průběh je:
- CMake zkontroluje, jestli je aktuální
.hex. - Pokud není, program znovu přeloží.
pymcuprogsmaže paměť čipu.- Nahraje nový
.hex. - Ověří, že se program zapsal správně.
Když všechno projde, ATtiny se po resetu rozběhne s novým programem. U blink příkladu by měla začít blikat LED.
Překlad přes Makefile
Pokud místo CMake používáte Makefile,
typicky stačí:
make
Tím vznikne .elf a .hex.
Samotné nahrávání pak můžete spustit ručně přes pymcuprog,
například:
pymcuprog write \
--tool uart \
--uart /dev/ttyUSB0 \
--clk 115k \
--device attiny1626 \
--filename attiny_blink.hex \
--erase \
--verify
--tool uart není UART vašeho programuU pymcuprog znamená --tool uart,
že se k UPDI adaptéru připojujeme přes sériový port počítače.
Není to totéž jako USART nebo UART ve firmware.
Program v čipu nemusí používat UART vůbec.
Časté chyby
Když nahrávání nefunguje, většinou je problém v jedné z těchto věcí:
- špatný port, například jiný než
/dev/ttyUSB0, - chybí oprávnění k sériovému portu,
- špatně zapojené
UPDI, - čip není napájený,
- v projektu je nastavený jiný
MCU, - programátor používá jinou rychlost než je nastavená v programu, například
115k.
Chyba při nahrávání ještě neznamená, že je špatně program. Nejdřív je potřeba ověřit, že funguje komunikace s čipem.