Příprava prostředí
V této části budeme počítat s Debianem nebo systémem, který se mu hodně podobá. Nebudeme se vázat na konkrétní vývojové prostředí. Důležité je mít nainstalované nástroje, které umí program přeložit a později nahrát do čipu.
Co je potřeba nainstalovat
Pro překlad programu na ATtiny potřebujeme cross-kompilátor. To znamená, že program překládáme na běžném počítači, ale výsledek poběží na procesoru jiné architektury. V našem případě na AVR čipu.
Na Debianu nainstalujte základní nástroje:
sudo apt update
sudo apt install gcc-avr binutils-avr avr-libc cmake ninja-build python3-pip pipx
Balíček gcc-avr obsahuje překladač avr-gcc.
Balíček binutils-avr obsahuje nástroje jako avr-objcopy, avr-size nebo avr-nm.
Balíček avr-libc
obsahuje základní knihovnu a hlavičkové soubory pro AVR.
Pro nahrávání novějších ATtiny přes UPDI se hodí nástroj
pymcuprog.
Ten na Debianu obvykle není jako běžný apt balíček,
proto je nejčistší nainstalovat ho přes pipx:
pipx install pymcuprog
Po instalaci zkontrolujte, že nástroje existují:
avr-gcc --version
avr-objcopy --version
pymcuprog --version
pymcuprogpipx instaluje programy typicky do ~/.local/bin.
Pokud příkaz pymcuprog nejde spustit,
zkontrolujte, že máte ~/.local/bin v proměnné PATH.
Struktura projektu
Jednoduchý projekt může vypadat takto:
attiny-blink/
├── CMakeLists.txt
└── src/
└── main.c
Složka src/ obsahuje zdrojové soubory.
U většího projektu můžete přidat i složku include/
pro vlastní hlavičkové soubory.
Hlavičky pro samotný čip nejsou v projektu.
Ty dodává avr-libc.
Samotný soubor CMakeLists.txt nebo Makefile je konfigurace sestavení.
Ta říká,
jaký čip používáme,
jaké soubory se mají přeložit
a jak má vzniknout výsledný .hex.
Tomu se věnuje kapitola Konfigurace sestavení.
Minimální program
Zdrojový soubor může začít například takto:
#ifndef F_CPU
#define F_CPU 3333333UL
#endif
#include <avr/io.h>
#include <util/delay.h>
#define LED_PIN PIN1_bm
int main(void)
{
PORTA.DIRSET = LED_PIN;
while (1) {
PORTA.OUTTGL = LED_PIN;
_delay_ms(500);
}
}
Tady je důležitý hlavně řádek:
#include <avr/io.h>
Soubor <avr/io.h>
vybere správné definice podle toho,
pro jaký čip překládáme.
Když překladači řekneme -mmcu=attiny1626,
natáhne se hlavička
<avr/iotn1626.h>.
V ní jsou popsané registry, bity a vektory přerušení pro ATtiny1626.
V příkladu díky tomu existuje třeba PORTA.DIRSET, PORTA.OUTTGL
a maska PIN1_bm.
PA1Příklad počítá s LED připojenou na pin PA1.
Na jiné desce může být LED jinde,
nebo tam nemusí být vůbec.
V embedded světě se vždycky díváme do schématu desky,
nebo si zapojení postavíme sami.
Kde jsou hlavičkové soubory
Na Debianu jsou hlavičky z avr-libc typicky zde:
/usr/lib/avr/include/
Zajímavé soubory:
/usr/lib/avr/include/avr/io.h
/usr/lib/avr/include/avr/interrupt.h
/usr/lib/avr/include/avr/cpufunc.h
/usr/lib/avr/include/avr/iotn1626.h
Soubor io.h je vstupní brána.
Nepíšeme přímo:
#include <avr/iotn1626.h>
ale píšeme:
#include <avr/io.h>
io.h se podle nastaveného čipu rozhodne,
který konkrétní soubor má vložit.
Pro ATtiny1626 v něm najdete něco ve stylu:
#elif defined (__AVR_ATtiny1626__)
# include <avr/iotn1626.h>
V samotném iotn1626.h jsou potom definice registrů.
Zjednodušeně například:
#define PORTA (*(PORT_t *) 0x0400)
#define USART0 (*(USART_t *) 0x0800)
#define PIN5_bm 0x20
To je důvod,
proč v programu můžete psát PORTA.DIRSET
nebo USART0.BAUD.
Nejsou to obyčejné proměnné.
Jsou to pojmenované adresy registrů v paměťové mapě čipu.
Pro pochopení není nejdůležitější konkrétní editor, ve kterém píšete kód.
Důležité je vědět, jaké nástroje se používají:
avr-gcc je překladač,
avr-libc dodává hlavičky
a pymcuprog se bude hodit při nahrávání přes UPDI.
Jakmile rozumíte těmto částem, IDE je už jen pohodlnější obal. Konfigurace sestavení je popsaná v kapitole Konfigurace sestavení a samotný překlad a nahrání programu v kapitole Překlad a nahrávání.