Stap 3: Het instellen van de Arduino interne WatchDog-Timer
Samenvatting: In stap 3 van dit Instructable kijken we naar het instellen van de Arduino interne watchdog-timer. We ook praten over de problemen met de Arduino interne WatchDog-Timer en uitleggen waarom een externe WatchDog-Timer, is een betere keuze in vele, maar niet alle systemen.
Instellen van de Arduino interne WatchDog-Timer
De Arduino is een veel eenvoudiger machine dan een Raspberry Pi. Echter, het is eigenlijk makkelijker om op te hangen van een Arduino, dan is het een Raspberry Pi omdat alle code interne schroefdraad op de Arduino. Single threaded betekent dat er slechts één programma tegelijk op de Arudino (met uitzondering van Interrupts, bij wijze van denken). Het punt is dat hebt u slechts één thread tegelijk uitgevoerd, om het even welk hangen op dat draad met de computer stoppen zal. Natuurlijk, er zijn andere problemen die ervoor dat uw programmacode crash en Arduino zorgen kunnen te lock-up. Time-outs op randapparatuur, power kwesties, RFI, etc., etc. Slechte code met behulp van de functie millis() is een klassiek probleem. U moet de rollover 49.5 dagen omgaan, als u geen een real timerklok gebruikt.
Het gebruik van de Arduino interne WatchDog (als u annuleerteken merk op werkzaamheden)
Eerste van alle een definitie. WTO wordt gedefinieerd als de maximale hoeveelheid tijd die de WatchDog-timer tellen kunt vooraleer op nood voor opnieuw worden ingesteld (met andere woorden, wanneer het opnieuw van de computer opstarten zal als de computer verdwijnt).
Er zijn een heleboel dingen die zal de interne WatchDog houden van het werken in de Arduino, dus oppassen.
Hier is een manier om te werken met de interne Arduino WatchDog-timer. Eerst en vooral is de Wto van alle modellen van de Arduino een MAXIMUM van 8 seconden. Hou dat in gedachten. Met een langere Wto omvat veel meer zonden in mijn mening (Wto is 16 seconden op de interne Raspberry Pi WatchDog – die nog niet lang genoeg is voor onze smaak), zodat de Arduino Wto een beetje kort is. We hebben vaak seriële processen die langer dan 8 seconden in onze ontwerpen lopen. Ja, u kunt opnemen klopte in de code, maar wanneer u externe bibliotheken gebruikt, dat is een pijn.
Bouwen om te experimenteren met uw Arduino WDT, een nieuwe schets in de IDE Arudino. Waarschuwing: Als u een ArduinoMega 2560 of soortgelijk apparaat gebruikt, kunt u "zachte brick" uw apparaat. Zie de opmerkingen in de problemen hieronder. Mijn Arduino UNO van SainSmart werkte prima met deze schets. Beginnen met
#include <avr/wdt.h> #define RESETWATCHDOG void setup() { Serial.begin(57600); Serial.println(""); Serial.println ("------->Arduino Rebooted"); Serial.println(""); wdt_enable(WDTO_8S); } void loop() { #ifdef RESETWATCHDOG wdt_reset(); #endif Serial.println("Arduino Running"); delay(1000); }
Uitvoeren van de schets en laat het lopen voor 30 seconden of zo. U moet nooit zien de "Arduino gereboot" bericht weer na een reboot. Vervolgens, commentaar uit de RESETWATCHDOG-instructie als volgt:
#define RESETWATCHDOG
Nu wanneer u de schets, uitvoert als uw WatchDog werkt, dan moet u de Arduino Reboot elke 8 seconden of zo in de seriële monitor.
Problemen met de interne Arduino WatchDog-Timer
Gebruik van de interne WatchDogTimer van de Arduino is problematisch op zijn best. De Arduino WatchDog-Timer heeft een Wto van 8 seconden dus als u een nieuwe schets wilt downloaden en de oude schets heeft de WatchDog ingeschakeld, dan kunt u in een oneindige reboot-reeks. Dit heet "zachte bricking". De Arduino is dan vrijwel waardeloos (zonder een heleboel werk), maar het is nog steeds actief. WatchDog verloopt, bootloader begint, bootload werken voor een tijdje, WatchDog verloopt, etc., etc. etc. Sommige bootloaders nu de WatchDog op de juiste wijze uitschakelen, maar pas op er zijn een heleboel Arduinos daar (als het Mega-2560 - van die we grote fans zijn) die nog steeds niet werken. U kunt het bijwerken van de bootloader, maar het is niet een gemakkelijke taak. Dit is een probleem dat we meerdere malen ben tegengekomen.
- De interne Arduino WatchDog doet niet macht cyclus het systeem. Het herstart de Arduino via de lijn resetten. Dit betekent dat het niet opnieuw onder alle omstandigheden starten. Vooral in low-power / brownout voorwaarden vaak ervaren met Zonne-aangedreven systemen. Ik heb dit gezien in Project Curacao.
- Er zijn problemen met de bootloader (zie hierboven)
- De interne WatchDog-Timer is niet volledig onafhankelijk van de Arduino. Als uw code naar een stukje code schakelt de WDT springt, bent u klaar. Probeer uw stapel om te zien welke interessante dingen kunnen gebeuren aan code in een kleine embedded systeem zoals de Arduino te overschrijven.
- De maximale Wto is 8 seconden. U kan in routines, zoals de seriële communicatie voor meer dan 8 seconden. Uitzoeken van alle mogelijkheden en brengen wdt_reset() oproepen op de juiste plek is moeilijk en met sommige seriële routines, niet onmogelijk.