Arduino Mega 2560 nach verwendung des Watchdog Timers nicht mehr beschreibbar

Hallo,

ich wollte ein bischen mit dem Watchdog Timer experimentieren und habe dazu einen Code auf meinen Arduino Mega 2560 hochgeladen.

Jetzt habe ich das Problem, dass es nicht mehr möglich ist den Microcontroller neu zu beschreiben.
Der Code (ganz egal welcher Art) wird zwar kompiliert, kann aber nicht geuploadet werden.

Ich habe hier:

http://forum.arduino.cc/index.php?topic=116110.0

gelesen, dass das etwas mit dem Watchdog zu tun hat und man das Problem so lösen kann:

im Arduino Unterverzeichnis:
hardware\arduino\bootloaders\atmega
in der Datei:
makefile
beim entsprechenden Target bei:
CFLAGS +=
den Parameter:
'-DWATCHDOG_MODS'
hinzufügen

Beispiel für den Mega:
mega: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=0' -DBAUD_RATE=57600 '-DWATCHDOG_MODS'

Hex-Datei sichern, und aus dem Verzeichnis entfernen. Danach den Bootloader neu kompilieren (make.exe…)und via ISP auf den Chip brennen.

-Funktioniert das auch mit einem Mega 2560?
-Wenn ja, was bedeutet "Hex-Datei sichern, und aus dem Verzeichnis entfernen"?
-Wie kann ich den Mega 2560 per ISP beschreiben (mit einem Arduino Uno)?

Einen Uno mit einem Uno als ISP zu beschreiben hat bei mir schon funktioniert.
Macht man das bei seinem großen Bruder genauso?

Oder gibt es vielleicht auch eine andera Möglichkeit meinen Mega 2560 zu retten?

Für alle die es interessiert wäre hier übrigens der Watchdog Code, den ich geuploadet habe:

#include <avr/wdt.h>

void setup()
{
  Serial.begin(9600);
 
  Serial.println('A');
  delay(300);
  
  Serial.println('B');
  delay(300);
  
  Serial.println('C');
  delay(300);
  
  Serial.println('D');
  delay(300);
  
  Serial.println('E');
  delay(300);
  
  Serial.println('F');
  delay(300);
  
  Serial.println('G');
  delay(300);
  
  Serial.println('H');
  delay(300);
  
  Serial.println('I');
  delay(300);
  
  Serial.println('J');
  delay(300);
  
  Serial.println('K');
  delay(300);
  
  wdt_enable(WDTO_2S);
}

void loop()
{
  
}

Wenn der Sketch den Wachdog im setup nicht schnell genug aufruft oder Du die Wachdogzeit so kurz wählst daß der Bootloader nicht beendet wird bevor der Watchdog einschreitet resetiert der Arduino bevor Du ein Upload machen kannst.
Ich befürchte ein Upload mittels ISP nutzt nichts. Ich weiß nicht ob ein rücksetzen der entsprechenden Fuse mitels ISP möglich ist.
Eine Lösung ist High Voltage Programming. Eine Beschreibung für einen ATmega328 eines Arduino UNO hier: Soup.io . Mir ist aber nicht bekannt ob und wie man einen eingelöteten ATmega2560 so resetieren kann.

Viele Grüße Uwe

Was hast Du genau gemacht?
Nicht nur "mit dem Watchdog-Timer" gespielt (z.B. für den Sleepmode), sondern "einen Watchdog-Reset programmiert"?

Epijano:
-Funktioniert das auch mit einem Mega 2560?

Bevor Du irgendwas kompliziertes anfängst, das auf möglicherweise veralteten/uralten Informationen aus dem Internet beruht, würde ich eher mal ausprobieren, ob der aktuelle MEGA-Bootloader nicht bereits entsprechend fehlerbereinigt ist, ohne dass Du selbst einen eigenen Bootloader-Quellcode zu einem Bootloader-Executable kompilieren brauchst. Das ist nämlich nicht so ganz trivial.

In jedem Fall benötigst Du einen ISP-Programmer.
Notfalls einen zweiten "Arduino as ISP" mit entsprechendem Sketch und entsprechender Hardware-Verkabelung.

Also mal die Arduino Version 1.0.5 installieren
Dann mit dem ISP den aktuellen "Bootloader neu installieren".

Ist der Fehler dann weg und der MEGA funktioniert wieder? ==> Glückwunsch!

Wenn der Fehler auch mit einem aktuellen MEGA-Bootloader nicht beseitigt werden kann:
Schreibe Dir einen kurzen eigenen Sketch, der sofort im setup() den Watchdog deaktiviert und lade diesen Sketch mit dem ISP-Programmer hoch!

Und danach wie folgt verfahren:
Wenn Du mit Bootloader und nur noch ohne Watchdog-Timer programmieren möchtest, danach wieder einen Bootloader installieren.

Und wenn Du immer noch mit Watchdog-Reset experimentieren möchtest: Lasse den Bootloader weg und lade alle Sketche NUR MIT ISP!

