ATmega64 muss nach dem Einschalten zurückgesetzt werden

Ich verwende einen ATmega64A für mein Projekt mit ESP8266 und RFM75. Aber der ATmega64 hängt beim Einschalten und ich muss den Reset auf Low ziehen, damit mein Code funktioniert. Ich verwende einen externen 8-MHz-Quarz.

Ich habe alle VCC- und GND-Pins ordnungsgemäß mit 0,1-µF-Kondensatoren an jedem VCC-PIN verbunden. Der RESET-Pin wird mit 10-kΩ-Widerständen hochgezogen und 10-µF-Kondensatoren werden zwischen RESET und GND geschaltet (ich habe auch 0,1-µF-Kondensatoren ausprobiert).

Ich brauche eine Art Hilfe, um aus diesem Problem herauszukommen. Alle Kommentare oder Vorschläge werden geschätzt.

EDIT 1: Mein Schaltplan hier angehängt.ATmega64-Schema.

Ich habe den Spannungspegel am RESET PIN im eingeschalteten Zustand gemessen.

RESET PIN-Spannung beim Einschalten. RESET PIN-Spannung beim Einschalten

BEARBEITEN 2 : Nur der LED-Blinkcode funktioniert gut auf derselben Hardware. Ich habe dies so oft überprüft, indem ich die Versorgung ein- und ausgeschaltet habe. Ich denke, Code hat einige Probleme. Ich versuche es herauszufinden.

BEARBEITEN 2: Ich habe beim Start einen einfachen LED-Blinkcode angezeigt, bevor ich die ESP8266- oder RFM-Initialisierung starte. Ich habe auch eine Debug-Option in meinem Code. Als Debug-Terminal wird ATmega64 UART1 verwendet. Ich habe versucht, die LED vor der Debug-Initialisierung zu blinken. Led Blinking funktioniert wie ein Zauber! Ich habe eine Funktion im Debug-Terminal, um beim Start ein Banner zu drucken. Es gibt Datum, Uhrzeit der Kompilier- und Neustartursachen sowie eine Codeversion aus. Als ich die Funktion kommentiert habe, funktioniert mein Code einwandfrei. Ich habe viele Male auf verschiedenen Boards getestet, bis das Problem dann verschwunden ist. hier die funktion die ich entfernt habe.

    static void PrintBanner(void)
{
    unsigned char status = MCUCSR;
    unsigned char moreThanOne = 0;

    printf_P(PSTR(CMD_LINE_MSG_WELCOME));
    printf_P(PSTR("Firmware: v%S [Compiled on "__DATE__" "__TIME__"]\r\nBoot cause: "), PSTR(APP_VERSION));

    if(status & (1 << PORF))
    {
        printf_P(PSTR("Power On"));
        MCUCSR &= ~(1 << PORF);
        moreThanOne = 1;
    }
    if(status & (1 << EXTRF))
    {
        if(moreThanOne)
            printf_P(PSTR(", "));
        printf_P(PSTR("External"));
        MCUCSR &= ~(1 << EXTRF);
        moreThanOne = 1;
    }
    if(status & (1 << BORF))
    {
        if(moreThanOne)
            printf_P(PSTR(", "));
        printf_P(PSTR("Brown-out"));
        MCUCSR &= ~(1 << BORF);
        moreThanOne = 1;
    }
    if(status & (1 << WDRF))
    {
        if(moreThanOne)
            printf_P(PSTR(", "));
        printf_P(PSTR("Watchdog"));
        MCUCSR &= ~(1 << WDRF);
        moreThanOne = 1;
    }
    if(status & (1 << JTRF))
    {
        if(moreThanOne)
            printf_P(PSTR(", "));
        printf_P(PSTR("JTAG"));
        MCUCSR &= ~(1 << JTRF);
        moreThanOne = 1;
    }

    printf_P(PSTR(" Reset.\r\n"));
}

