- Wat zijn zekeringen in AVR - een gedetailleerde uitleg
- Fuse Bits in Arduino
- Componenten die nodig zijn om zekeringen in AVR te testen
- Schema voor het testen van de zekeringbits in AVR
- Testen van de zekeringen in AVR
In deze tutorial gaan we het hebben over zekeringen. Toen ik op de universiteit zat en leerde over alle leuke dingen in elektronica, hoorde ik de term fuse voor het eerst in AVR, mijn eerste gedachte over het onderwerp was, oh! er zit iets in de AVR dat zal ontploffen als ik iets verkeerd heb gedaan. Destijds waren er niet veel bronnen beschikbaar op internet om doorheen te gaan. Ik heb behoorlijk wat gezocht om erachter te komen dat deze zekeringen verwijzen naar een aantal speciale bits in de AVR Microcontroller. Deze bits zijn als kleine schakelaars in de AVR en door ze aan / uit te zetten, kunnen we enkele speciale functies van de AVR in- / uitschakelen. Het in- en uitschakelen betekent instellen en resetten.
We gaan van deze gelegenheid gebruikmaken om alles te bespreken wat er is over de Fuse-bits in AVR. Voor de eenvoud nemen we het voorbeeld van een Arduino-bord met de populaire ATmega328P-microcontroller. Hier leert u hoe u deze zekeringen instelt voor het in- en uitschakelen van sommige van deze functies, wat erg handig is in real-life toepassingen. Dus laten we er meteen op ingaan.
In onze vorige berichten hebben we veel AVR-microcontrollers-projecten gebouwd, zoals de Interfacing GSM-module met AVR-microcontroller en Interfacing HC-05 met AVR-microcontroller. Je kunt ze bekijken als je meer wilt weten over die projecten.
Wat zijn zekeringen in AVR - een gedetailleerde uitleg
Zoals we eerder hebben besproken, zijn zekeringen in de microcontroller als kleine schakelaars die kunnen worden in- en uitgeschakeld om verschillende functies in de AVR-microcontroller in en uit te schakelen. Dit is het deel waar onze volgende vraag opkomt, dus hoe kunnen we deze zekeringen instellen of resetten? Het antwoord op deze vraag is simpel: we doen het met behulp van zekeringenregisters.
In de ATmega328P IC zijn er in totaal 19 fuse bits en deze zijn onderverdeeld in drie fuse bytes. Deze worden gedefinieerd als "Extended Fuse Bytes", "High Fuse Byte" en de "Low Fuse Byte".
Als u Tabel-27 van de ATmega328 / P-datasheet Rev: 7810D – AVR – 01/15 bekijkt, vindt u alle kleine details over de fuse-bits. Maar de onderstaande afbeelding geeft u een beter idee over het gedeelte met fusebits van het gegevensblad.
Nu je een beetje hebt geleerd over de fuse-bits, laten we het gegevensblad doornemen en alle nodige details over dit IC ontdekken.
De verlengde zekeringsbeetjes:
Zodra u op het tabblad Fuse Bits klikt en een beetje naar beneden scrolt, vindt u Tabel 27-5: die de tabel toont voor de "Extended Fuse Byte", algemeen bekend als " EFUSE". De afbeelding hieronder laat precies dat zien.
In deze tabel zijn er slechts drie bruikbare bits en de andere drie zijn gereserveerd. Deze drie bits hebben betrekking op het Brownout-detectieniveau. Zoals u kunt zien in de opmerking als we naar tabel 28-5 kijken, kunnen we er meer details over vinden.
Zoals u in de bovenstaande tabel kunt zien, hebben we de tabel voor Brownout-detectie. Brownout-detectie is een functie die de microcontroller reset wanneer de voedingsspanning onder een bepaald spanningsniveau daalt. In de ATmega328P IC kunnen we de brownout-detectie volledig uitschakelen of we kunnen deze instellen op de niveaus die in de bovenstaande tabel worden weergegeven.
De hoge zekeringsbytes:
Zoals u in de onderstaande afbeelding kunt zien, toont tabel 27-6: van het gegevensblad de hogere zekeringbits van de ATmega328P IC.
De hoge zekering zorgt voor verschillende taken in de ATmega328 Microcontroller. In deze sectie zullen we praten over de hogere fuse bits en hun werking. Laten we beginnen met de BOOTRST-, BOOTSZ0- en BOOTSZ1-bits. Deze drie bits zijn verantwoordelijk voor het instellen van de opstartgrootte; opstartgrootte verwijst naar de hoeveelheid geheugen die is gereserveerd voor het installeren van de bootloader.
Een bootloader is een speciaal stuk software dat bovenop de microcontroller draait en verschillende taken beheert. Maar in het geval van de Arduino wordt de bootloader gebruikt om de Arduino-sketch in de microcontroller te uploaden. In een van onze vorige artikelen hebben we u laten zien hoe u de bootloader in ATmega328P kunt branden met Arduino. U kunt dat bekijken als u geïnteresseerd bent in het onderwerp. Terugkomend op ons onderwerp, de doeleinden van andere bits in de hoge byte zijn redelijk duidelijk gemaakt, de EESAVE-bit is om het EEPROM-geheugen te behouden terwijl een chipwisselcyclus wordt uitgevoerd. Het WDTON-bit is om de Watchdog-timer in of uit te schakelen.
De watchdog-timer is een speciale timer in de ATmega328P IC die een aparte klok heeft en onafhankelijk loopt. Als de watchdog-timer is ingeschakeld, moet u deze met een bepaalde periode wissen, anders reset de watchdog-timer de microcontroller. Dit is een handige functie die bij veel microcontrollers beschikbaar is als de processor vastloopt; de watchdog zal het resetten om schade aan de eindtoepassing te voorkomen.
De DWEN-bit is er om de debug-draad in te schakelen; dit is een voorbereidend protocol dat intern in hun hardware is ingebouwd en dat wordt gebruikt om de processors te programmeren en te debuggen. Als deze functie is ingeschakeld, kunt u de processor flashen en debuggen met een enkele aangesloten draad. Maar om het te gebruiken, heb je speciale hardware nodig die voorbereid is op Atmel.
De overige twee bits zijn die bits die u moet vermijden, tenzij u precies weet wat u doet. Dit zijn de RSTDISBL bit-7 en de SPIEN bit-5. De RSTDISBL (External Reset Disable), zoals de naam al aangeeft, schakelt de externe hardware-resetpin uit en de SPIEN-bit wordt gebruikt om de SPI-programmeerinterface uit te schakelen. Als u een van deze twee bits uitschakelt, kan uw AVR volledig worden geblokkeerd; het is dus een goed idee om ze met rust te laten.
De Low Fuse Bytes:
Zoals u in de onderstaande afbeelding kunt zien, toont tabel 27-7: van het gegevensblad de Lower Fuse-bits van de ATmega328P IC.
Deze zekeringbyte is verantwoordelijk voor het instellen van de klokbron en enkele andere parameters van de klok in de AVR. In dit gedeelte leren we dat allemaal.
Het 7e bit of de CKDIV8-vlag kan worden ingesteld om de klokbron door 8 te delen, dit is erg handig, wat je misschien al weet als je hebt geprobeerd de AVR zelf te programmeren. Het volgende bit is het CKOUT-bit en het is het 6e bit in de Low Fuse Byte. Door het te programmeren, wordt het interne kloksignaal op de PORTB0 van de microcontroller uitgevoerd.
De bits-5 en bit-4 SUT1 en SUT0 regelen de opstarttijd van de microcontroller. Dit voorkomt eventuele opstartacties die al dan niet plaatsvinden voordat de voedingsspanning een acceptabel minimum drempelspanningsniveau kan bereiken. En de laatste vier CKSEL0 - 4 bits worden gebruikt om de klokbron van de microcontroller te selecteren. De onderstaande tabel geeft u een beter begrip van deze vier bits die verantwoordelijk zijn voor het instellen van de klokbron. U kunt deze tabel vinden in de sectie Klokbron van het gegevensblad.
Nu, voordat we verder komen, is er nog een ding dat ik moet doornemen, is de tabel voor de opstartvertraging van de oscillator. Met opstartvertraging verwijzen we naar bits 4 en 5 van de onderste zekeringsbyte. De vertragingen moeten worden ingesteld afhankelijk van de toestand waarin het circuit zal werken en het type oscillator dat u gebruikt. De standaardwaarden zijn ingesteld om het stijgende vermogen met 6 klokcycli te vertragen wanneer een opstart- of uitschakelsequentie wordt uitgevoerd. Vervolgens is er nog een vertraging van 14 klokcycli met 65 Ms vertraging na het opstarten.
Opluchting! Dat was veel informatie om te verteren. Maar laten we, voordat we verder gaan, dit gedeelte afsluiten met een korte opmerking.
Notitie:
Als je de datasheet zorgvuldig hebt bekeken, moet je hebben gemerkt dat het programmeren van een zekeringbit betekent dat je deze laag zet, dwz 0 (nul), wat het tegenovergestelde is van wat we doorgaans doen om een poort hoog of laag te maken. Daar moet u rekening mee houden bij het configureren van uw zekeringen.
Fuse Bits in Arduino
We hebben in het bovenstaande gedeelte veel over zekeringen gesproken, maar laten we in dit gedeelte bespreken hoe we ze kunnen configureren en hoe we ze in een microcontroller kunnen schrijven. Daarvoor hebben we een tool nodig genaamd Avrdude. Het is een hulpmiddel dat kan worden gebruikt om geheugen in AVR-microcontrollers te lezen, schrijven en wijzigen. Het werkt met SPI en heeft een lange lijst met ondersteuning voor verschillende soorten programmeurs. u kunt de tool downloaden via de onderstaande link. We zullen ook onze favoriete microcontroller Arduino gebruiken.
- Download Avrdude versie 6.3 Windows-ming32
Nu je Avrdude hebt, moet je dat uitpakken en een opdrachtvenster in die map openen. Als u van plan bent om het later te gebruiken, kunt u het mappad toevoegen aan uw Windows-omgevingsvariabele sectie. Maar ik zal het op mijn bureaublad zetten en daar een opdrachtvenster openen. Zodra we dat hebben gedaan, zullen we de USBasp-programmeur op onze pc aansluiten en zullen we ervoor zorgen dat we de juiste driver voor onze USBasp-programmeur hebben. Zodra we dat hebben gedaan, zijn we klaar om te gaan en zullen we eerst de standaardwaarde van de zekering lezen. Om dat te doen, moet u de volgende opdracht uitvoeren.
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
Als alles klopt, leest deze opdracht de fuse-bytes en plaatst deze in drie afzonderlijke tekstbestanden. De onderstaande afbeelding geeft u een beter idee van het proces.
Zoals je kunt zien, heeft de Avrdude de fuse-bits op de Arduino nano doorgelezen en opgeslagen in drie afzonderlijke tekstbestanden. Nu hebben we ze geopend en kregen drie waarden; voor EFUSE: 0xFD, voor HFUSE: 0XDA, voor LFUSE: 0xFF. Dit was de standaard zekeringwaarde die we kregen voor een Arduino nano. Laten we deze bits nu naar binair converteren en ze vergelijken met hun standaardwaarde uit het gegevensblad. De onderstaande tabel laat precies dat zien.
Voor het gemak zijn de fuse-bits geschreven in hexadecimale waarden, maar als we ze converteren naar binaire waarden en ze vergelijken met het gegevensblad, weten we wat er gebeurt. Laten we beginnen met de Lower Fuse Byte. Zoals u kunt zien aan de hand van de bovenstaande reeks, is deze ingesteld op 0XFF en is de binaire waarde 0B11111111.
Stock Lower Fuse Bytes vergelijken met Arduino:
Lage zekering byte |
Bit nr. |
Standaardwaarde in AVR |
Standaardwaarde van Arduino |
CKDIV8 |
7 |
0 (geprogrammeerd) |
1 (niet geprogrammeerd) |
CKOUT |
6 |
1 (niet geprogrammeerd) |
1 (niet geprogrammeerd) |
SUT1 |
5 |
1 (niet geprogrammeerd) |
1 (niet geprogrammeerd) |
SUT0 |
4 |
0 (geprogrammeerd) |
1 (niet geprogrammeerd) |
CKSEL3 |
3 |
0 (geprogrammeerd) |
1 (niet geprogrammeerd) |
CKSEL2 |
2 |
0 (geprogrammeerd) |
1 (niet geprogrammeerd) |
CKSEL1 |
1 |
1 (niet geprogrammeerd) |
1 (niet geprogrammeerd) |
CKSEL0 |
0 |
0 (geprogrammeerd) |
1 (niet geprogrammeerd) |
De hogere zekeringsbyte is ingesteld op 0XDA in binair, dat wil zeggen 0B11011010.
Hogere zekeringbyte in binair:
Hoge zekeringbyte |
Bit nr. |
Standaardwaarde in AVR |
Standaardwaarde van Arduino |
RSTDISBL |
7 |
1 (niet geprogrammeerd) |
1 (niet geprogrammeerd) |
DWEN |
6 |
1 (niet geprogrammeerd) |
1 (niet geprogrammeerd) |
SPIEN |
5 |
0 (geprogrammeerd) |
0 (geprogrammeerd) |
WDTON |
4 |
1 (niet geprogrammeerd) |
1 (niet geprogrammeerd) |
EESAVE |
3 |
1 (niet geprogrammeerd) |
1 (niet geprogrammeerd) |
LAARZENZ1 |
2 |
0 (geprogrammeerd) |
0 (geprogrammeerd) |
LAARZENZ0 |
1 |
0 (geprogrammeerd) |
1 (niet geprogrammeerd) |
BOOTRST |
0 |
1 (niet geprogrammeerd) |
0 (geprogrammeerd)) |
De instelling voor de uitgebreide zekeringbyte is ingesteld op 0XFD, in binair is dit 0B11111101.
Uitgebreide zekeringsbyte in binair:
Uitgebreide zekeringbyte |
Bit nr. |
Standaardwaarde in AVR |
Standaardwaarde van Arduino |
- |
7 |
1 |
1 |
- |
6 |
1 |
1 |
- |
5 |
1 |
1 |
- |
4 |
1 |
1 |
- |
3 |
1 |
1 |
BODLEVEL2 |
2 |
1 (niet geprogrammeerd) |
1 (niet geprogrammeerd) |
BODLEVEL1 |
1 |
1 (niet geprogrammeerd) |
0 (geprogrammeerd) |
BODLEVEL0 |
0 |
1 (niet geprogrammeerd) |
1 (niet geprogrammeerd) |
Dit markeert het einde van deze sectie. Vanaf nu hebben we veel geleerd over de AVR-microcontroller en zijn fuse-bits. Dus laten we dit artikel afronden door onze theorie op de proef te stellen door enkele van de fuse bits in de Arduino Nano te veranderen en ermee te experimenteren.
Componenten die nodig zijn om zekeringen in AVR te testen
We hebben veel gesproken over de zekeringen in het bovenstaande deel. Maar om verder te gaan in het artikel, hebben we enkele hardwarecomponenten en enkele softwaretools nodig. In deze sectie zullen we daarover praten. Een lijst met vereiste componenten met afbeeldingen wordt hieronder weergegeven.
- Breadboard - 1
- Arduino Nano - 1
- USBasp AVR Programmer - 1
- USB-kabel - 1
- AVR 10-pins naar 6-pins converter - 1
- Avrdude (softwaretool voor het programmeren van AVR)
- LED - 1
- 330R-weerstand - 1
- Startkabels
Schema voor het testen van de zekeringbits in AVR
De hardwaretestopstelling wordt hieronder in deze opstelling weergegeven. We hebben de Arduino Nano met een USB-kabel op de pc aangesloten en we hebben ook de USBasp-programmeur op de pc aangesloten. Het doel van dit artikel is om de fuse bits in AVR te programmeren. Om die reden hebben we de USBasp programmer met de Arduino verbonden. Onderstaande afbeelding geeft u een beter idee van de opstelling.
Testen van de zekeringen in AVR
De testopstelling wordt hieronder weergegeven. Zoals je kunt zien, hebben we de Arduino en de USBasp-programmeur beide op de USB van mijn laptop aangesloten.
Laten we nu de Arduino IDE openen en een eenvoudige knipperschets uploaden. De inhoud van de basisknipperschets spreekt voor zich, dus ik heb er geen details over gegeven.
Je zult in de video zien dat de led op pin 13 knippert zoals het hoort. Laten we nu de zekeringinstellingen aanpassen en instellen op de standaardwaarden. En zoals we eerder hebben gezien in de datasheet; de EFUSE is 0XFF; de HFUSE is D9; De LFUSE is: 62. Laten we het nu configureren met Avrdude, het flashen en kijken wat er gebeurt. De code die we zullen gebruiken is-
avrdude -c usbasp -p m328P -U lfuse: w: 0x62: m -U hfuse: w: 0xd9: m -U efuse: w: 0xff: m
Zodra ik dit doe, zul je zien dat de LED extreem langzaam gaat knipperen omdat we de waarde voor een 16Mhz-klok hebben berekend en geprogrammeerd en nu, na het doorbranden van de zekeringen, is het slechts een 1Mhz interne RC-oscillator. Dit is de reden waarom de LED zo langzaam knippert. Laten we nu proberen om nogmaals een schets te uploaden. We zullen zien dat de Arduino een fout geeft en de code niet wordt geüpload. Omdat we door het wijzigen van de zekeringen ook de instellingen van de bootloader hebben verknoeid. Dat zie je in de onderstaande afbeelding.
Om dit op te lossen en de Arduino terug te zetten zoals hij was, moeten we de bootloader gewoon opnieuw branden voor de Arduino. Om dat te doen, ga naar Tools -> Programmer- USBasp , en zodra we dat doen, kunnen we weer naar tools gaan en kunnen we klikken op de bootloader-optie branden. Dit zal opnieuw de standaard bootloader op je Arduino branden en alles zal teruggaan naar zoals het was.
Nadat de bootloader was teruggeflitst naar de Arduino, keerde deze terug naar de oorspronkelijke staat en de laatste afbeelding toont een knipperende LED nadat de bootloader opnieuw was gebrand.
En dit markeert het einde van dit artikel. Ik hoop dat je het artikel leuk vond en iets nieuws hebt geleerd. Als u vragen heeft over het artikel, aarzel dan niet om hieronder een opmerking te plaatsen.