Einen Bootloader installiert zu haben und gleichzeitig Watchdog-Reset nutzen zu wollen, ist nicht wirklich sinnvoll. Das machst Du besser auf einem System ohne Bootloader, auf das der Sketch mit einem ISP hochgeladen wird.

Erstmal danke für die Antworten.

High Voltage Programming ist für mich nicht wirklich eine Option :frowning:

In jedem Fall benötigst Du einen ISP-Programmer.
Notfalls einen zweiten "Arduino as ISP" mit entsprechendem Sketch und entsprechender Hardware-Verkabelung.

Ich habe einen Arduino Uno, den ich als ISP-Programmer verwenden kann.
Wie ich damit Code auf einen anderen Arduino Uno hochlade wird ja in diversen Tutorials recht gut erklärt.
Das hab ich auch hingekriegt.
Aber wie sieht die Verkabelung aus, wenn ich mit dem Uno Code auf den Mega hochladen möchte?
Geht das überhaupt?
Meine Theorie wäre folgende gewesen:

Wenn Uno1 programmiert wird, dann muss ich ja dessen Pin 13 mit dem Pin 13(SCK) von Uno2(Uno der als ISP fungiert) verbinden.
Der SCK Pin ist beim Mega ja aber nicht Pin 13, sondern Pin 52.
Wenn ich also mit meinem Uno den Mega programmieren möchte, dann wäre es ja logisch, wenn ich Pin 13 vom Uno mit Pin 52 vom Mega verbinde....

Wenn ich das selbe mit den anderen Pins mache, dann komme ich auf folgende Verkabelung:

Arduino Uno als ISP Arduino Mega 2560 der programmiert werden soll

Pin 13 Pin 52
Pin 12 Pin 50
Pin 11 Pin 51
Pin10 Reset
5V 5V
GND GND

Stimmt das so?

Funktioniert hat es jedenfalls nicht, aber ich hab natürlich auch keine Ahnung, ob das so generell nicht geht oder es immer noch am Watchdog liegt...

Mit dem ISP-Sketch auf dem Arduino UNO kannst Du den ATmega2560 auf dem MEGA programmieren. Die 2x3 Pfosten sind gleich anzuschließen. Ich kann Dir aber nicht sagen ob der Watchdog nicht dazwischenfunkt.
Grüße Uwe

Epijano:
Stimmt das so?

Funktioniert hat es jedenfalls nicht, aber ich hab natürlich auch keine Ahnung, ob das so generell nicht geht oder es immer noch am Watchdog liegt...

Generell müßte es wohl so funktionieren. Allerdings hast Du auf dem MEGA ja immer noch den fehlerhaften Sketch auf dem MEGA2560 drauf, und wenn der MEGA Strom bekommt, dann läuft erst sein Bootloader und danach aktiviert der fehlerhafte Sketch wieder den Watchdog-Reset, der ab dem Zeitpunkt aktiv ist und in einer Endlos-Reset-Schleife immer wieder zuschlägt und auch beim Reset nicht mehr deaktiviert wird.

Auf welche Tmeout-Zeit hast Du denn den Watchdog-Reset programmiert? Acht Sekunden? Oder weniger?

Wenn Du keinen richtigen ISP-Programmer hast und wenn ich es mir recht überlege, müßtest Du mit einem manuellen Reset eigentlich auch mit Hilfe des Bootloaders und des USB-Kabels in der Lage sein, einen neuen, fehlerfreien Sketch hochzuladen. Z.B. den Blink-Beispielsketch.

Hintergrund: Soweit mir bekannt ist, startet der Atmega beim Power-On ohne aktivierten Watchdog, und wenn danach der Watchdog-Reset programmiert ist, bleibt dieser bis zum Entfernen der Stromversorgung aktiv, übersteht also Resets.

Eigentlich müßtest Du jetzt nur folgende zwei Dinge machen:

  1. das MEGA-Board mit Strom versorgen, OHNE dass der Controller startet
  2. dafür sorgen, dass beim anschließenden ERSTEN START des Controllers sofort über den Bootloader ein neuer Sketch geladen wird

Das Handling dafür wäre wie folgt. Vorab würde ich unter Windows die Tonausgabe aktivieren, so dass man es akustisch hört, wenn Windows ein angestöpseltes USB-Gerät entfernt oder eingestöpselt bekommt.

  1. USB-Kabel vom MEGA2560 Board entfernen (Board stromlos machen)
  2. Reset-Taster auf dem MEGA-Board drücken und gedrückt halten
  3. USB-Kabel einstöpseln und warten, bis die serielle Schnittstelle von Windows erkannt wird (Ton!)
    (Der gedrückte Reset-Button auf dem Board verhindert, dass der Controller startet)
  4. Aus der Arduino-Software heraus den Sketch-Upload starten (z.B. Blink-Sketch)
  5. Sobald die Arduino-Software "Uploaden..." anzeigt, blitzartig den Reset-Button loslassen

