- Ce sunt siguranțele în AVR - O explicație detaliată
- Fuse Bits în Arduino
- Componente necesare pentru testarea siguranțelor în AVR
- Schema pentru testarea bișorilor de siguranță în AVR
- Testarea siguranțelor în AVR
În acest tutorial, vom vorbi despre siguranțe. Când eram la facultate și învățam despre toate lucrurile interesante din electronică, am auzit pentru prima dată termenul de fuziune în AVR, gândul meu inițial pe această temă a fost, oh! există ceva în interiorul AVR care va arunca dacă am greșit ceva. Pe atunci, pe Internet nu erau prea multe resurse disponibile. Am căutat destul de mult pentru a afla că aceste siguranțe se refereau la niște biți speciali din microcontrolerul AVR. Acești biți sunt ca niște comutatoare minuscule în interiorul AVR și, pornind / oprind, putem activa / dezactiva unele caracteristici speciale ale AVR. Porniți-l și dezactivați înseamnă setarea și resetarea.
Vom profita de această ocazie pentru a discuta tot ce există despre biții Fuse din AVR. Pentru simplitate, vom lua exemplul unei plăci Arduino care găzduiește popularul microcontroler ATmega328P. Aici, veți învăța cum să setați aceste siguranțe pentru activarea și dezactivarea unora dintre aceste caracteristici, care este foarte util în aplicațiile din viața reală. Deci, hai să intrăm direct în asta.
În postările noastre anterioare, am construit o mulțime de proiecte de microcontrolere AVR, cum ar fi modulul Interfacing GSM cu microcontroler AVR și Interfacing HC-05 cu microcontroler AVR. Le puteți verifica dacă doriți să aflați mai multe despre aceste proiecte.
Ce sunt siguranțele în AVR - O explicație detaliată
Așa cum am discutat mai devreme, siguranțele din microcontroler sunt ca niște comutatoare mici care pot fi activate și dezactivate pentru a activa și a dezactiva diverse caracteristici ale microcontrolerului AVR. Aceasta este partea în care apare următoarea noastră întrebare, deci cum putem seta sau reseta aceste siguranțe? Răspunsul la această întrebare este simplu: o facem cu ajutorul registrelor de siguranțe.
În ATmega328P IC, există un total de 19 biți de siguranță și sunt împărțiți în trei octeți de siguranță. Acestea sunt definite ca „Octeturi de siguranță extinse”, „Octet de siguranță mare” și „Octet de siguranță scăzut”.
Dacă vă uitați la Tabelul-27 al fișei tehnice ATmega328 / P Rev: 7810D – AVR – 01/15, puteți afla toate detaliile despre biții siguranței. Dar imaginea de mai jos vă va oferi o idee mai bună despre secțiunea biți de siguranță a fișei tehnice.
Acum, pe măsură ce ați aflat puțin despre biții siguranței, să trecem prin foaia tehnică și să aflăm toate detaliile necesare despre acest CI.
Siguranțele extinse:
După ce faceți clic pe fila Fuse Bits și derulați puțin în jos, veți găsi Tabelul 27-5: care prezintă tabelul pentru „Extended Fuse Byte” cunoscut în mod obișnuit ca „ EFUSE”. Imaginea de mai jos arată exact asta.
În acest tabel, există doar trei biți utilizabili, iar ceilalți trei sunt rezervați. Acești trei biți se referă la nivelul de detectare Brownout. După cum puteți vedea în Notă, dacă ne uităm la Tabelul 28-5, putem găsi mai multe detalii despre aceasta.
După cum puteți vedea în tabelul de mai sus, avem tabelul pentru Detectarea Brownout. Detectarea Brownout este o caracteristică care resetează microcontrolerul atunci când tensiunea de alimentare scade sub un anumit nivel de tensiune. În IC-ul ATmega328P, putem dezactiva complet detecția brownout sau o putem seta la nivelurile afișate în tabelul de mai sus.
Octetii cu siguranță mare:
După cum puteți vedea în imaginea de mai jos, tabelul 27-6: al fișei tehnice prezintă biții de siguranță mai mari ai ATmega328P IC.
Fuzibil de mare afacere cu diferite sarcini din interiorul ATmega328 Microcontroller. În această secțiune, vom vorbi despre biții de siguranță mai mari și funcționarea lor. Să începem cu biții BOOTRST, BOOTSZ0 și BOOTSZ1. Acești trei biți sunt responsabili pentru setarea dimensiunii de încărcare; dimensiunea de boot se referă la cantitatea de memorie rezervată pentru instalarea bootloader-ului.
Un bootloader este un software special care rulează deasupra microcontrolerului și gestionează diferite sarcini. Dar în cazul Arduino, bootloader-ul este folosit pentru a încărca schița Arduino în interiorul microcontrolerului. Într-unul din articolele noastre anterioare, v-am arătat Cum să ardeți Bootloader-ul în ATmega328P folosind Arduino. Puteți verifica acest lucru dacă sunteți interesat de subiect. Revenind la subiectul nostru, scopurile altor biți din octetul mare sunt clar rezonabile, bitul EESAVE este de a păstra memoria EEPROM în timp ce se efectuează un ciclu de ștergere a cipului. Bitul WDTON este pentru a activa sau dezactiva cronometrul Watchdog.
Cronometrul câinelui de pază este un cronometru special în ATmega328P IC, care are ceasul său separat și rulează independent. Dacă cronometrul câinelui de pază este activat, atunci trebuie să îl ștergeți cu o anumită perioadă, în caz contrar, temporizatorul câinelui de pază va reseta microcontrolerul. Aceasta este o caracteristică utilă care vine în multe microcontrolere dacă procesorul se blochează; câinele de pază îl va reseta pentru a preveni orice deteriorare a aplicației finale.
Bitul DWEN este acolo pentru a activa firul de depanare; acesta este un protocol pregătitor care este integrat intern în hardware-ul lor, care este folosit pentru a programa și depana procesoarele. Cu această caracteristică activată, puteți bloca și depana procesorul cu un singur fir atașat. Dar pentru a-l utiliza, veți avea nevoie de hardware special care este pregătitor pentru Atmel.
Restul de doi biți sunt acei biți pe care trebuie să îi evitați, cu excepția cazului în care știți exact ce faceți. Acestea sunt RSTDISBL bit-7 și SPIEN bit-5. RSTDISBL (External Reset Disable), așa cum sugerează și numele, dezactivează pinul de resetare hardware extern, iar bitul SPIEN este utilizat pentru a dezactiva interfața de programare SPI. Dezactivarea oricăruia dintre acești doi biți poate împiedica complet AVR-ul; deci, lăsarea lor în pace este o idee bună.
Octetii cu siguranță scăzută:
După cum puteți vedea în imaginea de mai jos, tabelul 27-7: al fișei tehnice prezintă biții de siguranță inferioară ai ATmega328P IC.
Acest octet de siguranță este responsabil pentru configurarea sursei de ceas și a altor parametri ai ceasului în interiorul AVR. În această secțiune, vom afla despre toate acestea.
Cel de-al 7-lea bit sau steagul CKDIV8 pot fi setate pentru a împărți sursa ceasului la 8, acest lucru este foarte util, pe care s-ar putea să-l știți deja dacă ați încercat să programați singur AVR-ul. Următorul bit este bitul CKOUT și este al 6-lea bit din Low Fuse Byte. Programându-l, acesta ar genera semnalul de ceas intern pe PORTB0 al microcontrolerului.
Bit-5 și bit-4 SUT1 și SUT0 controlează timpul de pornire al microcontrolerului. Acest lucru previne orice acțiune de pornire care poate avea loc sau nu înainte ca tensiunea de alimentare să poată atinge un nivel minim de tensiune acceptabil. Și ultimii patru CKSEL0 - 4 biți sunt utilizați pentru a selecta sursa de ceas a microcontrolerului. Tabelul de mai jos vă oferă o mai bună înțelegere a acestor patru biți care sunt responsabili pentru configurarea sursei de ceas. Puteți găsi acest tabel în secțiunea Sursă de ceas a fișei tehnice.
Acum, înainte de a ajunge mai departe, mai este un lucru prin care ar trebui să trec: tabelul pentru întârzierea pornirii oscilatorului. Prin întârziere la pornire, ne referim la biții 4 și 5 ai octetului de siguranță inferior. Întârzierile trebuie setate în funcție de condiția în care va funcționa circuitul și de tipul de oscilator pe care îl utilizați. Valorile implicite sunt setate să încetinească creșterea puterii cu 6 cicluri de ceas atunci când se efectuează o secvență de pornire sau oprire. Apoi, există o altă întârziere de 14 cicluri de ceas cu 65 Ms de întârziere după pornire.
Phew! A fost o mulțime de informații de digerat. Dar, înainte de a continua, să încheiem această secțiune cu o notă rapidă.
Notă:
Dacă ați analizat cu atenție foaia tehnică, trebuie să fi observat că programarea unui bit de siguranță înseamnă setarea acestuia la un nivel scăzut, adică 0 (zero), ceea ce este opusul a ceea ce facem în general pentru a face un port înalt sau scăzut. Trebuie să țineți cont de acest lucru în timp ce vă configurați siguranțele.
Fuse Bits în Arduino
Am discutat multe despre siguranțe în secțiunea de mai sus, dar în această secțiune, să vorbim despre cum să le configurați și cum să le scrieți într-un microcontroler. Pentru asta, vom avea nevoie de un instrument numit Avrdude. Este un instrument care poate fi utilizat pentru citirea, scrierea și modificarea memoriei în microcontrolerele AVR. Funcționează cu SPI și are o listă lungă de suport pentru diferite tipuri de programatori. puteți descărca instrumentul de pe linkul de mai jos. De asemenea, vom folosi microcontrolerul nostru preferat Arduino.
- Descărcați Avrdude Versiunea 6.3 Windows-ming32
Acum, că aveți Avrdude, trebuie să extrageți acest lucru și să deschideți o fereastră de comandă în acel folder. De asemenea, dacă intenționați să-l utilizați mai târziu, puteți adăuga calea folderului în secțiunea variabilei de mediu Windows. Dar îl voi pune pe desktopul meu și voi deschide o fereastră de comandă acolo. Odată ce am făcut acest lucru, vom conecta programatorul USBasp la computerul nostru și ne vom asigura că avem driverul adecvat pentru programatorul nostru USBasp. Odată ce facem acest lucru, suntem buni să mergem și vom citi mai întâi valoarea implicită a siguranței. Pentru a face acest lucru, trebuie să executați următoarea comandă.
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
Dacă totul este în regulă, această comandă va citi octeții siguranței și le va pune în trei fișiere text separate. Imaginea de mai jos vă va oferi o idee mai bună despre proces.
După cum puteți vedea, Avrdude a citit biții siguranței de pe Arduino nano și i-a salvat în trei fișiere text separate. Acum, le-am deschis și am obținut trei valori; pentru EFUSE: 0xFD, pentru HFUSE: 0XDA, pentru LFUSE: 0xFF. Aceasta a fost valoarea implicită a siguranței pe care am obținut-o pentru un nano Arduino. Acum, să convertim acești biți în binar și să-i comparăm cu valoarea lor implicită din foaia de date. Tabelul de mai jos arată exact asta.
Pentru comoditate, biții de siguranță sunt scrise în valori hexazecimale, dar dacă le convertim în valori binare și le comparăm cu foaia de date, vom ști ce se întâmplă. Să începem cu octetul de siguranță inferior. După cum puteți vedea din șirul de mai sus, este setat la 0XFF, iar valoarea binară ar fi 0B11111111.
Comparând octeții de siguranță inferiori ai stocului cu Arduino:
Octet de siguranță scăzut |
Bit nr. |
Valoare implicită în AVR |
Valoarea implicită a Arduino |
CKDIV8 |
7 |
0 (programat) |
1 (neprogramat) |
PĂRȚIT |
6 |
1 (neprogramat) |
1 (neprogramat) |
SUT1 |
5 |
1 (neprogramat) |
1 (neprogramat) |
SUT0 |
4 |
0 (programat) |
1 (neprogramat) |
CKSEL3 |
3 |
0 (programat) |
1 (neprogramat) |
CKSEL2 |
2 |
0 (programat) |
1 (neprogramat) |
CKSEL1 |
1 |
1 (neprogramat) |
1 (neprogramat) |
CKSEL0 |
0 |
0 (programat) |
1 (neprogramat) |
Octetul de siguranță mai mare este setat la 0XDA în binar, adică 0B11011010.
Octet de siguranță mai mare în binar:
Octet de siguranță mare |
Bit nr. |
Valoare implicită în AVR |
Valoarea implicită a Arduino |
RSTDISBL |
7 |
1 (neprogramat) |
1 (neprogramat) |
DWEN |
6 |
1 (neprogramat) |
1 (neprogramat) |
SPIEN |
5 |
0 (programat) |
0 (programat) |
WDTON |
4 |
1 (neprogramat) |
1 (neprogramat) |
EESAVE |
3 |
1 (neprogramat) |
1 (neprogramat) |
BOOTSZ1 |
2 |
0 (programat) |
0 (programat) |
BOOTSZ0 |
1 |
0 (programat) |
1 (neprogramat) |
BOOTRST |
0 |
1 (neprogramat) |
0 (programat)) |
Setarea pentru octetul de siguranță extins este setată la 0XFD, în binar este 0B11111101.
Octet de siguranță extins în binar:
Octet de siguranță extins |
Bit nr. |
Valoare implicită în AVR |
Valoarea implicită a Arduino |
- |
7 |
1 |
1 |
- |
6 |
1 |
1 |
- |
5 |
1 |
1 |
- |
4 |
1 |
1 |
- |
3 |
1 |
1 |
BODLEVEL2 |
2 |
1 (neprogramat) |
1 (neprogramat) |
BODLEVEL1 |
1 |
1 (neprogramat) |
0 (programat) |
BODLEVEL0 |
0 |
1 (neprogramat) |
1 (neprogramat) |
Acum, aceasta marchează sfârșitul acestei secțiuni. De acum, am aflat multe despre microcontrolerul AVR și biții de siguranță ai acestuia. Deci, haideți să încheiem acest articol punând la încercare teoria noastră, modificând și experimentând unii dintre biții de siguranță din Arduino Nano.
Componente necesare pentru testarea siguranțelor în AVR
Am vorbit multe despre siguranțele din partea de mai sus. Dar pentru a continua mai departe în articol, avem nevoie de câteva componente hardware și câteva instrumente software. În această secțiune, vom vorbi despre acestea. O listă a componentelor necesare cu imagini este prezentată mai jos.
- Breadboard - 1
- Arduino Nano - 1
- Programator USBasp AVR - 1
- Cablu USB - 1
- Convertor AVR de 10 pini la 6 pini - 1
- Avrdude (Instrument software pentru programarea AVR)
- LED - 1
- Rezistor 330R - 1
- Cabluri jumper
Schema pentru testarea bișorilor de siguranță în AVR
Setarea de testare hardware este prezentată mai jos în această configurare. Am conectat Arduino Nano la computer cu un cablu USB și am conectat și programatorul USBasp la computer. Obiectivul acestui articol este de a programa biții de siguranță în AVR. Din acest motiv, am conectat programatorul USBasp la Arduino. Imaginea de mai jos vă va oferi o idee mai bună despre configurare.
Testarea siguranțelor în AVR
Configurarea testării este prezentată mai jos. După cum puteți vedea, am conectat Arduino și programatorul USBasp la ambele la USB-ul laptopului meu.
Acum, să deschidem ID-ul Arduino și să încărcăm o schiță de bază pentru clipire. Conținutul schiței de bază pentru clipire se explică de la sine, așa că nu am pus detalii despre aceasta.
Veți vedea în videoclip că ledul de pe pinul 13 clipește așa cum ar trebui. Acum să modificăm setările siguranței și să le setăm la valorile implicite. Și așa cum am văzut anterior în foaia tehnică; EFUSE este 0xFF; HFUSE este D9; LFUSE este: 62. Acum, să-l configurăm cu Avrdude, să-l flash și să vedem ce se întâmplă. Codul pe care îl vom folosi este-
avrdude -c usbasp -p m328P -U lfuse: w: 0x62: m -U hfuse: w: 0xd9: m -U efuse: w: 0xff: m
Odată ce voi face acest lucru, veți vedea că LED-ul va clipi extrem de lent, deoarece am calculat și programat valoarea pentru un ceas de 16 MHz și acum, după arderea siguranțelor, este doar un oscilator RC intern de 1 MHz. Acesta este motivul pentru care LED-ul clipește atât de încet. Acum, să încercăm să încărcăm o schiță din nou. Vom vedea că Arduino dă o eroare și codul nu este încărcat. Deoarece modificând siguranțele, am încurcat și setările bootloaderului. Puteți vedea asta în imaginea de mai jos.
Pentru a remedia acest lucru și pentru a pune Arduino înapoi așa cum a fost înainte, trebuie să ardem din nou încărcătorul de boot pentru Arduino. Pentru a face acest lucru, accesați Instrumente -> Programator- USBasp și, odată ce facem acest lucru, putem merge din nou la instrumente și putem face clic pe opțiunea de încărcare bootloader. Acest lucru va arde din nou încărcătorul de stocare pe Arduino și totul va reveni la cum a fost înainte.
După ce încărcătorul de încărcare a revenit la Arduino, acesta a revenit la starea inițială și ultima imagine vă arată un LED intermitent după ce încărcătorul de boot a fost ars din nou.
Și aceasta marchează sfârșitul acestui articol. Sper că ți-a plăcut articolul și ai învățat ceva nou. Dacă aveți întrebări cu privire la articol, nu ezitați să puneți un comentariu mai jos.