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 |
---|
High Byte |
---|
Extended Byte |
---|
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í:
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
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.
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.
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.
Home
V1.00 2015
By Michal Dudka (m.dudka@seznam.cz)