Falls es nicht auf Anhieb klappt, ggf. diese Schritte mehrmals wiederholen.

Funktioniert der Upload auf diese Art?
Wenn ja: Ist das Board danach normal benutzbar?

Hab endlich Zeit gefunden deine Vorschläge auszuprobieren...

Wenn der Fehler auch mit einem aktuellen MEGA-Bootloader nicht beseitigt werden kann:
Schreibe Dir einen kurzen eigenen Sketch, der sofort im setup() den Watchdog deaktiviert und lade diesen Sketch mit dem ISP-Programmer hoch!

So?

#include <avr/wdt.h>

void setup()
{
  #define wdt_disable(); 	
  pinMode(2,OUTPUT);
  Serial.begin(9600); 
}

void loop()
{
  Serial.println("Test"); 
  digitalWrite(2,HIGH);
  delay(1000);
  digitalWrite(2,LOW);
  delay(1000);
}

Hat leider nicht funktioniert.
Da bekomme ich die Selbe Fehlermeldung wie wenn ich den Mega ganz normal anschließe...

Auf welche Tmeout-Zeit hast Du denn den Watchdog-Reset programmiert? Acht Sekunden? Oder weniger?

Auf zwei Sekunden.
Allerdings muss der Code bevor der Watchdog aktiviert wird erst noch durch einige delays durch.
Hier nochmal der Code, der die Probleme verursacht hat:

#include <avr/wdt.h>

void setup()
{
  Serial.begin(9600);
 
  Serial.println('A');
  delay(300);
  
  Serial.println('B');
  delay(300);
  
  Serial.println('C');
  delay(300);
  
  Serial.println('D');
  delay(300);
  
  Serial.println('E');
  delay(300);
  
  Serial.println('F');
  delay(300);
  
  Serial.println('G');
  delay(300);
  
  Serial.println('H');
  delay(300);
  
  Serial.println('I');
  delay(300);
  
  Serial.println('J');
  delay(300);
  
  Serial.println('K');
  delay(300);
  
  wdt_enable(WDTO_2S);
}

void loop()
{
  
}

11 mal 0,3 plus 2 Sekunden.
Das wären insgesamt mindestens 5,3 Sekunden bevor der Reset ausgelöst wird...

Trotzdem hat auch das mit dem Reset Taster drücken nicht geklappt. :disappointed_relieved:

Was mir allerdings aufgefallen ist:
Wenn der Code mit dem Watchdog immer noch auf dem Arduino ist, dann müsste die TX-Led nach dem einschalten ja eigentlich einige Male kurz blitzen...
Tut sie aber nicht.

Ich werd aus meinem Board einfach nicht schlau...

Du solltest dir mal anschauen was #define genau macht

wdt_disable() ist ein Assembler Makro. Aber es wird genau wie jede andere Funktion auch aufgerufen:

wdt_disable();

Auf der AVR libc Seite steht auch mehr dazu:
http://www.nongnu.org/avr-libc/user-manual/group__avr__watchdog.html

Note that for newer devices (ATmega88 and newer, effectively any AVR that has the option to also generate interrupts), the watchdog timer remains active even after a system reset (except a power-on condition), using the fastest prescaler value (approximately 15 ms). It is therefore required to turn off the watchdog early during program startup, the datasheet recommends a sequence like the following:

uint8_t mcusr_mirror attribute ((section (".noinit")));

void get_mcusr(void)
attribute((naked))
attribute((section(".init3")));
void get_mcusr(void)
{
mcusr_mirror = MCUSR;
MCUSR = 0;
wdt_disable();
}

Epijano:
Trotzdem hat auch das mit dem Reset Taster drücken nicht geklappt. :disappointed_relieved:

Gerade mal getestet: Wenn Du das Board mit einem 2s-Watchdog gebrickt hast kannst Du exakt auf die von mir in Reply #5 beschriebene Art wieder einen neuen Sketch hochladen.

Aber wie Serenifly schon schrieb: Das "#define" mußt Du in Deinem Quelltext weglassen, das hat dort nichts verloren!
Nur:

  wdt_disable();

muß vorne in der setup-Funktion stehen.
Und wenn die Board-LED blinken soll, die sitzt auch beim MEGA an Pin-13 (und nicht an Pin-2).

Du solltest dir mal anschauen was #define genau macht

wdt_disable() ist ein Assembler Makro. Aber es wird genau wie jede andere Funktion auch aufgerufen:
Code:

wdt_disable();

Verdammt, das kommt davon wenn man alles ohne nachzudenken kopiert...

Ich bekomm den Code aber immer noch nicht auf das Board...

Aber frag mich nicht, warum es bei dir dan funktioniert.

Ich binn mir ganz sicher, dass der Arduino ab da wo ich den Code mit dem Watchdog timer hochgeladen habe nicht mehr neu beschreibbar war...