Az AVR (ATMega, ATTiny) chipek programozási folyamatának része az ún. biztosítékbitek (vagy konfigurációs bitek) beállítása is. Ezek azok a speciális beállítások, amelyek segítségével megváltoztathatóak a chipek működésének jellemzői.
A cikkben elsősorban az Arduino lappon elterjedt (Uno, Pro mini, Nano) ATMega 328 lesz a középpontban, de az ATTiny család mellett az ATMega2560 chipről is előkerül néhány karakter…
Példaként néhány lehetőség, amit a biztosítékbitek értékének megváltoztatásával lehet megtenni:
különböző órajel-források kiválasztása és a chip futási sebességének módosítása,
a szükséges minimális működési feszültség beállítása,
bootloader méretének beállítása és a használatának engedélyezése/tiltása,
soros programozási mód tiltása,
törléskor az ERPROM tartalmának megőrzése.
Az internet bugyraiban sok cikk megtalálható az AVR-ek bootloaderének visszaállításáról, a programozások mikéntjéről (→ Arduino, mint programozó és a bootloader (ArduinoISP)). De amikor a biztosítékbitekre kerül az ismerkedés során a sor, akkor a „nézd meg az adatlapban”, „használd a segédprogramokat” vagy “kérdezd meg a fórumok valamelyikében” tanácsokat lehet találni. Olyan oldalt, ami összeszedte a szükséges információkat és kezdő szinten elmagyarázta volna – csak nagyon hosszas kereséssel lehet jót találni.
Fontos! A biztosítékbitek helytelen vagy hibás beállítása a chip (látszólagos vagy ideiglenes) működésképtelenségét okozhatja! A visszaállításhoz speciális programozóra lehet szükség egyes esetekben – de egy kis odafigyeléssel azonban meglehetősen egyszerű megérteni a működésüket. Azonban, ha valamit sikerül elrontanod, magadra vess! A szokásos jogi nyilatkozat részemről: „bármely információ a legjobb tudásom alapján került leírásra, de az alkalmazásból származó közvetlen vagy közvetett károkért felelősséget nem vállalok”. Az itt leírt információk a tapasztalataim, az Arduino és számos elektronikai szakmai fórum leírásán alapulnak. Ha hibát találsz, akkor megköszönöm és kérlek az oldal végén a hozzászólásoknál tudod jelezni, vagy a Kapcsolat oldalon keresztül.
Tartalom
Biztosítékbitek
Az AVR chipeknél jellemzően 3 byte-ba lettek összeszervezve a biztosítékbitek:
alacsony helyi értékű biztosíték (low fuse),
magas helyi értékű biztosíték (high fuse),
bővített/kiterjesztett biztosíték (extend fuse),
és van egy negyedik konfigurációs byte is, ami a chip írás/olvasás védelméért felel.
Minden byte 8 bit-ből áll, és minden bit egy külön beállításra van hatással. Amikor a biztosítékbit beállításáról/törléséről van szó, valójában az adott low/high/extend biztosíték byte adott bitjének értékéről beszélünk. A bit beállítása során az 1 azt jelenti, hogy nincs beállítva/nincs programozva, a 0 (nulla) pedig azt jelenti, hogy beállított/programozott az adott bit.
A biztosítékok programozásakor mindig byte-ként hivatkozok rájuk, így az értékük 0…255 közt lehet. Ezt az adatot le lehet írni decimális számként vagy binárisként is – de a leggyakoribb a hexadecimális írásmód. Azaz írhatjuk 255, vagy B11111111 vagy a 0xFF formátumban is: mindegyik ugyanazt jelenti.
Fontos! Minden biztosíték esetében az 1 érték azt jelenti, hogy nincs beállítva, és a 0 (nulla) érték azt jelenti, hogy beállított. (Érdekes, nekem fordított ez a logika.)
ATMega-328P DIP tok lábkiosztás
Az alacsony biztosítékbitek (Low Fuse)
A Low Fuse paraméterezi a chip órajelforrását, a chip sebességével és az indítási késleltetéssel összefüggő beállításokat.
Az ATMega chipek különböző sebességgel futtathatóak – ezt a „ütemet” nevezzük órajelnek. Az órajel sebességét frekvenciának hívjuk, hiszen jel/sec alapon [Hz] adjuk meg. A chip sebességét az órajel határozza meg, és az órajel forrása a CKSEL biztosítékbit-csoport segítségével választható ki.
Az órajel származhat a chipen belüli RC-oszcillátorból, külső kristályból, külső rezonátorból vagy egy külső órajelforrásból. Az Arduino alkalmazások esetén általában külső, 16 MHz -es kristály vagy rezonátor került beépítésre.
A fényképen többféle Arduino Uno központi chip 16 MHz-es órajelforrása látható a beépítési környezettel.
Az órajelforrást, ha kapcsolási rajzon ábrázolva kell megkeresni:
A 16 MHz kvarc használatához az ATMega chipnek meg kell mondani, hogy az órajele nem az alapértelmezett belső RC, hanem külső, nagyfrekvenciájú kvarckristály. Ezt a CKSEL biztosítékbittel kell a chipen beállítani. Gyakori hiba, hogy a kristály helyesen van bekötve az áramkörbe, ám elfelejtődik megmondani a chipnek, hogy használja is azt.
Az Arduino lapok jellemzően külső órajel kristályt használnak, ám az ATMega két beépített oszcillátorral is rendelkezik:
egy 128 kHz -es RC oszcillátorral, valamint
egy kalibrálható RC oszcillátorral.
A „külső órajelforrás” opció lehetővé teszi, hogy a chip külső négyszögjel alakú órajelet használjon.
Ennek akkor van jelentősége, ha precízen szükséges két chip szinkronban járjon. A legpontosabb – kvarckristáy alapú órajelek – ~10 ppm pontosságúak, azaz 16MHz ± 160 Hz frekvenciával működnek. Közös órajel esetén viszont a két chip közt 0.00 Hz az eltérés. De nagy széria esetén, ha a chipek közel vannak egymáshoz – ott is olyan alkalmazzák ezt a megoldást. Így laponként néhány dollárcent megspórolható – 100e db széria esetén már mérhető a megtakarítás! A külső órajelet az XTAL1 kivezetéshez kell csatlakoztatni.
Tipp: precíz külső órajelforrás lehet egy oszcillátorkocka is – ez hőfok-kompenzálással, tápfeszültség figyeléssel, zavarvédelemmel is el van látva.
Oszcillátor beállítása
A CKSEL biztosítékbitek beállítása Arduino esetén: CKSEL3=1, CKSEL2=1, CKSEL1=1 és a CKSEL0=1. Ennél a beállításnál a belső áramkör behangolása optimálisan 8MHz és 16MHz közötti kristályhoz ideális.
Ha lassabb, például 6 MHz -es kristályt kell használni, akkor a beállítás: CKSEL3=1, CKSEL2=1, CKSEL1=0 és CKSEL0=1. Ezzel a beállítással a 3,0-8,0MHz tartomány került kiválasztásra.
A belső RC oszcillátor 8 MHz -es használatához a beállítások: CKSEL3=0, CKSEL2=0, CKSEL1=1 és CKSEL0 = 0.
SUT1/SUT0 (Start Up Time – indulási késleltetés)
A kristályoknak és oszcillátoroknak megfelelő feszültségre van szükségük a megfelelő működéshez. Az ATMega chip elindításakor időbe telik (igaz rövid), amíg a feszültség eléri a stabil működéshez szükséges szintet. Amíg a feszültség fokozatosan emelkedik, előfordulhat, hogy az órajel-forrás nem a megfelelő, pontos frekvenciával rezeg vagy lengve, egyenetlen és ingadozó frekvenciával kezd működni. A biztosítékbittel beállítható, hogy adott késleltetéssel induljon csak el az órajel a tápfeszültség megjelenéséhez képest.
Az indítási késleltetési idő beállítására a CKSEL0, a SUT1 és SUT1 együtt használható.
A BOD (Brown Out Detection – Tápfeszültség-figyelés) funkció később kerül kifejtésre.
Az Arduino a maximális indítási késleltetést használja, ez 14CK + 65 ms (CKSEL0=1, SUT1=1 és SUT0=1), ami az ATMega-328/328P chip alapértelmezett beállítása is. A 14CK (14 órajel) + 65 msec időtartam alatt a rendszerben a feszültség az órajel-áramkör indulásához szükséges 1.8V-ot eléri illetve ezt már meghaladja.
CKDIV8 (Clock Divide – 1/8-ad órajelosztó)
Az ATMega-328/328P chipek beépített RC oszcillátorral rendelkeznek, amelynek alapértelmezett frekvenciája 8.0MHz. A bontatlan, új chipek esetén a 8-as osztóbit be van kapcsolva, így a chipek 8MHz RC sebesség/8 = 1MHz belső, RC alapú órajelről működnek (RC jelentése: az órajelet ellenállás-kondenzátor párosa határozza meg). Az indítási idő alapértelmezetten maximálisra van állítva. (CKSEL=„0010”, SUT=„10” és CKDIV8=„0”). Ezzel a beállítással a chip mindenféle külső órajelforrás nélkül is működik – és a későbbi programozás során lehet átállítani bármely más órajel-forrásra.
A CKDIV8 használata akkor mindenképp szükséges, ha a külső órajelforrás frekvenciája meghaladja a chip működési tartományában megadottat (ATMega328 esetén fmax=20MHz!). És az ATMega chipek alacsony feszültségeken is használhatók, azonban minél alacsonyabb a tápfeszültségük, annál lassabb a maximális sebesség lehetősége – ekkor is szükség lehet a DIVCK8 használatára. Fontos! Bármely órajel-forrás esetén használható a DIVCK8 osztó használata!
AVR chipek órajelforrásai. A System Clock Prescaler részlet jelenti a DIVCK8 használatát.
CKOUT (Clock Out – órajelkimenet)
Az AVR chipek belső, működési órajele a CLKO (Clock Out) kivezetésre irányítható (ATMega 328 estén ez a PortB.0 kivezetés (Arduino: D8)). Ez például akkor hasznos, ha az órajelre más áramkörök meghajtásához van szükség, vagy szinkronban kell járatni két AVR chipet. A CLKO kivezetésen bufferelve minden esetben megjelenik a működési órajel – függetlenül attól, hogy mi az órajel eredeti forrása! Az új chipek alapértelmezett beállítása CKOUT=1 (nincs engedélyezve az órajel kimenet).
Felső biztosítékbitek (High Fuse)
A high fuse több, különféle beállítást reprezentál. A sok funkció közül szinte mind valamilyen speciális beállításra van hatással. Az itt paraméterezhető eszközök:
a watchdog időzítő,
az eeprom megőrzése vagy törlése és a
bootloader működésének beállításai.
RSTDISBL (Reset Disable – külső reset letiltása)
A PortC.6 kivezetés a kontroller Reset kivezetését is jelenti – azzal közös. A Reset funkciója: a chip újraindítása, azaz amikor alacsony szintről magasra vált a bemenetre adott jelszint, akkor aktiválódik. Így működik az Arduino esetén is: amikor megnyomásra kerül a Reset gomb, akkor a PortC.6 chipkivezetés a GND-re kerül lehúzásra és a chip alaphelyzetbe áll.
A PortC.6 normál I/O kivezetésként is használható, de ez a Reset funkció letiltását jelenti. Fontos! Ez azt is jelenti, hogy a chip már nem programozható a leggyakoribb ISP módon! A Reset tiltásával plusz bemenethez lehet jutni, azonban a chip újraprogramozása így jóval bonyolultabbá vált. Tipp: Így jobb ezt a beállítást nem piszkálni – ez az egyik lehetőség, amin jobb nem változtatni.
Ha a RSTDISBL engedélyezve van (külső Reset letiltva), akkor az indítási idő (SUT1 és SUT0) 14CK + 4,1 ms-ra változik, hogy biztosítsa a (nem ISP alapú) programozási módba való belépést. Alapértelmezés szerint a beállítás RSTDISBL=1 (nincs beállítva) – azaz a Reset kivezetés engedélyezve van.
DWEN (debugWIRE enable – debugWire engedélyezés)
A kis lábszámú ATMega chipek beépített hibakereső eszközökkel rendelkeznek, amelyek alapértelmezés szerint ki vannak kapcsolva. A hibakeresési mód a DWEN biztosítékbittel kapcsolható be – azonban a debugWire ugyanazt a kivezetést használja, mint a Reset (PortC.6)! Így, ha a DWEN engedélyezve van, akkor ez a Reset helyébe lép. Így az ISP programozás elérhetetlenné válik (akárcsak a RSTDSBL esetén)!
A debugWire segítségével a chipen belüli futásidő alatti – valódi – hibakeresésre van mód: de ehhez debugWire kompatibilis programozóra van szükség. Ilyen programozó például az AVR-Dragon. Azonban az Arduino keretrendszer szoftver nem tartalmaz AVR-hez illeszkedő hibakereső eszközt – így ez a funkció csak az AVR-Studio-val használható (a módszertanról és alkalmazásról a Debugging Arduino using debugWire oldalon található egy jó cikk az induláshoz).
Az ATMega chipek elsősorban soros programozással programozhatók. A soros programozást az SPI interfészen keresztül valósul meg az ATMega chipek esetén. Ehhez az SCK (órajel), MOSI (bemenet) és MISO (kimenet) kivezetések valamint a Reset láb elérhetősége szükséges. Ha letiltásra kerül a soros programozás, akkor többé nem használhatóak az SPI kivezetések a chip programozásához (de a futó programban az SPI felület továbbra is elérhető)! A soros programozást az ún. Lockbitekkel is meg lehet akadályozni!
A normál használathoz és fejlesztéshez az SPIEN maradjon engedélyezett státuszban. Ha azonban a program már végleges és nincs szükség további chip átprogramozásra – akkor ezzel az opcióval megakadályozható, hogy az ISP programozófelületen el lehessen érni a chipet.
Az alapértelmezett beállítás: az SPIEN engedélyezve van (SPIEN=0).
Az RSTDISBL, SPIEN és DWEN biztosítékbitek átállításával meggátolható az ATMega chipek egyszerű programozása. Kezdőként, ezek elállításával a chipből ki lehet zárni magunkat.
Fontos, hogy a biztosítékbitek byte szervezésűek, így nagyon könnyű elnézni 1-1 bitet a beállítási értékek közt. Mind az ISP tiltását/engedélyezését, mind az órajelforrás megadását nagyon körültekintően kell végezni!
WDTON (Watchdog On – Watchdog időzítő automatikus bekapcsolása)
Az úgynevezett WatchDog (Őrző Kutya) felügyelet alapvetően egy felhúzható időzítő, amely a chip alaphelyzetbe állítását eredményezi, ha a beállított idő alatt nem kerül nullázásra. Ez akkor lehet hasznos, ha instabil kód fut a rendszerben, vagy olyan komplex rendszer kerül kialakításra, amelyet nem szabad hagyni, hogy lefagyjon.
Ha a watchdog időzítő engedélyezve van, a futó program összeomlása vagy lefagyása esetén az időzítő számlálója (WatchDog Timer) túlcsordul, és alaphelyzetbe állítja a chipet – ez a reset gomb megnyomásához hasonló újraindítást okoz egy futó Arduino esetében.
A Watchdog Timer szoftveresen is aktiválható a futó programból, így a biztosítékbit beállításait nem igazán kell használni. Alapértelmezés szerint a WatchDog időzítő ki van kapcsolva (WDTON=1).
Az ATMega chip átprogramozásakor a Flash memória közvetlenül az új kód feltöltése előtt törlődik. Normál körülmények között a törlés az EEPROM-ra is vonatkozik. Az EESAVE biztosítékbit segítségével beállítható, hogy az EEPROM ne kerüljön mégse ekkor törlésre. Ez például akkor hasznos, ha a programkódot frissíteni kell, de a tárolt paraméterek maradjanak változatlanok. Az alapértelmezett érték, hogy az EEPROM is törlésre kerüljön programozáskor (EESAVE=1).
Érdemes ezt a biztosítékbitet beállítani. Az EEPROM korlátozott életciklusú, így minél kevesebbszer van írva, annál jobb. Az EEPROM törlése nincs hatással az új kód feltöltésére és a projektek többsége nem is használja az EEPROM memóriát, így annak nem törlése (vagy nemtörlése) nem jelent problémát.
BOOTSZ1 & BOOTSZ0 (Boot Size – Bootloader méret)
Az ATMega chipek bootloader használatára is programozhatóak. Ez egy kis program, amely a chip bekapcsolásakor vagy alaphelyzetbe állításakor először elindul. A bootloadert (lefordítva kb. rendszerindító betöltő) általában az eszköz inicializálására, külső kommunikáció ellenőrzésére valamint szoftverfrissítés kontrolleroldali megvalósítására lehet használni. Az Arduino a bootloader segítségével kommunikál a csatlakoztatott számítógéppel, hogy vár-e új program feltöltésre. Ez az oka annak, hogy az Arduino minden esetben újraindul, amikor a kommunikációs csatorna megnyitásra kerül a számítógép irányába.
A bootloader a programmemóriában tárolódik, ugyanabban a memóriában, amit a felhasználói program is használ. Mivel a bootloader funkcióitól, forrásától, tudásától függően különböző méretű lehet – az ATMega chipen beállítható, hogy mennyi helyet foglaljon le. A normál (régebbi) Arduino bootloader 2kB méretű, de az újabb Optiboot (az UNO-n is használt) csak 0,5kB helyet foglal. Ha az optiboot bootloader kerül használatra, akkor a fennmaradó 1.5kB a főprogramhoz használható.
A bootloader a programmemória címtér végén található.
Ha a chipben van bootloader, akkor a BOOTSZ és a BOOTRST biztosítékbit együtt használandó. A BOOTRST biztosítékbit megmondja az ATMega chipnek, hogy bootloadert kell futtatni induláskor, míg a BOOTSZ azt a memóriacímet adja meg, ahol a rendszertöltő elindul. Ha a BOOTRST nincs beállítva, akkor a felhasználói alkalmazás a BOOTSZ beállításoktól függetlenül a teljes memóriát használhatja és a főprogram indul el.
A táblázatban a méretek ún. szóban (word) értendőek (1x word (16 bit) – 2x byte(8 bit)) – azaz 256 word = 512 byte.
Az érintetlen, új chipek alapértelmezett értéke BOOTSZ1=0 és BOOTSZ0=0, ami azt jelenti, hogy ha a BOOTRST be van kapcsolva, akkor 4 kB memóriát foglalhat el a bootloader.
BOOTRST (Boot Reset – bootloader engedélyezés)
Az ATMega chipek tartalmazhatnak botloadert, de ekkor a chipet be kell állítani, hogy ez a program induljon el – ez a BOOTRST biztosítékbit beállításával történik. Ha nincs beállítva, a chip a 0x0000 kezdőcímre ugrik és a alapprogram indul el.
Az alapértelmezett beállítás: BOOTRST=1 (nincs engedélyezve).
Kiterjesztett biztosítékbitek (Extend Fuse)
A bővített biztosítékbitek (extend fusebit) elsősorban az ún. brown-out-detect (BOD) beállítására szolgálnak. A fennmaradó biztosítékbitek későbbi fejlesztésre vannak fenntartva.
BOD (Brown-Out-Detector – feszültségszint-figyelés)
Az ATMega chipek instabillá vagy megbízhatatlanná válhatnak, ha elégtelen feszültség mellett üzemelnek. Például az ATMega 328/328P biztonságosan működik 16 MHz-en, ha legalább 4V tápfeszültséget kap. Ha 4V alatti a tápfeszültsége, akkor az azt jelenti, hogy a chip valószínűleg hibázni fog. Ez problémát jelent, ha az eszközt érzékelőkkel használjuk a mérésekhez, vagy pontos időzítésekre van szükség. A csökkenő feszültség esetén a kontroller által előállított órajel frekvenciája elcsúszik, a SRAM tartalma sérülhet, az ADC mérés pontatlanná válik, de egyéb misztikus hibák is megjelenhetnek.
Annak érdekében, hogy a chip a megfelelő feszültségtartományban üzemeljen, beállítható egy minimális működési feszültségszint. Ha a feszültség e szint alá esik, akkor a chip automatikusan újraindul (illetve amíg a BOD feszültségszint alatt van, reset állapotban van tartva). Alapvetően, ha a tápfeszültség a BOD szint alatt van, a chip resetelve marad – ennek minden következményével: összes regiszrer alapértékre kerül, a kivezetések bemenetté válnak, a felhúzó-ellenálások ki vannak kapcsolva…
A BOD szükséges értékét a kontroller adatlapjából nézhetjük meg. A chip frekvenciája egy stabil feszültséget feltételez. Az ez alatti legmagasabb BOD értéket kell a működési határnak kijelölni.
16MHz működés esetén a feszültségigény 4.5V. Az ez alatti legmagasabb BOD: 4.3V.
Az érintetlen, új chipek alapértelmezett értékei: BODLEVEL2=1 (nincs beállítva), BODLEVEL1=1 (nincs beállítva), BODLEVEL0=1 (nincs beállítva). Összességében: BOD nincs bekapcsolva/engedélyezve.
Védelmi bitek (Lock Bit)
A lock-bitek (záróbitek) használhatók a programmemória olvasási/írási hozzáférésének korlátozására. A bootloader rész és az alkalmazás rész saját zárbitekkel rendelkezik, és az egyes területekhez való hozzáférés külön-külön beállíthatóak.
BLB1x (Boot Lock Bit 1 – bootloader védelem)
A BLB1x (bootloader záróbit) engedélyezi a Bootloader területen a program-memória szoftverből történő írását illetve olvasását. Ezek lehetőségei:
BLB12=1 és BLB11=1 : Nincs korlátozás , szoftverből írható és olvasható is a bootloader flash területe,
BLB12=1 és BLB11=0 : A bootloader területe szoftverből NEM írható,
BLB12=0 és BLB11=0 : A bootloader területe szoftverből NEM írható, olvasni csak a bootloader programból lehet,
BLB12=0 és BLB11=1 : A bootloader területét olvasni csak a bootloader programból lehet.
Ha a bootloader a BOOTRST beállításábal nincs engedélyezve, akkor irreleváns a beállítás. Alapértelmezetten a BLB12=1 és BLB11=1 (nincsen korlátozás az írás/olvasásra a boot területre).
BLB0x (Boot Lock Bit 0 – főprogram memória védelem)
A BLB0x (főprogram memória záróbit) engedélyezi a Bootloader területen a program-memória szoftverből történő írását illetve olvasását. Ezek lehetőségei:
BLB02=1 és BLB01=1 : Nincs korlátozás , szoftverből írható és olvasható is a főprogram flash területe,
BLB02=1 és BLB01=0 : A főprogram flash területe szoftverből NEM írható,
BLB02=0 és BLB01=0 : A főprogram flash területe szoftverből NEM írható, olvasni csak a főprogramból lehet,
BLB02=0 és BLB01=1 : A főprogram területét olvasni csak a főprogramból lehet.
Ha a bootloader engedélyezése be van kapcsolva, akkor a Flash memória főprogram és bootloader területre van felosztva. Ha a bootloader nem aktív, akkor a teljes Flash memória főprogramhoz tartozik. Alapértelmezetten a BLB02=1 és BLB01=1 (nincsen korlátozás az írás/olvasásra a Flash főprogrami területére).
LB (Lock bit – védelmi bit)
A Lock bitek a külső soros és párhuzamos programozók elleni védelmet határozzák meg. A beállítások hatása a külső programozó műveleti lehetőségeire:
LB2=1 és LB1=1: Nincsen semmilyen korlátozás
LB2=1 és LB1=0: A Flash és EEPROM tartalom nem programozható (de olvasható marad!)
LB2=0 és LB1=0: A Flash és EEPROM tartalom nem programozható és nem is olvasható
A külső programozó esetén (ha a tiltások érvényesek), akkor azok a biztosítékbitekre is vonatkoznak. Fontos! A biztosítékbitek még a memóriatartalom olvasás elleni védelme esetén is kiolvashatóak maradnak. Átírni, módosítani nem lehet őket. A Chip típusának azonosító byte-jai bármely beállítás esetén olvasható maradnak!
Tipp: ha egy chipet védelemmel zárunk le, akkor az újraíráshoz a feloldás a chip teljes törlésével elérhető. Így a chip gyakorlatilag üresen rendelkezésre áll, a védett program nem nyerhető ki belőle. Fontos! Arduino esetén a bootloader segítségével a lezárt chip adattartalma kiolvasható – hiszen azt a bootloader végzi és a külső programozó beállításainak nincs hatása a bootloader működésére! Ha olyan chipre van szükség (szoftvervédelem), ami a bootloaderrel csak a feltöltést engedélyezi – az a bootloader újraírásával/újraprogramozásával lehetséges.
Egyes ATMega328P kontrollerek alapértelmezett beállításai
A felhasználástól függően más beállítás lehet az ATMega328P chipeknél. A felsorolás az Arduino beállításokat hasonlítja össze a még érintetlen kontrollerrel.
OptiBoot/Uno ATMega-328 biztosítékbitek – a különbség
Optiboot Boot Loader
Az optiboot bootloaderének használata illetve a Duemilanove (nano old) bootloader közötti különbség – ha csak a biztosítékbiteket nézzük, akkor az a bootloader részére lefoglalt hely mérete. Az optiboot 512 byte, a normál bootloader 2048 byte (2 kbyte) helyet foglal le a flash memóriából.
Persze a kisebb méretbe kevesebb funkcionalitás fért bele:
hiányzik a beégetett program ellenőrzése,
az EEPROM feltöltése és ellenőrzése,
az optikai visszajelzés egyszerűbb.
Optiboot esetén 31,5kbyte, régi bootloader esetén 30kbyte programmemória marad szabadon.
Ha kicserélésre kerül a Nano lapkán a bootloader, akkor a biztosítékbitet is át kell állítani, hogy több szabad flash memória legyen elérhető a főprogram számára. Tipp: ha nagyobb bootloader terület van lefoglalva, mint a ténylegesen szükséges, akkor a bootloader előtt fennmaradó részen üres flash van (FF adattartalom). Ennek a utasításnak a jelentése: nop – azaz 1 órajel várakozás. Így a bootloader program indulása néhány microsec késleltetéssel indul…
Egyéb AVR chipek egyéb beállításai
Az Arduino által alapvetően támogatott processzor az ATMega2560 (Mega lapok) illetve a ATMega32U4 (Leonardo). Ezen chipek biztosítékbitjeinek működése azonos a megismert ATMega328 chippel.
ATMega2560 kiegészítő biztosítékbitek
Az ATMega2560 lockbitjei közül értelemszerűen a debugWire nem található meg illetve a Reset kivezetés letiltásának sincs értelme a nagyszámú elérhető lábak miatt. A chip ezek helyett két másfajta konfigurációt kapott (Az Arduino szoftver sem a JTAG alapú programozást, sem a hibakeresést nem támogatja) :
JTAGEN (JTAG Enable – JTAG engedélyezés)
Ez a debugWire helyett érhető el azonosan a High Fuse területen. A kis lábszámú chipek esetén az egyvezetéskes debugWire segítségével volt mód a hibakeresésre (a reset kivezetés hazsnálatával). A nagyobb AVR chipek esetén ez erre eredetileg a JTAG szolgált. A hibakeresés és programozó felület az ATMega2560 esetén a soros és párthuzamos módok mellett a JTAG-on keresztül is lehetséges. A Lock Bitek programozói módok tiltása a JTAG-ra is kiterjed az ezzel rendelkező chipek esetére!
Fontos! A JTAG engedélyezése a chip F portjának 4…7 kivezetéseit lefoglalja, így itt az analóg jelek mérése nem lehetséges! (Arduino alatt A4..A7 ekkor nem használható!)
Alapértelmezett beállítás új chip esetén JTAGEN=0 (JTAG engedélyezett).
OCDEN (On Chip Debug Enable – chip hibakeresés engedélyezés)
Ha a JTAG programozás engedélyezett, akkor annak kibővítése, hogy ugyanezen JTAG felületen át a chip hibakereső módját használni lehessen.
Alapértelmezett beállítás OCDEN=1 (OCDEN tiltva).
ATMega32U4 kiegészítő biztosítékbitjei
Az ATMega32U4 lockbitjei közül értelemszerűen a debugWire nem található meg illetve a Reset kivezetés letiltásának sincs értelme a nagyszámú elérhető lábak miatt. A chipben elérhető konfigurációs bitek a kissé eltérő feléíptés miatt kaptak helyet (a Leonardo beépített USB-vel rendelkezik).
HWBE (Hardware Boot Enable – boot mód hardware alapú engedélyezése)
A beépített USB port miatt a bővített (Extend) biztosíték biteknél BOD mellett érhető el a HWBE funkció. Ennek bekapcsolt állapotában az ATMega32U4 a gyárilag előre a flash memóriába beprogramozott USB bootloadert indítja el – ha a HWB kivezetésen keresztül a chipen ez engedélyezve van! Azaz mind a küslő lábon, mind a biztosítékbitek közt engedélyezni szükséges, hogy beépített bootloader elinduljon. Tipp: a bootloader kialakítása során lehetséges az Arduino-féle megközelítés: a bootloader egy idő letelte után a főprogramra adja tovább a vezérlést, vagy lehetséges az Atmel megközelítése: a bootloader a frissítésre való és a külső lábbal kerül beállításra, hoyg induljon el. Nincs ekkor időtúllépés és egyéb megoldás, vagy a bootloader fut vagy a főprogram.
Fontos! Ha a bootloader felülírásra kerül, akkor a bootloader indulására is ugyanúgy hatással van a HWBE láb! Ezen át kikényszeríthető a bootloader indítása (még ha a BOOTRST kikapcsolt állapotban is van!)
Alapértelmezett beállítás: HWBE=0 (engedélyezett)
JTAG és OCDEN
Az ATMega32U4 chip a JTAG és a OCDEN biztosítékbitekkel rendelkezik. A működésük megegyezik az ATMega2560 chipnél leírtakkal – azzal a különbséggel, hogyha a JTAG engedélyezve van, akkor az A0..A3 kivezetések nem érhetőek el.
Alapértelmezett beállítás új chip esetén JTAGEN=0 (JTAG engedélyezett) és OCDEN=1 (OCDEN tiltva).
Zárszó
A chipek konfigurációja a biztosíték és lock bitekkel könnyen kezelhető. Azonban tekintettel kell lenni arra, hogy a chipek könnyen tetszhalott állapotba is rakhatóak! Az Arduino keretrendszer a gyári beállításait a boards.txt állomány tartalmazza.
Minthogy a támogatott chipek köre egyre bővül, így az adatlapok ismerete egyre fontosabb lehet. Ez a cikk a konfigurálás kisebb rejtelmeibe próbált bevezetni. Ha valami kimaradt a cikkbőll, akkor azt a Fórumban, a Kapcsolat oldalon vagy a lap alján a hozzászólások közt is lehet jelezni.