Forum: Mikrocontroller und Digitale Elektronik ATiny im sleep mode durch eine von zwei Tasten aufwecken


von Mr.Burns (Gast)


Lesenswert?

Hallo,

ich brauche Hilfe bei der Realisierung folgender Schaltung.
Ich habe einen ATiny den ich in den Sleep Modus versetzen will.
Er soll möglichst wenig Strom verbrauchen, da er an einer C2032 
Knopfzelle betrieben werden soll.
U.a. habe ich zwei Tasten am ATiny. Wenn eine der beiden Tasten gedrückt 
wird dann soll der ATiny aufwachen, erkennen welche Taste gedrückt wurde 
und dementspechend eine Funktion ausführen.

Fragen:

1. Mit welcher Beschaltung kann ich zwei Taster an den 'WakeUp' 
Interrupt Pin und gleichzeitig an zwei Portpins hängen (zum auswerten 
welche gedrückt wurde)

2. Wie kann ich erkennen welche der Tasten gedrückt wurde? Ganz normal 
durch Einlesen an den Portpins? Geht das in der Interruptroutine oder 
dauert das Aufwachen evtl. zu lange so dass in der Interruptroutine 
nicht mehr erkannt werden kann welche Taste gedrückt wurde?

3. Kann ich im WakeUp-Interrupt auch gleich die Tasten entprellen?

Brauche da ein wenig Starthilfe, danke an Euch!

von Uwe (de0508)


Lesenswert?

Hallo,

Zu deinen Fragen:

1) Das was und wie steht in Dein Datenblatt deines AVR µC.
Dort steht in einer Tabelle  welcher Interrupt welchen Mode wieder 
"aufwachen" lässt. Ok ?

Das wissen wir leider nicht.

2) Nach dem Aufwachen und sperren der Tasterinterrupts,
wird in der Main wieder die INT. Entprellroutine mit ca. 10ms Zykluszeit 
gestartet.
Tritt ein Event Taste A oder B gedrückt auf, wird die entsprechende 
Funktion Event_A() oder Event_B() aufgerufen.

3) nein.

von Gerald G. (gerald_g)


Lesenswert?

Schlagworte die du suchst sind u.a. powerdown mode und pin change 
interrupt.

Was du vor hast ist mithilfe des GCC-AVR tutorials ( interrupt und 
sleepmodes) und des datenblattes in 10-15 Zeilen code zu bewerkstelligen

: Bearbeitet durch User
von Thomas E. (thomase)


Lesenswert?

Zuerst verräts du, um welchen Tiny es sich handelt.
Dann bringst du deine Schaltung ohne Sleep zum Laufen. Also das übliche 
Zeugs mit Taster entprellen und je nach Tastendruck Funktionen 
ausführen. Erst wenn alles läuft, wird der Sleep eingebaut.

Das Aufwecken geschieht dann mit Pinchange-Interrupt. Dann ist der 
Ablauf wie von Uwe beschrieben.

mfg.

von m.n. (Gast)


Lesenswert?


von Thomas E. (thomase)


Lesenswert?

m.n. schrieb:
> Oder so, auf zwei Tasten erweitert.
> Beitrag "EIN-AUS mit Taster per Interrupt, ATtiny25 o.ä."
Dieser Vollpfostenscheiss hat auch gerade noch gefehlt.

mfg.

von m.n. (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> Dieser Vollpfostenscheiss hat auch gerade noch gefehlt.

Ein in der Tat sehr sachliches Argument :-)

von Mr.Burns (Gast)


Lesenswert?

Hallo,

danke schonmal für die Antworten. Also ich denke es wird ein ATtiny85 
werden.

In dem Beitrag EIN-AUS... wird ja ellenlang diskutiert ob mit RC oder 
ohne usw. wie mache ich es denn nun richtig?
Wie schließe ich denn die Taster an den ATtiny85 Ports und an den Pin 
Change Interrupt Pin (ich nehme an PB0?) an? Schließlich müssen die 
Taster ja den Pin Change Interrupt auslösen und gleichzeitig einen 
Eingangs-Pin auf Low ziehen.
Gibt es eine schnelle Entprell-Routine? Ich brauche keine 
Taster-Lang/Taster-Kurz Auswertung sondern möchte nur einfaches Tasten 
also Kurzdrücken erkennen.

