Přeskočit na hlavní obsah

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
Když shell nezná pymcuprog

pipx 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:

src/main.c
#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.

LED nemusí být zrovna na PA1

Pří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č nepopisujeme nastavení v IDE?

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í.