Spørgsmål:
Watchdog-timer sidder fast i genstartsløjfen? (grøn LED blinker)
DominicM
2014-06-13 00:55:13 UTC
view on stackexchange narkive permalink

Jeg prøver at oprette en måde at genstarte arduino på kommando. Koden nedenfor skal gøre det, men det ser ud til, at min arduino bare sidder fast i en slags løkke, hvor jeg ikke kan uploade eller få seriel output. Den grønne led (pin 13) blinker meget hurtigt. Den eneste måde at stoppe dette på er at skære strøm til enheden, selv reset-knappen fungerer ikke. Dette sker kun når "R" modtages via seriel, eller hvis funktionen wdt_reset () kommenteres.

  #include <avr / io.h> # include <avr / wdt.h>int ledPin = 3; ugyldig opsætning () {MCUSR = 0; wdt_disable (); Serial.begin (57600); Serial.println ("BOOT!"); pinMode (ledPin, OUTPUT); digitalWrite (ledPin, LOW); delay (500);} void loop () {if (Serial.available () > 0) {char cmd = Serial.read (); hvis (cmd == 'R') {Serial.println ("R modtaget!"); wdt_enable (WDTO_1S); forsinkelse (2000); Serial.println ("1 SEK."); }} wdt_reset (); digitalWrite (ledPin, HIGH);}  

Hvad laver jeg forkert?

Jeg tror, ​​jeg løb ind i dette for et stykke tid siden for at uploade en ny skitse (uden vagthundens ting) holdt jeg nulstillingsknappen nede, indtil lige før IDE begyndte sin "upload" -tilstand.
Se også noten nederst i dette indlæg: http://ariverpad.wordpress.com/2012/02/26/resetting-the-arduino-through-software-for-fun-and-profit/
@sachleen ja, jeg fulgte den opskrivning, men er lidt forvirret, hvor den kode går. Jeg antager, at det ikke går ind i skitsen? Jeg foretrækker ikke at redigere kildefiler, da det vil påvirke alle arduino I-programmer.
Ja, det ville ændre bootloaderen og også påvirke andre skitser, men kun hvis du bruger vagthunden.
@sachleen Betyder det, at bootloaderen skal flashes igen?
Fire svar:
Nahkki
2014-06-13 02:03:12 UTC
view on stackexchange narkive permalink

Et af de mest oplagte problemer her er, at du aktiverer vagthundtimeren med en forsinkelse på 1S, og derefter beder du mikrocontrolleren om at sove i 2S, udskrive noget og derefter gå tilbage i sløjfen. Dette skal i teorien være fint (din wdt skal udløse en genstart under 2 sekunders ventetid), men jeg har set det forårsage problemer.

Derudover nogle bootloaders (især Optiboot bootloader på Uno og nyere boards ) kan have problemer med vagthundtimere, der får wdt til at forblive aktiveret efter nulstilling, selvom installationssløjfen deaktiverer den. Til at begynde med - prøv at øge wdt-tiden til noget større end 2S (du skulle være i stand til at gøre WDTO_8S) og se om problemet fortsætter.

EDIT - OP'en bruger en Arduino Pro Mini-klon. Den medfølgende bootloader på Arduino Pro Mini understøtter ikke genstart af systemet af WDT. I det væsentlige genstarter brættet på en enhed med en bootloader, der ikke understøtter WDT-genstart, men timeren / nulstillingen forårsager ikke, at brættet kontinuerligt nulstilles ved genstart. Der er alternative bootloadere til Arduino-kort, der kan løse dette problem. En anden løsning er at bruge en anden metode til at genstarte tavlen.

