In deze tutorial ben ik met behulp van een Attiny85 microcontroller en ik wil een LED knipperen met ongeveer 1 tweede interval.
Meestal met Arduino en andere knipperen tutorials u gewoon gebruik maken van een vertraging van 1 tweede of 1000 milliseconden om te zetten in- en uitschakelen. In deze tutorial gaan we gebruiken een speciale functie van de MCU die zelden krijgen de aandacht die het verdient.
DE WATCHDOG
Nu die laat de hond dat je zou kunnen zeggen, en ik lach... haha...
De watchdog wordt gewoonlijk gebruikt als een veiligheidsmaatregel voor als de MCU op een onbereikbare plaats en het ophangt om wat voor reden, je heb geen enkele manier van het resetten en het opnieuw werkend te krijgen. Dus de watchdog een bijna afzonderlijk gedeelte van het MCU is, heeft het een klok van eigen (normaal gesproken een RC-kring) en een prescaler van deze klok, nu wat zij niet hebben is het vergelijken van een timer of een manier om een precieze timing instellen. Er is alleen de overloop.
Nu voor een ATtiny85 er 10 verschillende prescaling instellingen zijn te gebruiken, van 16 MS tot 8 seconden (Zie datasheet p.46 voor details). Normaal gesproken de watchdog opnieuw instellen van het MCU wordt gebruikt, maar het kan ook worden ingesteld op het uitvoeren van een interrupt.
Ten eerste, laten we beginnen met het opzetten van de watchdog.
// Disable all interrupts cli(); /* Clear MCU Status Register. Not really needed here as we don't need to know why the MCU got reset. page 44 of datasheet */ MCUSR = 0; /* Disable and clear all Watchdog settings. Nice to get a clean slate when dealing with interrupts */ WDTCR = (1<<WDCE)|(1<<WDE);WDTCR = 0; // Setup Watchdog for interrupt and not reset, and a approximately 500ms timeout P.45WDTCR = (1<<WDIE) | (1<<WDP2) | (1<<WDP0); // Enable all interrupts.sei();
Dit is de veilige manier voor het instellen, de reden waarom we wat doen "reinigen" in het begin is om ervoor te zorgen dat we krijgen wat we willen. statische en wie weet wat kunnen verknoeien een MCU dus het is een goede zaak om het te doen rechts, als u niet wilt dat ze veilig zijn, alles wat je nodig hebt is deze regel
WDTCR = (1<<WDIE) | (1<<WDP2) | (1<<WDP1);
Nu we hebben heeft de watchdog instellen en niets te doen, ook niet echt, zoals de watchdog een veiligheidsmaatregel is het sommige ingewikkelde bewegingen. In dit geval zijn we het laten uitvoeren van een ISR elke 500ms (ongeveer) vertellen maar we een ISR daarvoor nog niet hebt gemaakt, en zoals ik al zei deze functie hebben enkele ingewikkelde manieren functioneren, zodat wanneer de ISR wordt uitgevoerd, de watchdog schakelt automatisch over van interrupt modus naar de modus opnieuw!!!
Tenzij de interrupt-modus opnieuw wordt ingeschakeld in de ISR.
Dus, laten we een blinky ISR
ISR(WDT_vect) {// Flip bit 3 of PORTB PORTB ^= (1<<3); /* ReEnable the watchdog interrupt, as this gets reset when entering this ISR and automatically enables the WDE signal that resets the MCU the next time the timer overflows */WDTCR |= (1<<WDIE); }
Nu hebben we een ISR die flips de LED die u hebt aangesloten op de PORTB3 in- en uitschakelen per 1/2 seconde en wordt de interrupt opnieuw ingeschakeld.
Was niet zo eenvoudig?
Hier is de volledige MrBlinky c bestand.