Mikrocontroller hängt beim Ausschalten

In meiner Anwendung habe ich den ESP8266-WLAN-Chip mit dem ATTiny828-Mikrocontroller verbunden. Wir haben unser benutzerdefiniertes Modul mit diesen beiden Chips darauf entwickelt. Das Problem, mit dem wir konfrontiert sind, ist, dass der Mikrocontroller manchmal beim Ausschalten des Moduls hängt. Die Taste ist ein Taster vom Typ „Push to On“, und die Ein-/Ausschaltfunktion wird mit der folgenden Schaltung implementiert:Strom EIN/AUS-SchaltungWenn der Schalter gedrückt wird, schaltet sich der npn-Transistor ein, wodurch PMOS Strom leitet und die gesamte Einheit einschaltet. Sobald der Mikrocontroller gestartet wird, versetzt er den ON / OFF-Pin in einen dauerhaften HIGH-Zustand (um das Gerät eingeschaltet zu halten, nachdem der Schalter losgelassen wurde). Der "SENSE"-Pin des Mikrocontrollers erfasst den Zustand des Schalters (Pin-Wechsel-Interrupts sind an diesem Pin aktiv). Wenn also der Schalter länger als eine vorprogrammierte Zeitspanne gedrückt wird, schaltet der Mikrocontroller den ON / OFF-Pin auf Null, wodurch das Modul ausgeschaltet wird.

Wir haben in der Software für die Entprellung gesorgt, indem wir eine Verzögerung von 100 ms hinzugefügt haben. Hier ist unser Code

// PW pin is same as "SENSE" pin
ISR(PCINT0_vect) {
    static uint8_t tmr_pw_start = 0; 
    static uint8_t PW_prev = 1, GP2_prev = 1;

    uint8_t const PW = READ(PW);
    uint8_t const GP2 = READ(GPIO2);

    if (PW != PW_prev) {
        if (PW) {               // Start measuring button press time
            tmr_pw_start = 1;
            ovf0 = 0;
        } else if(tmr_pw_start){ 
            if (ovf0 > 60) {                            
                WRITE(On_off_pin, LOW);     // POWER OFF
                _delay_ms(100); 
            }            
            tmr_pw_start = 0;
        }
    }

    if (GP2 != GP2_prev) {
        TOGGLE(BLUE_LED);
    }
    PW_prev = PW;
    GP2_prev = GP2;
}

ISR(TIMER0_OVF_vect, ISR_NOBLOCK) {
    ovf0++;
    if(!(ovf0 % 16))    TOGGLE(GREEN_LED);
}

Wir lassen Timer 0 immer laufen und seine Anzahl von Überläufen wird verwendet, um die verstrichene Zeit zu messen. es dauert ca. 32 ms für einen Überlauf.

Abgesehen davon sind auch UART-Interrupts aktiv, bei denen es nur die Daten nimmt und sie einer globalen Variablen zuweist.

Das Problem ist folgendes: Wenn Sie den EIN/AUS-Schalter länger als 2 Sekunden drücken und dann loslassen, sollte das Gerät ausgeschaltet werden, was die meiste Zeit der Fall ist. Aber in 1 von 15 Fällen hängt der Mikrocontroller beim Ausschalten. Es reagiert nicht mehr auf Tastendruck und die LEDs hören auf zu blinken. Oder manchmal reagiert es nicht mehr und die GRÜNE LED blinkt immer noch.

Kann jemand erraten, was das Problem sein kann?

Keine Ahnung, aber ändern Sie 100 ms auf 10 ms und sehen Sie, ob sich die Wahrscheinlichkeit um 1/15 ändert ... die meisten momentanen Schalter sind <1 ms, es sei denn, sie sind wirklich flockig
Ich kann raten, weil ich dieses Problem schon einmal bei anderen Prozessoren gesehen habe. Das Problem, das Sie haben, kann durch eine Reihe von Problemen verursacht werden. Am häufigsten fällt die Spannung zum Prozessor ab, nachdem Sie den Regler abgeschaltet haben. Es muss eine messerscharfe Abschaltung sein, oder der Prozessor wird sich auf dem Weg nach unten "fehlverhalten" und das EIN/AUS-Signal wieder auf EIN setzen. Es gibt eine Reihe anderer Probleme, die ich nicht erraten könnte, ohne Ihren vollständigen Schaltplan zu sehen. Beginnen Sie damit, sich „Snap-on-Snap-off“-Spannungsregler anzusehen (falls sie noch von National Semi oder ihren Erben hergestellt werden).
Was ist die Spannung des ATTiny828 und ESP8266? Post-Regulator, meine ich. Sind das 3,3V? Außerdem liest es sich so, als ob Sie sich auf den ATTiny und nicht auf den ESP8266 konzentrieren. Haben Sie versucht, den ESP8266 einfach aus der Schaltung zu ziehen und sich über die ATTiny-Funktionalität zu informieren, ohne dass er vorhanden ist?
Warum den ATtiny überhaupt hinter den Netzschalter stecken? Im Power-Down-Modus werden typischerweise 100 nA benötigt.
Was ist der Typ von ovf0? Besteht die Möglichkeit, dass es überläuft, wenn Sie die Taste zu lange drücken? Wenn ja, würde das dazu führen, dass das Mikro beim Loslassen nicht stoppt, da die Bedingung (ovf0 > 60) falsch wäre.

Antworten (1)

Wenn Sie die Taste gedrückt halten und das Mikro die ON/OFFLeitung niedrig treibt, gibt es einen niederohmigen Pfad direkt von der Batterie durch die I/O-Schutzdioden am SENSEPin des Mikros zu seinem Strombus – das ist eine sehr schlechte Sache . Es gibt ON/OFFauch einen anderen Weg durch Ihre externe Diode und den Pin.

Zumindest sollten Sie einen Widerstand in Reihe mit jeder der I/O-Leitungen haben, um den Strom zu begrenzen, der unter dieser Bedingung fließen kann. Aber das Mikro kann möglicherweise immer noch mit dieser geringen Strommenge weiterlaufen, sodass Sie Ihr Design auch auf andere Weise erweitern müssen.

Die direkteste Lösung wäre wahrscheinlich, das Mikro auf die "immer eingeschaltete" Seite des Schalters zu stellen und es einfach in einen "Schlaf" -Modus mit geringem Stromverbrauch zu versetzen, wenn das System ausgeschaltet sein soll. Dies würde tatsächlich die erforderliche externe Schaltung vereinfachen.


EDIT: Nachdem ich ein bisschen mehr darüber nachgedacht hatte, wurde mir klar, dass Sie die Transistoren erst ausschalten, nachdem die Taste losgelassen wurde. Das oben beschriebene Problem ist also nur ein Problem, wenn die Taste beim Loslassen springt - aber wenn es so ist tut, wird das System sofort wieder hochfahren oder in einem halb eingeschalteten Zustand hängen bleiben.

Ist es ein Schnappknopf oder etwas "weicheres"?

Da war ich unterwegs. Gut!