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!
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.
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
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.
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!
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.
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.
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?
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.
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.
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?
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.
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...
Die SW-Entprellung ist zuverlässig und einfach anzuwenden.
Den meisten Strom werden die Optokoppler verbrauchen.
Die µA des ATtiny13 kannst Du vernachlässigen.
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!
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.
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.