+420 602 267 146
[email protected]

Mikrokontroléry ATtiny 4/5/9/10: Miniaturní výkon pro vaše projekty

V polovině roku 2009 uvedl výrobce mikrokontrolérů ATMEL na trh řadu velmi zajímavých miniaturních mikrokontrolérů řady ATtiny 4/5/9/10. Všechny se vyrábějí v provedení pouzdra SOT-23, mají 6 vývodů a rozměry zhruba 2x3 mm. Tato čtveřice sourozenců se liší velikostí paměti RAM a přítomností AD převodníku. Nejvýkonnější provedení je ATtiny10, na který se v článku podíváme podrobněji a vyzkoušíme si jednoduchou aplikaci v assembleru AVRstudia dodávaného firmou ATMEL zdarma v rámci podpory prodeje.

Nenechme se zmást miniaturními rozměry - cca 2x3 mm - celého mikrokontroléru. Uvnitř tohoto miniaturního pouzdra tepe výkonné jádro se spoustou standardních i rozšířených periférií.

Schéma pouzdra mikrokontroléru ATtiny 4/5/9/10 s označením vývodů.

Mikrokontroléry ATtiny 4/5/9/10: Provedení a rozdíly

Mikrokontroléry ATtiny 4/5/9/10 se vyrábějí ve dvou provedeních pouzder: SOT23-6 (cca 2x3 mm) a UDFN s osmi pady (cca 2x2x0,6 mm). Z hlediska rozměrů a pájitelnosti je pro běžné uživatele přijatelnější „větší“ pouzdro SOT23-6.

Popis pinů

  • VCC, GND - napájecí napětí pro mikrokontrolér.
  • Port B (PB3..PB0) - jedná se o 4bitovou obousměrnou (vstupně/výstupní) bránu (port) s interními pull-up rezistory, individuálně nastavitelnými pro každý I/O bit.
  • RESET - vstup pro RESET signál. Nízká úroveň signálu trvající déle než 2 000 ns pro 1,8 V, popř. 400 ns při napájení 5 V generuje reset mikrokontroléru, pokud běží hodiny a zároveň tento pin není pro signál RESET zakázán. Z důvodu malého počtu I/O pinů lze totiž tomuto pinu přiřadit alternativní funkci - buď vstup přerušení PCINT3, nebo vstup AD převodníku na kanálu 3 (ADC3).

Rozdíly mezi ATtiny 4/5/9/10

Existují 4 provedení tohoto mikrokontroléru s rozdíly ve vybavení a velikosti interní RAM paměti:

  • ATtiny4
  • ATtiny5
  • ATtiny9
  • ATtiny10

Běžně k dostání je nejvýkonnější typ - ATtiny10, v ceně cca 30 Kč. Na něm lze zkoušet bez omezení a případně po odladění a optimalizaci programu použít typ s menší výbavou.

Registry mikrokontroléru ATtiny 4/5/9/10

Mikrokontroléry používají 16 registrů číslovaných od R16 po R31. Toto je z důvodu „kompatibility“ s AVR rodinou mikrokontrolérů, která používá 32 registrů. Registry R26 až R31 mohou tvořit tzv. párové registry - R26+R27 je tzv. X registr, R28+R29 je tzv. Y registr a R30+R31 je tzv. Z registr. Tyto 16bitové registry jsou používány pro nepřímé adresování paměťového prostoru (rozsah adres paměti programu je 1 024 adres).

Zdroje hodinového signálu a volba pracovního taktu

Další zajímavou vlastností je volba hodinového kmitočtu. V podstatě existují tři možné zdroje kmitočtu pro řízení mikrokontroléru:

  • vnější (externí) hodinový signál CLKI (přivedený na vývod CLKI = PB1)
  • „watchdog“ oscilátor
  • interní kalibrovaný RC oscilátor (standardní volba pro RESET u mikrokontroléru)

