Forum: Mikrocontroller und Digitale Elektronik Schalter beim öffnen als Interrupt nutzen mit niedrigem Verbrauch?


von Gerald M. (gerald_m17)


Lesenswert?

Hallo,

ich bastle gerade ein Sautelefon, das sich beim umfallen einschaltet, 
und die zuletzt gewählte Nummer anruft, und sich dann wieder auschaltet.

Das alles funktioniert auch soweit, und der Attiny2313 schläft auch 
schön im powerdown modus.

Nun wollte ich noch diesen:
http://www.conrad.de/ce/de/product/185232/Vibrations-Sensor-360-JWR-001-02
Sensor verbauen.
Das sind im Prinzip 4 Schrauben, zwischen denen eine Kugel eingesperrt 
ist. Es sind also immer irgendwelche 2 nebeneinander liegende Pins 
miteinander verbunden.
Ich wollte also jeweils die diagonalen Schrauben miteinander verbinden, 
an den einen Verbund INT0 und an den anderen GND anschließen. Bei 
steigender Flanke (Pullup aktiviert, in dem Moment indem die Kugel kurz 
keinen Kontakt hat) wollte ich den Sleepmode verlassen. Nun geht das 
aber ja im Power-Down nicht...
Jetzt würde mir noch einfallen, einen Pulldown Widerstand einzubauen, 
und ein Diagonalpaar auf V+ zu legen. Dann fleßt ja aber dauerhaft (da 
der Schalter ja geschlossen ist) ein Strom von 3V/10000Ohm = 300µA, was 
ja witzlos ist.

Hat jemand eine Idee, wie man bei geschlossenem Schalter wenig Strom 
verbrauch, und V+ am INT Pin anliegt, und bei geöffnetem GND an INT 
geben kann?

Grüße
Gerald

von c-hater (Gast)


Lesenswert?

Gerald m. schrieb:

> wollte ich den Sleepmode verlassen. Nun geht das
> aber ja im Power-Down nicht...

Natürlich geht das. Es geht bloß nicht für INT0, der kann nur mit 
Level-Trigger aufwachen und erfordert deswegen eine Mindestdauer für den 
Kontakt. Nimmst du halt INT1 oder PCINT.

von Gerald M. (gerald_m17)


Angehängte Dateien:

Lesenswert?

Ah, danke dir!
Hatte das auch am Ende getestet mit Int1 (hatte da was im Datenblatt 
gefunden zu Int0), das hat allerdings nicht funktioniert. Habe jetzt 
aber gesehen dass ich den PullUp für Int1 vergessen habe zu setzen, und 
stattdessen den Int0 (noch) gesetzt hatte, während ich alles andere auf 
Int1 geändert habe. Ich versuche das wenn ich daheim bin.
Anbei ist übrigens beim Code, bei weitem nicht der schönste mit den 
ganzen dealys, auch die ganzen #defines brauch man wahrscheinlich nicht 
bei dem kurzen Stück Code. Aber es funktioniert wie es soll :P

von Der (Gast)


Lesenswert?


von Gerald M. (gerald_m17)


Lesenswert?

ja, DER "Sensor" schlechthin scheint es nicht zu sein. Es ist allerdings 
der einzige, mechanische (Wegen Stromverbrauch) Schalter, der relativ 
Lagenunabhängig schaltet.
Denn wenn das Handy bewegt wurde, soll es ja nach 5 Minuten wieder 
scharf geschalten sein, damit man nicht jedesmal raus in den Wald muss 
und das Telefon wieder hinstellen muss. (Wie bei den Neigungsschaltern 
wo eine Kugel auf einer schiefen Ebene mit 2 Kontakten ist)

von Gerald M. (gerald_m17)


Lesenswert?

So, habe es jetz versucht, mit steigender oder fallender Flanke geht das 
nicht.
Der Code oben funktioniert, aber nur weil das nicht der PowerDown sonder 
der Standby Mode ist. Bei PowerDown kommt er mit Flanke, auch an Int1, 
nicht raus :'(

von Heiko (Gast)


Lesenswert?

Klingt, als würde es ein Cache werden :-)

von Stefan (Gast)


Lesenswert?

Wegen der Pull-up Widerstände verbraucht der Sensor aber ständig Strom. 
Ich würde versuchen, die Pullups in regelmäßigen Intervallen nur ganz 
kurz zu aktivieren. Dazu müsste der Mikrocontroller regelmäßig von einem 
Timer aufgeweckt werden, anstatt von Interrupts durch den Sensor.

