Fuses na Attiny24

Fuses, česky by se dalo říct pojistky, slouží k základnímu nastavení Atmelu. Řídí se s nimi zdroj hodin a základní "životní" funkce čipu. Také si jejich špatným nastavením můžete Atmel zablokovat. Jak je používat si přiblížíme v tomto článku.

Fuses se nastavují programátorem. Ať už ISP,JTAG nebo jiným rozhraním. Nelze je až na vyjímky měnit z programu. Jestliže většina periferií byla mezi členy rodiny AVR podobná nebo dokonce stejná, fuses nejsou. To co teď budu popisovat bude platit pro Attiny24A. Ostatní čipy typicky budou mít některé možnosti shodné, ale nelze se na to spoléhat. Snad do nejdůležitější k čemu fuses použijete je nastavení hodinového signálu. Tomu se obecně budu věnovat asi v jiném článku, takže teď by jste měli mít nějákou elementární představu. Attiny24A i její verze s větší pamětí (tiny44A a tiny84A) mají tři fuses byty. Nesou názvy "Low byte", "High byte", "Extended byte" a jejich strukturu najdete v datasheetu v sekci 19.2.

Low Byte
bitnázev bitufunkcezákladní stav
7CKDIV8dělí clock 8mi0
6CKOUTspouští clock na PB21
5SUT1řídí čas nastartování1
4SUT0řídí čas nastartování0
3CKSEL3vybírá zdroj clocku0
2CKSEL2vybírá zdroj clocku0
1CKSEL1vybírá zdroj clocku1
0CKSEL0vybírá zdroj clocku0
High Byte
bitnázev bitufunkcezákladní stav
7RSTDISBLVypnutí externího resetu0
6DWENZapnutí DebugWIRE1
5SPIENPovolení ISP programování1
4WDTONTrvalé zapnutí Watchdogu0
3EESAVENemazat EEPROM při mazání čipu0
2BODLEVEL2Nastavuje úroveň napětí pro BOD0
1BODLEVEL1Nastavuje úroveň napětí pro BOD1
0BODLEVEL0Nastavuje úroveň napětí pro BOD0
Extended Byte
bitnázev bitufunkcezákladní stav
7--1
6--1
5--1
4--1
3--1
2--1
1--1
0SELFPRGENPovoluje sebeprogramování1

Dávejte velký pozor

Červeně jsem zvýranil ty bity, které nikdy neměňte ! Napíšu to raději ještě jenou, nikdy je neměňte, pokud nevíte co děláte. Velká skupina uživatelů AVR jsou začátečníci nebo mírně zkušení programátoři (ti zkušenější to asi číst nebudou) a typicky je jejich výbavou jednoduchý ISP programátor (typicky klon USBASP). Změnou jakékoli z nich už čip s ISP programátorem nebude komunikovat. A s ISP programátorem už to nepůjde vrátit zpátyk. S jinými programátory možná (podle typu). Bit RSTDISBL odpojí reset od pinu PB3. Takže PB3 se stane normálním portem jako všechny ostatní. Ale pro vás to bude znamenat, že jste svůj čip naprogramovali naposled. Tahle možnost slouží k vyjímečným případům, kdy tento pin v aplikaci nutně potřebujete a nevadí vám, že čip už pak není možné v obvodu přeprogramovat (typicky když jen osazujete už vyvinuté zařízení). Bit SPIEN zapíná / vypíná programování po SPI rozhraní - což je přesně to čím čip typicky programujete (AVR-ISP, všechny klony USBASP, programátory do paralelního portu...). Vypnutí (zapsaní log.0) využijete jen pokud chcete aby vaše zařízení už v obvodu nemohl nikdo upravovat. Bit DWEN slouží k zapnutí DebugWIRE rozhraní. Jeho použití ale vyžaduje vyptnuí SPIEN. Pokud máte programátor s DebugWIRE (jako je AVR-ICE nebo AVR-Dragon) můžete si dovolit SPIEN povolit. Čip pak s vámi bude komunikovat pomocí DebugWIRE po resetovacím pinu a vybudete moct program krokovat a ladit přímo v čipu. Pak budete moct DebugWIRE opět vypnout a zapnout ISP. Ale vše stojí na tom že máte programátor s rozhraním DebugWIRE. Pokud ho nemáte, nedokázali by jste znovu zapnout SPIEN.Žlutě jsem pak vybarvil ty bity, kterými můžete čip nepěkně zablokovat, ale se kterými budete potřebovat zacházet.

