- Hva er sikringer i AVR - en detaljforklaring
- Sikringsbiter i Arduino
- Komponenter som kreves for å teste sikringer i AVR
- Skjematisk skjema for testing av sikringsbiter i AVR
- Test av sikringene i AVR
I denne opplæringen skal vi snakke om sikringer. Tilbake da jeg var på college og lærte om alle de kule tingene innen elektronikk, hørte jeg begrepet sikring i AVR for første gang, min første tanke om emnet var, åh! det er noe inni AVR som vil blåse hvis jeg gjorde noe galt. Den gang var det ikke mye ressurser tilgjengelig på Internett å gå gjennom. Jeg søkte ganske mye for å finne ut at disse sikringene refererte til noen spesielle biter inne i AVR Microcontroller. Disse bitene er som små brytere inne i AVR og ved å slå dem på / av, kan vi slå på / av noen spesielle funksjoner i AVR. Å slå den på og av betyr å angi og tilbakestille.
Vi kommer til å benytte anledningen til å diskutere alt som er der om sikringsbitene i AVR. For enkelhets skyld vil vi ta eksemplet med et Arduino-kort som huser den populære ATmega328P Microcontroller. Her vil du lære hvordan du setter disse sikringene for å slå noen av disse funksjonene på og av, noe som er veldig nyttig i virkelige applikasjoner. Så, la oss komme rett inn i det.
I våre tidligere innlegg har vi bygget mange AVR-mikrokontrollere-prosjekter som Interfacing GSM-modulen med AVR-mikrokontroller og Interfacing HC-05 med AVR-mikrokontroller. Du kan sjekke dem ut hvis du vil lære mer om disse prosjektene.
Hva er sikringer i AVR - en detaljforklaring
Som vi diskuterte tidligere, er sikringer i mikrokontrolleren som små brytere som kan slås på og av for å aktivere og deaktivere forskjellige funksjoner i AVR-mikrokontrolleren. Dette er den delen hvor vårt neste spørsmål oppstår, så hvordan setter eller tilbakestiller vi disse sikringene? Svaret på dette spørsmålet er enkelt: Vi gjør det ved hjelp av sikringsregistre.
I ATmega328P IC er det totalt 19 sikringsbiter, og de er delt inn i tre sikringsbyte. Disse er definert som “Extended Fuse Bytes”, “High Fuse Byte” og “Low Fuse Byte”.
Hvis du ser på tabell-27 i databladet ATmega328 / P Rev: 7810D – AVR – 01/15, kan du finne ut alle de små detaljene om sikringsbitene. Men bildet nedenfor gir deg en bedre ide om sikringsdelene i databladet.
Nå som du har lært litt om sikringsbitene, la oss gå gjennom databladet og finne ut alle nødvendige detaljer om denne IC.
De utvidede sikringsbitene:
Når du klikker på Fuse Bits-fanen og ruller litt ned, finner du Tabell 27-5: som viser tabellen for “Extended Fuse Byte” , kjent som “ EFUSE”. Bildet nedenfor viser akkurat det.
I denne tabellen er det bare tre brukbare biter, og de andre tre er reservert. Disse tre biter tar for seg Brownout Detection-nivået. Som du kan se i notatet hvis vi ser på tabell 28-5, kan vi finne mer detaljer om det.
Som du kan se i tabellen ovenfor, har vi tabellen for Brownout Detection. Utbruddsdeteksjon er en funksjon som tilbakestiller mikrokontrolleren når forsyningsspenningen faller under et bestemt spenningsnivå. I ATmega328P IC kan vi deaktivere detekteringen av brownout, eller vi kan sette den til nivåene som er vist i tabellen ovenfor.
High Fuse Bytes:
Som du kan se på bildet nedenfor, viser tabell 27-6: i databladet de høyere sikringsbitene til ATmega328P IC.
Den høy sikring avtale med ulike oppgaver innenfor ATmega328 mikrokontroller. I denne delen vil vi snakke om de høyere sikringsbitene og deres virkemåte. La oss starte med bitene BOOTRST, BOOTSZ0 og BOOTSZ1. Disse tre bitene er ansvarlige for å stille inn oppstartsstørrelsen; oppstartsstørrelse refererer til mengden minne som er reservert for installering av opplastingsprogrammet.
En bootloader er en spesiell programvare som kjører på toppen av mikrokontrolleren og klarer forskjellige oppgaver. Men når det gjelder Arduino, brukes bootloaderen til å laste opp Arduino-skissen inne i mikrokontrolleren. I en av våre tidligere artikler har vi vist deg hvordan du brenner bootloader i ATmega328P ved hjelp av Arduino. Du kan sjekke det ut hvis du er interessert i emnet. Når vi kommer tilbake til emnet vårt, blir hensikten med andre biter i den høye byten gjort rimelig tydelig, EESAVE-biten er å bevare EEPROM-minnet mens det er utført en slettesyklus. WDTON-biten er å aktivere eller deaktivere Watchdog Timer.
Vakthundtimeren er en spesiell tidtaker i ATmega328P IC som har sin egen klokke og går uavhengig. Hvis vakthundstimeren er aktivert, må du fjerne den med en viss periode, ellers vil vakthundtimeren nullstille mikrokontrolleren. Dette er en nyttig funksjon som kommer i mange mikrokontrollere hvis prosessoren setter seg fast; vakthunden vil tilbakestille den for å forhindre skade på sluttapplikasjonen.
DWEN-biten er der for å aktivere feilsøkingstråden; dette er en forberedende protokoll som er innebygd i maskinvaren deres, som brukes til å programmere og feilsøke prosessorer. Med denne funksjonen aktivert, kan du blinke og feilsøke prosessoren med en enkelt ledning festet. Men for å bruke den, trenger du spesiell maskinvare som er forberedende for Atmel.
De resterende to bitene er de bitene du trenger å unngå med mindre du vet nøyaktig hva du gjør. Dette er RSTDISBL bit-7 og SPIEN bit-5. RSTDISBL (External Reset Disable) deaktiverer, som navnet antyder, den eksterne nullstillingsnålen for maskinvare, og SPIEN-biten brukes til å deaktivere SPI-programmeringsgrensesnittet. Hvis du deaktiverer noen av disse to bitene, kan du AVR-en din fullstendig murstein. så å la dem være i fred er en god idé.
The Low Fuse Bytes:
Som du kan se på bildet nedenfor, viser tabell 27-7: i databladet de nedre sikringsbitene til ATmega328P IC.
Denne sikringsbyte er ansvarlig for å sette opp klokkilden og noen andre parametere for klokken inne i AVR. I denne delen vil vi lære om alt dette.
Den 7. biten eller CKDIV8-flagget kan settes til å dele klokkilden med 8, dette er veldig nyttig som du kanskje allerede vet om du har prøvd å programmere AVR selv. Den neste biten er CKOUT-biten, og den er den 6. biten i Low Fuse Byte. Hvis du programmerer det, sendes det interne klokkesignalet på PORTB0 på mikrokontrolleren.
Bits-5 og bit-4 SUT1 og SUT0 styrer oppstartstiden til mikrokontrolleren. Dette forhindrer oppstarthandlinger som kan eller ikke kan finne sted før forsyningsspenningen kan nå et akseptabelt minimum terskelspenningsnivå. Og de fire siste CKSEL0 - 4 bitene brukes til å velge klokkilden til mikrokontrolleren. Tabellen vist nedenfor gir deg en bedre forståelse av disse fire bitene som er ansvarlige for å sette opp klokkilden. Du finner denne tabellen i klokkildeseksjonen i databladet.
Nå, før vi kommer videre, er det en ting til som jeg burde gå igjennom, er tabellen for forsinkelse ved oppstart av oscillatoren. Ved oppstartsforsinkelse refererer vi til bit 4 og 5 i den nedre sikringsbyten. Forsinkelsene må innstilles avhengig av tilstanden kretsen skal fungere i og hvilken type oscillator du bruker. Standardverdiene er satt til å senke stigende kraft med 6 klokkesykluser når en oppstart- eller avstengningssekvens utføres. Deretter er det en ny forsinkelse på 14 klokkesykluser med 65 Ms forsinkelse etter oppstart.
Puh! Det var mye informasjon å fordøye. Men før du fortsetter videre, la oss avslutte denne delen med et raskt notat.
Merk:
Hvis du har sett på databladet nøye, må du ha lagt merke til at programmering av en sikringsbit betyr å sette den lav, dvs. 0 (null), som er det motsatte av det vi vanligvis gjør for å gjøre en port høy eller lav. Du må huske på det mens du konfigurerer sikringene dine.
Sikringsbiter i Arduino
Vi har snakket mye om sikringer i avsnittet ovenfor, men i denne delen, la oss snakke om hvordan du konfigurerer dem og hvordan du skriver dem i en mikrokontroller. For det trenger vi et verktøy som heter Avrdude. Det er et verktøy som kan brukes til å lese, skrive og endre minne i AVR-mikrokontrollere. Det fungerer med SPI, og det har en lang liste med støtte for forskjellige typer programmerere. du kan laste ned verktøyet fra lenken nedenfor. Vi vil også bruke vår favoritt mikrokontroller Arduino.
- Last ned Avrdude versjon 6.3 Windows-ming32
Nå som du har Avrdude, må du trekke ut det og åpne et kommandovindu i den mappen. Hvis du planlegger å bruke den senere, kan du også legge til mappestien til delen for Windows-miljøvariabler. Men jeg vil legge det på skrivebordet mitt og åpne et kommandovindu der. Når vi har gjort det, vil vi koble USBasp-programmereren til PC-en vår, og vi vil sørge for at vi har riktig driver for USBasp-programmereren vår. Når vi har gjort det, er vi klare og vi vil lese standard sikringsverdi først. For å gjøre det, må du kjøre følgende kommando.
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
Hvis alt er riktig, vil denne kommandoen lese sikringsbyte og plassere dem i tre separate tekstfiler. Bildet nedenfor gir deg en bedre ide om prosessen.
Som du kan se, leste Avrdude gjennom sikringsbitene på Arduino nano og lagret dem i tre separate tekstfiler. Nå åpnet vi dem og fikk tre verdier; for EFUSE: 0xFD, for HFUSE: 0XDA, for LFUSE: 0xFF. Dette var standard sikringsverdi vi fikk for en Arduino nano. La oss nå konvertere disse bitene til binære og sammenligne dem med standardverdien fra databladet. Tabellen nedenfor viser nøyaktig det.
For enkelhets skyld er sikringsbitene skrevet i heksadesimale verdier, men hvis vi konverterer dem til binære verdier og sammenligner dem med databladet, vet vi hva som skjer. La oss starte med nedre sikringsbyte. Som du kan se fra strengen ovenfor, er den satt til 0XFF, og den binære verdien vil være 0B11111111.
Sammenligning av lager lavere sikringsbytes med Arduino:
Lav sikringsbyte |
Bit nr. |
Standardverdi i AVR |
Standardverdien til Arduino |
CKDIV8 |
7 |
0 (programmert) |
1 (ikke programmert) |
CKOUT |
6 |
1 (ikke programmert) |
1 (ikke programmert) |
SUT1 |
5 |
1 (ikke programmert) |
1 (ikke programmert) |
SUT0 |
4 |
0 (programmert) |
1 (ikke programmert) |
CKSEL3 |
3 |
0 (programmert) |
1 (ikke programmert) |
CKSEL2 |
2 |
0 (programmert) |
1 (ikke programmert) |
CKSEL1 |
1 |
1 (ikke programmert) |
1 (ikke programmert) |
CKSEL0 |
0 |
0 (programmert) |
1 (ikke programmert) |
Higher Fuse Byte er satt til 0XDA i binær, det vil si 0B11011010.
Høyere sikringsbyte i binær:
High Fuse Byte |
Bit nr. |
Standardverdi i AVR |
Standardverdien til Arduino |
RSTDISBL |
7 |
1 (ikke programmert) |
1 (ikke programmert) |
DWEN |
6 |
1 (ikke programmert) |
1 (ikke programmert) |
SPIEN |
5 |
0 (programmert) |
0 (programmert) |
WDTON |
4 |
1 (ikke programmert) |
1 (ikke programmert) |
SPAR |
3 |
1 (ikke programmert) |
1 (ikke programmert) |
BOOTSZ1 |
2 |
0 (programmert) |
0 (programmert) |
BOOTSZ0 |
1 |
0 (programmert) |
1 (ikke programmert) |
BOOTRST |
0 |
1 (ikke programmert) |
0 (programmert)) |
Innstillingen for utvidet sikringsbyte er satt til 0XFD, i binær er det 0B11111101.
Utvidet sikringsbyte i binær:
Utvidet sikringsbyte |
Bit nr. |
Standardverdi i AVR |
Standardverdien til Arduino |
- |
7 |
1 |
1 |
- |
6 |
1 |
1 |
- |
5 |
1 |
1 |
- |
4 |
1 |
1 |
- |
3 |
1 |
1 |
BODLEVEL2 |
2 |
1 (ikke programmert) |
1 (ikke programmert) |
BODLEVEL1 |
1 |
1 (ikke programmert) |
0 (programmert) |
BODLEVEL0 |
0 |
1 (ikke programmert) |
1 (ikke programmert) |
Dette markerer slutten på denne delen. Per nå har vi lært mye om AVR-mikrokontrolleren og dens sikringsbiter. Så la oss pakke opp denne artikkelen ved å sette vår teori på prøve ved å endre og eksperimentere med noen av sikringsbitene i Arduino Nano.
Komponenter som kreves for å teste sikringer i AVR
Vi har snakket mye om sikringene i den ovennevnte delen. Men for å fortsette videre i artikkelen trenger vi noen maskinvarekomponenter og noen programvareverktøy. I denne delen vil vi snakke om disse. En liste over nødvendige komponenter med bilder er vist nedenfor.
- Brettbrett - 1
- Arduino Nano - 1
- USBasp AVR-programmerer - 1
- USB-kabel - 1
- AVR 10-pin til 6- pin-omformer - 1
- Avrdude (Programvareverktøy for programmering av AVR)
- LED - 1
- 330R motstand - 1
- Jumperkabler
Skjematisk skjema for testing av sikringsbiter i AVR
Oppsett av maskinvaretesting er vist nedenfor i dette oppsettet. Vi har koblet Arduino Nano til PC-en med en USB-kabel, og vi har også koblet USBasp-programmereren til PC-en. Målet med denne artikkelen er å programmere sikringsbitene i AVR. Av den grunn har vi koblet USBasp-programmereren til Arduino. Bildet nedenfor gir deg en bedre ide om oppsettet.
Test av sikringene i AVR
Testoppsettet er vist nedenfor. Som du kan se, har vi koblet Arduino og USBasp-programmereren begge til USB-en på den bærbare datamaskinen min.
La oss nå åpne Arduino IDE og laste opp en grunnleggende blinkeskisse. Innholdet i den grunnleggende blinkskissen er selvforklarende, så jeg la ikke noen detaljer om det.
Du vil se i videoen at ledningen på pinne nr. 13 blinker som den skal. La oss nå justere sikringsinnstillingene og sette den til standardverdiene. Og som vi tidligere har sett i databladet; den EFUSE er 0xFF; HFUSE er D9; LFUSE er: 62. La oss nå konfigurere den med Avrdude, blinke den og se hva som skjer. Koden vi skal bruke er-
avrdude -c usbasp -p m328P -U lfuse: w: 0x62: m -U hfuse: w: 0xd9: m -U efuse: w: 0xff: m
Når jeg har gjort dette, vil du se at LED-lampen vil blinke ekstremt sakte fordi vi har beregnet og programmert verdien for en 16Mhz-klokke, og etter å ha brent sikringene er det bare en 1Mhz intern RC-oscillator. Dette er grunnen til at LED-lampen blinker sakte. La oss nå prøve å laste opp en skisse igjen. Vi vil se at Arduino gir ut en feil, og koden blir ikke lastet opp. For ved å endre sikringene har vi også ødelagt innstillingene for bootloader. Du kan se det i bildet nedenfor.
For å fikse dette og for å sette Arduino tilbake som den var før, trenger vi bare å brenne oppstartslasteren igjen for Arduino. For å gjøre det, gå til Verktøy -> Programmerer - USBasp , og når vi gjør det, kan vi igjen gå til verktøy, og vi kan klikke på alternativet burn bootloader. Dette vil igjen brenne lageropplasteren på Arduino, og alt vil gå tilbake til som det var før.
Etter at bootloaderen ble blinket tilbake til Arduino, gikk den tilbake til sin opprinnelige tilstand, og det siste bildet viser en blinkende LED etter at bootloaderen ble brent igjen.
Og dette markerer slutten på denne artikkelen. Jeg håper du likte artikkelen og lærte noe nytt. Hvis du har spørsmål angående artikkelen, ikke nøl med å gi en kommentar nedenfor.