Danke nochmals!

von Thomas E. (thomase)


Lesenswert?

Mr.Burns schrieb:
> Hallo,
>
> danke schonmal für die Antworten. Also ich denke es wird ein ATtiny85
> werden.
>
> In dem Beitrag EIN-AUS... wird ja ellenlang diskutiert ob mit RC oder
> ohne usw. wie mache ich es denn nun richtig?
In Software. RC ist Murks.

Siehe auch:
Lothar Miller schrieb:
>> Um ein "bouncing" der Buttons zu verhindern, habe ich parallel zum
>> Taster einen 0.01uF Kondensator geschaltet.
> Das ist nur eine lange Schreibweise für "Murks".
> Wenn man einen uC hat, macht man die Entprellung in der Software.

> Wie schließe ich denn die Taster an den ATtiny85 Ports und an den Pin
> Change Interrupt Pin (ich nehme an PB0?) an? Schließlich müssen die
> Taster ja den Pin Change Interrupt auslösen und gleichzeitig einen
> Eingangs-Pin auf Low ziehen.
Es gibt nicht DEN Pinchange-Pin. Alle Pins können einen 
Pinchange-Interrupt auslösen. Die Pins, die den Interrupt auslösen 
sollen, werden in einer Maske eingestellt. Wird ein Taster betätigt, 
wird ein Interrupt ausgelöst. In der ISR, eine für den ganzen Port, 
schaltest du die Pinchange Interrupts ab, damit das eventuelle 
Prellfeuerwerk keine weiteren auslöst, landest im Hauptprogramm in der 
ersten Anweisung nach Sleep und das Programm arbeitet ganz normal weiter 
und fragt im Polling die Tasten ab. Du mußt nur dafür sorgen, daß der 
Controller nicht in den Sleep geht, bevor alles abgearbeitet ist.
Der Sleep wird ganz zuletzt eingebaut, wenn alles läuft.

Die Bezeichnungen im Datenblatt verwirren ein bisschen.
Die "ISR(PCINT0_vect)" wird bei allen Pinchange-Interrupts an diesem 
Port aufgerufen.
Bei größeren Controllern gehört PCINT0-vect zu PORTA, PCINT1_vect zu 
PORTB usw., unabhängig davon, daß die Pins an PORTA auch mit PCINT0, 
PCINT1 usw. bezeichnet werden.
Das hätte man sicherlich besser machen können.

> Gibt es eine schnelle Entprell-Routine? Ich brauche keine
> Taster-Lang/Taster-Kurz Auswertung sondern möchte nur einfaches Tasten
> also Kurzdrücken erkennen.
Nimm die Peda-Routine. Die ist hier State-of-the-Art.

mfg.

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Mr.Burns schrieb:

> 1. Mit welcher Beschaltung kann ich zwei Taster an den 'WakeUp'
> Interrupt Pin und gleichzeitig an zwei Portpins hängen (zum auswerten
> welche gedrückt wurde)

Einfach einen ATtiny nehmen, der durch alle Pins geweckt werden kann, 
dann stellt sich das Problem erst garnicht.

Falls das nicht möglich ist: "wired" OR/AND. Also im Wesentlichen zwei 
Dioden.

> 2. Wie kann ich erkennen welche der Tasten gedrückt wurde? Ganz normal
> durch Einlesen an den Portpins?
> Geht das in der Interruptroutine oder
> dauert das Aufwachen evtl. zu lange so dass in der Interruptroutine
> nicht mehr erkannt werden kann welche Taste gedrückt wurde?

Das wäre denkbar. Ebenfalls denkbar ist, daß die ISR gerade dann zum 
Zuge kommt, wenn der Kontakt gerade "weggeprellt" ist.

Beides umgehst du, wenn du, wie oben vorgeschlagen, einen PCINT-fähigen 
Tiny verwendest. Für einen der beiden Taster einen PCINT-Pin, für den 
anderen INTx. Schon löst sich das Problem in Wohlgefallen auf. Wird die 
PCINT-ISR beim Aufwachen durchlaufen, war's der Taster, der am PCINT-Pin 
angeschlossen ist, wird die INTx-ISR durchlaufen, war's der andere. Du 
brauchst also garkeinen Pin mehr nach dem Aufwachen abfragen.

