- Co jsou pojistky v AVR - podrobné vysvětlení
- Pojistkové bity v Arduinu
- Součásti potřebné k testování pojistek v AVR
- Schéma testování pojistkových bitů v AVR
- Testování pojistek v AVR
V tomto tutoriálu budeme hovořit o pojistkách. Když jsem byl na vysoké škole a učil se o všech skvělých věcech v elektronice, poprvé jsem slyšel pojem pojistka v AVR, moje počáteční myšlenka na toto téma byla, ach! uvnitř AVR je něco, co vybuchne, když udělám něco špatně. V té době nebylo na internetu k dispozici mnoho zdrojů, které by bylo možné projít. Hledal jsem dost, abych zjistil, že tyto pojistky odkazovaly na některé speciální bity uvnitř mikrokontroléru AVR. Tyto bity jsou jako drobné přepínače uvnitř AVR a jejich zapnutím / vypnutím můžeme zapnout / vypnout některé speciální funkce AVR. Zapnutí a vypnutí znamená nastavení a resetování.
Využijeme tuto příležitost k projednání všeho, co tam je o Fuse bitech v AVR. Pro zjednodušení si vezmeme příklad desky Arduino, která obsahuje populární mikrokontrolér ATmega328P. Zde se naučíte, jak nastavit tyto pojistky pro zapnutí a vypnutí některých z těchto funkcí, které se v reálných aplikacích opravdu hodí. Pojďme tedy do toho.
V našich předchozích příspěvcích jsme vybudovali mnoho projektů mikrokontrolérů AVR, jako je modul GSM Interfacing s mikrokontrolérem AVR a Interfacing HC-05 s mikrokontrolérem AVR. Můžete si je prohlédnout, pokud se o těchto projektech chcete dozvědět více.
Co jsou pojistky v AVR - podrobné vysvětlení
Jak jsme již diskutovali dříve, pojistky v mikrokontroléru jsou jako malé spínače, které lze zapínat a vypínat, aby se povolily a deaktivovaly různé funkce v mikrokontroléru AVR. Toto je část, kde vyvstává naše další otázka, tak jak nastavíme nebo resetujeme tyto pojistky? Odpověď na tuto otázku je jednoduchá: Děláme to pomocí registrů pojistek.
V ATmega328P IC je celkem 19 pojistkových bitů a jsou rozděleny na tři pojistkové bajty. Ty jsou definovány jako „Extended Fuse Bytes“, „High Fuse Byte“ a „Low Fuse Byte“.
Pokud se podíváte na tabulku 27 datového listu ATmega328 / P Rev: 7810D – AVR – 01/15, můžete zjistit všechny malé podrobnosti o pojistkových bitech. Níže uvedený obrázek vám ale poskytne lepší představu o sekci pojistkových bitů v datovém listu.
Nyní, když jste se dozvěděli něco málo o pojistkových bitech, projdeme si datový list a zjistíme všechny potřebné podrobnosti o tomto integrovaném obvodu.
Rozšířené pojistkové bity:
Jakmile kliknete na záložku Fuse Bits a trochu se posunete dolů, najdete tabulku 27-5: která ukazuje tabulku pro „Extended Fuse Byte“ běžně známou jako „ EFUSE“. Obrázek níže to přesně ukazuje.
V této tabulce jsou pouze tři použitelné bity a další tři jsou rezervovány. Tyto tři bity se zabývají úrovní detekce Brownout. Jak vidíte v poznámce, pokud se podíváme na tabulku 28-5, můžeme o ní najít další podrobnosti.
Jak vidíte ve výše uvedené tabulce, máme tabulku pro detekci Brownout. Detekce výpadku je funkce, která resetuje mikrokontrolér, když napájecí napětí klesne pod určitou úroveň napětí. V ATmega328P IC můžeme úplně deaktivovat detekci procházení nebo ji můžeme nastavit na úrovně, které jsou uvedeny ve výše uvedené tabulce.
Vysoké pojistkové bajty:
Jak vidíte na obrázku níže, tabulka 27-6: datového listu ukazuje bity Higher Fuse na ATmega328P IC.
Pojistka High vypořádat s různými úkoly uvnitř ATMEGA328 mikroprocesoru. V této části si povíme o pojistkových bitech Vyšší a jejich fungování. Začněme s bity BOOTRST, BOOTSZ0 a BOOTSZ1. Tyto tři bity jsou zodpovědné za nastavení velikosti bootování; velikost zavádění označuje množství paměti vyhrazené pro instalaci zavaděče.
Zavaděč je speciální software, který běží nad mikrokontrolérem a spravuje různé úkoly. Ale v případě Arduina se bootloader používá k nahrání skici Arduino uvnitř mikrokontroléru. V jednom z našich předchozích článků jsme si ukázali, jak vypálit bootloader v ATmega328P pomocí Arduina. Můžete se podívat, jestli vás téma zajímá. Když se vrátíme k našemu tématu, účel ostatních bitů ve vysokém bajtu je dostatečně jasný, bitem EESAVE je zachování paměti EEPROM, zatímco se provádí cyklus mazání čipu. Bit WDTON slouží k povolení nebo zakázání časovače Watchdog.
Watchdog timer je speciální časovač v ATmega328P IC, který má své samostatné hodiny a běží nezávisle. Pokud je časovač hlídacího psa povolen, musíte jej po určité době vymazat, jinak časovač hlídacího psa resetuje mikrokontrolér. Toto je užitečná funkce, která je součástí mnoha mikrokontrolérů, pokud se procesor zasekne; hlídací pes jej resetuje, aby nedošlo k poškození konečné aplikace.
Bit DWEN je tam, aby umožnil ladicí drát; toto je přípravný protokol, který je interně zabudován do jejich hardwaru a který se používá k programování a ladění procesorů. Pokud je tato funkce povolena, můžete procesor flashovat a ladit připojeným jediným vodičem. Chcete-li jej však použít, budete potřebovat speciální hardware, který je pro Atmel připraven.
Zbývající dva bity jsou ty bity, kterým se musíte vyhnout, pokud přesně nevíte, co děláte. Jedná se o bit RSTDISBL bit 7 a bit SPIEN 5. RSTDISBL (External Reset Disable), jak název napovídá, deaktivuje externí hardwarový resetovací pin a bit SPIEN se používá k deaktivaci programovacího rozhraní SPI. Zakázáním kterékoli z těchto dvou bitů můžete AVR úplně zdědit; takže nechat je na pokoji je dobrý nápad.
Bajty nízké pojistky:
Jak vidíte na obrázku níže, tabulka 27-7: datového listu zobrazuje bity spodní pojistky IC ATmega328P.
Tento bajt pojistky je zodpovědný za nastavení zdroje hodin a některých dalších parametrů hodin uvnitř AVR. V této části se dozvíme vše.
Sedmý bit nebo příznak CKDIV8 lze nastavit tak, aby zdroj hodin rozdělil na 8, což je velmi užitečné, což už možná víte, pokud jste si sami vyzkoušeli programování AVR. Další bit je CKOUT bit a je to 6. bit v Low Fuse Byte. Naprogramováním by se vyslal interní hodinový signál na PORTB0 mikrokontroléru.
Bity-5 a bit-4 SUT1 a SUT0 řídí čas spuštění mikrokontroléru. Tím se zabrání jakémukoli spuštění, ke kterému může nebo nemusí dojít, než napájecí napětí dosáhne přijatelné minimální prahové úrovně napětí. A poslední čtyři CKSEL0 - 4 bity se používají k výběru zdroje hodin mikrokontroléru. Níže uvedená tabulka poskytuje lepší pochopení těchto čtyř bitů, které jsou zodpovědné za nastavení zdroje hodin, tuto tabulku najdete v části Zdroj hodin v datovém listu.
Teď, než se dostaneme dále, je ještě jedna věc, kterou bych měl projít, je tabulka zpoždění spuštění oscilátoru. Zpožděním spouštění máme na mysli bity 4 a 5 dolního bajtu pojistky. Zpoždění je třeba nastavit v závislosti na podmínkách, ve kterých bude obvod pracovat, a typu použitého oscilátoru. Výchozí hodnoty jsou nastaveny na pomalé zvyšování výkonu se 6 hodinovými cykly, když se provádí sekvence zapnutí nebo vypnutí. Dále je zde další zpoždění 14 hodinových cyklů se zpožděním 65 Ms po spuštění.
Uf! To bylo hodně informací k strávení. Než však budeme pokračovat, ukončíme tuto část rychlou poznámkou.
Poznámka:
Pokud jste si pečlivě prohlédli datový list, jistě jste si všimli, že programování bitové pojistky znamená jeho nastavení na nízkou hodnotu, tj. 0 (nula), což je opak toho, co obvykle děláme, aby port byl vysoký nebo nízký. Na toto musíte pamatovat při konfiguraci pojistek.
Pojistkové bity v Arduinu
Ve výše uvedené části jsme hovořili hodně o pojistkách, ale v této části si povíme, jak je nakonfigurovat a jak je zapsat do mikrokontroléru. K tomu budeme potřebovat nástroj s názvem Avrdude. Je to nástroj, který lze použít ke čtení, zápisu a úpravám paměti v mikrokontrolérech AVR. Pracuje s SPI a má dlouhý seznam podpory pro různé typy programátorů. nástroj si můžete stáhnout z níže uvedeného odkazu. Také budeme používat náš oblíbený mikrokontrolér Arduino.
- Stáhněte si Avrdude verze 6.3 Windows-ming32
Nyní, když máte Avrdude, musíte to extrahovat a otevřít příkazové okno v této složce. Pokud ji plánujete použít později, můžete do sekce proměnných prostředí systému Windows přidat cestu ke složce. Ale dám to na plochu a otevřu tam příkazové okno. Jakmile to uděláme, připojíme programátor USBasp k našemu PC a ujistíme se, že máme správný ovladač pro náš programátor USBasp. Jakmile to uděláme, je dobré jít a nejdříve přečteme výchozí hodnotu pojistky. Chcete-li to provést, musíte spustit následující příkaz.
avrdude.exe -c usbasp -p m328p -U lfuse: r: low_fuse_val.txt: h -U hfuse: r: high_fuse_val.txt: h -U efuse: r: ext_fuse_val.txt: h
Pokud je vše v pořádku, tento příkaz přečte pojistkové bajty a vloží je do tří samostatných textových souborů. Obrázek níže vám poskytne lepší představu o procesu.
Jak vidíte, Avrdude přečetl pojistkové bity na Arduino nano a uložil je do tří samostatných textových souborů. Nyní jsme je otevřeli a dostali tři hodnoty; pro EFUSE: 0xFD, pro HFUSE: 0XDA, pro LFUSE: 0xFF. Toto byla výchozí hodnota pojistky, kterou jsme dostali pro Arduino nano. Pojďme nyní převést tyto bity na binární a porovnat je s jejich výchozí hodnotou z datového listu. Přesně to ukazuje následující tabulka.
Pro usnadnění jsou pojistkové bity zapsány v hexadecimálních hodnotách, ale pokud je převedeme na binární hodnoty a porovnáme je s datovým listem, budeme vědět, co se děje. Začněme spodní pojistkovou bajtou. Jak vidíte z výše uvedeného řetězce, je nastaven na 0XFF a binární hodnota by byla 0B11111111.
Porovnání skladových spodních bajtů s Arduino:
Bajt nízké pojistky |
Bit č. |
Výchozí hodnota v AVR |
Výchozí hodnota Arduina |
CKDIV8 |
7 |
0 (naprogramováno) |
1 (neprogramováno) |
CKOUT |
6 |
1 (neprogramováno) |
1 (neprogramováno) |
SUT1 |
5 |
1 (neprogramováno) |
1 (neprogramováno) |
SUT0 |
4 |
0 (naprogramováno) |
1 (neprogramováno) |
CKSEL3 |
3 |
0 (naprogramováno) |
1 (neprogramováno) |
CKSEL2 |
2 |
0 (naprogramováno) |
1 (neprogramováno) |
CKSEL1 |
1 |
1 (neprogramováno) |
1 (neprogramováno) |
CKSEL0 |
0 |
0 (naprogramováno) |
1 (neprogramováno) |
Bajt vyšší pojistky je nastaven na 0XDA v binárním formátu, který je 0B11011010.
Bajt vyšší pojistky v binárním formátu:
High Fuse Byte |
Bit č. |
Výchozí hodnota v AVR |
Výchozí hodnota Arduina |
RSTDISBL |
7 |
1 (neprogramováno) |
1 (neprogramováno) |
DWEN |
6 |
1 (neprogramováno) |
1 (neprogramováno) |
SPIEN |
5 |
0 (naprogramováno) |
0 (naprogramováno) |
WDTON |
4 |
1 (neprogramováno) |
1 (neprogramováno) |
EESAVE |
3 |
1 (neprogramováno) |
1 (neprogramováno) |
BOOTSZ1 |
2 |
0 (naprogramováno) |
0 (naprogramováno) |
BOOTSZ0 |
1 |
0 (naprogramováno) |
1 (neprogramováno) |
BOOTRST |
0 |
1 (neprogramováno) |
0 (naprogramováno)) |
Nastavení pro rozšířený bajt pojistky je nastaveno na 0XFD, v binárním formátu je to 0B11111101.
Rozšířený bajt pojistky v binárním formátu:
Prodloužená bajtová pojistka |
Bit č. |
Výchozí hodnota v AVR |
Výchozí hodnota Arduina |
- |
7 |
1 |
1 |
- |
6 |
1 |
1 |
- |
5 |
1 |
1 |
- |
4 |
1 |
1 |
- |
3 |
1 |
1 |
BODLEVEL2 |
2 |
1 (neprogramováno) |
1 (neprogramováno) |
BODLEVEL1 |
1 |
1 (neprogramováno) |
0 (naprogramováno) |
BODLEVEL0 |
0 |
1 (neprogramováno) |
1 (neprogramováno) |
Tímto končí tato část. Od této chvíle jsme se naučili hodně o mikrokontroléru AVR a jeho pojistkových bitech. Pojďme tedy zabalit tento článek tím, že otestujeme naši teorii změnou a experimentováním s některými pojistkovými bity v Arduino Nano.
Součásti potřebné k testování pojistek v AVR
Hodně jsme mluvili o pojistkách ve výše uvedené části. Abychom ale mohli v článku pokračovat, potřebujeme nějaké hardwarové komponenty a softwarové nástroje. V této části si o nich povíme. Seznam požadovaných komponent s obrázky je uveden níže.
- Nepájivá deska - 1
- Arduino Nano - 1
- Programátor USBasp AVR - 1
- Kabel USB - 1
- AVR 10kolíkový na 6kolíkový převodník - 1
- Avrdude (softwarový nástroj pro programování AVR)
- LED - 1
- Rezistor 330R - 1
- Propojovací kabely
Schéma testování pojistkových bitů v AVR
Nastavení testování hardwaru je uvedeno níže v tomto nastavení. Arduino Nano jsme připojili k počítači pomocí kabelu USB a také jsme připojili programátor USBasp k počítači. Cílem tohoto článku je naprogramovat pojistkové bity v AVR. Z tohoto důvodu jsme připojili programátor USBasp k Arduinu. Obrázek níže vám poskytne lepší představu o nastavení.
Testování pojistek v AVR
Nastavení testování je uvedeno níže. Jak vidíte, připojili jsme Arduino a programátor USBasp k USB mého notebooku.
Nyní otevřete IDE Arduino a nahrajte základní mrknutí. Obsah základního blikajícího náčrtu je vysvětlující, takže jsem o něm neuváděl žádné podrobnosti.
Ve videu uvidíte, že LED na kolíku č. 13 bliká tak, jak by měla. Nyní vyladíme nastavení pojistky a nastavíme ji na výchozí hodnoty. A jak jsme již dříve viděli v datovém listu; EFUSE je 0xFF; HFUSE je D9; LFUSE je: 62. Nyní jej nakonfigurujeme pomocí Avrdude, provedeme flash a uvidíme, co se stane. Kód, který budeme používat, je-
avrdude -c usbasp -p m328P -U lfuse: w: 0x62: m -U hfuse: w: 0xd9: m -U efuse: w: 0xff: m
Jakmile to udělám, uvidíte, že LED bude blikat extrémně pomalu, protože jsme vypočítali a naprogramovali hodnotu pro 16Mhz hodiny a nyní po spálení pojistek je to jen 1Mhz interní RC oscilátor. Proto LED bliká tak pomalu. Nyní se pokusme znovu nahrát náčrt. Uvidíme, že Arduino vydá chybu a kód se nenahraje. Protože změnou pojistek jsme také pokazili nastavení bootloaderu. Můžete to vidět na následujícím obrázku.
Abychom to napravili a vrátili Arduino zpět, jak tomu bylo dříve, musíme pro Arduino znovu vypálit bootloader. Chcete-li to provést, přejděte na Nástroje -> Programátor - USBasp a jakmile to uděláme, můžeme znovu přejít na nástroje a můžeme kliknout na možnost vypalování bootloaderu. Tím se opět vypálí akciový bootloader na vašem Arduinu a vše se vrátí zpět do původního stavu.
Poté, co se bootloader vrátil zpět do Arduina, se vrátil do původního stavu a poslední obrázek vám ukáže blikající LED po opětovném vypálení bootloaderu.
A tímto končí tento článek. Doufám, že se vám článek líbil a dozvěděli jste se něco nového. Pokud máte jakékoli dotazy týkající se článku, neváhejte přidat komentář níže.