Stap 3: Lezen en schrijven van de zekeringen
In een eerdere instructable, ik laten zien hoe u kunt lezen en uw met uw programmeur en avrdude zekeringen. Hier, zal ik u tonen hoe te uw zekeringen tijdens runtime om te zien hoe uw MCU heeft eigenlijk hen terug te lezen. Opmerking, dat dit niet de instelling van de compilatie die je uit de definities in < avr/io*.h > maar de werkelijke zekeringen krijgt zoals de MCU ze tijdens runtime leest.
Uit tabel 27-9 in het gegevensblad van de ATmega328P (databook, meer bevalt) zijn de bits van de Byte lage zekering als volgt:
CKDIV8 CKOUT SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0
Een interessant ding op te merken is dat met zekeringen, 0 betekent geprogrammeerd en een 1 betekent dat die bijzondere bits unprogrammed. Enigszins contra-intuïtief, maar als je eenmaal het weet je weten.
- CKDIV8 stelt u de klok van uw CPU gedeeld door 8. De ATmega328P komt uit de fabriek geprogrammeerd voor het gebruik van haar interne oscillator op 8MHz met CKDIV8 geprogrammeerd (dwz ingesteld op 0) waardoor u een definitieve F_CPU of CPU frequentie van 1MHz. Op de Arduino, dit is gewijzigd sinds ze zijn geconfigureerd voor het gebruik van een externe oscillator op 16MHz.
- CKOUT wanneer geprogrammeerd zal uw CPU kloksnelheid op PB0, oftewel digital pin 8 op Arduinos output.
- SUT [1..0] geeft de starttijd voor je AVR.
- CKSEL [3..0] Hiermee stelt u de klokbron, zoals de interne RC-oscillator, externe oscillator, enz.
Wanneer u uw zekeringen leest, zal het worden teruggegeven aan u in de hexadecimale notatie. Dit is de indeling die u nodig hebt als u wilt schrijven de zekeringen via avrdude. Op mijn arduino is hier wat ik krijg als ik lees de lagere fuse byte:
root read lfuseLower Fuse: 0xff
Dus, alle bits zijn ingesteld op 1. Ik heb dezelfde procedure op een kloon Arduino en kreeg dezelfde waarde. Controle van een van mijn zelfstandige AVR-systemen, ik heb 0xDA die is de waarde die ik had gesteld dat enkele tijd terug bij het configureren van de chip.
Dezelfde procedure wordt gebruikt voor het controleren van de hoge Fuse Byte, uitgebreid Fuse Byte, en Lock zekeringen. De kalibratie en de handtekening fuse bytes zijn uitgeschakeld in de code met een #if 0 preprocessor-richtlijn, die u wijzigen kunt als u scrappy voelen.