Význam jednotlivých fuses

Tři pro bastlíře nebezpečené fuse jsme již probrali, teď se vrhneme na ostatní. Bitem WTDON Můžete trvale zapnout Watchdog, pomocí EESAVE můžete zajistit aby zachoval obsah paměti EEPROM při mazání čipu. Pokud ladíte aplikaci využívající EEPROM a pořád čip přeprogramováváte, může se vám to hodit. Bity BODLEVEL nastavují hladinu Brow-out detekce. Ta slouží k tomu aby se čip při podpětí "vypnul". Máte-li nějáký vnější obvod, který nedokáže pracovat při nižším napětí, je lepší zajistit že bude čip vypnutý a nebude se pokoušet v rámci programu s obvodem komunikovat. Napěťové úrovně pro BOD mohou být 1.8V, 2.7V a 4.3V. Výrobce ale uvádí jisté tolerance (viz Table 20-6. v datasheetu), takže nestavte aplikaci na tom že BOD zapracuje na desetinu voltu přesně. Přirozeně ale BOD nemusíte vůbec použít, jeho provoz vás stojí nějákou energii a u nízkoodběrových aplikací by vám to mohlo vadit. Bity CKSEL slouží k volbě clocku čipu. Tady je výběr široký.
Můžete volit z těhto možností:

Červeně jsem vám opět vybarvil možnosti, kterým by jste se měli vyhnout. Nevím jak AVR-ICE ale klasický čínský USBASP prgramátor nebo jeho klony si s červenou variantou neporadí. Nejprve se ve zkratce budu věnovat jednotlivým možnostem a pak se vrátím k tomu co a za jakých okolností můžete zvolit. Aby čip mohl komunikovat s ISP programátorem, je potřeba aby jeho takt byl alespoň 4x vyšší jak komunikační clock programátoru. Levné programátory mají pevnou frekvenci asi 125kHz. Pokud by jste tedy čip přepli na interní 128kHz oscilátor budete si muset sehnat jiný čip nebo jiný programátor. V režimu krystalového oscilátoru, si pak musíte správně zvolit rozsah frekvencí. Možnosti jsou 0.9-3MHz, 3-8MHz a větší jak 8Mhz.Datasheet doporučuje ke krystalu volit kondenzátory z rozsahu 12-22pF. S keramickým rezonátorem je pak možné volit frekvence ještě v rozsahu 0.4-0.9MHz, ale opět vám hrozí riziko že ztratíte možnost čip naprogramovat (pod frekvenci 0.8MHz).

Bity SUT nastavují jak dlouho se bude čip startovat. Kolik ticků clocku a jak dlouhé spoždění se po startu vloží před začátek programu. CKDIV8 nastavuje zda se má clock podělit osmi. Pokud ho zapnete, jádro čipu poběží na 8krát nižší frekvenci než na jaké běží zdroj hodin. Používám-li interní 8MHz oscilátor se zapnutou fuse CKDIV8, poběží čip na 1MHz. Pokud CKDIV8 vypnu, poběží na 8MHz. V novém čipu máte CKDIV8 zapnutý. Bit CKOUT vám umožňuje na pin PB2 vypustit váš clock. To se může hodit při synchronizaci zařízení, ale přijdete o jeden pin. U nového čipu je tato možnost vypnuta. V extended byte je jen jediý bit SELFPRGEN, který povoluje nebo zakatuje instrukci SPM. Pomocí ní je možné zapisovat do flash paměti.Některé čipy jsou z výroby vybaveny bootloadery (naprogamovány). Bootloader komunikuje skrze nějáké rozhraní (typicky UART) a je schopen přijímat data a naprogramovat zbytek flash paměti. Můžete tak programovat čip bez "programátoru". Tuto metodu používá arduino. Takže až někoho budete chtít vydírat, vypněte mu na arduinu SELFPRGEN :D

Jak na to prakticky ?