Was wäre die Ursache für das RESET-Problem des ATmega64 mit diesem Codestück? Liegt es daran, dass Daten aus dem Programmspeicher abgerufen werden, um über UART zu drucken? Trotzdem versuche ich, der Ursache für dieses Problem auf den Grund zu gehen. Wenn jemand eine Ahnung davon hat, werfen Sie bitte etwas Licht darauf. Danke.

Es wäre hilfreich, einen Teil Ihres Setup-Codes oder zumindest eine Übersicht zu sehen. Es hört sich so an, als würde Ihr Code während des Starts in einen unerwarteten Zustand geraten. Die schnelle und schmutzige (und nicht empfohlene) Lösung könnte darin bestehen, die MCU-Schleife (leer für Schleife) beim Start einige tausend Mal zu haben, um zu warten, bis sich alles stabilisiert hat.
Taher - Ich kann mir ein paar mögliche Hardware-bezogene Ursachen für dieses Verhalten vorstellen. Um diese potenziellen Ursachen jedoch effizient zu berücksichtigen, müssten Sie (a) einen vollständigen, korrekten Schaltplan und Fotos der Hardware bereitstellen; (b) Listen Sie auf, welche Testausrüstung Sie zur Verfügung haben, z. B. Oszilloskop? Oder nur DMM? (c) Erläutern Sie die Geschichte des Designs, z. B. hat ein früherer Prototyp funktioniert? Wenn ja, was hat sich seit diesem Design geändert? (d) Erklären Sie, welche Fehlerbehebung Sie bisher durchgeführt haben. Haben Sie beispielsweise versucht, nur ein einfaches "Blink-LED" -Programm in der MCU auszuführen und alles andere von der MCU zu trennen?
Es ist sehr wahrscheinlich, dass Ihre Stromversorgung zu langsam ansteigt. Sie können einen Supply Supervisor (Brownout-Detektor) wie den MAX809 ( onsemi.com/pub/Collateral/MAX809S-D.PDF ) hinzufügen, um einen konsistenten Start zu gewährleisten. Bei diesen frühen ATMegas wurde der POR auf nur etwa 1,5 V eingestellt (im Gegensatz zu BOD auf 2,5 V eingestellt). Wenn die Stromversorgung dann langsam von diesem Pegel ansteigt, ist es möglich, dass die Startverzögerung zu kurz ist und der Prozessor hängt.
@Jack - Einverstanden (+1), dies ist eines der potenziellen Probleme, die ich in Betracht gezogen habe, und deshalb habe ich nach der Verfügbarkeit eines Oszilloskops gefragt, um die Anstiegszeit der Stromversorgung zu messen. Wenn das OP den Verlauf der von mir angeforderten Ereignisse offenbart, enthält es möglicherweise auch relevante Datenpunkte (z. B. funktionierte ein früherer Prototyp mit einer anderen Stromversorgung). Hoffen wir, dass das OP mit einigen Updates und Daten antwortet ...
@SamGibson: a) Sicher, ich werde einen vollständigen Schaltplan bereitstellen, im Moment kann ich das nicht. b) Ich habe hier DMM, DSO, Oszilloskop zur Verfügung. c) Ja, frühere Prototypen haben gut funktioniert. Zu dieser Zeit lief die CPU mit 5 V, jetzt läuft die CPU mit 3 V3. das ist die einzige Änderung. Ich habe keine Komponenten oder Schaltpläne geändert, aber das PCB-Design in späteren Prototypen. auch dieses RESET-Problem, bei neuen Prototypen, sehr oft beobachtet. Manchmal funktioniert es richtig, manchmal muss es extern zurückgesetzt werden.
@SamGibson: d) Ich habe gerade Crystal hinzugefügt und Fuse-Bits geändert und Kondensatoren und RESET-Kondensatoren entkoppelt. Ich habe keinen anderen Code auf Hardware wie Blink LED getestet, werde das aber tun und bald aktualisieren.
@JackCreasey: Ich bitte um Entschuldigung, aber kannst du mir das bitte besser erklären?
Beim ATMega gibt es zwei sehr wichtige Reset-Bedingungen ... die durch Power-on-Reset (Vpot) eingestellten, die bei steigender Spannung etwa 1,4 V betragen ... wenn über diesem Schwellenwert das Power-on-Timing (t(TOUT)) läuft . Die Prozessor-VCC muss jedoch mindestens 2,5 V beim '64L und 3,6 V beim '64 betragen. Wenn VCC unter diesen Werten liegt, läuft der Prozessor möglicherweise nicht ... er kann hängen bleiben. LESEN Sie das Datenblatt um Tabelle 19 Reset-Eigenschaften für weitere Details ... und insbesondere Hinweis 2. ... wenn Ihre Versorgung nicht schnell genug ansteigt, können Sie beim Einschalten hängen bleiben.
@JackCreasey Vielen Dank, werde mir das ansehen und hierher zurückkommen.
@TaherKawantwala - Danke. Obwohl diesen Antworten einige Informationen fehlten (so dass ich die feinen Details nicht vollständig verstanden habe), lautet eine kurze Analyse, dass Sie eine nahezu ideale Fehlerbehebungssituation haben: Der vorherige Prototyp hat funktioniert, aber dieser hat Ihr Symptom „muss häufig manuell zurückgesetzt werden“. Daher können Sie die funktionierenden und fehlerhaften Boards vergleichen, um die Fehler zu finden, die im aktualisierten Design verursacht wurden. Sie sagten "Ich habe keine Komponenten geändert", aber Ihre anderen Kommentare besagen, dass Sie dies getan haben. Wie auch immer, wenn Ihre Arbeit mit Jack nicht erfolgreich ist, gibt es Techniken zur Fehlerbehebung, die angewendet werden können. Viel Glück!
Versuchen Sie, den Reset-Kondensator und den Widerstand vollständig aus dem Stromkreis zu entfernen. Wenn der Reset-Pin schwebend gelassen wird, führt dies zu POR ohne Einfluss (und sollte eine unterstützte Konfiguration sein). Der Reset-Pin hat einen internen Pull-up von 30-60 kOhm.
@Anonymous Ich habe Cap und RES von einer RESET-PIN entfernt, das Problem ist immer noch da. Es funktioniert irgendwann, aber manchmal muss ich RESET LOW ziehen, damit der Mikrocontroller läuft.
Taher, dann können Sie sich dafür entscheiden, den Leistungsübergang beim Einschalten des Geräts zu messen, und wenn Sie dort nichts Besonderes finden, wenden Sie sich an den Atmel-Support. Interessanterweise sehe ich nicht, wie ich ein Support-Ticket bei ihnen eröffnen soll. Wenn ich ein Entwickler wäre, wäre dies einer der größten Showstopper bei der Verwendung ihrer Produkte. Wahrscheinlich müssen Sie sich bei "my Atmel" anmelden, um Support-Tickets erstellen zu können.
Haben Sie eine serielle Verbindung oder etwas anderes, das vor dem Einschalten ein Signal an einen E / A-Pin anlegt? So etwas kann einen Prozessor durch die Schutzdioden teilweise mit Strom versorgen und dazu führen, dass das Einschalten nicht wirklich ein echtes Einschalten ist.
Hast du die Brown-Out-Level-Sicherung gewechselt? Wenn es auf 4 V eingestellt ist, verursacht es immer noch Probleme.

Antworten (1)

Einige Hinweise:

  1. AVRs haben Startverzögerungssicherungen für die Uhr (SUT1/SUT0 für ATmega64) – prüfen Sie, ob das Problem bei unterschiedlichen Einstellungen der Startverzögerung auftritt.

  2. Verwenden Sie die Brownout-Erkennung (auch eine Sicherungseinstellung).

  3. Versuchen Sie, am Anfang eine Busy-Wait-Schleife hinzuzufügen.