Rozsah kmitočtů přivedených z vnějšího zdroje je nejširší - od 0 do 12 MHz v závislosti na připojeném napájecím napětí. Pro 12 MHz je třeba napájet mikrokontrolér minimálně 4,5 V. Interní „watchdog“ oscilátor má pevný nastavený kmitočet 125 kHz a interní kalibrovaný RC oscilátor má pevný kmitočet 8 MHz.

Pokud provedeme reset mikrokontroléru, nastaví se automaticky tento interní RC oscilátor, ovšem pozor, také se nastaví automaticky hodnota pro předděličku kmitočtu 8. Jádro mikrokontroléru je tedy bezprostředně po resetu taktováno na 1 MHz. Na rozdíl od ostatních AVR mikrokontrolérů, kdy se hodnota předděličky (CLOCK PRESCALER) nastavuje pomocí tzv. fuse, tzn. pouze při programování a samotný mikrokontrolér tuto hodnotu nemůže měnit, ATtiny4/5/9/10 má možnost tuto předděličku nastavovat programově, a tedy např. volit pro různé části programu různé prováděcí hodinové kmitočty, a tím určovat spotřebu celého mikrokontroléru. Pokud tedy víme, že čekáme na stisk klávesy, můžeme kmitočet snížit a optimalizovat tak spotřebu celého zařízení.

K tomuto nastavení se používá tzv. CLKPSR - Clock Prescale Register. Vidíme, že můžeme dělící poměr kmitočtu hodinového signálu nastavit od 1 (bez dělení) až po 256. Ale to není vše. Za běhu programu můžeme měnit i zdroj hodinového kmitočtu pomocí tzv. CLKMSR - Clock Main Settings Register. Každá změna těchto parametrů však vyžaduje instrukce v délce 4 bytů, což nás může limitovat v příliš časté změně těchto parametrů.

Programování pomocí Tiny Programming Interface (TPI)

Schéma rozhraní TPI pro programování mikrokontrolérů ATtiny.

Na rozdíl od známého ISP interface v provedení SPI u mikrokontrolérů ATMega a ATtiny vyšší třídy, tedy MISO, MOSI, CLK a RESET signálu, používají tyto miniaturní mikrokontroléry tzv. TPI rozhraní neboli Tiny Programming Interface. Tento programovací interface sestává ze dvou vrstev - přístupové a fyzické vrstvy. Programování se provádí pomocí fyzické vrstvy používající signály (z pohledu mikrokontroléru):

  • _RESET - vstupní signál povolující TPI rozhraní
  • TPICLK - vstupní signál hodinového kmitočtu
  • TPIDATA - vstupně/výstupní signál pro komunikaci programátor <-> mikrokontrolér

Programátor s TPI rozhraním si můžete sestavit sami, nebo zvolit hotové řešení. Velmi oblíbený je např. programátor AVRPROG mkII. Tento programátor pracuje pod operačními systémy Windows XP/Vista/7 a s rozhraním USB a nejen že podporuje standardní rozhraní ISP pro většinu mikrokontrolérů ATMega a ATtiny, ale umí také zmiňované TPI rozhraní a jako třešničku PDI neboli Programming and Debugging Interface, což je rozhraní používané u ATXmega mikrokontrolérů. Samozřejmě spolupracuje se všemi verzemi AVRstudia, takže máte v ruce univerzální programátor pro všechny mikrokontroléry vyráběné firmou ATMEL.

Programátor AVRPROG mkII pro univerzální programování mikrokontrolérů.

Ukázková aplikace - blikáme s LED

Co budeme pro pokus potřebovat:

  • programátor, např. AVRPROG mkII
  • mikrokontrolér ATtiny10
  • LED
  • rezistor 1,5 kΩ
  • univerzální plošný spoj, lze i „vrabčí hnízdo” nebo nepájivé kontaktní pole
  • pro „bastlířský" komfort: destičku pro redukci pouzdra z SOT23-6 na DIL rozteč, tedy 2,54 mm
