Relativně stručný, ale za to hlubší úvod do nejmenších mikrokontrolérů ATtiny

Mikrokontroléry řady ATtiny patří k nejmenším a nejjednodušším obvodům vhodným k prototypování, které můžeme snadno programovat v prostředí Arduino.  Byly doby, kdy 1 MHz a 512 B RAM byl naprostý luxus, ale na primitivní zařízení s požadavkem nepatrného odběru, malé ceny a velikosti se ATtiny stále s oblibou používá. Podobně jako populární 555 má pouze 8 vývodů. A sehnat se dá pod padesát korun v ČR (nebo od 1USD na e-BAY – verze ATtiny13)

Polovodiče – na nich to všechno stojí

Pro úvod si připomeňme: vodič elektřinu vede, kdežto polovodič ji vede jen za určitých podmínek. Například dioda – vede proud pouze jedním směrem (podobně jako zpětná klapka u digestoře propustí vzduch jen jedním směrem).

Tranzistor – je v číslicové technice využíván jako elektronický spínač – je podobný jednoduchému mechanickému stroji (páka/kladka), kdy malým proudem je spínán (ovládán) větší proud. Díky malým rozměrům je základním stavebním prvkem integrovaných obvodů.
Logické hradlo (obsahuje několik tranzistorů) je základem všech elektronických (číslicových) zařízení.
Jednoduchý klopný obvod tvoří paměťové buňky nebo je částí posuvných registrů a operačních jednotek, bez kterých nefunguje žádný počítač ani chytrý telefon.
Nechceme a ani neumíme suplovat kompletní výuku elektroniky, ale berte to jako inspiraci, shrnutí nebo osnovu, o co by se začátečník měl hlouběji zajímat.

Nepájivé pole nebo univerzální deska?

Vstup do světa elektroniky je „propojování“ – kdy musíme propojit vodiči různé součástky nebo moduly. Před pár lety se na výsluní dostalo Arduino a pak i jednodeskový počítač Raspberry Pi – ale z našich workshopů máme osobní zkušenost, že někteří zájemci o elektroniku mají občas problém i s propojením více kabelů na nepájivém poli. Připojení čidla na I2C sběrnici (4 vodiče!) zvládla snad jediná skupina začátečníků ze šesti.

Na obrázku je v různých variantách snad nejjednodušší možné zapojení:
svítivá LED dioda připojená přes odpor k baterce .
a) nákres – názorný, ale u složitějších zapojení nepoužitelný
b) schéma zapojení – pro zkušenější je stále základem
c) Fritzing a podobné programy umožní grafický náhled – zase spíše pro jednodušší obvody – a nepájivé pole je pro pokusy velmi populární.

Odpověď na otázku z nadpisu odstavce není jednoznačná, nepájivé pole použijeme pro jednorázové jednoduché rozebiratelné zapojení. Pro finální produkty nebo složitější obvody se nám moc neosvědčilo. Mezi desítkou propojení se snadno udělá chyba, která se špatně hledá – můžou být i vadné kablíky nebo mnoho kontaktů po čase není spolehlivých. Už vůbec se nehodí pro pohyblivá vozítka nebo roboty.

