Beim STM32 kann man eine Batterie an einen bestimmten Pin anschließen, damit die Echtzeituhr auch ohne Betriebsspannung weiter läuft. Wenn keine Batterie vorhanden ist, soll der Pin mit Vcc verbunden werden. Diese Wahl habe ich über einen Jumper gelöst. Ich möchte aber auch im MCU erkennen, ob eine Batterie angeschlossen ist oder nicht. Dazu dachte ich, die Batterie ohne Jumper an einen weiteren Pin anzuschließen und diesen dann softwareseitig abzufragen. Die Frage ist: Wie bekomme ich das hin, ohne dass ein Strom von mehr als ein paar uA fließt? Und wie erreiche ich einen definierten Eingangswert, wenn die Batterie fehlt? Ein Pull-down verbraucht sicher zu viel Strom.
Helge schrieb: > 3-pin header für den jumper? Ja, habe ich für die Verdrahtung Batterie/Vcc gemacht. Aber davon bekommt der STM32 nichts mit. Ich könnte natürlich noch einen zweiten Jumper einbauen für den zweiten Pin, aber vielleicht geht das auch eleganter.
Peter M. schrieb: > Ich möchte aber auch im MCU erkennen, ob eine Batterie angeschlossen ist > oder nicht. Dazu dachte ich, die Batterie ohne Jumper an einen weiteren > Pin anzuschließen und diesen dann softwareseitig abzufragen. Man prüfe nach Power-On (und nur danach!) Reset nach, ob die RTC läuft. Wenn ja => Batterie dran, wenn nein => keine dran oder Erstinbetriebnahme. Den Status merkt man sich und initialisiert die RTC, wenn sie noch nicht läuft. Ab dem zweiten Einschalten weiß man's dann.
Du hast ja einen internen ADC Kanal für die Batteriespannung. Du könntest die Schwelle zur Erkennung auf 3.25V legen. Ist sie kleiner liegt eine Batterie vor, ist die größer ist sie direkt an VCC angeschlossen.
A. B. schrieb: > Man prüfe nach Power-On (und nur danach!) Reset nach, ob die RTC läuft. > Wenn ja => Batterie dran, wenn nein => keine dran oder > Erstinbetriebnahme. Den Status merkt man sich und initialisiert die RTC, > wenn sie noch nicht läuft. Ab dem zweiten Einschalten weiß man's dann. Gute Idee, leider läuft die Uhr in beiden Fällen. Der Unterschied ist, in einem Fall sind die Werte 0, im anderen Fall nicht. Leider setzt das voraus, dass die Uhr initialisiert wurde, und genau hier will ich ja unterscheiden, welcher Fall vorliegt. Aber vielleicht kann trotzdem irgendwie das aktuelle Datum heranziehen ... guter Vorschlag!
Harald schrieb: > Du hast ja einen internen ADC Kanal für die Batteriespannung. Du > könntest die Schwelle zur Erkennung auf 3.25V legen. Ist sie kleiner > liegt eine Batterie vor, ist die größer ist sie direkt an VCC > angeschlossen. Auch eine gute Idee, aber ich verwende eine CR2032, und laut eines zufällig gewählten Datenblattes kann die Spannung bei 3,0V bis 3,4V liegen (hängt sicher vom Hersteller ab). Die Betriebsspannung beträgt 3,3V. Das erscheint mir leider zu unsicher.
Eignet sich halt nur zum unterdrücken einer Batteriewarnung. Wenn die Zeit auf nahe 0 ist, muß die Uhr eh gestellt werden.
In den RTC Registern kann man auslesen ob die RTC bereits initialisiert wurde oder nicht. Bei Stromausfall oder keiner/leerer Batterie wird entsprechend ein Bit im Register gesetzt. Beispiel: RTC_ISR Bit INITS Bei andern STM32 kann das Bit durchaus ein anderes sein. Alternative: Man verwendet eine Speicherstelle vom BKP RAM, und schreibt da einen Wert rein. Sollte der Wert nach dem Reset noch drin stehen, dann war da noch genügend Strom von der Batterie da. Sollte der Wert 0 sein, so nicht. Man braucht also kein extra IO Pin vom µC und auch kein AD Wandler oder sonstige Beschaltung die womöglich noch extra Strom von der Batterie weg nimmt.
:
Bearbeitet durch User
Peter M. schrieb: > A. B. schrieb: >> Man prüfe nach Power-On (und nur danach!) Reset nach, ob die RTC läuft. >> Wenn ja => Batterie dran, wenn nein => keine dran oder >> Erstinbetriebnahme. Den Status merkt man sich und initialisiert die RTC, >> wenn sie noch nicht läuft. Ab dem zweiten Einschalten weiß man's dann. > > Gute Idee, leider läuft die Uhr in beiden Fällen. Der Unterschied ist, > in einem Fall sind die Werte 0, im anderen Fall nicht. > > Leider setzt das voraus, dass die Uhr initialisiert wurde, und genau > hier will ich ja unterscheiden, welcher Fall vorliegt. > > Aber vielleicht kann trotzdem irgendwie das aktuelle Datum heranziehen > ... guter Vorschlag! Möglicherweise geht das doch viel einfacher, als gedacht: Wenn keine Batterie dranhängt, dann wird die Uhr mit Montag, 01.01.00 initialisiert, und zwar noch vor der eigentlichen Initialisierung mit RTC-Reset. Im andern Fall stehen wirkliche Werte drin. Es könnte allerdings sein, dass die Beobachtung ein Artefakt meiner Überprüfung ist, denn ich mache ja einen Reset vor dem Debuggen. Ein richtiger Einbau wird Klarheit bringen.
Markus M. schrieb: > RTC_ISR Bit INITS > [...] > Speicherstelle vom BKP RAM Klasse, das ist ja noch besser! Das übernehme ich so, denn das klingt vielversprechender, als nur das Datumsregister abzufragen.
Peter M. schrieb: > Es könnte allerdings sein, dass die Beobachtung ein Artefakt meiner > Überprüfung ist Ich habe ähnliches festgestellt. Beim F103 besteht die Uhr ja nur aus einem 32bit Sekundenzähler. Der beginnt bei 0, wenn die Batterie fehlt.
> Markus M. schrieb: > RTC_ISR Bit INITS Ich habe gerade nachgeschaut: Das Bit ist gesetzt, wenn das Datumsjahr 0 ist -- ist also äquivalent zu meiner Datumsprüfung. :-) Wenn es nicht funktioniert, nehme ich das Backup RAM.
Peter M. schrieb: > Wenn keine Batterie vorhanden ist, soll der Pin mit Vcc > verbunden werden. Warum eigentlich, kennt jemand eine vernünftige Erklärung? Der Chip muss ja mit jeder beliebigen Spannung von 3.6 bis 0.0V am VBAT-Pin richtig funktionieren. Na gut, irgendwann geht der LSE aus, aber sonst darf kein Unglück passieren. Also sollte man mit dem Jumper zwischen Batterie und und einer niedrigen Spannung umschalten. Den Unterschied kann man mit dem internen ADC-Kanal messen. Manchmal hat man in der Nähe 1.2V, notfalls kostet es zwei Widerstände. Natürlich vorausgesetzt, dass es nicht wirklich Vcc sein muss.
Bauform B. schrieb: > Peter M. schrieb: >> Wenn keine Batterie vorhanden ist, soll der Pin mit Vcc >> verbunden werden. > > Warum eigentlich, kennt jemand eine vernünftige Erklärung? Nein, nur dass es so im Datenblatt steht. Vielleicht wäre die RTC sonst ohne Stromversorgung?! > Also sollte man mit dem Jumper zwischen Batterie und und einer niedrigen > Spannung umschalten. [...] Manchmal hat man in der Nähe 1.2V, notfalls > kostet es zwei Widerstände. Natürlich vorausgesetzt, dass es nicht > wirklich Vcc sein muss. Wenn man eine Spannung kleiner als Vcc wählt, simuliert man quasi eine Batterie. Aber ich wüsste nicht, wieso das nicht funktionieren soll. Spannungsmessung ginge so, allerdings haben wir ja jetzt eine rein Software-basierte Umsetzung.
Peter M. schrieb: > soll der Pin mit Vcc verbunden werden. > Diese Wahl habe ich über einen Jumper gelöst. Warum nicht stattdessen durch einen Pin, der Vcc für die RTC bereitstellt? Start: Pin auf Eingang und Level abfragen. Wenn Level Low = keine Batterie eingesetzt, dann Pin auf Ausgang & High Wenn Level High = Batterie drin, Pin bleibt Eingang.
Peter M. schrieb: >>> Wenn keine Batterie vorhanden ist, soll der Pin mit Vcc >>> verbunden werden. >> >> Warum eigentlich, kennt jemand eine vernünftige Erklärung? > > Nein, nur dass es so im Datenblatt steht. Vielleicht wäre die RTC sonst > ohne Stromversorgung?! Okay, offen lassen sollte man VBAT wirklich nicht. Als definierte Spannung bietet sich natürlich GND an, das kann man auch besser von leeren Batterien unterscheiden. Also, ein extra Spannungsteiler ist ja wohl voll doof, wer denkt sich sowas aus?
Bauform B. schrieb: > Okay, offen lassen sollte man VBAT wirklich nicht. Als definierte > Spannung bietet sich natürlich GND an, das kann man auch besser von > leeren Batterien unterscheiden. Also, ein extra Spannungsteiler ist ja > wohl voll doof, wer denkt sich sowas aus? Nein, das wäre ein guter Plan B!
MWS schrieb: > Warum nicht stattdessen durch einen Pin, der Vcc für die RTC > bereitstellt? > > Start: > Pin auf Eingang und Level abfragen. > Wenn Level Low = keine Batterie eingesetzt, dann Pin auf Ausgang & High > Wenn Level High = Batterie drin, Pin bleibt Eingang. Ich musste ein wenig nachdenken, bis ich Dich verstanden habe. Damit bei "keine Batterie" ein LOW gemessen wird, braucht man doch einen Pull-down, oder? Sonst floated der Pin doch eher? Und mit dem Pull-down steigt dann wieder der Stromverbrauch, falls man nicht 1 MΩ oder mehr verwenden will. Funktioniert denn ein Pull-down mit einen so hohen Widerstand überhaupt zuverlässig?
Peter M. schrieb: > Damit bei "keine Batterie" ein LOW gemessen wird, braucht man doch > einen Pull-down, oder? Sonst floated der Pin doch eher? Der Pin wäre wohl mit dem VBAT-Pin verbunden, aber da fließt auch kein Strom, also braucht man einen Pull-Down. In diesem speziellen Fall würde man aber den internen GPIO-Pull-Down einschalten und nach dem Test wieder abschalten. Aber: Mit Batterie und Vcc = 0 fließt Strom in den GPIO-Pin. Wie viel, ist von Chip zu Chip und von Pin zu Pin verschieden, also aufpassen. Manche Pins haben eine Schutzdiode nach Vcc, darüber würde die Batterie schnellentladen. An manchen Pins sind Vcc+3.6V erlaubt, da sollten nicht mehr als 3uA fließen (was mir aber auch zuviel wäre). > Und mit dem Pull-down steigt dann wieder der Stromverbrauch, falls man > nicht 1 MΩ oder mehr verwenden will. Funktioniert denn ein Pull-down mit > einen so hohen Widerstand überhaupt zuverlässig? 270MΩ funktionieren hier einwandfrei, auf einer normalen Platine. Man muss sie nur sehr sorgfältig reinigen und coaten, und nicht mit irgendeinem Lack. Mit Resten vom schlechten Flußmittel und hoher Luftfeuchtigkeit funktionieren auch 27kΩ nicht zuverlässig. Ja, die Natur ist grausam...
Bauform B. schrieb: > Warum eigentlich, kennt jemand eine vernünftige Erklärung? Peter M. schrieb: > Nein, nur dass es so im Datenblatt steht. Vielleicht wäre die RTC sonst > ohne Stromversorgung?! Dazu gibt es eine Application Note. In dem Chip befindet sich ein schwacher Umschalter für die Versorgung der RTC und der damit verbundenen I/O Pins Pins PC13, PC14 und PC15. Die Uhr läuft genauer, wenn eine externe Versorgung angelegt wird.
Peter M. schrieb: > Ich musste ein wenig nachdenken, bis ich Dich verstanden habe. Damit bei > "keine Batterie" ein LOW gemessen wird, braucht man doch einen > Pull-down, oder? Den vergass ich beim Gedankenspiel, der STM32 sollte intern konfigurierbare besitzen. Bauform B. schrieb: > Mit Batterie und Vcc = 0 fließt Strom in den GPIO-Pin. Der Einwand einer parasitären Versorgung ist berechtigt. Wäre ggf. mit ein wenig Extrahühnerfutter inklusive 2 oder 3 Mosfets zu lösen. Allerdings wäre die Schönheit der Schlichtheit dahin.
Stefan ⛄ F. schrieb: > Dazu gibt es eine Application Note. In dem Chip in welchem eigentlich? > befindet sich ein > schwacher Umschalter für die Versorgung der RTC und der damit > verbundenen I/O Pins Pins PC13, PC14 und PC15. Okay. Das wäre doch ein Grund, warum die Spannung an VBAT egal ist. > Die Uhr läuft genauer, wenn eine externe Versorgung angelegt wird. Das wäre allerdings ein Grund, den Chip, oder wenigstens diese RTC, nicht zu verwenden... AppNote haben will
:
Bearbeitet durch User
Bauform B. schrieb: >> Dazu gibt es eine Application Note. In dem Chip > in welchem eigentlich? Ach ist doch egal, greifbare Fakten sind Nebensache. Der TO hat es nicht anders gewollt. > AppNote haben will Verstehe ich. Ich habe eben kurz danach gegoogelt und sie nicht gefunden. Ich kann mich an die Nummer des Dokumentes nicht mehr erinnern.
Stefan ⛄ F. schrieb: > Ach ist doch egal, greifbare Fakten sind Nebensache. Der TO hat es nicht > anders gewollt. Bin ich damit gemeint? Themen...O? Onkel? Wieso sind Fakten Nebensache? Ich halte mich einfach ans Datenblatt. Außerdem habe ich bereits eine Lösung.
Peter M. schrieb: > Bin ich damit gemeint? > Ich halte mich einfach ans Datenblatt. Das würden wir auch gerne tun, leider gibt es nicht "das eine" Datenblatt für "den STM32". Sage doch mal bitte, um welchen es geht.
Stefan ⛄ F. schrieb: > Das würden wir auch gerne tun, leider gibt es nicht "das eine" > Datenblatt für "den STM32". Sage doch mal bitte, um welchen es geht. Es handelt sich um den STM32F746.
Peter M. schrieb: > Es handelt sich um den STM32F746. Das Datenblatt zeigt den internen Umschalter für die Stromversorgung der RTC. Ich denke, der VBAT Pin muss nicht mit VDD verbunden werden wenn man keine Batterie hat. Der Einzige Hinweis der in diese Richtung geht ist dieser: "When PDR_ON pin is connected to VSS (Internal Reset OFF), the VBAT functionality is no more available and VBAT pin should be connected to VDD" Ich denke, dass du diese Betriebsart jedoch nicht verwendest, weil dann nämlich die ganze RTC auch deaktiviert ist.
Stefan ⛄ F. schrieb: > Ich denke, der VBAT Pin muss nicht mit VDD verbunden werden wenn man > keine Batterie hat. Der Einzige Hinweis der in diese Richtung geht ist > dieser: > > "When PDR_ON pin is connected to VSS (Internal Reset OFF), the VBAT > functionality is no more available and VBAT pin should be connected to > VDD" Du hast Recht, was die Passage angeht. Und das wäre prima, weil dann der Jumper entfallen kann. Ich habe meine Aussage allerdings aus dem _Getting started with STM32F7 Series MCU hardware development_ (AN4661), Abschnitt 1.2: _VBAT = 1.65 to 3.6 V: power supply for the RTC, the external clock 32 kHz oscillator and backup registers (through power switch) when VDD is not present._ _The VBAT pin can be connected to the external battery (1.65 V < V BAT < 3.6 V). If no external battery is used, it is recommended to connect this pin to VDD with a 100 nF external ceramic decoupling capacitor._ Also Vdd oder nicht? Grundsätzlich hast Du Recht, ich halte mich aber gerne an Recommendations.
Entschuldige, ich habe nicht gesehen, dass Du die Recommendation zitiert hast, meinen Beitrag konnte ich aber nicht mehr editieren. Zum Warum kann ich nur sagen, weil es empfohlen wird -- das reicht mir in den Regel. Aber ich probiere es auch mit einem unverbundenen Pin aus, was wohl funktionieren wird. Die Platine ist zur Zeit sowieso zum Fertigen in China, aber für die nächste Version überlege ich mir das noch. Also Danke für den Hinweis!
Ich muss mich nochmal korrigieren: Du hast etwas Anderes zitiert! :-)
:
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.