Forum: Mikrocontroller und Digitale Elektronik arduino Pro Mini: BOD_OFF funktioniert nicht


von Tim S. (Firma: Google) (tuxut83)


Lesenswert?

Hallo Gemeinde,

ich verwende derzeit einen Batterie-betriebenen Arduino Pro Mini (3,3V, 
8MHz, extern Oszi) in Verbindung mit der LowPower-Library von Rocket 
Scream Electronics.

https://github.com/rocketscream/Low-Power/blob/master/LowPower.cpp

Das Ganze läuft auch sehr gut bzw. ich sehe dass der Atmega328P in 
seinen PowerDown-Modus geht und nur noch 4,6uA verbraucht.

Folgender Code wird verwendet:
1
// - Sketch for 'power down' mode
2
#include "LowPower.h"
3
4
void setup() {
5
}
6
7
void loop() {
8
  // Sleep for 8 s with ADC module and BOD module off
9
  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
10
}

Was allerdings nicht geht:
Sobald die Batteriespannung unter 2,7V fällt schaltet der 
Mikrocontroller ab. Ich hatte ehrlich gesagt erwartet, dass er zumindest 
noch bis 2,0V laufen würde...

Das deutet doch sehr daraufhin, dass irgendwas mit der 
BrownOut-Detection nicht richtig ist oder? Kann es am externen Takt 
liegen?

Muss ich irgendwelche Fuses anders setzen? Wenn ja, wie macht man das 
(unter der ArduinoIDE)?

herzlichen DANK und schöne Grüße

von Rainer U. (r-u)


Lesenswert?

Tim S. schrieb:
> 2,7V fällt schaltet der
> Mikrocontroller ab. Ich hatte ehrlich gesagt erwartet, dass er zumindest
> noch bis 2,0V laufen würde...

Steht das so im Datenblatt? Und benutzt Du den Spannungsregler auf dem 
Board?

Tim S. schrieb:
> Das deutet doch sehr daraufhin, dass irgendwas mit der
> BrownOut-Detection nicht richtig ist oder?

Das kannst Du per fuse abschalten..

von Jan L. (ranzcopter)


Lesenswert?

Tim S. schrieb:
> Muss ich irgendwelche Fuses anders setzen? Wenn ja, wie macht man das
> (unter der ArduinoIDE)?

...hier ist das recht übersichtlich zusammengefasst:

https://github.com/joe-speedboat/Arduino-LowPower

von S. Landolt (Gast)


Angehängte Dateien:

Lesenswert?

Ich glaube nicht, dass der BOD aktiv ist, er verbraucht deutlich mehr 
als die genannten 4.6 uA.

von Tim S. (Firma: Google) (tuxut83)


Lesenswert?

Okay, da der Stromverbrauch so gering ist, kann ich jetzt davon 
ausgehen, dass BOD_OFF doch wirksam ist.

Nun stellt sich mir natürlich die Frage woran es noch liegen könnte...
Die Power-LED und der Spannungsregler sind von mir vom Board entfernt 
worden.
Die Batterie bzw. VCC und GND hängen an den Pins vom UART Header.

von Peter D. (peda)


Lesenswert?

Tim S. schrieb:
> Sobald die Batteriespannung unter 2,7V fällt schaltet der
> Mikrocontroller ab.

Wie stellst Du das fest?

Deine Funktion scheint den Watchdog zu enablen. D.h. nach 8s wacht er 
auf, BOD wird wieder aktiv und Reset.

Nimm mal PCINT zum Aufwachen, nachdem die VCC wieder auf >2,7V gestiegen 
ist.

von Reiner_Gast (Gast)


Lesenswert?

Tim S. schrieb:
> ich verwende derzeit einen Batterie-betriebenen Arduino Pro Mini (3,3V,
> 8MHz, extern Oszi) in Verbindung mit der LowPower-Library von Rocket
> Scream Electronics.

Ein Blick ins Datenblatt (ganz oben, auf Seite 2) verrät:

Speed Grade:
̶ 0 - 4MHz@1.8 - 5.5V, 0 - 10MHz@2.7 - 5.5.V, 0 - 20MHz @ 4.5 - 5.5V

Mit 8Mhz ist halt bei 2,7 Volt Schluß

Wenns ab 1,8 Volt funktionieren soll, dann dürfen es max. 4MHz sein

von Rainer U. (r-u)


Lesenswert?

Reiner_Gast schrieb:
> Mit 8Mhz ist halt bei 2,7 Volt Schluß

Darauf zielte meine allererste Frage.. :-)

von Tim S. (Firma: Google) (tuxut83)


