Forum: Mikrocontroller und Digitale Elektronik Atmega: Watchdog killt uC??


von Kogel R. (Gast)


Lesenswert?

Hallo,

kleines Problem: kann einen Atmega 128 nicht mehr über SPI flashen.

Vermutung:
Habe Watchdog auf kürzeste Zeit gestellt. Watchdog Reset schlägt zu,
leider funktioniert die WD disable routine nicht...
-> alle 13ms gibt es einen reset des µC

-> neu flashen geht nicht mehr (habe auch SW ohne watchdog versucht,
die vorher lief und auf anderem Board läuft)

-> atmega macht immer noch resets nach 13ms (sehe ich an Port-Signalen
aufm Osci)

Fragen:
Kann es sein, dass er sich den Watchdog-enable Zustand im
nichtflüchtigen Speicher merkt? (Habe natürlich schon spannungslos
geschaltet. Habe aber nicht das WDTON fuse programmiert, d.h. initial
WD state disabled.)

Kann das SPI flashen von Watchdog gestört werden??

Oder habe ich durch irgend eine andere Ursache just gleichzeitig den uC
geschossen???

Hat da jemand Erfahrung? Ich will erstmal nicht noch ein zweites Board
zum Testen nehmen....

von Marco S. (masterof)


Lesenswert?

abo

von Jörn-H. G. (joern_g)


Lesenswert?

SPI flashen kannst du (abgesehen von Bugs beim Tiny13) nicht mit so
etwas disablen. Geflöashed wird ja durch und während eines Resets, bei
dem der Watchdog auch nicht mehr arbeitet.

Hast du mal probiert einfach per SPI den Chip zu erasen - das hilft bei
merkwürdigen Phänomenen manchmal.

Wenn nicht einmal das geht, dann musst du mal deinen Programmer prüfen,
also mit Oszi (hast du ja) MISO, MOSI und CLK angucken, ob die Signale
alle da sind und gut aussehen.

Wenn kein Clock, dann den von aussen zuführen (Suche benutzen im
Forum).

Wenn Clock und MOSI da, aber keine MISO, dann ...??

Den Reset hast du nicht zufällig disabled per Fuses?

ISP auch nicht?

cu joern

von Laeubi (Gast)


Lesenswert?

versuch mal den reset Manuell auf GND zu ziehen!
Das hat mir schon manchmal geholfen wenn der AVR nicht mehr wollte (ich
hatte das problem bereits so 4 - 5 x keine Ahnung WAS das auslöst, aber
der Programmer sagt dan immer "Entering Programming Sequence failed")
mit manuellem auf GND ziehen ging es dann, hat vermutlich mit Spikes zu
tun durch schnelles schalten/reset sodass der Programmer Reset nicht
mehr sauber nach GND ziehen kann.

von Kogel R. (Gast)


Lesenswert?

Hallo,

danke für die Tipp's. Problem leider immer noch nicht gelöst...

Allerdings habe ich eine interessante Entdeckung gemacht. Die SW landet
sehr wohl im Flash des atmega.

Ich habe verschiedene Programme geflashed und über die download
funktion von usip wieder zurückgelesen. Tatsächlich sind die Programme
jeweils korrekt im Flash gelandet. Ausserdem kann ich anhand der Port
Pins auch sehen, dass ich andere SW geflashed habe.

Trotzdem macht der uC weiterhin alle ca. 13ms einen (scheinbar) reset.

Ich Versuche folgende Routine (mehr oder weniger aus dem Datasheet) zum
Watchdog disablen:

int main(void)                 // Main runs under the AvrX Stack
{
  // no interrupt shall occure between the next four lines
  MCUCSR &=0x80; // clear the reset source bits
  asm volatile ( "wdr" );  // reset watchdog timer
  WDTCR |= (_BV(WDCE) | _BV(WDE) );  // set both bits
  WDTCR = 0x00;  // clear WDE during next 4 cycles
}

Werde mir jetzt erstmal die Hardware genauer ansehen, ob ich noch was
anderes herausfinden kann was nicht mit dem WD zu tun hat...

von Laeubi (Gast)


Lesenswert?

Also ich glaub nicht das es mit dem WD zu tun hat...
Hast du nen Relais in deiner Schaltung? BOD aktiviert?
Hatte mal das problem das den Spannungseinbruch den ein Realis
verursachte beim Schalten meine AVR wegen aktivierter BOD reseten
lies.

Ich weiß jezt nicht genau, aber man kann irgenwie festellen was die
Resetquelle war (BOD, WD, PO) eventuell mal ne soft schreiben die je
nach Resetquelle eine Pin high sezt dann wiest du wenigstens shconmal
was die Quelle ist.
Ansonsten würde ich fast auf einen kurzschluss tippen.. hast du den
Chip mal erased?

von Kogel R. (Gast)


Lesenswert?

Es ist zum heulen, habe gerade mal diesen Code runtergeladen, Port
klappert sehr schnell (externer 16-MHz Oscillator läuft) aber nur 13ms
danach kurze Unterbrechung und wieder von vorne. Kein Relais oder
andere Lasten, kein Timer nichts....

Da ich irgendwie nicht an den WD glauben kann, muss wohl doch ein Chip
defekt vorliegen, aber ein sehr merkwürdiger :-( (Versorgung ist
einwandfrei, externer Reset konstant high)

int main(void)
{
  WDTCR=0x07;

    // init LED output
    DDRD |= (_BV(PD6) | _BV(PD7));
    PORTD &= ~_BV(PD6);  // LED off at start
    PORTD &= ~_BV(PD7);  // LED off at start

  while(1)
  {
    PORTD |= _BV(PD7);  // LED off at start
    PORTD &= ~_BV(PD7);  // LED off at start
  }
}

von Kogel R. (Gast)


Lesenswert?

Er läuft wieder....

Irgendwie muss die WDTON fuse gekippt sein (habe sie nie programmiert,
eine entspr. Sequenz steht gar nicht im makefile).

Interessant was so alles passieren kann...

Passiert das schon mal das sich fuses einfach so verändern? Evtl. durch
ESD da ich gerade recht viel mit der Platine gemacht habe? (ins Gehäuse
eingebaut und wieder ausgebaut)

von Ludwig W. (lordludwig)


Lesenswert?

durch ESD kann so etwas sehr leicht passieren, sei froh das dein chip
noch lebt!!!

von TravelRec. (Gast)


Lesenswert?

Was für einen Programmer benutzt Du?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.