Kérdés:
A Watchdog időzítő beragadt az újraindítási hurokban? (zöld LED villog)
DominicM
2014-06-13 00:55:13 UTC
view on stackexchange narkive permalink

Megpróbálok beállítani egy módot az arduino parancsra történő újraindítására. Az alábbi kódnak ezt meg kell tennie, de úgy tűnik, hogy az arduino-m csak elakadt valamilyen hurokban, ahova nem tudok feltölteni vagy soros kimenetet kapni. A zöld led (13. tű) nagyon gyorsan villog. Ennek egyetlen módja a készülék áramellátásának megszakítása, még a reset gomb sem működik. Ez csak akkor történik, ha az "R" soros úton érkezik, vagy ha a wdt_reset () függvényt megjegyzik.

  #include <avr / io.h> # include <avr / wdt.h>int ledPin = 3; beállítás () {MCUSR = 0; wdt_disable (); Serial.begin (57600); Serial.println ("Csizma!"); pinMode (ledPin, OUTPUT); digitalWrite (ledPin, LOW); delay (500);} void loop () {if (Soros.elérhető () > 0) {char cmd = Soros.olvasott (); if (cmd == 'R') {Soros.println ("R kapott!"); wdt_enable (WDTO_1S); késés (2000); Serial.println ("1 SEC."); }} wdt_reset (); digitalWrite (ledPin, HIGH);}  

Mit csinálok rosszul?

Azt hiszem, egy ideje belefutottam ebbe, egy új vázlat feltöltésére (a watchdog cuccok nélkül) addig tartottam lenyomva a reset gombot, amíg az IDE meg nem kezdte "feltöltési" állapotát.
Lásd még a bejegyzés alján található megjegyzést: http://ariverpad.wordpress.com/2012/02/26/resetting-the-arduino-through-software-for-fun-and-profit/
@sachleen igen, követtem ezt az írást, de kissé zavart vagyok, hova megy ez a kód. Feltételezem, hogy nem megy bele a vázlatba? Inkább nem szerkeszteném a forrásfájlokat, mivel ez minden arduino I programot érintene.
Igen, ez módosítaná a rendszerbetöltőt és kihatna más vázlatokra is, de csak akkor, ha a watchdogot használja.
@sachleen Ez azt jelenti, hogy a rendszerindítót újra fel kell villantani?
Négy válaszokat:
Nahkki
2014-06-13 02:03:12 UTC
view on stackexchange narkive permalink

Az egyik legkézenfekvőbb kérdés az, hogy engedélyezed a watchdog időzítőt 1S késleltetéssel, majd arra kéred a mikrovezérlőt, hogy aludjon 2S-re, kinyomtat valamit, majd visszatér a ciklusba. Ennek elméletileg rendben kell lennie (a wdt-nek újra kell indítania a 2 másodperces várakozást), de láttam, hogy ez problémákat okoz.

Ezenkívül néhány bootloader (nevezetesen az Optiboot bootloader az Uno-n és az újabb táblákon) ) problémákat okozhat a watchdog időzítőkkel, ami azt eredményezheti, hogy a wdt továbbra is engedélyezett marad a visszaállítás után, annak ellenére, hogy a telepítési ciklus letiltja. Először is: próbálja meg növelni a wdt időt 2S-nél nagyobbra (képesnek kell lennie a WDTO_8S elvégzésére), és ellenőrizze, hogy a probléma továbbra is fennáll-e.

SZERKESZTÉS - Az OP egy Arduino Pro Mini klón. Az Arduino Pro Mini mellékelt betöltője nem támogatja a rendszer újraindítását a WDT segítségével. Lényegében egy olyan eszközön, amelynek bootloaderje nem támogatja a WDT újraindítását, a kártya újraindul, de az időzítő / visszaállítás nem okozza a kártya folyamatos újraindítását újraindításkor. Vannak alternatív bootloaderek az Arduino táblák számára, amelyek megoldhatják ezt a problémát. Egy másik megoldás egy másik módszer használata a tábla újraindításához.

