arduino Pro Mini: BOD_OFF funktioniert nicht

OP (Firma: Google) #5316661
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
#5316679
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..
OP (Firma: Google) #5316872
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.
Gast #5317138
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
OP (Firma: Google) #5317377
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!
Gast #5317412
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.
Gast #5317489
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.
Gast #5317537
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.
Angehängte Dateien:
Gast #5317565
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.
Gast #5317698
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.
Gast #5317788
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.
OP (Firma: Google) #5317893
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!
Gast #5318042
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.
Gast #5318799
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.
(Firma: RUB) #5319635
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren