www.mikrocontroller.net

Forum: Projekte & Code Power Switch


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Udo Klein (udoklein)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich wollte für eine Selbstbauschaltung statt einem "normalen" Schalter 
einen Drucktaster haben (damit er wie die anderen Taster auf der 
Frontplatte aussieht). Blöd nur, daß ich in der Baugröße die ich brauche 
keinen gefunden habe.

Google hat natürlich sofort was beinahe passendes für mich gefunden. 
Nur: der LTC2953 kann eigentlich viel zu viel für meine Zwecke. Außerdem 
zieht er 14uA. Das scheint mir auch zuviel. Und der Spannungsbereich 
passt mir auch nicht. Der Chip will mindestes 2.7V Also habe ich mal 
geschaut was ich mit einem Tiny15V so hinbekomme.

Was das Programm tut:
Der Tiny schläft die meisste Zeit. Sobald der Taster >0.7s gedrückt ist 
wird der Ausgang aktiviert. Falls der Taster dann nicht innerhalb 2s 
losgelassen wird wird der Ausgang wieder deaktiviert.

Falls der Ausgang aktiv ist muß man den Taster 0.7s drücken um den 
Ausgang zu deaktivieren.

Stromverbrauch (bei 5V und unbelastetem Ausgang):
  0.4 uA (Taster nicht gedrückt)
  214 uA (Taster gedrückt).

Das Programm funktioniert bis jetzt ganz gut. Und da ich ja nur 128kHz 
Takt verwende kann man auch runter auf 1.8V (im Gegensatz zum LTC2953).

Ich würde mich über Anmerkungen und Verbesserungsvorschläge freuen.

Udo

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen Compiler benutzt Du denn?

Der AVR-GCC kann den ATtiny15 nicht, sondern nur AVRs mit RAM.
Ist allerdings egal, da der ATtiny15 eh nicht mehr hergestellt wird.
Man sollte also gleich einen ATtiny13 benutzen.
Der hat dann auch nen Pin-Change Interrupt, d.h. man kann immer 
schlafen, bei an und aus.

Wozu hast Du das mit den verschiedenen Zeiten gedacht?
Wäre nicht eine ganz normale Entprellung (einmal drücken->an, nochmal 
drücken->aus) völlig ausreichend?

Da ja 6 IO-Pins da sind, kann man doch gleich 3 Tasten entprellen.


Peter

Autor: Udo Klein (udoklein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit dem Tiny 15 war ein Tipfehler. Es ist ein Tiny 25. Klar könnte 
ich mehr Tasten entprellen. Das ist allerdings nicht mein Ziel. Das Teil 
soll nur den Ein/Aus Taster für einen größeren Controller kontrollieren.

Dazu soll es folgende Bedingungen erfüllen:

1) So niedrig wie irgend möglicher Stromverbrauch
2) So einfach wie möglich gehaltener Code

Grund für (1) ist klar. Für (2) steckt dahinter, daß ich auf jeden Fall 
vermeiden will, daß ein Fehler im Code die Schaltung in einem Zustand 
lässt in dem ich nicht mehr ein/ausschalten kann. D.h. es soll wirklich 
nur einen Schalter abbilden. Der "Hauptcontroller" könnte das auch tun. 
Nur hat der >10k Zeilen Code im Bauch und da kann man ja nicht mehr 
wirklich 100% sicher sein, daß der absolut nie abstürzt. Deshalb gibt es 
ja überhaupt solche Chips wie den LTC2953. Und genau sowas wollte ich 
haben. Auf keinen Fall will ich in einer Situation landen in der ich den 
Hauptschalter patchen muß.

Das mit den verschiedenen Zeiten ist dafür gedacht, daß das Teil in der 
Tasche nicht aus versehen angeht. D.h. wenn irgendwas auf die Taste 
drückt und diese unten blockiert, dann soll der Controller wieder 
abschalten. Wenn natürlich etwas 1.5s lang drückt und dann nicht mehr, 
dann ist die Schaltung an...

Das würde allerdings über den "Hauptcontroller" abgefangen. D.h. ich 
würde dort wohl noch etwas Code spendieren. Wenn >1 Minute kein echter 
Input kommt dann soll er den kleinen Schaltercontroller "runterziehen". 
Im Moment geht es aber um den Schalter.

Udo

Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Udo,

ich hab das Programm mal nachempfunden unter Verwendung meiner 
Entprellroutine.
Ich hatte grad aber nur nen ATtiny13 da.

Ich habs bei 300kHz getestet, da das STK500 nicht darunter programmieren 
will, d.h. es wird dann sehr umständlich zu testen.
Die Stromaufnahme ist aber auch dann schon sehr klein (240µA). Da dieser 
aber nur während der 0,7s bzw. 2,7s fließt, kann man das voll 
vernachlässigen.

Der Strom des internen Pullup ist etwa 140µA. Diesen kann man 
verringern, wenn man einen externen Pullup parallel schaltet, z.B. 
1MegaOhm.
Ist der Taster bei Power-Down gedrückt, wird der interne Pullup 
abgeschaltet.
Beim Entprellen oder losgelassener Taste ist aber immer der interne 
Pullup mit an. Die Störunterdrückung verschlechtert sich also nicht.
Mit dem Macro "EXTERNAL_PULLUP" kann man auswählen, ob man einen 
externen Pullup hat oder nicht.


Peter

Autor: Udo Klein (udoklein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist deutlich kürzer als meine Lösung. Du lässt den Timer einfach 
durchlaufen und er wird automatisch gestopt wenn die CPU im PWR_DOWN 
Mode ist. Clever.
Einen Punkt habe ich aber nicht verstanden.
So wie es aussieht wird im Wach / Idle Zustand alle 700/4ms der Pin 
abgefragt. Wenn ich jetzt einen Schalter habe der nicht viel prellt und 
gerade nach dem Abfragen drücke und zwar so, daß der Pin bei

  get_key_idle()

high ist, (z.B. weil er gerade prellt) und vor

  set_sleep_mode( SLEEP_MODE_PWR_DOWN );

auf Low geht und dann nicht weiter prellt, dann würde die CPU doch 
schlafen bis ich den Taster loslasse, oder werden durch GIMSK = 1<<PCIE 
vorher aufgelaufene Interrupts abgearbeitet?

Udo

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Udo Klein schrieb:
> oder werden durch GIMSK = 1<<PCIE
> vorher aufgelaufene Interrupts abgearbeitet?

Ja, die Interruptflags werden gesetzt, unabhängig von der 
Interruptfreigabe.
Man kann daher auch alle Interruptquellen pollen, wird z.B. bei der UART 
oft gemacht, beim EEPROM schreiben usw..

Daß die Routine try_power_down() dann nochmal durchlaufen wird, stört ja 
nicht.
Deshalb der Name try..., sie versuchte es immer wieder, bis es klappt.

Wichtig ist aber, die Reihenfolge einzuhalten, d.h. daß erst der 
Sleepmode auf Power-Down gesetzt wird und danach der Aufwachinterrupt 
enabled.
Vertauscht man beides, schläft man für immer.


Peter

Autor: Udo Klein (udoklein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist ja interessant. Und wieder was gelernt :)

Besten Dank, Udo

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.