Pro podobné pokusy (rozsvícení první ledky) máme oblíbené a odzkoušené dvě desky, které toho ale umí mnohem více (připojit lze Arduino Raspberry Pi na DEV nebo právě popisované Attiny – 
FIRSTboard
a DEVboard
… ale zpět k ATtiny:

Co se ukrývá v tak malém broučkovi?

Na křemíkovém čipu (oranžově) je mnoho obvodů a hradel (zeleně), které se skládají z tranzistorů (modře).
Poslední detailní záběr je pořízen elektronovým mikroskopem.

Velikost paměti pro program je pro typ ATtiny13A pouhý 1kB. V porovnání s nejběžnějším „Arduinem Uno“ s procesorem ATmega328, který má 32kB, je to žalostně málo. ATtiny13 obsahuje i vnitřní EEPROM o velikosti 64 Bajtů – (pro uložení nějakých konstant se to může hodit.)  
Na ploše několika málo milimetrů čtverečních je tedy vtěsnán celý počítač včetně operační paměti, paměti flash a mnoha periferií (vstupních, výstupních a komunikačních).

Obvod má v sobě zabudovaný hodinový oscilátor, takže nepotřebuje už žádné další okolní součástky (krystal). Jedinou externí doporučenou součástkou je kondenzátor na napájecím napětí.

ATtiny je vyráběn ve více velikostech (počet nožiček: 6-18), zabýváme se zde obvody, které mají 8 vývodů a vyrábějí se v THT (Through-hole-technology)  i SMD (surface-mount device – povrchová montáž) variantě.
Dva vývody jsou použity pro napájení, zbylých 6 (5 – pokud potřebujeme Reset) je možné použít jako: digitální vstup, digitální výstup, analogový vstup, PWM výstup (Pulse Width Modulation – pulsně šířková modulace) … u obvodu 45 a 85 i jako sběrnice I2c nebo SPI. Jednotlivé nejjednodušší modely řady Attiny:

Nevýhodou obvodu je to, že vzhledem k jeho jednoduchosti ho není možné programovat přímo přes USB (jako třeba některá Arduina), ale je nutno použít USB programátor.

Programátor ATtiny

Jednoduchý programátor se nejčastěji vytváří pomocí Arduina, které se využije jako ISP programátor. Zapojení v nepájivém poli vidíte na následujícím obrázku. Zde jsme použili menší Arduino NANO, jelikož se dá přímo do pole připojit a s ATtiny se propojí pouze několika vodiči:

Pokud si nehodláte s ATtiny pouze jednorázově zaexperimentovat, je vhodné si postavit „trvalý programátor“. Vyhnete se tak občasnému (ale velmi nepříjemnému) špatnému kontaktu drátků a také si neblokujete nepájivé pole na další zapojování. Stejným způsobem, jak popisujeme výše, využijeme jako programátor Arduino NANO v octopusLAB DEVboard desce.

Zapojení na obrázku: vlevo je prototyp, pomocí odpojitelných kabelů, vpravo je trvalé propojení realizováno několika připájenými drátky na spodku desky. Výhodou je i přímé připojení jedné LED diody (zde LED2 na obr. vpravo) a jednoho tlačítka (BTN2) pro první pokusy s ATtiny, které se dají otestovat, aniž by se mikrokontrolér přesouval jinam.

DEVboard je univerzální deska, která snadným způsobem propojí některé z řídících kontrolérů. Nejčastější využití (kromě popisovaného programátoru ATtiny) je například připojení OLED displeje, tlačítek a ledek k Raspberry Pi (a to ve všech variantách – i RPi ZERO) a někdy také s ATtiny, jako I2C slave A/D převodník pro RPi.
Prototypování a výuka – to je základní využití trvale oživených modulů. Jejich propojováním do složitějších celků se dá realizovat celá řada rozsáhlejších projektů.

Základem elektronické části programátoru je propojit napájení a ISP datové piny ATtiny s Arduinem (NANO):
P0(5) s D11, P1(6) s D12, P2(7) s D13.


Program pro ATtiny je možné psát v běžném vývojovém prostředí pro Arduino. Je však nutné provést drobnou úpravu konfigurace.
Podrobněji to popisujeme zde.

Vývojové prostředí Arduino IDE by pak mělo nabízet i programování ATtiny. Na následujícím náhledu je jednodušší verze, jejíž autorem je David A. Mellis.

Na obrázku si všimněte i nastavení. Pozor na správné zvolení portu (Port: my máme v ukázce COM12). A jako programátor ze vybere „Arduino as ISP“. Defaultně je taktování vnitřního oscilátoru (Clock) pro ATtiny 1MHz. Pro jiné frekvence (např. 8MHz) je většinou nutno použít sofistikovanější programátor, který umí „přepálit“ fuse – „pojistky“. Pro velkou část projektů nám ale 1MHz postačí. Dá se i jemně dokalibrovat a tak obvod použít pro jednoduchý zdroj malých frekvencí (1Hz-10kHz). S krystalem by to bylo samozřejmě přesnější.

Netvrdím, že je to úplně triviální a že vše pochopí každý okamžitě. Osminohý brouk ATtiny13 má základní pdf dokumentaci na 186 stranách a manuál pro ATtiny85 má 234 stran! Jednotlivé kapitoly doporučuji studovat detailněji až v případě, že potřebujete nebo chcete vědět víc. Jinak se v moři informací „ztratíte“. Ale prolistovat by si ho měl každý, aby tušil, co se tam dá všechno najít.
Zde je odkaz na pdf dokumentaci přímo od výrobce pro ATtiny85.

Vstupy a výstupy

A konečně si vysvětlíme i princip práce se vstupně-výstupními piny a to na velmi jednoduchém zapojení:

Na DEVboard máme k dispozici LED2 a S2 (tlačítko). Jak se nastaví vstup tlačítka a výstup pro LED? V Arduino IDE stačí pouze zadat v setup() funkci pinMode INPUT nebo OUTPUT:

//octopusLAB #DEVboard, ATtiny i/o example
#define LED2_PIN  1 // pin P1
#define BTN2_PIN  3 // pin P3

void setup() {
pinMode(LED2_PIN, OUTPUT);
//initialize digital pin as an output
pinMode(BTN2_PIN,  INPUT_PULLUP);
// button - input
}
...

My půjdeme však ještě více „do hloubky“:
Mikrokontroléry mívají celou řadu vnitřních registrů (registry jsou často osmibitové: jeden BYTE = 8 bitů, jeden bit pak odpovídá i jednomu pinu na sběrnici). Některé piny sběrnice mohou plnit různé funkce – podle potřeby a nastavení. K registrům ATtiny máme přístup i z Arduino prostředí – pomocí jejich názvů, například „PORTB“:

PORTB (Port B Data Register) – port pro výstup a nastavení pull-up. Používá se spodních pět bitů: PB0 až PB4) Využít se dá i pátý bit RST, ale my ho ponecháme pro Reset a tak budeme mít k dispozici pět pinů. Pro ukázku s LED se PB1 (druhý bit registru – číslováno od nuly) ukáže na pinu sběrnice P1 – a podle toho Led svítí nebo nesvítí.
DDRB (Data Direction Register) – nastavení „směru“ („1″=výstup;“0″=vstup).
PINB (Port B Input) – registr, kde můžeme přečíst vstupní hodnoty.

