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:Wenn 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?
Wenn Sie die Taste gedrückt halten und das Mikro die ON/OFF
Leitung niedrig treibt, gibt es einen niederohmigen Pfad direkt von der Batterie durch die I/O-Schutzdioden am SENSE
Pin des Mikros zu seinem Strombus – das ist eine sehr schlechte Sache . Es gibt ON/OFF
auch 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"?
Tony Stewart EE75
FiddyOhm
jonk
Janka
Edesign