Destička pro redukci pouzdra SOT23-6 na DIL rozteč.

Napájecí napětí pro konstrukci zajišťuje přímo zmiňovaný a doporučovaný programátor. Schéma zapojení je uvedeno na obr. 5, výsledná konstrukce může vypadat jako na obr. 6. Zapojení je tak minimalistické, že minimalističtější být ani nemůže. Obvod ATtiny10 je připojen trvale k programátoru AVRPROG mkII, který zajišťuje napájení celého obvodu +5 V ze sběrnice USB. To je totiž výrobcem předepsané napájecí napětí pro programování, i když vlastní obvod dokáže pracovat při napětí mnohem nižším. Proudový odběr je zanedbatelný a pro ovládání LED se používá jediný „nevyužitý" volný pin mikrokontroléru, a to druhý bit brány (portu) B neboli PB2. Z důvodu spotřeby jsem volil nízkopříkonovou LED s proudem cca 2 mA (předřadný rezistor je 1,5 kΩ).

Schéma zapojení pro blikání LED s ATtiny10.

Výhodou je, že mikrokontrolér je trvale připojen k programátoru, takže jakékoli změny v programu můžeme ihned vyzkoušet. Není třeba ani řešit oddělovací rezistory pro připojení TPI rozhraní. Mikrokontrolér taktéž obsahuje interní rezistor propojující RESET pin s VCC, můžeme tak upustit i od obligátního externího pull-up rezistoru mezi napájením a RESETem.

Destička je připojena k programátoru přes plochý vodič a samořezný 10pinový konektor známý z rozhraní ISP10, tentokráte však s jiným rozmístěním vývodů, daným programátorem AVRPROG mkII.

Program pro blikání s LED v assembleru

Program pro tuto konstrukci je velice jednoduchý a je napsán přímo v asembleru, abych se vyhnul používání vyšších programovacích jazyků a zároveň si vyzkoušel nástroj AVRstudio. Když už budeme blikat, tak aspoň nějak sofistikovaně. Zkusíme si pohrát s čekacím podprogramem a vyzkoušíme práci s více soubory při překladu. Testovací program pro blikání se skládá ze dvou částí - z obslužného programu a podprogramu pro přesné časování.

Zastavíme se u jedné, pro AVR mikrokontroléry nezvyklé věci, a tou je volba zdroje hodinového kmitočtu a volba předděličky - v programu po návěští RESET. Z důvodu ochrany určitých systémových registrů není možné do nich zapsat hodnotu přímo, ale zápisu musí předcházet zápis do registru CCP (Configuration Change Protection Register) na adrese 0x3C. Jediná smysluplná hodnota, kterou můžeme zapsat, je 0xD8 - podle katalogového listu. Po zápisu této hodnoty do CCP registru se během 4 strojových cyklů musí provést zápis do libovolného chráněného registru. V našem případě se jedná o zápis do CLKMSR (viz úvod) registru na adrese 0x37 s následujícím významem jednotlivých konfiguračních bitů:

  • V našem případě se do registru CLKMSR zapisuje hodnota 0x00, tedy volba interního kalibrovaného 8MHz RC oscilátoru.

Další nastavení se týká interní děličky kmitočtu. Ta se nastavuje registrem CLKPSR (viz úvod) na adrese 0x36. Důležitou informací, kterou je potřeba vědět, je, že po resetu procesoru jsou vždy použity tzv. defaultní hodnoty, což je interní RC oscilátor 8 MHz a dělící poměr 8. Pokud po resetu nebo během programu neprovedeme žádný zápis, běží mikrokontrolér ATtiny10 s výsledným systémovým taktem 1 MHz (8 MHz / 8). Oba zmiňované registry - CLKMSR a CLKPSR jsou chráněné proti zápisu, proto musí tomuto zápisu předcházet zápis do registru CCP.