> 3. Kann ich im WakeUp-Interrupt auch gleich die Tasten entprellen?

Und das entfällt dann ebenfalls, weil du die Weckquelle beim Aufwachen 
bereits kennst.

von m.n. (Gast)


Lesenswert?

Mr.Burns schrieb:
> In dem Beitrag EIN-AUS... wird ja ellenlang diskutiert ob mit RC oder
> ohne usw. wie mache ich es denn nun richtig?

Diese Diskussionen ergeben sich immer wieder, da einige Leute nur ein 
Verfahren kennen und zwanghaft auf dessen Anwendung bestehen. Die 
agressiven Reaktionen sprechen für sich.

> Wie schließe ich denn die Taster an den ATtiny85 Ports und an den Pin
> Change Interrupt Pin (ich nehme an PB0?) an? Schließlich müssen die
> Taster ja den Pin Change Interrupt auslösen und gleichzeitig einen
> Eingangs-Pin auf Low ziehen.

So, wie in der Schaltung an PB4 gezeigt. Sofern Du mit einer 3V 
Knopfzelle arbeitest, kann R1 entfallen und C1 direkt an PBx gelegt 
werden. Der Zustand des Pins wird im Programm erfaßt und ist beim 
Einschalten immer '0'.

> Gibt es eine schnelle Entprell-Routine? Ich brauche keine
> Taster-Lang/Taster-Kurz Auswertung sondern möchte nur einfaches Tasten
> also Kurzdrücken erkennen.

Eine schnelle Entprellroutine ist durch R2/C1 und den ATtiny schon 
gegeben. Die angehängten Bilder zeigen doch, dass in ca. 2,5ms der µC 
entprellt eingeschaltet ist. Wenn Dein Programm nur kurz auf die 
Tastendrücke reagieren muß, kann der µC nach 5ms schon wieder im 
Tiefschlaf liegen, was der Batterielebensdauer sehr zugute kommt. Mit 
regulären Entprellroutinen muß erst einmal ca. 50ms entprellt werden, 
bevor der µC das Einschalten als gültig erkannt hat.

Das 2.Schaltbild zeigt, wie man einen Eingang recht hochohmig ansteuern 
kann. Bei Batteriebetrieb kann daher auch ein blockierender Schalter die 
Batterie nicht zu schnell entladen.
Du mußt entscheiden, was Du brauchst!
Was soll es denn werden?

von Peter D. (peda)


Lesenswert?

m.n. schrieb:
> Mit
> regulären Entprellroutinen muß erst einmal ca. 50ms entprellt werden

Das ist Quatsch. Du kannst den Entprelltimer auf jede beliebige Zeit 
programmieren.

20..100ms haben sich allerdings als Optimum bewährt, zwischen 
Tasterqualität und sicherer Erkennung. Ein Mensch drückt typisch länger 
300ms, also ist noch reichlich Luft.
Man muß auch bedenken, das Taster mit zunehmendem Alter durch Ermüdung, 
Verschmutzung deutlich stärker prellen, als fabrikneue.

Und Du wirst ja nicht ständig auf den Tasten rumhämmern, daß 50ms einen 
nennenswerten Stromverbrauch bewirken.
Und falls doch, nimmste eben den Watchdogtimer zum Entprellen, da ist 
dann zwischen den Timerinterrupts Tiefschlaf mit etwa 30µA.

: Bearbeitet durch User
von m.n. (Gast)


Lesenswert?

Peter Dannegger schrieb:
> m.n. schrieb:
>> Mit
>> regulären Entprellroutinen muß erst einmal ca. 50ms entprellt werden
>
> Das ist Quatsch. Du kannst den Entprelltimer auf jede beliebige Zeit
> programmieren.

> 20..100ms haben sich allerdings als Optimum bewährt,

Mit Deinen 20-100ms liegst Du im Mittelwert bei 60ms. Meine 50ms sind 
Quatsch und Deine 60ms sind die Erlösung?
Lächerlich!

> Und falls doch, nimmste eben den Watchdogtimer zum Entprellen, da ist
> dann zwischen den Timerinterrupts Tiefschlaf mit etwa 30µA.

Warum soll man denn zusätzliche Programmkonstrukte einbauen, wenn ein 
RC-Glied von Hause aus schon beste Tiefpass-Eigenschaften aufweist?