Eventuell kommt man so auf weniger Stromverbrauch. Muss man mal durch 
rechnen.

Ansonsten fällt mir spontan der Sensor BMA020 ein, hat I²C Schnittstelle 
und einen Interrupt-Ausgang. Man kann ihn so konfigurieren, dass er bei 
minimalem Stromverbrauch einen Interrupt erzeugt, wenn er eine Vibration 
oder Lageänderung erkennt, die über einer einstellbaren Schwelle liegt. 
Der Sensor kann sich selbst aus dem Sleep Modus in regelmäßigen 
Intervallen aufwecken, um Strom zu sparen. Die Stromaufnahme im Sleep 
Modus liegt bei 1µA.

Den Sensor gibt's bei ELV als Modul inclusive Spannungsregler.

von LostInMusic (Gast)


Lesenswert?

>Hat jemand eine Idee,

Ja:

(1) µC mit niedriger FOSC takten, z. B. 128 kHz (Watchdog-Timer)
(2) Sensor an irgendeinen Port Pn anschließen
(3) Sleep Mode "Idle" verwenden (und keinen sonst)
(4) µC durch Timer zyklisch aufwecken lassen, z. B. alle 25 ms

(5) In jedem Zyklus tun:
      (a) Digital-Input-Stufen von Pn über DDR einschalten (DIDRn)
      (b) Interne Pullup-Widerstände für Pn einschalten (DDRn)
      (c) Pin-Status von Pn einlesen (PINn)
      (d) Digital-Input-Stufen von Pn über DDR ausschalten (DIDRn)
      (e) Interne Pullup-Widerstände für Pn ausschalten (DDRn)
      (f) Inputs verarbeiten
      (g) --> Idle (sleep)

Diese Lösung basiert darauf, dass der Stromverbrauch auch im Idle-Mode 
batterie- bzw. akkugerecht klein ist - und das ist er bei niedriger 
Taktfrequenz definitiv.

Der Sinn der Maßnahme (e) ist natürlich, dass bei geschlossenen 
Sensorkontakten kein Strom fließen kann. Infolge dessen ist (d) nötig, 
denn wenn der Pin während der Sleep-Phasen pullup-los ist, kann und wird 
er floaten. Dadurch würden die Digital-Input-Stufen womöglich ständig 
wild hin- und herkippen (unabhängig davon, ob der Pin eingelesen wird!) 
und dafür sinnlos Strom verbrauchen. Deshalb gibt es die Möglichkeit, 
sie abzuschalten.

von LostInMusic (Gast)


Lesenswert?

Hoppla, habe gerade gesehen, dass der Tiny2313 gar keine DIDR-Register 
hat. Hängt wahrscheinlich mit dem Nichtvorhandensein eines ADC zusammen. 
==> Anderen Controller nehmen.

von Thomas E. (thomase)


Lesenswert?

LostInMusic schrieb:
> Hoppla, habe gerade gesehen, dass der Tiny2313 gar keine DIDR-Register
> hat. Hängt wahrscheinlich mit dem Nichtvorhandensein eines ADC zusammen.
> ==> Anderen Controller nehmen.
Du hast dein Pulver aber schnell verschossen. Die Eingänge floaten auch 
nicht, wenn man sie einfach auf Ausgang 0 schaltet.

mfg.

von Gerald M. (gerald_m17)


Lesenswert?

Danke schonmal!

Stefan:
Danke schonmal für den Sensor. Für den Preis kann man echt nicht 
meckern. Eventuel ist er etwas groß, wenn man ich ins Handy einbauen 
will.
Hätte ich den vorher gefunden, wäre es villeicht der geworden


LostinMusic:
Auch dir nocheinmal danke.
Leider hat der Tiny2313 kein DIDRn Register. Allerdings habe ich noch 
andere Controller da. Aber als Ausgang schalten geht doch au, oder?
Du hast mich allerdings auf die Idee gebracht, dass ich ja, nachdem die 
5 Minuten Wartezeit vorbei sind, die aktuelle Position der Kugel ja 
durch ausprobieren herausfinden kann. Hierfür muss ich zwar jeden 
einzelnen PIN des Sensors an den ATTiny anschließen, aber das ist ja 
auch nicht so das Problem.
Die INT Pins werden diagonal an den Sensor angeschlossen, an die anderen 
Beiden jeweils ein normaler Pin.
Nach dem ausprobieren weiß ich welcher INT Pin Kontakt hat, und stelle 
ihn, wie die anderen beiden Pins auf GND. Es wird nur der andere INT Pin 
für den Interrupt benutzt. So ist die Empfindlichkeit zwar geringer, 
aber ich habe kein Strom Problem mehr. Und die Kugel schießt schon 
ordentlich in dem Sensor drin herum.

