Forum: Mikrocontroller und Digitale Elektronik Neue Probleme


von Bastler (Gast)


Lesenswert?

Hallo zusammen!

Ich würde nochmals Hilfe benötigen. Ich würde meine Sensorschaltung 
gerne mit einem Taster aus- bzw. ein schalten. Ich verwende den ATtiny 
24. Der Taster geht von PB3 auf Ground. Möchte also den internen Pull Up 
Widerstand nutzen.
Wenn das Gerät ausgeschaltet ist, muss ja weiterhin eine Schleife 
ablaufen die den Taster abfragt. Der Controller wird sich in dieser Zeit 
ja wahrscheinlich im Idle Mode befinden. Wie kann ich sowas generieren. 
Eine while-Schleife und eine Abfrage des Pins nach 0 ist wohl 
einleuchtend. Wenn ich den Taster alle 100 ms oder so abfrage, sollte 
die Entprellung ja zusätzlich gegeben sein oder? Ist ein Interrupt 
nötig??
Könnte mir hierbei jemand mit einem Code Beispiel helfen?
Die zweite Frage. Wie generiert man Hard- und Softwaremäßig am 
einfachsten einen "Batteriewächter". Die ganze Schaltung läuft mit einer 
3 V Batterie. Bei sagen wir mal 2,5 V soll ein Warnlämpchen blinken. Mit 
ADC und Spannungsteiler kann man das ja schwer machen, weil die 
Referenzspg. = VCC mitabsinkt. Wie macht man das am geschicktesten??
Danke im voraus!

Gruß
Thomas

von Frank L. (hermastersvoice)


Lesenswert?

wenn du nicht grad einen V-Typ hast blinkt bei 2,5V nix mehr. Ansonsten 
wirst du mit etwas Mühe genug Antworten hier im forum finden wenn du nur 
danach suchst.

bye

Frank

von oszi40 (Gast)


Lesenswert?

1.Ein guter Betreff hilft manchmal weiter...
2.An einer toten Batterie brennt auch keine LED.
3.Wenn man keine Spannung messen will, kann man sie auch vergleichen.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Bastler schrieb:

> Ich würde nochmals Hilfe benötigen. Ich würde meine Sensorschaltung
> gerne mit einem Taster aus- bzw. ein schalten. Ich verwende den ATtiny
> 24. Der Taster geht von PB3 auf Ground. Möchte also den internen Pull Up
> Widerstand nutzen.
> Wenn das Gerät ausgeschaltet ist, muss ja weiterhin eine Schleife
> ablaufen die den Taster abfragt.

Dann darf das Gerät nicht komplett ausgeschaltet sein. Mindestens der 
ATtiny muss noch laufen.

> Der Controller wird sich in dieser Zeit
> ja wahrscheinlich im Idle Mode befinden. Wie kann ich sowas generieren.

Da gibt es mehrere Verfahren. Wenn der µC aus einer Batterie oder einem 
Akku versorgt wird, ist Stromsparen besonders wichtig. Dann wird 
üblicherweise ein Sleep Mode eingesetzt.

> Eine while-Schleife und eine Abfrage des Pins nach 0 ist wohl
> einleuchtend. Wenn ich den Taster alle 100 ms oder so abfrage, sollte
> die Entprellung ja zusätzlich gegeben sein oder? Ist ein Interrupt
> nötig??
> Könnte mir hierbei jemand mit einem Code Beispiel helfen?

Gerade dieses Pollen wird aus Stromspargründen vermieden. Mit einem 
Interrupt kann der schlafende (d.h. stromsparende) µC aufgeweckt werden.

> Die zweite Frage. Wie generiert man Hard- und Softwaremäßig am
> einfachsten einen "Batteriewächter". Die ganze Schaltung läuft mit einer
> 3 V Batterie. Bei sagen wir mal 2,5 V soll ein Warnlämpchen blinken. Mit
> ADC und Spannungsteiler kann man das ja schwer machen, weil die
> Referenzspg. = VCC mitabsinkt. Wie macht man das am geschicktesten??

Du könntest eine klassische Blinkschaltung konstruieren, die einen 
Disable-Eingang oder Reset-Eingang hat, der von dem µC bedient wird. 
Wenn der µC nicht mehr läuft, weil eine Unterspannung einen Brownout 
ausgelöst hat, blinkt die externe Schaltung.

von Bastler (Gast)


Lesenswert?