Lesenswert?

Okay, gibt es nun einen (einfachen) Weg, den Takt herunter zu teilen, 
damit ich auf 4Mhz komme?

Welche Auswirkungen hätte dies für meine Arduino-Entwicklungsumgebung?
Es ist wichtig für mich, dass die Schnittstellen SPI, I2C und UART 
korrekt laufen (bei geringen Datenraten).

Wie gesagt, derzeit ist der "Standard"-Oszillator von 8Mhz auf dem Board 
verlötet.

DANKE!

von Tim S. (Firma: Google) (tuxut83)


Lesenswert?

Vielleicht so?
1
#include <avr/power.h>
2
3
void setup ()
4
  {
5
  // slow clock to divide by 2
6
  clock_prescale_set (clock_div_2);
7
  } // end of setup

von Reiner_Gast (Gast)


Lesenswert?

Tim S. schrieb:
> DANKE!
Ungeduldig? Da studiere mal den Abschnitt "System Clock and Clock 
Options" (Kapitel 9) des Datenblatts vom ATMega328P

> Okay, gibt es nun einen (einfachen) Weg, den Takt herunter zu teilen,
> damit ich auf 4Mhz komme?
> Wie gesagt, derzeit ist der "Standard"-Oszillator von 8Mhz auf dem Board
> verlötet.
>

Jein, an den 8MHz (intern oder extern) kannst du nix ändern, weil 
verlötet bzw im Chip drinnen.

Du könntest höchstes die Fuse CKDIV8 setzen oder wie von dir beschrieben 
per clock_prescale_set (in der Tat entspricht die Fuse CKDIV8 einem 
clock_prescale_set(clock_div_8))

>
> Welche Auswirkungen hätte dies für meine Arduino-Entwicklungsumgebung?
> Es ist wichtig für mich, dass die Schnittstellen SPI, I2C und UART
> korrekt laufen (bei geringen Datenraten).
>

Genau hier liegt das Problem... Alle Taktraten der Peripherie Module des 
ATMega328P werden aus dem Basistakt hergeleistet.

Während sich ohne Anpassung des Codes bei SPI und I2C, die ja ein 
Clocksignal haben, "lediglich" die Geschwindigkeit ändern sollte, stimmt 
beim UART z.B. die Komplette Baudraten Berechnung nicht mehr und es 
kommt eine krumme Baudrate heraus. Ebenfalls würde die millis() Funktion 
entsprechend langsamer zählen.

Die Arduino IDE ist halt auf 8/16 MHz Takt ausgelegt. Das Stichwort ist 
hier eine Compileranweisung namens "F_CPU", in der die aktuelle 
Geschwidigkeit eingetragen ist.  Irgendwo in den Tiefen der ganzen Libs 
des Arduino Framework ist das gesetzt.

Hier stößt das Arduino Framework an eine seiner Grenzen und evtl. 
solltest du dir überlegen auf z.B. das ATMel Studio als 
Entwicklungsumgebung umzusteigen.

von S. Landolt (Gast)


Lesenswert?

Wenn Peter Dannegger recht hat (und wann hat er mal nicht recht), dann 
steht zurzeit BOD auf 2.7 V, d.h. das Extended Fuse Byte auf FD - das 
wäre jetzt mal zu verifizieren; zusätzlich zur Taktabsenkung müsste dann 
also für die angestrebten 2.0 V der BOD permanent abgeschaltet (FF) 
oder auf 1.8 V (FE) gestellt werden.

von Manfred (Gast)


Angehängte Dateien:

Lesenswert?

Wenn ich das auf 
http://www.home-automation-community.com/arduino-low-power-how-to-run-atmega328p-for-a-year-on-coin-cell-battery/ 
richtig sehe, steht es dort

"LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); puts the MCU in 
SLEEP_MODE_PWR_DOWN for 16 ms to 8 s, depending on the first argument. 
It disables the ADC and the BOD."

Jetzt wäre mal die LowPower-library zu untersuchen, ob BOD_OFF auch 
global wirksam ist.

von S. Landolt (Gast)


Lesenswert?

> BOD_OFF auch global wirksam

Wenn der BOD eingeschaltet ist (per Extended Fuse Byte), dann lässt er 
sich m.E. softwaremäßig nur temporär deaktivieren, nämlich nur während 
des unmittelbar folgenden sleep. Und das steht im Widerspruch zum 
verlangten Betrieb bis 2.0 V herab.

von S. Landolt (Gast)


Angehängte Dateien:

Lesenswert?

nachgereicht

von Reiner_Gast (Gast)


