AVR fuse grunderna: kör en avr med en extern klocka (6 / 6 steg)
Steg 6: Summering.
Föregående steg kan se förvirrande och i ordning men detta steg kommer att ge en tydlig bild av hela processen.
Så vad vi faktiskt vill göra?
Vi har en mikrokontroller (här Atmega 8). Det körs på standardfrekvensen för den levererades med. Vi vill köra det på 16Mhz externa kristall.
Så vad gör exakt? Endast se och ändra fuse bitvärden. Vi får inte heller glömma att 1 betyder unprogrammed och 0: programmerad.
Chipet sitter nu, med dess standardkonfiguration fuse byte.
Först och främst måste vi bestämma, hur man kör mikrokontroller? För enkelhetens skull kan ta att vi bara har tre alternativ-external crystal, externa resonator eller intern oscillator.
Vi fick reda på att kristall oscillator är en tillförlitlig tid hålla SOURCEoch vi inte har något emot att spendera lite för två 22pf kondensatorer. Vårt val är nu klart, vill vi köra avr chip med en extern kristall.
Men där att få alternativ för att göra valet av externa kristalloscillator?
Alternativen är tillgängliga på CKSEL3 till CKSEL0 i den låga fuse byten.
Vi tittade upp tabellen i den microcontroller datablad och fick reda på att det finns ett alternativ kallat keramiska resonator eller crytal oscillator. Vi verkligen vill, så vi notera ned bit värdena av CKSEL3-CKSEL0 associerade med den.
Hmm, men det finns en rad värden för det, 1111-1010. Som en särskilt ta? Och hur du anger frekvensen för kristalloscillator? Uppenbarligen finns det många frekvenser för kristaller, vill vi köra det endast på 16Mhz.
För detta tittar vi upp på en annan tabell, som innehåller frekvensen och den rekommenderade mängden kondensatorer för att användas med dem.
I den här tabellen ser vi att 16Mhz är större att 1 Mhz så vi väljer det alternativet. Bitvärdet som associerades med CKOPT för vårt val är 0 och tillsammans med det, vi valde 111 för värden på CKSEL3-CKSEL1.
Nu är vi säkra på att vi kör det avr chipet med en extern crytal 16 MHz.
Vi läsa bara en instructable om fuse bits och det talade om några starta upp tid saker som crytal behöver värma upp och börja ge relaible signaler.
Hur hittar vi det?
Vi finner det igen i en tabell som finns i samma instructable. Den här tabellen innehåller nu CKSEL0 och SUT1 och SUT0 värde. Vi väljer alternativet att starta upp tid 65 millisekunder och därmed våra motsvarande bitvärden är CKSEL0 -1 SUT1 - 1, SUT0 - 1.
Vi således slutfört att välja uppsättning låg fuse byte.
Från början inställningen hög fuse byte var-
7) RSTDISBL-1
6) WDTON - 1
5) SPIEN-0
4) CKOPT -1
3) EESAVE -1
2) BOOTSZ1-0
1) BOOTSZ0-0
0) BOOTRST -1
Nu måste vi ändra dem till-
7) RSTDISBL -1
6) WDTON -1
5) SPIEN-0
4) CKOPT-0
3) EESAVE -1
2) BOOTSZ1-0
1) BOOTSZ0-0
0) BOOTRST -1
Det är 11001001 i binär eller C9 hexadecimalt. Vi bara ändrar CKOPT från 1 till 0, lämnar alla andra orörda.
Nu för den låga fuse byten, inledningsvis var-
7) BODLEVEL -1
6) BODEN -1
5) SUT1 -1
4) SUT0-0
3) CKSEL3-0
2) CKSEL2-0
1) CKSEL1-0
0) CKSEL0 -1
Vi ändrar den till-
7) BODLEVEL -1
6) BODEN -1
5) SUT1 -1
4) SUT0 -1
3) CKSEL3 -1
2) CKSEL2 -1
1) CKSEL1 -1
0) CKSEL0 -1
Det är 11111111 i binär eller FF i hexadecimal form.
Nu eftersom vi gjort gör evrything, behöver vi bara att bränna dessa nya inställningar i mikrokontroller.
Med avrdude-syntax, det bör vara-
avrdude - c usbasp -p m8 - U lfuse:w:0b11111111:m - U hfuse:w:0b11001001:m
Men det är bättre att skriva detta i hexadecimal, lik-
avrdude - c usbasp -p m8 - U lfuse:w:0xff:m - U hfuse:w:0xC9:m
Standardvärdena för Atmega8 inre 1Mhz oscillator var-
avrdude -p atmega8 - c usbasp - U lfuse:w:0xE1:m - U hfuse:w:0xD9:m
Slutligen slutar det totala förfarandet här. Även om det inte fullständigt förklara om säkringar och hur du programmerar dem, ger detta definitivt en ungefärlig uppfattning för nybörjare på vad säkringar och hur de ska hanteras.
Happy DIY-ning :)