@Mr.Burns
Sag am besten, wofür Du die Schaltung brauchst, dann kann man konkret 
entscheiden, was angebracht ist.

von chris (Gast)


Lesenswert?

m.n. schrieb:
> Warum soll man denn zusätzliche Programmkonstrukte einbauen, wenn ein
> RC-Glied von Hause aus schon beste Tiefpass-Eigenschaften aufweist?

Warum sollte man sich mit unnötiger Zusatzhardware rumschlagen, wenns in 
Software sowohl einfacher als auch besser geht?

von m.n. (Gast)


Lesenswert?

chris schrieb:
> Warum sollte man sich mit unnötiger Zusatzhardware rumschlagen, wenns in
> Software sowohl einfacher als auch besser geht?

Verstehe ich nicht, was Du meinst.

von Julian B. (julinho)


Lesenswert?

Wenn der Tiny nur auf den Tastendruck wartet, warum schaltest Du ihn 
nicht komplett aus und durch die Tasten ein, dann hast du Null 
Stromverbrauch.

von m.n. (Gast)


Lesenswert?

Zum einfachen Nachbau ein fertiges Programm mit Aufweckfunktion, 
Entprellung und Dekodierung für zwei Taster.
Beitrag "Re: EIN-AUS mit Taster per Interrupt, ATtiny25 o.ä."

von Mr.Burns (Gast)


Lesenswert?

Hallo,

oh mann ich wusste nicht, dass ich durch meine Frage hier fast einen 
Streit auslöse. Das war nicht meine Absicht.
Nunja ich bin nun eher verwirrt, der eine sagt RC ist murks weil 
Zusatzhardware der andere sagt das ist super mit RC weil Manns dann 
nicht in software machen muss.
Also ich weiß echt nicht wie ich nun es machen soll.
Was ich machen möchte? Also ich möchte mit einem ATtiny85 zwei 
batteriebetriebene Geräte gleichzeitig über den ATtiny bedienen. Welche 
Geräte das sind ist hier zweitrangig.
Ich möchte also durch einen Tastendruck am ATTiny an den beiden 
batteriebetriebenen Geräten eine Aktion auslösen, dies mache ich über 
Ausgagnsgpins des ATtiny und stellt in der Entwicklung / Programmierung 
kein Problem für mich dar, ich mache es über Optokoppler.
Mein Problem ist halt, dass ich möglichst wenig Strom verbrauchen 
möchte, damit die Batterie lange hält. Der ATtiny soll also möglichst 
immer schlafen. Nur wenn ich eine Taste drücke, soll er kurz aufwachen, 
eine Aktion ausführen und wieder einschlafen.
Die Geschichte mit den zwei Tastern dient für mich in erster Linie 
erstmal zum erlernen der WakeUp Funktion und der Programmierung der 
ATtinys.
In meiner finalen Schaltung habe ich dann aber ca. 10-12 Taster, da die 
batteriebetriebenen Geräte auch 10-12 Taster haben, die ich nun über den 
ATtiny antriggern möchte.
Für mich wäre es kein Problem ein zus. R/C Glied mit in die Schaltung 
einzubauen, wenn damit eine sicheres Aufwachen und Entprellung 
gewährleistet ist. Ist mir lieber, da ich die Interupts des ATtiny dann 
nicht mit Entprellen 'belasten' müsste.

Bin einwenig verwirrt...

von Peter D. (peda)


Lesenswert?

Die SW-Entprellung ist zuverlässig und einfach anzuwenden.
Den meisten Strom werden die Optokoppler verbrauchen.
Die µA des ATtiny13 kannst Du vernachlässigen.

von m.n. (Gast)


Lesenswert?

Mr.Burns schrieb:
> der andere sagt das ist super mit RC weil Manns dann
> nicht in software machen muss.

Es ist eine Kombination von Hard- und Software. Das RC-Glied sorgt 
entsprechend seiner Zeitkonstante für eine Vorfilterung, und die 
Software bringt die µC-interne Eingangshysterese auf immer VCC/2.

Mr.Burns schrieb:
> Bin einwenig verwirrt...