Dass der ATtiny 24V laufen muss ist mir völlig klar. Sleep Mode ist auch 
relativ klar, wobei ich da auf den ersten Blick im Datenblatt wenig dazu 
sehe. Dass ich die ganze Sache dann mit einem Interrupt wieder 
zurückhole kann ich mir auch gut vorstellen. Nur geht das mit einem 
Taster? Kann ich ihn mit diesem Impuls auf 0 in den Sleep Modus 
versetzen? Reicht der 0-Impuls aus um einen Interrupt auszulösen damit 
er wieder anläuft? Im Sleep Modus ist ja nur noch mein interner Takt 
(1MHz) am laufen. Habe keinen externen Quarz. Das Schalterentprellen 
muss dann wohl auch anders als mit der while Schleife funktionieren, 
weil die ja ständig Strom verbraucht.
Zu der Anregung mit der Batterieüberwachung. Ich möchte nicht gewarnt 
werden, wenn schon nichts mehr geht. Da ich den Tiny 24V gewählt habe, 
der normal bis 1,8 V funktioniert, hätte ich hald gerne ab 2,3 V oder so 
ein Warnlämpchen. Wenn das blinkt, muss mit einem Ausfall oder 
Fehlermeldungen gerechnet werden. Ich weiss auch die Sache mit dem 
Komperator. Also mit einem Vergleich. Nur dann bräuchte ich ja wohl 
wieder eine Z-Diode die mir eine feste Spg. liefert damit ich überhaupt 
vergleichen kann.

Gruß
Th.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Bastler schrieb:

> Sleep Mode ist auch
> relativ klar, wobei ich da auf den ersten Blick im Datenblatt wenig dazu
> sehe.

Das ganze Kapitel 7 im Datenblatt ist dem Thema gewidmet.

> Dass ich die ganze Sache dann mit einem Interrupt wieder
> zurückhole kann ich mir auch gut vorstellen. Nur geht das mit einem
> Taster?

Geht, wenn du den Taster an INT0 betreibst (Tabelle 7-1, Spalte Wake-up 
Source)

> Kann ich ihn mit diesem Impuls auf 0 in den Sleep Modus
> versetzen?

Könnte man, in der Regel programmiert man das aber anders. Im Leerlauf 
(Idle) kann man den I/O-Pin an INT0 pollen und bei Bedarf den µC 
schlafen schicken. Zuvor den "Wecker" fürs Aufwachen stellen, d.h. INT0 
scharf machen. Der nächste Tasterdruck weckt den µC und man schaltet den 
Wecker wieder am.

Ich habe sowas mit dem Suppentimer gemacht
http://www.mikrocontroller.net/articles/Pollin_Funk-AVR-Evaluationsboard#Suppentimer

> Reicht der 0-Impuls aus um einen Interrupt auszulösen damit
> er wieder anläuft?

Es gibt Bedingungen für die Mindestdauer des Tastendrucks. Steht im 
Datenblatt im Abschnitt 9.2 zu den Externen Interrupts.

> Im Sleep Modus ist ja nur noch mein interner Takt
> (1MHz) am laufen. Habe keinen externen Quarz. Das Schalterentprellen
> muss dann wohl auch anders als mit der while Schleife funktionieren,
> weil die ja ständig Strom verbraucht.

Das Entprellen kannst du per Software machen z.B. wenn du ein 
Schlafenlegen nach dem Aufwecken nur nach einer Mindestzeit zulässt.

Für die Entprellung im Wachmodus gibt es verschiedene Methoden. 
Ansehen würde ich mir die Interruptmethode mit einem Timerinterrupt 
statt des Wartescheifenverfahrens mit while.

> Zu der Anregung mit der Batterieüberwachung. Ich möchte nicht gewarnt
> werden, wenn schon nichts mehr geht. Da ich den Tiny 24V gewählt habe,
> der normal bis 1,8 V funktioniert, hätte ich hald gerne ab 2,3 V oder so
> ein Warnlämpchen. Wenn das blinkt, muss mit einem Ausfall oder
> Fehlermeldungen gerechnet werden. Ich weiss auch die Sache mit dem
> Komperator. Also mit einem Vergleich. Nur dann bräuchte ich ja wohl
> wieder eine Z-Diode die mir eine feste Spg. liefert damit ich überhaupt
> vergleichen kann.

Genau, entweder diskret selber aufbauen oder einen integrierten 
Resetcontroller mit der Wunschspannung (=> programmierbare 
Schaltschwelle) benutzen.

von Bastler (Gast)


Lesenswert?

