Forum: Compiler & IDEs Interrupt und Sleep Mode


von Izoard (Gast)


Lesenswert?

Hi

Ich habe ein kleines Problem und zwar benötige ich 1 Taster, dieser hat
zwei Funktionen:

kurz drücken : variable raufzählen
lang drücken : in den Power down mode


Ich habe den Taster an den INT0 Pin angehängt.

Mein Problem:


Normalerweise ist der INT0 auf die pos. Flanke getriggert. Für das
Aufwachen aus dem Sleep Mode, muss ich ihn aber LOW Level Triggern.

Nun drücke ich den Taster lang, der sleep Mode (Power Down) wird
aufgerufen. Der Taster ist immer noch gedrückt und darum wird gerade
ein Low Level Interrupt ausgelöst und der uC erwacht wieder!


Weiss jemand, wie ich mein Problem lösen kann?

von Michael (Gast)


Lesenswert?

Tastenabfrage in den Timer-IRQ. Siehe auch diverse andere Postings hier
im Forum.

von Peter D. (peda)


Lesenswert?

Taste im Timerinterrupt entprellen und dann in der Hauptschleife vor der
Interruptfreigabe und dem Sleep warten, bis entprellter Zustand ==
Taste losgelassen.

Tasten können auch beim Loslassen prellen und dann würdest Du ohne
Entprellung sofort wieder aufwachen.


Peter

von Izoard (Gast)


Lesenswert?

Ach so, vielen Dank...

Eigentlich wollte ich, dass man den Taster drücken kann so lange man
will und er nach 2sec in den Sleep Mode gesetzt wird...

Jetzt muss ich ihn halt loslassen und erst dann wird der uC
abgeschaltet...

Geht halt nicht anders...


Noch eine Frage:


Wie kann ich ein Taster einlesen und dann ein Flag setzen, wenn er 0
ist?: Die funktion bit_is_clear gibt ja den Wert der Stelle zurück!
(sehe ich das richtig?)


FLAG Definition:
struct
{
    unsigned char taster_flag:1;
} x;

Taster einlesen:

x.taster_flag = bit_is_clear(PIND,2);

von Rahul (Gast)


Lesenswert?

mit "~" = Bitweise Negation...

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
Noch kein Account? Hier anmelden.