Så hvis det kan forårsage problemer, hvilken metode forårsager ikke problemer? Jeg prøvede lige 8 sekunder med 9 sekunders forsinkelse med samme resultater. 8 sekunder ville alligevel være for lange, da jeg faktisk ikke har brug for nogen forsinkelse efter seriel kommando.
Et af de første spørgsmål ville være - hvilket board er det, og hvilken bootloader kører du på det? Derudover - hvad sker der med en enklere version af vagthundkoden? For eksempel en, der ikke læser et input, men snarere sløjfer en udskriftserklæring n gange og derefter nulstiller? Her (http://www.megunolink.com/how-to-detect-lockups-using-the-arduino-watchdog/) er et eksempel på en meget enkel brug af vagthundtimeren - hvad sker der, når du kører noget som dette ?
Jeg bruger arduino pro mini-klon med standard bootloader (ikke sikker på hvad det er). Med kopien indsat prøve fra linket låses den lige op efter et par sekunder efter tænding.
En hurtig google på dit produkt viser andre med samme problem. Bootloaderen på Arduino Pro Mini understøtter ikke genstart af systemet understøttet af vagthundtimeren. I det væsentlige genstarter de systemet, men genstarter ikke timeren, hvilket medfører, at kortet kontinuerligt nulstilles ved genstart. Jeg har ikke brugt en Arduino Pro mini og har heller ikke haft meget held med offbrands (intet galt med dem, bare uheld fra min side), så jeg kan ikke anbefale en anden bootloader offhand, men en hurtig google-søgning viser, at der er folk, der har fundet en fungerende bootloader til den enhed, der understøtter WDT.
Er bootloader overhovedet påkrævet til vagthund? Kunne jeg bare slippe af med bootloader helt, så længe jeg kan programmere det via Bluetooth, der ville være den bedste mulighed for mig.
Det løser sandsynligvis ikke dit problem. Det er ikke, at bootloaderen er problemet - det er implementeringen af ​​WDT i bootloaderen, og hvordan bootloaderen afleverer WDT-begivenheder, der er problemet. At slippe af med bootloaderen slipper ikke problemet - det ændrer det bare, så du skal implementere håndteringen af ​​WDT alene. Det er bestemt muligt at brænde en skitse til en arduino uden bootloader ([Her] (http://www.arduino.cc/da/Hacking/Programmer) er noget dokumentation om det.) Men uden en bootloader vil du ikke være i stand til at indlæse en skitse via bluetooth.
Er der en særlig grund til, at du bruger en WDT til at nulstille arduino? Der er flere andre metoder ([her] (http://www.instructables.com/id/two-ways-to-reset-arduino-in-software/?ALLSTEPS) er en vejledning, der beskriver disse metoder), som du kan bruge der ville komme omkring dette.
WDT er den eneste software-eneste løsning, men jeg antager, at jeg vil bruge en af ​​benene til at udløse nulstillingen.
Chupo_cro
2017-10-04 07:11:43 UTC
view on stackexchange narkive permalink

Aktivering af genstart af overvågningstimersystem og ventetid i en sløjfe indtil nulstilling er en legitim måde at SW nulstille µC på, som ved hjælp af vagthund til at fange µC's dårlige opførsel, hvilket kan være forårsaget af forskellige årsager.

Imidlertid er nogle der skal træffes forholdsregler, når du bruger nulstilling af overvågningssystem, fordi på alle AVR'er, der også har overvågning, afbryder overvågningshunden med prescaler indstillet til 0000 = 16 ms forbliver aktiv efter overvågning af overvågningssystemets system. Det er derfor en programmerings ansvar at rydde MCUSR og at deaktivere vagthundtimeren så hurtigt som muligt efter forekomst af en sådan tilstand. Da LPM-rutiner til initialisering af .data- og .bss-sektioner kan vare længere end watchdog-timeoutintervallet, skal koden til deaktivering af vagthunden placeres i .init3 sektion og indholdet af MCUSR kan eventuelt gemmes til senere nulstilling af kildeundersøgelse. Her er koden, der gør det beskrevne:

  uint8_t mcusr_copy __attribute__ ((afsnit (".noinit"))); ugyldig deaktiver_wdt (ugyldig) \ __attribut __ ((nøgen)) \ __attribute __ ((afsnit (". init3"))); ugyldig deaktiver_wdt (ugyldig) {mcusr_copy = MCUSR; MCUSR = 0x00; wdt_disable ();}  

Problemet kan dog opstå, når du bruger en bootloader, der ikke tager højde for muligheden for nulstilling af overvågningssystemet. Hvis det er tilfældet, vil watchdog-timeout ske inden i bootloader (som udføres den første), før ovenstående kode har mulighed for at deaktivere watchdog-timeren, og µC sidder fast i en endeløs reset-loop. Siden nulstilling af µC vil ikke rydde WDRF flag i MCUSR registreres (det kan kun ryddes i software eller ved nulstilling af tænding) den eneste måde vil derefter være at skifte strøm og uploade en ny kode, når vagthundtimeren stadig ikke er aktiveret af den foregående kode. WDRF i MCUSR -registret skal ryddes inden wdt_disable () , fordi WDE ikke kan ryddes, hvis WDRF er stadig indstillet - derfor er rækkefølgen af ​​instruktionerne i ovenstående kode meget vigtig. Funktionen placeret i sektionen .init3 må ikke kaldes fra senere kode.

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

Du kan genstarte Arduino med denne kommando:

  asm flygtig ("jmp 0");  
Dette gør kun soft reset og nulstiller det ikke til standardindstillingerne fuldstændigt.
Albertobozal
2018-10-16 18:43:46 UTC
view on stackexchange narkive permalink

Fjern fjernelse af vagthunde ved init er en løsning. Jeg bruger optiboot 8.0, og det fungerer perfekt.

  // Funktion Pototypevoid wdt_init (ugyldig) __attribute__ ((nøgen, brugt, sektion (". Init3"))) // Funktion Implementationvoid wdt_init (ugyldigt) {MCUSR = 0; wdt_disable (); returnere;}  


Denne spørgsmål og svar blev automatisk oversat fra det engelske sprog.Det originale indhold er tilgængeligt på stackexchange, som vi takker for den cc by-sa 3.0-licens, den distribueres under.
Loading...