ATmega1284 läuft sehr langsam, bis er neu geflasht wird

Wenn ich meinen ATmega1284 einschalte, wird er extrem langsam ausgeführt – wahrscheinlich weniger als ein Zehntel seiner normalen Geschwindigkeit, gemessen an den zyklischen LEDs, die er betreibt. Es ist so konfiguriert, dass es den internen Oszillator ohne Teiler verwendet, und ich habe bestätigt, dass CKOUT einen 8-MHz-Takt liefert.

Zurücksetzen hilft nicht, aber wenn ich es ISP mache (nur flashen, nicht Sicherungen), läuft es plötzlich wieder mit voller Geschwindigkeit. lfuse ist 0xA2 (interner RC-Oszillator, kein Teiler).

Was ist die wahrscheinliche Ursache dafür? Was soll ich noch testen?

erst nach dem einschalten? Und einmal geflasht läuft es OK, bis Sie aus- und wieder einschalten? Ist es das, was Sie sagen?
Ich habe es jetzt ein paar Mal aus- und wieder eingeschaltet und es kommt mit der richtigen Geschwindigkeit zurück. Vielleicht ist es also das erste Einschalten, nachdem es eine Weile ausgeschaltet war. Ich schalte es mal kurz aus und schaue, ob es einen Unterschied macht.
Haben Sie dieses Problem gelöst? Ich frage mich, was das Problem war.
Ich hab nicht. Ich konnte es nicht zuverlässig reproduzieren, was das Testen etwas schwierig macht.

Antworten (1)

Hier ist eine Checkliste mit einigen Dingen, die helfen könnten, das Problem weiter aufzuspüren:

  • Wenn Sie Interrupts jeglicher Art verwenden, stellen Sie sicher, dass die zugehörigen E / A-Leitungen immer in einem stabilen Zustand gehalten werden. Wenn Sie beispielsweise einen Taster ohne Pull-up/down angeschlossen haben, können externe Faktoren dazu führen, dass er schwingt. Die scheinbare Langsamkeit kann daran liegen, dass der Prozessor seine ganze Zeit damit verbringt, Interrupts zu bedienen.

  • Stellen Sie sicher, dass geeignete Entkopplungskondensatoren vorhanden sind. Während dies unwahrscheinlich erscheinen mag, weil die Programmierung zu löschen scheint, kann es sich auch um einen Oszillatorzustand handeln, der durch physisches Bewegen oder Anlegen einer externen Spannungsquelle während des Programmierens gelöscht wird.

  • Überprüfen Sie, ob Sie im Allgemeinen alles innerhalb der Spezifikation ausführen. Wenn Sie sich beispielsweise mit LEDs befassen, sehen Sie unten auf Seite 324 des ATmega1284-Datenblatts , dass bestimmte Gruppen von E / A-Pins eine Gesamtstrombegrenzung von 100 mA haben.

  • Sie haben erwähnt, dass das Problem schwer zu wiederholen ist. Es kann sich lohnen, die Umgebungsbedingungen wie Temperatur, Mobiltelefone in der Nähe usw. zum Zeitpunkt des Auftretens zu notieren. Überprüfen Sie bei batteriebetriebenen Schaltungen möglicherweise die Batteriespannung zu diesem Zeitpunkt, bei netzbetriebenen Schaltungen denken Sie an Dinge wie Klimaanlagen, die die Stromqualität beeinträchtigen könnten.

  • Wenn Sie nur ein einziges Gerät hergestellt haben, kann es sich lohnen, ein zweites System zu bauen, falls Sie zufällig auf eine schlechte Komponente stoßen oder während der Montage / Entwicklung etwas beschädigt haben. Wenn nicht, würde ich es zumindest mit einem anderen AVR versuchen.

  • Obwohl dies keine gute langfristige Lösung ist, könnten Sie vielleicht sehen, ob die Aktivierung des Watchdog-Timers das Problem löst, indem der langsame Programmbetrieb erkannt und zurückgesetzt wird.

  • Sie haben etwa zehnmal langsamer erwähnt. Vielleicht könnten Sie die Zeitschleifen stark verlangsamen, um eine erwartete Zykluszeit von beispielsweise 10 Sekunden zu erhalten. Dann können Sie die genaue Zeit mit einer Stoppuhr messen und erhalten eine genauere Vorstellung. Wenn es genau 8 Mal wäre, würde dies auf etwas Seltsames mit der CKDIV8Sicherung hindeuten. Es hört sich so an, als hätten Sie das durch Messen abgedeckt, CKOUTaber ich lasse es hier zugunsten aller anderen mit ähnlichen Problemen.