Zajímavější je kód pro čekání stanovené doby v souboru wait.asm. Původní kód napsal pan Radoslaw Kwiecien. Jednalo se o univerzální kód použitelný jak pro řadu ATmega, tak ATtiny. Až do doby, než byly na trh uvedeny mikrokontroléry ATtiny 4/5/9/10. Na rozdíl od předchozích typů mikrokontrolérů tyto neumí strojovou instrukci „sbiw", která dokáže odečítat číselnou konstantu od 16bitového registru vzniklého spojením dvou 8bitových registrů. ATtiny10 sice dokáže dva 8bitové registry sdružovat do 16bitového, neumí však zmiňovanou instrukci odečtu.

Hlavní část podprogramu WaitMiliseconds uschová registry r16 a r17 na zásobník, protože je bude měnit, a rozdělí čekací interval na milisekundové části pomocí 500 μs čekacích smyček, které se opakují tolikrát, jakou hodnotu obsahoval registr r16 před vstupem do podprogramu. Pokud program rozebereme na strojové cykly, bude výsledné čekání o malinko delší, protože např. návratová instrukce RET trvá nějaký čas, skoky v hlavní smyčce ke každé 1 ms přičtou jeden strojový takt apod. V rámci milisekund se ale jedná o poměrně přesné časování. Musíme si uvědomit, že toto bude pracovat za předpokladu, že nevyužijeme žádné přerušení v mikrokontroléru. Jinak by se doba nekontrolovaně prodloužila. Řešením je při volání čekací smyčky zakazovat přerušení.

CodeVisionAVR - vývojové prostředí pro mikrokontroléry Atmel

CodeVisionAVR, známý také jako CVAVR nebo jednoduše Codevision, je plnohodnotný vývojový systém pro mikrokontroléry Atmel AVR. Tento kompilátor pochází od Pavla Haiduca z HP Infotech S.R.L. a je dostupný ve dvou verzích:

  • Plná (Standard) verze: generuje kód pro všechny klasické AVR a ATMega série.
  • Odlehčená (Light) verze: vytváří kód pouze pro klasickou AVR řadu (čísla součástek začínající AT90S....).

K dispozici je také verze pro součástky bez statické paměti SRAM (TinyAVR a AT90S1200) nazývaná CodeVisionAVR Tiny. Tato verze je ke stažení bezplatně z webu Codevision a je omezená velikostí programu, který je možné kompilovat, nicméně stále umožňuje velmi slušnou práci se systémem. Pro vyzkoušení programu je k dispozici zkušební verze s omezenou velikostí výsledného kódu.

Velká obliba vývojových prostředků CodeVisionAVR je bezesporu dána také jejich nízkou cenou, respektive skvělým poměrem cena/výkon. Bezplatná zkušební verze CodeVisionAVR je stejná s komerční verzí, kromě toho že velikost kompilovaného kódu je omezená a knihovny pro PCF8563, PCF8583, DS1302 a DS1307 RTCS jsou odstraněny.

Grafické vývojové prostředí CodeVisionAVR je velmi přívětivé a snadno se používá. Dodávané knihovny nabízejí podporu pro velký počet obvykle používaných vnitřních i vnějších zařízení, jako jsou LCD displeje, hodiny reálného času (RTC), teplotní snímače, UART, SPI, atd. Kompilovaný kód může být programován do procesoru s pomocí vestavěného ISP (In System Programming), který lze použít po úspěšném sestavení kódu.

K dispozici je také terminálový program dodávaný jako část Codevision. Terminál může posílat a přijímat soubory a také má schopnost zobrazit příjem dat v kódu HEX nebo ASCII a odeslání jednotlivých hexadecimálních hodnot. Codevision může produkovat objektový kód ve formátu COFF, díky kterému je možné při vývoji aplikace použít plnohodnotný debugger z AVR Studia od Intelu. Výstupem však může být i formát OBJ nebo Intel HEX pro užití s jiným programátorem FLASH a EEPROM.