Použijeme-li Arduino C klasicky pinMode() digitalWrite() pro jednoduché blikání Ledky, bude mít přeložený kód např. 680 B – a tolik se nahrává do flash paměti. Když ale využijeme efektivnější práci s registry, má kód velikost 480 B – což je takřka o čtvrtinu méně! V případě ATtiny 13, kde je k dispozici jen 1k (1024 B), to někdy rozhoduje o proveditelnosti projektu.
Proto to zkusíme trochu více „strojákově“:

Vstupně výstupní piny jsou kolečka P0 až P5. Popisované vnitřní registry máme barevně odlišeny.
Hodnota šedé „X“ znamená, že to pro popisovaný příklad není podstatné
zelená „out“ v PORTB je 0 nebo 1, které se pak objeví na výstupu P1
modrá „in“ v PINB obsahuje 0 nebo 1, která se načetli na vstupu P3

DDRB1=1 (zelená „1“ v oranžovém čtverci) nastaví PORTB1 jako výstupní a pak se signál dostává „ven“ na pin P1.
DDRB3=0 (modrá „0“ v oranžovém čtverci) nastaví možnost čtení, co se objeví „venku“ na pinu P3 – přečte se z PINB3.
PORTB3=1 (modrá „1“ v zeleném čtverci) připne PULL-UP rezistor na vstup PINB3.

Programování ve strojovém kódu procesoru ani práce s assemblerem (jazykem symbolických adres) se sice dnes už používá málo, je ale dobré znát pár základních principů, jak se pracuje s nastavením a čtením bitů v registrech a na sběrnicích.

Logické operace:

~ negace, & AND, | OR, ^ XOR

Binární zápis čísel:

1 => 0b00000001; 2 => 0b00000010; …

Maskování pomocí & (využití operace AND)

0b10101010 & 0b00000001 -> 0 (na nultém bitu prvního parametru je 0)

0b10101010 & 0b00000010 -> 1 (na prvním bitu prvního parametru je 1)

Zkrácený zápis přiřazení:

PORT = PORT & MASK; -> PORT &= MASK;

MAKRA PRO PRÁCI S JEDNOTLIVÝMI BITY (P=PORT, M=MASK)

#define bitGet(p,m) ((p) & (m))

// Get the value of a bit: bitGet(PORTB, BIT(5));

#define bitSet(p,m) ((p) |= (m))

// Set the value of a bit (set it to 1),

// like bitSet(PORTB, BIT(2));

#define bitClear(p,m) ((p) &= ~(m))

// Clear a bit (set it to 0), like bitClear(PORTB, BIT(2));

Nastavení mikrokontoléru, podle úvodního zadání pak může vypadat takto:

DDRB  = 0b00000010; //Data Direction  PB1 „1“out

PORTB = 0b00001000; //pull-up for PB3

Můžeme si vyzkoušet v praxi, jak to funguje – na tom nejjednodušším příkladě, kdy to co čteme ze vstupu tlačítka, posíláme na LED diodu.
Úloha „drát“ – tlačítkem ovládaná Led:


void setup()
{
DDRB = 0b00000010; //Data Direction ("1"=out;"0"=in)
PORTB = 0b0001000; //pull-up for PB3
}

loop()
{
if ((PINB & 0b00001000) == 0) {
PORTB |= 0b00000010; //PB1 to HIGH (LED on) }
else
{
PORTB &= 0b11111101;  //PB1 to LOW (LED off)}
}

Pokud jste se dostali až sem a máte i prakticky vyzkoušeno, otevírá se vám svět celé řady projektů, kdy není potřeba Arduino, protože ATtiny postačí. A když vás článek zaujal a zajímají vás některé další konkrétní ukázky, připravíme pokračování s několika jednoduchými projekty.


(Připraveno ze série článků napsaných pro hamik.cz)

Honza Čopák – https://octopuslab.cz