Hur du ändrar fuse bitar av AVR Atmega328p - 8 bitars microcontroller med Arduino (2 / 7 steg)
Steg 2: Förståelse Fuse bitar från datablad
AtmegaXXX AVR microcontrollers levereras med en standard 1 MHz intern oscillator. I detta instructable jag kommer att visa dig hur du ändrar säkringarna av Atmega328P-PU att arbeta på 8MHz intern oscillator. Platsen för särskilda fuse bitar skiljer sig bland alla tre fuse byte (låg, hög och utökade säkringar) beroende på AVR chip används. Så var noga med att skriva ner dem innan du ställer dem.
Låga Byte säkringar
Den låga byte säkringen behandlar klockan källan, hur snabbt chip kommer att köras och hur länge det väntar vid start. 1 byte motsvarar 8 bitar. Så finns det 8 bitar i den låga fuse byten. Dessa 8 bitar förklaras här:
- Lite-7: CKDIV8: när som delar upp klockfrekvens av 8
- Bit-6: CKOUT: när ställa in klockan pulser är utgången på PB0 (Pin 14)
- Bit-5: SUT1: Start tidsfördröjning
- Bit-4: SUT0: Start tidsfördröjning
- Bit 3: CKSEL3: Ställ klocka källa
- Bit-2: CKSEL2: Ställ klocka källa
- Bit-1: CKSEL1: Ställ klocka källa
- Bit-0: CKSEL0: Ställ klocka källa
ATmega marker kan köras med olika hastigheter eller frekvenser och frekvensen bestäms av klocka källa som används. Klockan källan anges med hjälp av CKSEL3... 0 säkring bitar. Att arbeta med interna klocka källa vi måste ange CLSEL3 = 0, CKSEL2 = 0, CKSEL1 = 1 och CKSEL0 = 0. Du måste hitta detta värde i databladet för mikrokontroller. I databladet finns ett kapitel "systemklocka och hårdvaruklocka alternativ". Det finns ett underämne i det kapitlet "Klocka källor". Där hittar du en tabell där värdet av CKSEL3... 0 kan vara fount. Jag har bifogat en skärmdump av databladet.
För starttiden finns en annan underämnet "kalibrerad inre RC-Oscillator". Där kan du hitta en annan tabell för SUT0... 1. jag kommer att använda långsamt stigande Energialternativ. Så SUT1 = 1 och SUT0 = 0.
Nu återstår två fler bitar att ange: CKOUT och CKDIV8. Jag behöver inte någon klocka puls utgången på PB0. Så jag kommer att ställa detta till 1 (unprogrammed).
Den maximala frekvensen av inre RC oscillator för Atmega328P-PU är 8 MHz. Detta uppnås när CKDIV8 är 1 (eller unprogrammed). Om du anger detta till 0 (eller planerade) då kommer ditt chip runt på 1 MHz. Så vi måste ställa in CKDIV8 för att köra chip på 8 MHz = 1.
Nu kombinera alla 8 bitar, våra krävs låg fuse byte är 11100010.
Övre byte säkringar
Övre byte säkringen förklaras nedan. Du kan enkelt hoppa över denna del. Här har jag bara förklarade de höga fuse bitarna. Vi behöver inte ändra de höga fuse bitarna för att ändra klockan källan och frekvens. Men om du är intresserad av att veta om den höga byten säkringar sedan gå igenom den under punkt.
Det finns 8 bitar i övre byte säkring också. Dessa är:
- Lite-7: RSTDISBL: externa återställa inaktivera
- Bit-6: DWEN: felsöka tråd aktivera
- Bit-5: SPIEN: aktiverar Seriell programmering och data nedladdning
- Bit-4: WDTON: Watchdog timer alltid på
- Bit 3: EESAVE: bevara EEPROM minne genom chip radera
- Bit-2: BOOTSZ1: ställer in bootloader minnesstorleken
- Bit-1: BOOTSZ0: ställer in bootloader momory storleken
- Bit-0: BOOTRST: Välj Återställ vektorn
Nu kommer jag förklara varje bit:
RSTDISBL (extern återställning inaktivera)
PC6 av Atmega328 är en Återställ PIN-kod, hålla det låga (till marken) och chip kommer att återställas. Så här fungerar växeln på Arduino. När du trycker på återställningsknappen den ansluter PC6 till marken och återställer chip. PC6 kan också användas som en vanlig IO stift men detta innebär att inaktivera återställningsfunktionen vilket i sin tur innebär att chipet inte längre kan inline programmerad (i linje programmering kräver en återställning). Detta är ett av alternativen är det bättre att inte ändra. Jag kan tänka mig RSTDISBL genomförs av säkerhetsskäl att stoppa chip som omprogrammeras eller inbyggd programvara som laddas ned. När RSTDISBL är programmerad start tid (SUT1 SUT0) ökas till 14CK + 4.1ms att säkerställa programmeringen kan anges.
Som standard är inställningen RSTDISBL = 1 (unprogrammed).
DWEN (debug tråd aktivera)
ATmega marker har inbyggda felsökningsverktyg som är som standard inaktiverat. DWEN säkringen används för att aktivera dem. DWEN använder samma stift som reset (PC6) och när DWEN är aktiverat (och de låsa bitarna inte anges) Återställ PIN-koden blir en kommunikation pin och normal återställning inte längre fungerar. Till exempel, om du aktiverar DWEN på en Arduino fungerar reset-knappen inte längre. Att använda det på-flisa felsökning du behöver en kompatibel programmerare som AVR Dragon. Eftersom jag inte har en lämplig programmerare jag har aldrig använt och inte vet hur man använder felsökning. Om du vill veta mer är det en bra artikel att komma igång.
Detta är en av säkringarna noga med. Om du aktiverar DWEN och även aktivera de låsa bitarna kan du inte längre Programmera chip på normalt sätt.
Om du just har börjat lämna DWEN till 1 (unprogrammed). Reset är ju mycket användbar.
SPIEN (aktiverar Serial programming och nedladdning av Data)
ATmega marker kan programmeras med hjälp av Seriell programmering. Seriell programmering används för ombord på programmering med ett seriellt protokoll via en ISP (inline seriell programmerare) eller UART (universal asynchronous receiver / sändare). Den normala metoden för programmering ATmega marker är via SPI gränssnitt med hjälp av SCK (klocka), MOSI (ingång) och MISO (output) stift. Om du inaktiverar seriell kan programmering sedan du inte längre använda SPI för att programmera chip. Du kan också inaktivera Seriell programmering med lock bitar. Lämna SPIEN aktiverad, men om du har en enhet som är slutliga och inga ytterligare programmering krävs kan du använda detta alternativ för att stoppa människor använder chip via seriell kommunikation för normal användning och utveckling.
Standardinställningen är SPIEN aktiverad, SPIEN = 0 (planerat).
WDTON (Watchdog Timer alltid på)
Watchdog är i grunden en timer som gör att chipet att återställa om det inte får ett OK signal på bestämda tider. Det kan vara användbart när du har instabil kod eller har ett system som inte får tillåtas att permanent låsa. När watchdog timer är aktiverat, bör en skiss krascha eller frysa kommer timern att timeout och återställa chip orsakar en omstart liknar att trycka på återställningsknappen en en rinnande Arduino. Watchdog Timer kan aktiveras i programvaran så fuse inställningarna egentligen inte behöver användas. Som standard är watchdog timer off, WDTON = 1 (unprogrammed).
EESAVE (bevara EEPROM minne)
När ATmega chippet programmeras raderas minnet precis innan den nya koden laddas upp. Under normala omständigheter raderas EEPROM minnet och programminnet. EESAVE säkringen kan nyttjas för att skilja chipet inte att radera EEPROM. Detta är användbart när du vill uppgradera kod men behålla inställningar som lagras i EEPROM.
Jag har fått för vana att ställa detta säkring; EEPROM har en begränsad livslängd så ju mindre du skriva till det bättre. Radera eeprom påverkar inte ladda upp ny kod och flesta av mina projekt inte använder eeprom minnet så inte radera det inte är ett problem. DropController lagrar inställningar och släpp tider i eeprom och så jag som EESAVE att bevara data när jag laddar upp nya versioner av koden.
Standardvärdet är EESAVE = 1 (unprogrammed), och EEPROM-minne raderas under chip radera cykla vid programmering.
BOOTSZ1 & BOOTSZ0 (Boot loader storlek)
ATmega marker har möjlighet att använda en starthanterare, detta är ett litet program som körs när chipet först startas eller när den återställs. Stöveln loadersgoogle används normalt till att initialisera enhet och kontrollerar om extern kommunikation. Arduino använder en starthanterare för att prata med en ansluten dator att se om det finns en ny program till vara belastat upp. Detta är anledningen till Arduino återställs när du laddar upp ny kod, Återställ kör boot loader, de boot loader kontrollerna för att se om du har ny kod.
Starthanteraren lagras i programminne, samma minne används för användarprogrammet och sedan boot loader kan vara olika storlekar du kan berätta ATmega chip hur mycket utrymme att reservera. Regelbundna (äldre) Arduino boot loader är 2 kilobyte (KB) men den nyare Optiboot (används på UNO) är endast 0.5KB (512 bytes). Om använda Optiboot och ange boot loader storleken därefter får du en extra 1,5 KB för egna program. 1,5 KB kan vara mycket utrymme, kör programmet tar slut är därför jag började programmera fristående ATmega marker i första hand. Koden för drop Controller blev för stor för regelbundna Arduino så jag tog bort boot loader.
Om du har en starthanterare sedan måste BOOTSZ användas tillsammans med BOOTRST. BOOTRST berättar ATmega chip minnesadress där starthanteraren börjar. Om BOOTRST inte anges kan då i användarprogrammet använda hela minnet oavsett BOOTSZ.
Standard för nya marker är BOOTSZ1 = 0 (planerat) och BOOTSZ0 = 0 (planerat) vilket innebär att de har maximalt minne reserverat för en starthanterare.
BOOTRST (Välj Återställ vektor)
ATmega marker kan använda en starthanterare, detta är ett litet program som körs när chipet återställs. Om du har en starthanterare så måste du informera MCU och detta är med hjälp av BOOTRST säkring inställning. När BOOTRST säkring är inställd, på Återställ kommer att enheten hoppa till adressen som Bootloader. Om inte set, chip kommer att hoppa till programmet startadress på 0x0000.
Standardvärdet är BOOTRST = 1 (unprogrammed).
Om BOOTRST inte anges (ingen bootloader) används inte BOOTSZ säkringar oavsett värde.
Varning: RSTDISBL, SPIEN och DWEN säkringarna har potential att tegel ATmega chip, eller åtminstone göra chipet mycket mycket svårt att använda igen. För allmänt bruk, och särskilt om du just har börjat med programmering fristående marker, bör du inte ändra dessa säkring inställningar. Du bör också kontrollera att du inte ändrar dem när du skriva andra fuse inställningar.
Så våra våra krävs hög fuse byte är 11011011.
Utökade Fuse bitar
De utökade säkringarna används bara fastställa en brun ut upptäckt (BOD). ATmega marker kan bli instabil eller otillförlitliga när den används med tillräcklig spänning. Till exempel kan Atmega328 / 328P köra säkert på 16 MHz om den har minst 4 V leverera. Något under 4V betyder chip kan förväntas bära sig illa åt. Detta skulle vara ett problem om enheten används med sensorer ta mätningar eller förlitat sig på exakta tider.
För att säkerställa chip har tillräcklig inspänning en minsta spänning kan ställas in. Om spänningen sjunker under denna nivå kommer att sedan chip återställa sig själv. Detta kallas brown-out detektor nivån. I grund och botten om medföljande spänningen understiger BOD chip håller återställning nere.
Jag går inte igenom varje bitar av utökade fuse byte. Som standard är alla bitar i detta byte anges som 1 (unprogrammed).
Och här är vår utökade fuse byte är 11111111.