CodeVisionAVR je ideálním vývojovým prostředkem zejména pro programátory, kteří mají rádi vysoký komfort práce a nechtějí přitom ztrácet čas přílišným studiem a nastavováním procesorů. To pochopitelně platí pouze v případě, že příslušný obvod je obsažen v knihovně kompilátoru.

SPI periferie na AVR mikrokontrolérech

V tomto tutoriálu si popíšeme, jak funguje SPI periferie na AVR a na čtyřech příkladech si ukážeme její ovládání. První tři příklady budou demonstrovat ovládání Atmelů v rolích Master a Slave. Při nich byste měli získat vhled do ovládání SPI modulu. Poslední příklad bude trochu neobvyklý a zaměří se na ovládání digitálního potenciometru.

Hardware sloužící k SPI komunikaci najdete nejspíš na všech čipech řady Atmega. Attiny používají USI (Universální sériové rozhraní), ale některé mají i SPI rozhraní (Attiny88). Skoro všichni SPI rozhraní Atmelu používáte i když o tom nemusíte vědět, protože ISP programátory totiž využívají SPI rozhraní čipu k nahrátí programu.

SPI na Atmelech umožňuje plně duplexní přenos s bitovou rychlostí až polovinu taktu procesoru. Může pracovat jako master i jako slave a pořadí bitů ve zprávě lze nastavovat softwarově. Krom toho může SPI generovat přerušení nebo atmel probrat ze spánku. Používání SPI v roli mastera je velice snadné, takže si ho určitě oblíbíte. Ke komunikaci používáte dvě až čtyři linky: MISO, MOSI, SCK a v roli slave obvodu ještě SS pin.

Role pinů v SPI komunikaci

  • MISO (Master In, Slave Out)
  • MOSI (Master Out, Slave In)
  • SCK (Serial Clock)
  • SS (Slave Select) - v roli slave obvodu má SS pin přesně tu samou roli jako obecně CS (Chip select). Slouží k aktivaci Slave obvodu. Přivedením log.0 na tento vstup je slave obvod aktivován, nastavý svůj MISO pin jako výstup a může komunikovat. Naopak jestliže je jeho SS vstup držen v log.1, udržuje slave MISO linku ve stavu vysoké impedance (Hi-Z) a neprovádí žádnou komunikaci.

Master obvod má také specifické chování SS pinu. Pokud je SS pin (PB4 na Atmega16) nastaven jako výstup, nemá žádný význam. Jestliže je ale SS pin nastaven jako vstup, tak je potřeba zajistit aby na něm byla log.1 (třeba interním pull-up rezistorem). Jakmile se na něm totiž objeví log.0, přepne se master do role slave! To slouží k tomu, aby spolu mohlo komunikovat více Master obvodů.

Programování a SPI

Fakt, že SPI rozhraní je používáno k programování čipu, přináší drobné komplikace. ISP programátor potřebuje možnost používat vývody RST, MISO, MOSI a SCK. Je tedy potřeba zajistit, že žádné další zařízení nebude některou z linek blokovat. To lze zajistit snadno postřednictvím oddělovacích rezistorů.

Problémy mohou nastat u menších atmelů, kde může být některý z pinů sdílen třeba s AREF. Na ten by jste mohli chtít připojit kondenzátor k filtraci vnitřní reference. Kondenzátor na datové lince ale hrubě omezuje komunikační rychlost. U levných programátorů USBASP nemusí být možné snížit komunikační rychlost. Těm pak jakýkoli kondenzátor na kterékoliv komunikační lince znemožňuje programování.

Registry pro řízení SPI