Ok. Das sind alles sehr nützliche Hilfen für mich. Also für mich würde 
sich dann in meinen Augen der Idle Mode oder Standby Mode anbieten.
Also das mit Taster drücken funktioniert dann wohl auch. Aber das 
Programm Suppentimer hört sich sehr kompliziert und ist ja auch 
Ewigkeiten groß befürchte ich.
Soweit ich das Einschätzen kann müßte es relativ leicht gehen. Nur die 
Register dementsprechend belegen und wohl eine ISR Routine schreiben. In 
die kann ich dann gleichzeitig auch das mit dem Entprellen nehmen wenn 
es eine Timerinterruptroutine ist.
Das mit dem integrierten Resetcontroller verstehe ich noch nicht bei der 
Batterieüberwachung.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Bastler schrieb:
> Ok. Das sind alles sehr nützliche Hilfen für mich. Also für mich würde
> sich dann in meinen Augen der Idle Mode oder Standby Mode anbieten.
> Also das mit Taster drücken funktioniert dann wohl auch.

> Aber das
> Programm Suppentimer hört sich sehr kompliziert und ist ja auch
> Ewigkeiten groß befürchte ich.

Bestimmt weil eine vierstellige 7-Segmentanzeige dabei angesteuert wird. 
Das Grundverfahren, Schlafen vorbereiten, Wecker stellen, Schlafen, 
Aufwachen Wecker abstellen ist rel. einfach. Der Suppentimer-Code kann 
auch auf drei Arten übersetzt werden (s. DEFINEs im Source) - ohne 
Schlafen/Wecken, mit simuliertem Schlafen/Wecken und mit tatsächlichem 
Schlafen/Wecken.

> Soweit ich das Einschätzen kann müßte es relativ leicht gehen. Nur die
> Register dementsprechend belegen und wohl eine ISR Routine schreiben.

Zwei ISRs: Eine für die Behandlung des externen Interrupts von INT0 beim 
Aufwecken. Und eine für den Timerinterrupt für alle Zeitaufgaben.

> In
> die kann ich dann gleichzeitig auch das mit dem Entprellen nehmen wenn
> es eine Timerinterruptroutine ist.

Korrektemente.

> Das mit dem integrierten Resetcontroller verstehe ich noch nicht bei der
> Batterieüberwachung.

Das ist ein IC, das eingangsseitig eine zu überwachende Spannung bekommt 
und ausgangsseitig ein Logiksignal aus gibt, ob die Schaltschwelle von 
der Spannung über- oder unterschritten wird.

Wenn man das Logiksignal an einen RESET-Eingang eines µC hängt, kann man 
den kontrolliert rauf- und runterfahren lassen. Das ist der übliche 
Einsatzzweck eines solchen ICs, daher der Name Reset Controller.

Aber wenn man das Logiksignal an einen beliebigen I/O-Eingang eines µC 
hängt, kann man auf den Zustand der Versorgungsspannung im Programm 
reagieren.

von Bastler (Gast)


Lesenswert?

Da ich für meine Sensorschaltung eine while(1) Schleife benutze, müßte 
die ISR-Routine wohl innerhalb dieser Schleife sein vermute ich. 
Ansonsten ist ein Austreten aus dieser Schleife ja ausgeschlossen. Das 
kann ich ja wiederum auch mit dem Interrupt für externe Ereignisse 
handeln.
Ich versuch gerade aus dem Suppentopf-Timer den für mich interessanten 
Code rauszuziehen. Das dürften ja nicht mal 10 -15 Zeilen sein für meine 
einfache Anwendung.
Ein weiteres IC ist für meine Aufgabe nur ganz schwer zu vermitteln. Das 
zu begründen würde aber jetzt sehr lange dauern. Gibt es irgendeine 
Möglichkeit das mit wenigen Bauteilen so zu realisieren?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Bastler schrieb:

> Da ich für meine Sensorschaltung eine while(1) Schleife benutze, müßte
> die ISR-Routine wohl innerhalb dieser Schleife sein vermute ich.
> Ansonsten ist ein Austreten aus dieser Schleife ja ausgeschlossen.

Gerade nicht. Das ist ja der Clou einer ISR: Es ist eine eigenständige 
Funktion in einem Programm, die im Falle eines Interrupts das 
Userprogramm ("die while(1) Schleife") unterbricht, abgearbeitet wird 
und danach das Userprogramm an der unterbrochenen Stelle weiterführt.

von Bastler (Gast)


Lesenswert?

In Ordnung. Dann werde ich jetzt mal versuchen diese ISR zu schreiben 
und hoffe dass des so klappt wie ichs mir vorstelle.
Könnte man das mit der Batterieüberwachung auch irgendwie mit Brown out 
machen??

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.