Tehát ha ez problémákat okozhat, melyik módszer nem okoz problémákat? Éppen 8 másodpercet próbáltam 9 másodperces késéssel ugyanolyan eredménnyel. 8 másodperc egyébként is túl hosszú lenne, mivel valójában nincs szükségem késleltetésre a soros parancs után.
Az első kérdések egyike az lenne: milyen tábla ez, és milyen bootloadert futtat rajta? Továbbá - mi történik az őrzőkód egyszerűbb verziójával? Például olyan, amely nem olvas be egy bemenetet, hanem n-szer hurkolja a nyomtatási utasítást, majd visszaállítja? Itt (http://www.megunolink.com/how-to-detect-lockups-using-the-arduino-watchdog/) példa a watchdog időzítő nagyon egyszerű használatára - mi történik, ha ilyesmit futtat ?
Arduino pro mini klónot használok alapértelmezett bootloaderrel (nem tudom, mi az). A hivatkozásból beillesztett másolatot ugyanúgy rögzíti a bekapcsolás után néhány másodperc.
Gyors google a termékén megmutatja másoknak is ugyanezt a problémát. Az Arduino Pro Mini rendszerindítója nem támogatja a rendszer újraindítását, amelyet a watchdog időzítő támogat. Lényegében újraindítják a rendszert, de nem indítják újra az időzítőt, ami miatt a tábla újraindításkor folyamatosan visszaáll. Nem használtam Arduino Pro mini-t, és nem is volt nagy szerencsém offbrands-sel (semmi baj velük, csak balszerencsém a részemről), ezért nem tudok ajánlani másik bootloadert offhand-en, de egy gyors Google-keresés azt mutatja, hogy vannak olyan emberek, akik talált egy működő boot betöltőt az eszközhöz, amely támogatja a WDT-t.
Egyáltalán szükséges-e a bootloader a watchdoghoz? Meg tudnék-e szabadulni egyáltalán a bootloader-től, amíg tudok programozni bluetooth-on keresztül, ami a legjobb megoldás lenne számomra.
Ez valószínűleg nem oldja meg a problémát. Nem arról van szó, hogy a rendszerbetöltővel lenne a probléma - a probléma a WDT megvalósítása a rendszerbetöltőben és az, hogy a rendszerbetöltő hogyan adja át a WDT-eseményeket. A bootloader megszabadulása nem szabadul meg a problémától - csak megváltoztatja azt, így egyedül kell végrehajtania a WDT kezelését. A vázlatot minden bizonnyal be lehet írni egy arduino-ba a bootloader nélkül ([Itt] (http://www.arduino.cc/en/Hacking/Programmer) néhány dokumentáció róla.) De bootloader nélkül nem leszel képes vázlatot betölteni bluetooth-on keresztül.
Van valami oka annak, hogy WDT-t használ az alaphelyzetbe állításhoz? Számos más módszer létezik ([itt] (http://www.instructables.com/id/two-ways-to-reset-arduino-in-software/?ALLSTEPS), amely részletesen leírja ezeket a módszereket) hogy ezt megkerülné.
A WDT az egyetlen szoftveres megoldás, de azt hiszem, az egyik csap használatával elindítom a visszaállítást.
Chupo_cro
2017-10-04 07:11:43 UTC
view on stackexchange narkive permalink

A watchdog időzítő rendszer újraindításának engedélyezése és a ciklusban történő várakozás a visszaállításig törvényes módja annak, hogy az SW visszaállítsa a µC-t, mivel a watchdog segítségével elkapja a µC helytelen viselkedését, amelyet különböző okok okozhatnak. óvintézkedéseket kell tenni a watchdog rendszer visszaállítása során, mert az összes AVR-n, amely szintén őrzőkutyával rendelkezik, megszakítja az őrzőkutyát a 0000 = 16 ms-ra beállított előmérővel a watchdog rendszer visszaállítása után is aktív marad. Ezért a programozó felelőssége, hogy törölje az MCUSR funkciót, és az ilyen állapot bekövetkezése után a lehető leghamarabb kikapcsolja a watchdog időzítőt. Mivel az .data és .bss szakaszok inicializálásához szükséges LPM rutinok hosszabbak lehetnek, mint a watchdog időkorlátja, a watchdog letiltásának kódját a .init3 szakasz ban kell elhelyezni, az MCUSR opcionálisan elmenthető a forrás későbbi visszaállításához. Itt található a következő kód:

  uint8_t mcusr_copy __attribute__ ((szakasz (".noinit"))); void disable_wdt (érvénytelen) \ __attribute __ ((meztelen)) \ __attribute __ ((szakasz (". init3")))); void disable_wdt (void) {mcusr_copy = MCUSR; MCUSR = 0x00; wdt_disable ();}  

A probléma azonban olyan bootloader használatakor merülhet fel, amely nem veszi figyelembe a watchdog rendszer visszaállításának lehetőségét. Ebben az esetben a watchdog időtúllépése a bootloaderen belül történik (amelyet először hajtanak végre), mire a fenti kódnak lehetősége van kikapcsolni a watchdog időzítőt, és a µC beragad egy végtelen visszaállítási ciklusba. Mivel a µC visszaállítása nem törli a WDRF jelölést az MCUSR regiszterben (csak szoftveresen vagy Power-on reset-rel törölhető) akkor az áramellátás megszakítása és egy új kód feltöltése lesz, amikor a watchdog időzítőt még mindig nem aktiválja az előző kód. Az MCDRR regiszterben található WDRF -t törölni kell a wdt_disable () előtt, mert a WDE nem törölhető, ha WDRF még mindig be van állítva - ezért nagyon fontos a fenti kódban szereplő utasítások sorrendje. A .init3 szakaszban elhelyezett függvényt nem szabad későbbi kódból meghívni.

geometrikal
2014-06-15 02:51:53 UTC
view on stackexchange narkive permalink

Az Arduino-t ezzel a paranccsal indíthatja újra:

  asm volatile ("jmp 0");  
Ez csak a soft reset-et hajtja végre, és nem állítja vissza teljesen az alapértelmezett értékekre.
Albertobozal
2018-10-16 18:43:46 UTC
view on stackexchange narkive permalink

Az egyik megoldás az őrzők kikapcsolása az initnél. Az optiboot 8.0 verziót használom, és tökéletesen működik. (érvénytelen) {MCUSR = 0; wdt_disable (); visszatér;}



Ezt a kérdést és választ automatikusan lefordították angol nyelvről.Az eredeti tartalom elérhető a stackexchange oldalon, amelyet köszönünk az cc by-sa 3.0 licencért, amely alatt terjesztik.
Loading...