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....
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
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.
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...
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?
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 } }
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)
durch ESD kann so etwas sehr leicht passieren, sei froh das dein chip noch lebt!!!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.