Řízení SPI se provádí pomocí tří registrů: SPCR, SPSR a SPDR.

  • SPDR: Slouží k manipulaci s daty. Zápisem do něj uložíte data do posuvného registru odkud se pak přímo odesílají. Nesmíte do něj nezapisovat během přenosu, jinak vás o tom informuje vlajka WCOL v registru SPSR. Pro čtení má SPDR vyrovnávací paměť.
  • SPCR: Slouží k řízení periferie. SPI povolujete nebo zakazujete bitem SPE. Pomocí bitu SPIE povolujete přerušení. Bit DORD nastavuje řazení dat ve zprávě. Bity CPOL a CPHA nastavujete mód. Nastavením bitu MSTR zapínáte režim master. Dvojice bitů SPR1 a SPR0 slouží k nastavení přenosové rychlosti.
  • SPSR: Obsahuje dvojici vlajek: WCOL (signalizuje zápis do SPDR během přenosu) a SPIF (signalizuje dokončení přenosu).

Módy SPI

Nastavení módu SPI je shrnuto v tabulce (viz originální dokumentace). Důležité je také nastavení rychlosti přenosu, které je ovlivněno bity SPR1 a SPR0 z registru SPCR a také bitem SPI2X z registru SPSR.

Příklad komunikace Master - Slave

V roli mastera je použití SPI velice snadné. V roli slave je situace trochu odlišná. Pokud má slave odesílat nějaká data, je potřeba mu v DDR registru nastavit pin MISO jako výstup. Samotný zdrojový kód pro master je docela průhledný. Nejprve konfigurujeme vstupy a výstupy.

V roli masteru je důležité správně nastavit pin SS. Pokud tuto funkci nechceme používat, musíme na pinu SS udržovat log.1 nebo jej nastavit jako výstup. V příkladu je využit pull-up rezistor.

Program pro slave obvod je velice jednoduchý. Nastavíme si výstup pro LED. Protože komunikace je jednosměrná a slave nemá co vysílat, nemuseli bychom si nastavovat MISO (PB6) jako výstup. Ale pro zajímavost to uděláme.

V hlavní smyčce slave obvodu čekáme na nastavení vlajky SPIF, která bude signalizovat příjem 1 byte. Jakmile přijde, vyčteme data z SPDR, čímž se smaže vlajka a systém je připraven pro přijetí dalších dat. Pak už jen podle přijatého byte rozsvítíme nebo zhasneme LED.

Ukázka komunikace Master - Slave na osciloskopu.

V dalším příkladu si předvedeme jednosměrnou komunikaci, ve které bude master přijímat data ze slave. Slave necháme pracovat s přerušením.

CodeVisionAVR a jeho možnosti

CodeVisionAVR je známý jako CVAVR nebo jednoduše Codevision. Tento kompilátor od Pavla Haiduca z HP Infotech S.R.L. je plnohodnotným vývojovým systémem pro mikrokontroléry Atmel AVR. V plné verzi generuje kód pro všechny klasické AVR a ATMega série, zatímco odlehčená verze vytváří kód pouze pro klasickou AVR řadu (čísla součástek začínající AT90S....). K dispozici je také bezplatná verze CodeVisionAVR Tiny pro součástky bez statické paměti SRAM (TinyAVR a AT90S1200), omezená velikostí programu.

Zkušební verze CodeVisionAVR je identická s komerční verzí, s výjimkou omezené velikosti kompilovaného kódu a chybějících knihoven pro RTC.

Grafické vývojové prostředí CodeVisionAVR je uživatelsky přívětivé a nabízí podporu pro mnoho vnitřních i vnějších zařízení, jako jsou LCD displeje, hodiny reálného času, teplotní snímače, UART, SPI a další. Kompilovaný kód lze programovat do procesoru pomocí vestavěného ISP. Codevision také obsahuje terminálový program pro odesílání a příjem souborů a podporuje různé výstupní formáty (COFF, OBJ, Intel HEX).

CodeVisionAVR je ideální volbou pro programátory, kteří hledají komfortní vývojové prostředí s dobrou podporou.

Programování AVR mikrokontrolérů E03 - Arduino IDE (+ AVR s Bootloaderem)

tags: #atmel #vymaskovani #bytu

Oblíbené příspěvky: