Goto vor Loop() via Interrupt, Mega 2560

Servus,

schraube bzw. programmiere seit einigen Tagen an meinem Programm für mein Mega 2560 rum.

Ich will die Kommunikation mit meinem Xperia betreiben, daher das HC-06 Bluetoohmodul.

Nun die Frage wie kann ich ein Softreset erreichen ohne gleich den Resetbutton zu betätigen?

Habe mir einen der 5 Interrupts zu nutze gemacht, bei Aufruf soll ein eine "goto - Sprungmarke" mich gleich nach der Loop rauslassen ...

Soweit die Theorie!

Nun 2 Fragen:

  1. Ist es Gesund, einene Port XYZ auf Reset zu verbinden und mit Pinmode(XYZ, HIGH) dem Softreset zubetätigen - ist doch für gedacht oder?

  2. Habe eine Fehlermeldung: label 'abbruch' used but not defined

Code:

attachInterrupt(1, Abbruch, LOW); // Interrupt für Abbruch

void loop()
{
abbruch:
...
}

ISR:

void Abbruch() // Interrupt für Abbruch
{
goto abbruch;
}

Sorry zu früh abgeschickt ...

Hoffe könnt mir helfen, bzw. ne bessere Option ?

Sollte halt via Bluetooh realisibar sein!

Gruß Fabian

Lass erstmal das goto weg, dass ist ganz schlechter Programmierstil!

http://www.xappsoftware.com/wordpress/2013/06/24/three-ways-to-reset-an-arduino-board-by-code/

  1. ein Autoreset funktioniert nicht sicher. Einen Reset braucht man nicht.
  2. es ist eine schlechte Idee Goto zu verwenden.

Wieso willst Du den Arduino resetieren??
Wieso willst Du per interrupt inden Loop() Schleife springen, wo Du doch bereits dort bist?
Gib uns den gesamten Sketch.
Grüße Uwe

Beim Schmökern im Datenblatt bin ich über den Watchdog Timer gestolpert, der als Reset Source in 10.2 gelistet ist. Bleibt die Frage, ob/wie man diesen Reset bei Bedarf (möglichst einfach) provozieren kann?

Könnte es ausreichen, WDIF/WDIE per Programm zu setzen?

http://playground.arduino.cc/Main/ArduinoReset
bietet eine reiche Auswahl zum Thema ...

asm( "jmp 0" );

oder

void (*reset)() = 0;
...
 if (x) reset();

ist kein "echtes" Reset; den Watchdog zu verwenden, schon :wink:

Mit goto von einer ISR in die Funktion loop() hineinzuspringen, geht gar nicht, zum Glück :o

@sschultewolter ja die 3. "Reset by Wire" - Methode daran dachte ich auch, einen Pin mit Kabel direkt auf Reset.

@uwefed

Inwiefern nicht sicher? Bisher einmal versehentlich draufgekommen und hat sofort funktioniert.

Wenn ich vom Xperia zu viele Signale schicke, also auf Senden "hämmer" gibt der Controller keine Antwort mehr, schätze überladen.

Aus diesem Statdium kam ich bisher nur über ein Reset wieder zum lauffähigen Zustand zurück.

Bin mir nicht ganz im klaren, ob "break" bzw. "exit(1)" mich wieder an den Anfang der Loop bringt. Im normalen C/C++ bewirkt dies das "breaken" aus der Schleife, Entscheidung bzw. zum Ende des Programms.

hi,

die loop steht "unsichtbar" in einer while(1)-schleife. wenn Du also aus der loop "aussteigst", kommst Du wieder an den anfang der loop.

gruß stefan

Solltest du nicht eher den Bock in deiner Software suchen?
Anstatt da von außen einen dirty Hack dran zu kleben?

@Fabian:

The exit() function terminates the application. Since there is no environment to return to, status is ignored, and code execution will eventually reach an infinite loop, thereby effectively halting all code processing. Before entering the infinite loop, interrupts are globally disabled.

In a C++ context, global destructors will be called before halting execution.

Das ist also nicht, was du suchst, sondern nur ein bisschen härter als

while(true) {} // Bleibt hier hängen

Aus Funktionen mit goto rauszuspringen ist nicht nur schlechter Stil, sondern katastrophal falsch, da damit der Stack nicht wieder abgebaut wird.

@Fabian, ich meinte mit meinem Link eigentlich die 2 Variante mit dem WDT und nicht die mit der Verdrahtung.

Einen Reset auf einem AVR auslösen ist ansonsten nicht der richtige Stil. Wenn das Programm sich weggehangen hat, bringt dir der Software Reset garnichts. Egal ob mit WDT oder Hardware Verbindung.

Schreibe dein Programm richtig, sodass du sagen kannst, mit einer FUnktion setzt du alle Werte wieder auf den Startwert.