Pokud by jste museli ručně procházet fuses bit po bitu a volit hodnoty, hrozilo by velké riziko že se přehlédnete a uděláte chybu (ať už vratnou nebo nevratnou). Navíc je to práce dosti otravná. A proto na webu existuje mnoho prostředků, kteří za vás hodnoty fuses připraví. Velice přehledný a užitečný mi přišel nástroj Engbedded Atmel AVR® Fuse Calculator. Zde si můžete přehledně vybrat jak fuses čipu nastavit. Opačně je také možnost přečtené fuses dole do formuláře zapsat a sledovat v menu nahoře jaké je aktuální nastavení čipu. Mimo jiné vám stránka vygeneruje argumenty pro AVRDUDE (driver programátorů), kterým můžete fuses do čipu zapsat. Některé programátory s grafickým rozhraním také umožňují přehledně nastavovat fuses. Mě na všechnu práci stačil výše zmíněný web. V sekci "Device Selection" si vyberete čip. V mém případě Attiny24A. V sekci "Feature configuration" je hned první položkou volba zdroje hodinového signálu (roletkové menu). Paleta je strašn široká, protože jsou uvedeny všechny kombinace zdrojů signálu i startovacích časů... Pak následuje výčet možností, které jsme si už vysvětlovali. V sekci "Manual fuse bits configuration" můžete volit jednotlivé bity fuses. Toho ale nevyužívejte, lepší je konfiguraci v sekci "Feature configuration" a jednotlivé hodnoty všech bitů nechat spočítat jejich web. V sekci "Current settings" je pak shrnuto vaše nastavení. Do této sekce také můžete zapsat vyčtené fuses z vašeho čipu a po stisku "apply values" se podívat na jejich význam.

Když udělám chybu ?

Popíšeme si několik "havárií", kdy se vám špatným nastavením podaří čip "zablokovat". Smrtící kombinace už znovu rozebírat nebudu. Prvním typickým příkladem je přehmat ve zdroji hodinového signálu. Přehlédnete se a místo 8MHz interního RC oscilátoru zapnete 8MHz krystalový oscilátor. Naprogramujete a čip se s vámi přestane bavit. Očekává totiž že mu na piny XTAL1 a XTAL2 připojíte krystal + dva kondenzátory 12-20pF z každého pinu na zem. Zachrana takového čipu je snadná. Prostě sežeňte krystal a kondenzátory a připojte je. Čip krystal rozkmitá a má zase clock a může se bavit s programátorem. Pokud ani tak čip nekomunikuje, podívejte se osciloskopem zda krystal kmitá. Pokud ne zkuste vyměnit kondenzátory za menší/větší. Když ani to nepomůže, nejspíš jste naprogramovali zdroj hodin jinak než se domníváte. V takovém případě se můžete pokusit použít následující postup.

Nastavíte-li jako zdroj hodin externí signál, musíte ho čipu přivést. Mělo by se jednat o pravidelný obdélníkový průběh. Aby jste mohli komunikovat i s programátorem, bylo by dobré aby frekvence byla nejméně 1MHz. Stačí připojit generátor na pin CLKI. Poté by jste měli být schopni opět navázat komunikaci s programátorem a přeprogramovat si fuses zpět. Pokud generátor nemáte, budete si ho muset improvizovaně postavit. Buď pomocí TTL (74HC14 a podobně) nebo elegantněji si ho vytvořit z jiného ATMELu. U Atmelu můžete pužít již zmíněnou CLKOUT funkci nebo si napsat jednoduchý program, který vygeneruje frekvenci vyšší jak 1MHz. Je ale potřeba uvědomit si že clock by měl mít střídu 50%, takže tupá smyčka nastavující port do log.1 a pak do log.0 nemusí mít dostatečně kvalitní průběh. Pokud se pro to rozhodnete doporučoval bych spíš použít některý z časovačů. Pokud vám žádná z metod nezabere, vyplatí se ve většině případů čip zahodit a netrávit hodiny zkoušením různýchmožností nebo sháněním někoho kdo má lepší programátor.

Závěrem

Ze začátku se můžete nastavování fuses vhýbat, ale jakmile přejdete z prvotních pokusů k reálným aplikacím, budete s nimi muset pracovat. Už jen takové hloupé stopky nebo minutky, pokud mají běžet rozumně přesně, potřebují krystalový zdroj clocku. A ten bez fuses nezapnete. Počítejte s tím že pár čipů skončí zablokovaných a berte to jako cenu za zkušenosti :) Doufám, že jste získali náležitý vhled do problematiky. Vím, že vysvětlení zdrojů clocku by si žádalo více prostoru, ale myslím že se mu budu věnovat v samostatném článku.