Angehängte Dateien:

Lesenswert?

Je nach Dauer des Schlafes / Entladung der Batterie macht es ggf. Sinn, 
dass nach dem Aufwachen die Spannungsversorgung durch den BOD geprüft 
wird.

Hier würde sich ein Absenken der BOD Levels über die Fuses auf 1.8 Volt 
anbieten (siehe Anlage)

von Manfred (Gast)


Lesenswert?

Reiner_Gast schrieb:
> Je nach Dauer des Schlafes / Entladung der Batterie macht es ggf. Sinn,

Ist leider im Datenblattauszug von S. Landolt eindeutig, dass sich BOD 
per Software nicht abstellen lässt. Damit dürfte es aus der 
Arduino-Umgebung heraus wohl nicht machbar sein - es sei denn, man 
fummelt in deren Definitionsdateien herum.

von Einer K. (Gast)


Lesenswert?

Reiner_Gast schrieb:
> Hier stößt das Arduino Framework an eine seiner Grenzen
Nein!
Grenzen hat es, aber nicht an der Stelle.
F_CPU ist in der Board Definition angenagelt.
Diese kann man editieren, das ist aber, nun ja, unelegant....

Also:
Für Extrawürste, erzeuge eine eigene Boarddefinition.
Ist alles keine Raketenwissenschaft.

von Tim S. (Firma: Google) (tuxut83)


Lesenswert?

Okay, so wie ich es jetzt verstanden habe ist BOD_OFF also wirklich nur 
in dem Sleep von 8s wirksam?
Wenn der Controller daraus navh 8sek wieder "aufwacht" prüft er die 
Spannung und schaltet bei 2,7V ab?

Das würde auch zu dieser Aussage passen:
https://iot-playground.com/blog/2-uncategorised/9-arduino-low-power-sensor

Hier ist erläutert, dass ein Pro Mini noch bei 2,4V @8MHz laufen sollte 
(siehe Diagramm).

Wenn ich nun eine neue Boarddefinition unter ArduinoIDE anlegen und dort 
die Fuses definiere (BODLEVEL) ist das dann schon ausreichend oder muss 
ich die Fuses noch "richtig" umprogrammieren via ISP?

Herzlichen Dank!

von Einer K. (Gast)


Lesenswert?

Tim S. schrieb:
> Wenn ich nun eine neue Boarddefinition unter ArduinoIDE anlegen und dort
> die Fuses definiere (BODLEVEL) ist das dann schon ausreichend oder muss
> ich die Fuses noch "richtig" umprogrammieren via ISP?

Wenn du die Fuses in der Boarddefinition anlegst/änderst, musst du sie 
noch per "Bootloader brennen" auf den µC schreiben.

von Manfred (Gast)


Lesenswert?

Arduino F. schrieb:
> Wenn du die Fuses in der Boarddefinition anlegst/änderst, musst du sie
> noch per "Bootloader brennen" auf den µC schreiben.

Geht das über den vorhandenen Bootloader oder nur per ISP?

von Einer K. (Gast)


Lesenswert?

Offensichtlich kannst du dich nicht selber kundig machen.
Und nein, auf Google vorlesen, habe ich gerade wenig Lust.

Ein letzter Suchtipp: "Arduino Bootloader brennen"

von Manfred (Gast)


Lesenswert?

Arduino F. schrieb:
> Offensichtlich kannst du dich nicht selber kundig machen.

Fanboy - ich kann einen Bootloader brennen, wenn der fehlt, dazu habe 
ich ISP-Hardware, die von der IDE unterstützt wird!

Die Frage ist durchaus ernst gemeint, ob sich per USB ein vorhandener 
Bootloader überschreiben lässt.

Beitrag #5318824 wurde von einem Moderator gelöscht.
von Einer K. (Gast)


Lesenswert?

Manfred schrieb:
> Die Frage ist durchaus ernst gemeint, ..
Ja, das glaube ich dir.

Meine Ansage übrigens auch.

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Manfred schrieb:
> Die Frage ist durchaus ernst gemeint, ob sich per USB ein vorhandener
> Bootloader überschreiben lässt.
Naja, das wuerde bedeuten, dass sich der vorhandene Bootloader selbst 
ueberschreiben muesste. => Wenn der Bootloader also nicht entsprechend 
geschrieben ist (wobei ich nicht weiss, ob das moeglich ist), dass er 
sich selbst erstmal in den RAM kopiert (und von da ausgefuehrt werden 
kann), dann wird das nichts. Du wuerdest dir den Ast auf dem du sitzt 
unterm Hintern absaegen.

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.