Als faule alternative könnte ich auch einfach einen 1MOhm PullDown 
Widerstand benuten. Teste es gerade, und noch funktioniert es. Der Strom 
wäre mit 3µA verkraftbar.

edit: Achso, und dieses alle 25ms Anschalten und Pin lesen, da weiß ich 
nicht ob ich gerade in dem Moment den Impuls habe.

von LostInMusic (Gast)


Lesenswert?

>Die Eingänge floaten auch nicht, wenn man sie einfach auf Ausgang 0 schaltet.

Stimmt - diese Möglichkeit ist mir glatt entgangen. Punkt für Dich :-)

>Der Strom wäre mit 3µA verkraftbar.

Mit was willst Du das Ding denn versorgen? Eine gewöhnliche 
AA-Alkalizelle kann immerhin ≈100 µA ununterbrochen drei Jahre lang 
liefern (Rechnung: I = Q/t = 3000 mAh/(3*365*24 h) = 0.114 mA). 
Eventuell macht es also gar keinen Sinn, um jeden Mikroampère-Bruchteil 
zu kämpfen.

>Achso, und dieses alle 25ms Anschalten und Pin lesen, da weiß ich
>nicht ob ich gerade in dem Moment den Impuls habe.

40 Samples/s dürften genug sein, um jede Veränderung zuverlässig zu 
registrieren - wenigstens mit einem Sample. So blitzartig schnell 
können Deine Viecher nicht rütteln X-D. Probiers aus und wenn Du 
Bedenken hast, nimm 80 Samples/s.

von Gerald M. (gerald_m17)


Lesenswert?

Danke dir nochmal.

Versorgt wird das ganze mit dem Handy Akku. Dieser hat etwa 400mAh 
(hatte zumindets mal, sind ja alte Handys). Deswegen meine ich ja, wenn 
ich einen 1MOhm PullDown Widerstand nehme, benötigt der 3µA, das wäre 
verkraftbar.
Die normal vorgeschlagenen 10kOhm brauchen jedoch 300µA, was etwa einem 
Monat enstspricht. Das ist zu wenig.
Mit meinem Aufbau brauche ich mit dem 1MOhm ca. 5µA, und das ist gut so.
Ich frage mich nur, ob das vielleicht nicht gut geht mit dem 1MOhm.

Die alternative mit dem Timer ist aber auch nicht schlecht, da könnte 
man vor allem auch alle paar Stunden den ADC einschalten (dann muss es 
wirklich ein anderer Controller sein) und bei niederer Spannung einen 
Doppelanruf tätigen.

Ich denke ich teste das mit den 25ms Schlaf noch, muss mir allerdings 
dann erst noch nen Uhrenquarz organisieren. Der Spannungscheck wäre noch 
ein nettes Gimmick

von c-hater (Gast)


Lesenswert?

Gerald m. schrieb:
> So, habe es jetz versucht, mit steigender oder fallender Flanke geht das
> nicht.
> Der Code oben funktioniert, aber nur weil das nicht der PowerDown sonder
> der Standby Mode ist. Bei PowerDown kommt er mit Flanke, auch an Int1,
> nicht raus :'(

Hmm, ich bin jetzt auch garnicht mehr so sicher, daß der 2313 bei einem 
anderen externen Int als INT0 aus dem PowerDown aufwachen kann.

Der Sinn der entsprechenden Formulierung im Datenblatt wird von einem 
winzigen Komma kontrolliert, das ich bei einem flüchtigen Blick schlicht 
übersehen hatte, was aber bei größerer Darstellung der Seite eindeutig 
als vorhanden erkennbar ist und dem Satz eine völlig andere Bedeutung 
gibt, nämlich: nein, es geht nur INT0 und der auch nur mit Leveltrigger.

Die logische Konsequenz wäre: schick den 2313 endlich auf's Altenteil 
und nimm einen modernen AVR. Bei denen ist es nämlich tatsächlich so, 
wie ich schrieb. (was wohl der Grund ist, warum ich die zuerst dem 
2313-Datenblatt entnommene Bedeutung zunächst nicht angezweifelt habe, 
sie entsprach einfach dem, was ich gewohnt war)