Hier ist es üblich, dass x-beliebige Leute nur substanzloses Geschreie 
ablassen. Ließ Dir die Beiträge noch einmal in Ruhe durch und beurteile 
das, was an Sachargumenten geliefert würde. Wenn oben über 'unnütze 
Zusatzhardware' lamentiert wird, bleibt eine Rückfrage unbeantwortet. 
Diese Leute darf man einfach nicht ernst nehmen.
Laß Dich nicht durch heiße Luft infizieren.

Mr.Burns schrieb:
> Fragen:
>
> 1. Mit welcher Beschaltung kann ich zwei Taster an den 'WakeUp'
> Interrupt Pin und gleichzeitig an zwei Portpins hängen (zum auswerten
> welche gedrückt wurde)
>
> 2. Wie kann ich erkennen welche der Tasten gedrückt wurde? Ganz normal
> durch Einlesen an den Portpins? Geht das in der Interruptroutine oder
> dauert das Aufwachen evtl. zu lange so dass in der Interruptroutine
> nicht mehr erkannt werden kann welche Taste gedrückt wurde?
>
> 3. Kann ich im WakeUp-Interrupt auch gleich die Tasten entprellen?

Mit Schaltung und Programm, die ich gestern in diesem Forum ergänzt 
habe, werden alle Deine Anforderungen voll erfüllt.
Anstatt zwei Ausgangspins zu togglen, kannst Du einfach andere Aktionen 
durchführen. Mache es einfach!

von Mr.Burns (Gast)


Lesenswert?

Hallo m.n.,

danke werde Deine Schaltung mal testen!

von m.n. (Gast)


Lesenswert?

Mr.Burns schrieb:
> Hallo m.n.,
>
> danke werde Deine Schaltung mal testen!

Das freut mich!
Schaltung + Programm hatte ich mit meinem Musteraufbau noch einmal 
durchgemessen.
Für niedrige Ruhestromaufnahme muß der Brown-Out-Detector ausgeschaltet 
bleiben. Andernfalls fließen schon ca. 18µA @ 3,3V.
Mit unbelasteten Ausgängen (ohne Meßspitzen vom Oszilloskope) liegt die 
Ruhestromaufnahme bei < 0,2µA. Bei einem gedrücktem Taster steigt diese 
auf < 4µA, was hauptsächlich durch den 1M Pullup-Widerstand 
hervorgerufen wird. Natürlich kann man auch die internen 
Pullup-Widerstände verwenden, die die Stromaufnahme bei gedrücktem 
Taster aber deutlich erhöhen.
Diese Werte wurden bei Raumtemperatur bzw. Raumfeuchtigkeit gemessen und 
können unter anderen Bedingungen natürlich auch höher ausfallen. Als 
'Hausnummer' taugen sie dennoch.

Beim Drücken oder Loslassen eines Tasters ist der µC < 300µs @ 8MHz 
aktiv und geht danach wieder in den Tiefschlaf.

Wenn Du letztlich insgesamt zwölf Taster verwenden möchtest, wäre es 
besser einen AVR zu nehmen, der hinreichend viele Eingangspins hat, zum 
Beispiel ein ATtiny2313/4313. Welche Art der Aufweckfunktion + 
Entprellung Du letztlich verwendest, hängt dann von Deinen genauen 
Anforderungen ab.

von Karl H. (kbuchegg)


Lesenswert?

Mr.Burns schrieb:

> Nunja ich bin nun eher verwirrt, der eine sagt RC ist murks weil
> Zusatzhardware der andere sagt das ist super mit RC weil Manns dann
> nicht in software machen muss.

Was sind wir?
Sind wir Programmierer oder nicht? Was soll das heißen, man 'muss' es in 
Software machen. Jeder ordentliche Programmierer hat kein Problem, den 
ganzen Vorgang in Software und nur in Software zu machen und sich so 
eine externe Beschaltung zu ersparen.

Wie PeDa schon sagte:
wenn du auf deinem Taster 24 Stunden lang im halbe Sekunde Takt 
rumhämmerst, dann können die 50ms zum Problem werden. Wenn dem nicht so 
ist, dann spielt zero,null,nada,niente,... Rolle, ob dein µC 50ms später 
auf deinen Tastendruck reagiert und in dieser Zeit etwas Strom 
verbraucht oder nicht.
Den Menschen möchte ich erst mal sehen, der diese 50ms Verzögerung auf 
einen Tastendruck feststellen kann. Ausgenommen Chuck Norris 
selbstverständlich.

: Bearbeitet durch User
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.