- Какво представляват предпазителите в AVR - подробно обяснение
- Битове за предпазители в Arduino
- Компоненти, необходими за тестване на предпазители в AVR
- Схема за тестване на битовите предпазители в AVR
- Тестване на предпазителите в AVR
В този урок ще говорим за предпазители. Още когато бях в колеж и научих за всички страхотни неща в електрониката, чух за първи път термина предпазител в AVR, първоначалната ми мисъл по темата беше, ох! вътре в AVR има нещо, което ще издуха, ако съм направил нещо нередно. Тогава в интернет нямаше много ресурси, през които да се премине. Потърсих доста, за да разбера, че тези предпазители се отнасят до някои специални битове вътре в AVR микроконтролера. Тези битове са като малки превключватели вътре в AVR и като ги включваме / изключваме, можем да включваме / изключваме някои специални функции на AVR. Включването и изключването му означава настройка и нулиране.
Ще използваме тази възможност, за да обсъдим всичко, което има за битовете Fuse в AVR. За простота ще вземем примера на платка Arduino, в която се помещава популярният ATmega328P микроконтролер. Тук ще научите как да настроите тези предпазители за включване и изключване на някои от тези функции, което е много полезно в реални приложения. Така че, нека да влезем в него.
В предишните ни публикации сме изградили много проекти за AVR микроконтролери като Interfacing GSM модул с AVR микроконтролер и Interfacing HC-05 с AVR микроконтролер. Можете да ги проверите, ако искате да научите повече за тези проекти.
Какво представляват предпазителите в AVR - подробно обяснение
Както обсъждахме по-рано, предпазителите в микроконтролера са като малки превключватели, които могат да се включват и изключват, за да се активират и деактивират различни функции в AVR микроконтролера. Това е частта, в която възниква следващият ни въпрос, така че как да настроим или нулираме тези предпазители? Отговорът на този въпрос е прост: Правим го с помощта на регистри на предпазители.
В интегралната схема на ATmega328P има общо 19 бита предпазители и те са разделени на три байта предпазители. Те се определят като „Разширени байтове на предпазителите“, „Байт с висок предпазител“ и „Байт с нисък предпазител“.
Ако погледнете Таблица-27 на листа с данни ATmega328 / P Rev: 7810D – AVR – 01/15, можете да разберете всички малки подробности относно битовете на предпазителите. Но изображението по-долу ще ви даде по-добра представа за раздела с предпазители в таблицата с данни.
Сега, след като научихте малко за битовете на предпазителите, нека да преминем през листа с данни и да разберем всички необходими подробности за този IC.
Разширените битове за предпазители:
След като щракнете върху раздела Fuse Bits и превъртите малко надолу, ще намерите Таблица 27-5: която показва таблицата за „Extended Fuse Byte“ , известна като „ EFUSE“. Изображението по-долу показва точно това.
В тази таблица има само три използваеми бита, а останалите три са запазени. Тези три бита се занимават с ниво на откриване на Brownout. Както можете да видите в Бележката, ако разгледаме Таблица 28-5, можем да намерим повече подробности за нея.
Както можете да видите в горната таблица, ние имаме таблицата за откриване на прекъсване. Откриването на прекъсване е функция, която нулира микроконтролера, когато захранващото напрежение падне под определено ниво на напрежение. В ATmega328P IC можем напълно да деактивираме откриването на прекъсване или да го настроим на нивата, показани в горната таблица.
Байтове с висок предпазител:
Както можете да видите на изображението по-долу, таблица 27-6: на листа с данни показва по-високите битове на предпазителя на интегралната схема ATmega328P.
Най- бушон висока сделката с различни задачи в рамките на ATmega328 микроконтролер. В този раздел ще говорим за битовете с по-високи предпазители и тяхната работа. Нека започнем с битовете BOOTRST, BOOTSZ0 и BOOTSZ1. Тези три бита са отговорни за задаване на размера на зареждане; boot size се отнася до количеството памет, запазено за инсталиране на bootloader.
Буутлоудърът е специален софтуер, който работи върху микроконтролера и управлява различни задачи. Но в случая с Arduino, буутлоудъра се използва за качване на скицата на Arduino вътре в микроконтролера. В една от предишните ни статии ви показахме как да запишете Bootloader в ATmega328P с помощта на Arduino. Можете да проверите това, ако се интересувате от темата. Връщайки се към нашата тема, целите на другите битове във високия байт са сравнително ясни, битът EESAVE е да запази EEPROM паметта, докато се извършва цикъл на изтриване на чипа. WDTON битът е да активира или деактивира Watchdog Timer.
Таймерът за наблюдение е специален таймер в ATmega328P IC, който има отделен часовник и работи независимо. Ако таймерът за наблюдение е активиран, трябва да го изчистите с определен период, в противен случай таймерът за наблюдение ще нулира микроконтролера. Това е полезна функция, която се предлага в много микроконтролери, ако процесорът заседне; пазачът ще го нулира, за да предотврати повреда на крайното приложение.
Битът DWEN е там, за да активира кабела за отстраняване на грешки; това е подготвителен протокол, който е вътрешно вграден в техния хардуер, който се използва за програмиране и отстраняване на грешки в процесорите. Когато тази функция е активирана, можете да мигате и отстранявате грешки в процесора с един единствен кабел. Но за да го използвате, ще ви е необходим специален хардуер, който е подготвителен за Atmel.
Останалите два бита са тези битове, които трябва да избягвате, освен ако не знаете точно какво правите. Това са RSTDISBL бит-7 и SPIEN бит-5. RSTDISBL (External Reset Disable), както подсказва името, деактивира външния щифт за нулиране на хардуера, а битът SPIEN се използва за деактивиране на интерфейса за програмиране SPI. Деактивирането на който и да е от тези два бита може напълно да огради AVR; така че да ги оставите сами е добра идея.
Байтовете с нисък предпазител:
Както можете да видите на изображението по-долу, таблица 27-7: на листа с данни показва битовете на долния предпазител на IC ATmega328P.
Този байт на предпазителя е отговорен за настройката на източника на часовника и някои други параметри на часовника вътре в AVR. В този раздел ще научим за всичко това.
7-ият бит или флагът CKDIV8 могат да бъдат настроени да разделят източника на часовника на 8, това е много удобно, което може би вече знаете, ако сте опитали сами да програмирате AVR. Следващият бит е битът CKOUT и това е 6-ият бит в байта с нисък предпазител. Програмирането му ще изведе вътрешния тактов сигнал на PORTB0 на микроконтролера.
Битовете-5 и бит-4 SUT1 и SUT0 контролират времето за стартиране на микроконтролера. Това предотвратява всякакви пускови действия, които могат или не могат да се извършват преди захранващото напрежение да достигне приемливо минимално ниво на праговото напрежение. И последните четири CKSEL0 - 4 бита се използват за избор на тактовия източник на микроконтролера. Таблицата, показана по-долу, ви дава по-добро разбиране на тези четири бита, които са отговорни за настройката на източника на часовника, можете да намерите тази таблица в раздела за източник на часовник на листа с данни.
Сега, преди да продължим, има още едно нещо, през което трябва да премина, е таблицата за забавяне на пускането на осцилатора. Като закъснение при стартиране, имаме предвид битове 4 и 5 от долния байт на предпазителя. Закъсненията трябва да бъдат настроени в зависимост от условието, в което веригата ще работи и вида на осцилатора, който използвате. Стойностите по подразбиране са настроени на бавно нарастваща мощност с 6 тактови цикъла, когато се извършва последователност на включване или изключване. След това има ново закъснение от 14 тактови цикъла с 65 Ms закъснение след стартиране.
Фу! Това беше много информация за смилане. Но преди да продължим по-нататък, нека завършим този раздел с бърза бележка.
Забележка:
Ако сте разгледали внимателно листа с данни, сигурно сте забелязали, че програмирането на бит с предпазители означава да го настроите на ниско, т.е. 0 (нула), което е обратното на това, което обикновено правим, за да направим порт висок или нисък. Трябва да имате предвид това, докато конфигурирате предпазителите си.
Битове за предпазители в Arduino
Говорихме много за предпазителите в горния раздел, но в този раздел нека поговорим за това как да ги конфигурираме и как да ги запишем в микроконтролер. За това ще ни трябва инструмент, наречен Avrdude. Това е инструмент, който може да се използва за четене, запис и промяна на паметта в AVR микроконтролери. Работи с SPI и има дълъг списък с поддръжка за различни видове програмисти. можете да изтеглите инструмента от връзката, дадена по-долу. Също така ще използваме любимия ни микроконтролер Arduino.
- Изтеглете Avrdude версия 6.3 Windows-ming32
Сега, след като имате Avrdude, трябва да го извлечете и да отворите команден прозорец в тази папка. Също така, ако планирате да го използвате по-късно, можете да добавите пътя на папката към раздела с променливи на вашата среда на Windows. Но ще го сложа на работния си плот и ще отворя команден прозорец там. След като направим това, ще свържем USBasp програмиста към нашия компютър и ще се уверим, че разполагаме с подходящия драйвер за нашия USBasp програмист. След като го направим, сме готови и първо ще прочетем стойността на предпазителя по подразбиране. За да направите това, трябва да изпълните следната команда.
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
Ако всичко е наред, тази команда ще прочете байтовете на предпазителите и ще ги постави в три отделни текстови файла. Изображението по-долу ще ви даде по-добра представа за процеса.
Както можете да видите, Avrdude прочете битовете на предпазителите на Arduino nano и ги записа в три отделни текстови файла. Сега ги отворихме и получихме три стойности; за EFUSE: 0xFD, за HFUSE: 0XDA, за LFUSE: 0xFF. Това беше стойността на предпазителя по подразбиране, която получихме за Arduino nano. Сега, нека преобразуваме тези битове в двоични и ги сравняваме със стойността им по подразбиране от листа с данни. Таблицата по-долу показва точно това.
За удобство битовете на предпазителите се записват в шестнадесетични стойности, но ако ги преобразуваме в двоични стойности и ги сравним с листа с данни, ще знаем какво се случва. Нека започнем с долния байт на предпазителя. Както можете да видите от горния низ, той е зададен на 0XFF и двоичната стойност ще бъде 0B11111111.
Сравнение на байтовете на запасите на долния предпазител с Arduino:
Байт с нисък предпазител |
Бит No. |
Стойност по подразбиране в AVR |
Стойност по подразбиране на Arduino |
CKDIV8 |
7 |
0 (програмиран) |
1 (непрограмиран) |
ИЗКЛЮЧВАНЕ |
6 |
1 (непрограмиран) |
1 (непрограмиран) |
SUT1 |
5 |
1 (непрограмиран) |
1 (непрограмиран) |
SUT0 |
4 |
0 (програмиран) |
1 (непрограмиран) |
CKSEL3 |
3 |
0 (програмиран) |
1 (непрограмиран) |
CKSEL2 |
2 |
0 (програмиран) |
1 (непрограмиран) |
CKSEL1 |
1 |
1 (непрограмиран) |
1 (непрограмиран) |
CKSEL0 |
0 |
0 (програмиран) |
1 (непрограмиран) |
Байтът за по-висок предпазител е зададен на 0XDA в двоичен файл, който е 0B11011010.
По-висок байт на предпазителя в двоичен файл:
Байт с висок предпазител |
Бит No. |
Стойност по подразбиране в AVR |
Стойност по подразбиране на Arduino |
RSTDISBL |
7 |
1 (непрограмиран) |
1 (непрограмиран) |
ДУЕН |
6 |
1 (непрограмиран) |
1 (непрограмиран) |
ШПИЕН |
5 |
0 (програмиран) |
0 (програмиран) |
WDTON |
4 |
1 (непрограмиран) |
1 (непрограмиран) |
EESAVE |
3 |
1 (непрограмиран) |
1 (непрограмиран) |
BOOTSZ1 |
2 |
0 (програмиран) |
0 (програмиран) |
BOOTSZ0 |
1 |
0 (програмиран) |
1 (непрограмиран) |
BOOTRST |
0 |
1 (непрограмиран) |
0 (програмиран)) |
Настройката за байта с разширен предпазител е зададена на 0XFD, в двоичен вид е 0B11111101.
Удължен байт на предпазителя в двоичен файл:
Удължен байт на предпазителя |
Бит No. |
Стойност по подразбиране в AVR |
Стойност по подразбиране на Arduino |
- |
7 |
1 |
1 |
- |
6 |
1 |
1 |
- |
5 |
1 |
1 |
- |
4 |
1 |
1 |
- |
3 |
1 |
1 |
BODLEVEL2 |
2 |
1 (непрограмиран) |
1 (непрограмиран) |
BODLEVEL1 |
1 |
1 (непрограмиран) |
0 (програмиран) |
BODLEVEL0 |
0 |
1 (непрограмиран) |
1 (непрограмиран) |
Това отбелязва края на този раздел. Към момента научихме много за микроконтролера AVR и неговите предпазители. И така, нека завършим тази статия, като изпробваме нашата теория, като променим и експериментираме с някои от битовете на предпазителите в Arduino Nano.
Компоненти, необходими за тестване на предпазители в AVR
Говорихме много за предпазителите в горната част. Но за да продължим по-нататък в статията, са ни необходими някои хардуерни компоненти и някои софтуерни инструменти. В този раздел ще говорим за тях. Списък на необходимите компоненти с изображения е показан по-долу.
- Макет - 1
- Arduino Nano - 1
- USBasp AVR програмист - 1
- USB кабел - 1
- AVR 10-пинов към 6- пинов преобразувател - 1
- Avrdude (Софтуерен инструмент за програмиране на AVR)
- LED - 1
- 330R резистор - 1
- Джъмперни кабели
Схема за тестване на битовите предпазители в AVR
Настройката за тестване на хардуер е показана по-долу в тази настройка. Свързахме Arduino Nano към компютъра с USB кабел, а също така свързахме и USBasp програмиста към компютъра. Целта на тази статия е да програмира битовете на предпазителите в AVR. Поради тази причина сме свързали USBasp програмиста с Arduino. Изображението по-долу ще ви даде по-добра представа за настройката.
Тестване на предпазителите в AVR
Настройката за тестване е показана по-долу. Както можете да видите, свързваме Arduino и USBasp програмиста и към USB на моя лаптоп.
Сега нека отворим IDE на Arduino и да качим основна скица на мига. Съдържанието на основната скица на мига е обяснимо, така че не посочих подробности за нея.
Ще видите във видеото, че светодиодът на щифт № 13 мига както трябва. Сега нека променим настройките на предпазителя и да го зададем на стойностите по подразбиране. И както вече видяхме в листа с данни; на EFUSE е 0xFF; HFUSE е D9; LFUSE е: 62. Сега нека да го конфигурираме с Avrdude, да го прокараме и да видим какво ще се случи. Кодът, който ще използваме е-
avrdude -c usbasp -p m328P -U lfuse: w: 0x62: m -U hfuse: w: 0xd9: m -U efuse: w: 0xff: m
След като направя това, ще видите, че светодиодът ще мига изключително бавно, защото сме изчислили и програмирали стойността за часовник от 16Mhz и сега след изгаряне на предпазителите това е само 1Mhz вътрешен RC осцилатор. Ето защо светодиодът мига толкова бавно. Сега нека се опитаме да качим скица още веднъж. Ще видим, че Arduino издава грешка и кодът не се качва. Тъй като чрез промяна на предпазителите сме объркали и настройките на буутлоудъра. Можете да видите това на изображението по-долу.
За да поправим това и да върнем Arduino обратно както преди, трябва просто да изгорим буутлоудъра отново за Arduino. За да направите това, отидете на Инструменти -> Програмист - USBasp и след като го направим, можем отново да отидем на инструменти и да кликнете върху опцията за запис на буутлоудъра. Това отново ще изгори основния буутлоудър на вашия Arduino и всичко ще се върне към предишното.
След като буутлоудърът беше върнат обратно към Arduino, той се върна в първоначалното си състояние и последното изображение ви показва мигащ светодиод, след като буутлоудъра беше изгорен отново.
И това бележи края на тази статия. Надявам се статията да ви е харесала и да сте научили нещо ново. Ако имате някакви въпроси относно статията, не се колебайте да добавите коментар по-долу.