von Schnucki (Gast)


Lesenswert?

> Schalter beim öffnen als Interrupt nutzen mit niedrigem Verbrauch?
Das Öffnen ist ein Substantiv und wird großgeschrieben.

von m.n. (Gast)


Lesenswert?

c-hater schrieb:
> Die logische Konsequenz wäre: schick den 2313 endlich auf's Altenteil

Er hat doch schon den hochmodernen ATtiny2313!
Der kann aber auch einen PCINT an jedem Eingang auslösen, wozu mir 
Folgendes einfällt.
Beitrag "Re: EIN-AUS mit Taster per Interrupt, ATtiny25 o.ä."

von c-hater (Gast)


Lesenswert?

m.n. schrieb:

> Er hat doch schon den hochmodernen ATtiny2313!

Der 2313 gehört noch zur zweiten Generation der AVRs, ist also nicht 
hochmodern.

> Der kann aber auch einen PCINT an jedem Eingang auslösen

Nicht einmal das kann er, sondern nur für die acht Eingänge, die zu Port 
B gehören.

Und was er halt auch nicht kann, um was es hier aber gerade geht: Per 
PCINT aus dem Tiefschlaf (PowerDown) aufwachen.

Moderne AVRs können das. Z.B. die pinkompatiblen 2313-Nachfolger 2313A 
und 4313. Die gehören ja auch zur aktuellen AVR-Generation.

von Gerald M. (gerald_m17)


Lesenswert?

Hi,

Den 2313a habe ich auch da (zwar nur im DIP Gehäuse, abba fürs 
breadboard reicht)

Diesen kann ich auch nicht per Flanke aufwecken. Per LowLevel  geht das, 
aber ich wollte ja die Flanke haben, da der Sensor in der Konstellation 
ja dauerhaft ist, und bei Erschütterung kurz High ausgibt.
Es gibt die Int Möglichkeiten:
Low
Steigende Flanke
Fallende Flanke
Level change.

Und nur low weckt ihn, egal ob int0 oder int1

von m.n. (Gast)


Lesenswert?

c-hater schrieb:
> Nicht einmal das kann er, sondern nur für die acht Eingänge, die zu Port
> B gehören.

Da haben die das bei Atmel doch wohl vergessen?


> Und was er halt auch nicht kann, um was es hier aber gerade geht: Per
> PCINT aus dem Tiefschlaf (PowerDown) aufwachen.

Aber per PCINT aufwecken kann auch schon der Typ ohne 'A'.

von c-hater (Gast)


Lesenswert?

Gerald m. schrieb:

> Den 2313a habe ich auch da (zwar nur im DIP Gehäuse, abba fürs
> breadboard reicht)
>
> Diesen kann ich auch nicht per Flanke aufwecken.

Doch, das geht mit PCINT.

Mit INT0/INT1 geht nur low-level.

Warum liest du nicht einfach mal die Datenblätter?

von c-hater (Gast)


Lesenswert?

m.n. schrieb:

> Aber per PCINT aufwecken kann auch schon der Typ ohne 'A'.

Das dachte ich ja zuerst auch, aber nachdem der Thread-Eröffner meinte, 
das ginge nicht, habe ich nochmal nachgelesen.

Die Anmerkung zu Tabelle 14 auf Seite 34 des Datenblatts läßt da leider 
erhebliche Interpretationsspielräume.

Und ich habe im Moment keinen urtümlichen 2313 hier, um es selber 
auszuprobieren.

Sicher ist jedenfalls, daß der 2313A es kann. Den habe ich nämlich hier 
und mit dem habe ich es ausprobiert. Allerdings: die entsprechende 
Stelle im Datenblatt ist genauso bescheuert formuliert. Also könntest du 
bezüglich des 2313 durchaus Recht haben.

von m.n. (Gast)


Lesenswert?

c-hater schrieb:
> Die Anmerkung zu Tabelle 14 auf Seite 34 des Datenblatts läßt da leider
> erhebliche Interpretationsspielräume.

Beim den Prelimenary von 04/06 für den ATtiny2313/V ist auf S. 34 
aufgeführt, dass das Aufwecken geht. Insgesamt habe ich vier 
Datenblätter zum ATtiny2313 und jetzt noch das allerletzte 
heruntergeladen.

Mit dem 2313A geht dann alles, wie man es braucht. Jetzt sind wir Alle 
ein bißchen schlauer und freuen uns :-)

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.