Arduino der bei 1,8V Versorgungsspannung läuft gesucht!

Hallo zusammen,
ich beschäftige mich gerade mit dem Thema „Energy Harvesting“ und bräuche für mein aktuelles Projekt einen Arduino der bei möglichst kleiner Versorgungsspannung läuft. Wie im Datenblatt angegeben würde ich meinen Atmega328P gerne bei 1,8V und 4Mhz laufen lassen. Nach mehreren Stunden Internetrecherche habe ich nicht mehr als diesen Link zu dem Thema gefunden: Low powered tracker 1.8V 4Mhz “Arduino” | Ava High Altitude Balloon Project
Leider hat es mit der Anleitung bei mir nicht funktioniert. Weder die PATH environmental variable lies sich bei mir aufm Mac setzten noch das Makefile ausführen. Kann mir damit vlt. jemand helfen? Oder kennst sonst jemand ein Tutorial wo das besser beschrieben ist? Gehe ich recht der Annahme das es nicht reicht in der boards.txt ein neues Board anzulegen weil ich auch die Brown Out Detection im Bootloader runtergesetzt müsste?

Vielen Dank und viele Grüße
Simon

Simon12:
Gehe ich recht der Annahme das es nicht reicht in der boards.txt ein neues Board anzulegen weil ich auch die Brown Out Detection im Bootloader runtergesetzt müsste?

Nein, die Änderung bzw. Ergänzung der "boards.txt" sollte ausreichen.

Die BrownOut-Settings sind mit in den "Fuses" codiert.

Du mußt Dir bei solchen Manipulationen nur über die Risiken und Nebenwirkungen klar sein:

  1. Du benötigst einen ISP-Programmer, um einmal mit der Funktion "Bootloader installieren" die Fuses entsprechend zu setzen

  2. Der Bootloader wird in jedem Fall unbrauchbar und Du mußt alle Sketche mit dem ISP-Programmer hochladen.

  3. Bei den mit der Arduino-Software mitgelieferten Arduino-Libraries wird Dir nur garantiert, dass diese bei 8 und 16 MHz Systemtakt funktionieren. HardwareSerial ist wohl so programmiert, dass Serial auch bei anderen Taktraten funktioniert, andere Libraries eher nicht. Und bei Libraries von Drittanbietern, die irgendwelche Timings eingebaut haben, die nicht aus millis() und delay() abgeleitet werden, wird ggf. nur 16 MHz als Systemtakt unterstützt. Je nachdem, was Du an Libraries einsetzen möchtest, kannst Du Dich also nicht darauf verlassen, dass diese Libraries auch mit abweichendem Systemtakt in jedem Fall einwandfrei funktionieren werden.

jurs:
3. Bei den mit der Arduino-Software mitgelieferten Arduino-Libraries wird Dir nur garantiert, dass diese bei 8 und 16 MHz Systemtakt funktionieren. HardwareSerial ist wohl so programmiert, dass Serial auch bei anderen Taktraten funktioniert, andere Libraries eher nicht. Und bei Libraries von Drittanbietern, die irgendwelche Timings eingebaut haben, die nicht aus millis() und delay() abgeleitet werden, wird ggf. nur 16 MHz als Systemtakt unterstützt. Je nachdem, was Du an Libraries einsetzen möchtest, kannst Du Dich also nicht darauf verlassen, dass diese Libraries auch mit abweichendem Systemtakt in jedem Fall einwandfrei funktionieren werden.

Garantiert wird erstmal überhaupt nichts hier bei Arduino - Freunden.
Aber mit Libraries hat man meist viel Glück und sonst den Sourcecode zur Verfügung. :wink:
4MHz ist eher ungewöhnlich, und geht nicht mit einem Arduino (?), sondern nur mit etwas selbstgebautem. Den internen Takt zu verwenden und den auf 1MHz runterzusetzen, sollte mit entsprechenden boards.txt und evtl. avrdude.conf Einträgen zu machen sein.

Danke für deine Antwort!
Könnte der Eintrag in boards.txt dann in etwa so aussehen:

lowPower.name=Low Power Arduino (1.8V, 4 Mhz)
lowPower.upload.protocol=arduino
lowPower.upload.maximum_size=30720
lowPower.upload.speed=57600
lowPower r.bootloader.low_fuses=0xfd
lowPower.bootloader.high_fuses=0xda
lowPower.bootloader.extended_fuses=0xff
lowPower.bootloader.path=atmega
lowPower.bootloader.file= optiboot_atmega328.hex
lowPower.bootloader.unlock_bits=0x3F
lowPower.bootloader.lock_bits=0x0F
lowPower.build.mcu=atmega328p
lowPower.build.f_cpu=4000000L
lowPower.build.core=arduino
lowPower r.build.variant=standard

Die Fuse-Settings die in dem geposteten Link stehen sollten ja für 1,8V richtig gesetzt sein. Hab ich dich richtig verstanden, dass es egal ist was für eine Bootloader ich bei bootlaoder.file eintrage da er nicht gebraucht wird?
Ist der Upload mit „Arduino as ISP“ auch möglich oder brauch ich einen richtigen ISP-Programmer? Entfällt dann das Brennen des Bootloaders und ich kann den Sketch direkt über die ISP-Schnittstelle uploaden?
Für mein Projekt brauch ich die RC-Switch Library und die Low-Power Library von www.rocketscream.com. Beide sind nicht gerade unkritisch was das Timing angeht. Wie kann ich denn rausfinden wie das Timing in den jeweiligen Libraries realisiert wird? Kommt es nicht drauf an welchen Timer die Library verwendet?

Vielen Dank und viele Grüße
Simon

Simon12:
Die Fuse-Settings die in dem geposteten Link stehen sollten ja für 1,8V richtig gesetzt sein.

Keine Ahnung, ich bin nicht so der Fuses-Spezialist.

Simon12:
Hab ich dich richtig verstanden, dass es egal ist was für eine Bootloader ich bei bootlaoder.file eintrage da er nicht gebraucht wird?

Mehr noch: Du kannst Die "bootloader.file=" Zeile komplett weglassen! Dann wird mit einem kompatiblen ISP erst gar kein Bootloader auf den Controller gebrannt. Es funktioniert sowieso kein einziger Standard-Bootloader mit 4 MHz Systemtakt. Wenn Du Dir also keinen eigenen speziellen Bootloader programmierst, ist es völlig sinnlos, da eine Datei einzutragen. Aber es schadet auch nicht.

Simon12:
Ist der Upload mit „Arduino as ISP“ auch möglich oder brauch ich einen richtigen ISP-Programmer?

Nein, vermutlich nicht. Ich habe es mal probiert, mit "Arduino as ISP" Controller auf 1 MHz internen Takt mit Arduino as ISP zu brennen, aber der Controller ist mit 1 MHz zu langsam, um mit der ISP-Datenrate noch mitzukommen. Mit 8 MHz internem Takt klappt es noch. Mit 4 MHz müßtest Du ausprobieren. Im Normalfall benötigst Du einen richtigen ISP, an dem Du Controller mit besonders niedriger Taktrate auch mit einer besonders niedrigen Brennrate brennen kannst. Im Endeffekt hängt es von der Kompatibilität Deines ISP-Programmers zur Arduino-Software und zum Brennen besonders langsamer Controller ab, ob es funktioniert. Mit "Arduino as ISP" hatte ich bei langsamen Controller-Taktraten (1 MHz) jedenfalls nur Probleme und ich wüßte nicht, wie diese damit vermieden werden können.

Simon12:
Entfällt dann das Brennen des Bootloaders und ich kann den Sketch direkt über die ISP-Schnittstelle uploaden?

Das eigentliche "Brennen eines Bootloaders" entfällt bzw. ist überflüssig. Die Funktion "Bootloader installieren" muß nur einmal ausgeführt werden, um die Fuses am Controller entsprechend zu setzen. Danach braucht immer nur der Sketch über die ISP-Schnittstelle hochgeladen werden.

Simon12:
Für mein Projekt brauch ich die RC-Switch Library und die Low-Power Library von www.rocketscream.com. Beide sind nicht gerade unkritisch was das Timing angeht. Wie kann ich denn rausfinden wie das Timing in den jeweiligen Libraries realisiert wird? Kommt es nicht drauf an welchen Timer die Library verwendet?

Wie Michael schon schrieb, bei Open Source Software bekommst Du ja immer den Quellcode mitgeliefert. Wenn Deine Libraries mit hardwarenaher Timer-Programmierung arbeiten, dann wirst Du Dich in den Quellcode einarbeiten und die Timerinitialisierung selbst anpassen müssen, damit diese Libraries überhaupt mit einer anderen Taktrate als 16 MHz funktionieren.

Das ganze Softwarekonzept von Arduino und den "fertigen Libraries" basiert auf der Verwendung von "standardisierter Hardware". Sobald diese Grundvoraussetzung nicht mehr gegeben ist, mußt Du die hardwarenah programmierten Dinge selber programmieren oder entsprechend anpassen.

Die Fuse-Settings die in dem geposteten Link stehen sollten ja für 1,8V richtig gesetzt sein.

Ja, die sollten so funktionieren, wenn Du einen externen Quartz als Taktquelle einsetzt.

Für mein Projekt brauch ich die RC-Switch Library und die Low-Power Library von www.rocketscream.com. Beide sind nicht gerade unkritisch was das Timing angeht.

Wo sind die Links zu den verwendeten Bibliotheken?

So...nach mehreren Stunden hat es gestern Abend dann doch noch geklappt! Nochmals vielen Dank für den guten Input hier!
Die Fuse-Settings mussten noch etwas abgeändert werden:

ulp.name=Low Power Arduino (1.8V, 1 Mhz Internal CLK)
ulp.upload.protocol=stk500
ulp.upload.maximum_size=30720
ulp.upload.speed=57600
ulp.bootloader.low_fuses=0x62
ulp.bootloader.high_fuses=0xDA
ulp.bootloader.extended_fuses=0x06
ulp.bootloader.path=arduino:atmega
ulp.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex
ulp.bootloader.unlock_bits=0x3F
ulp.bootloader.lock_bits=0x0F
ulp.build.mcu=atmega328p
ulp.build.f_cpu=1000000L
ulp.build.core=arduino
ulp.build.variant=standard

Ließ sich problemlos mit dem Arduino als ISP-Programmer brennen bzw. uploaden. Die Low-Power Library läuft ohne Probleme, in der RC-Switch Library GitHub - sui77/rc-switch: Arduino lib to operate 433/315Mhz devices like power outlet sockets. mussten die Pulslängen angepasst werden. Momentan läuft der Arduino mit 1 Mhz über die interne Clock. Ich würde aber gerne die maximale Geschwindigkeit bei 1,8V ausreizen, sprich 4Mhz Taktfrequenz. Nachdem ich mir den Fuse Calculator AVR® Fuse Calculator – The Engbedded Blog angeschaut habe scheint es aber so zu sein, dass ich über das [CKDIV8=0]-Register entweder keinen Prescaler setze oder ihn auf 1/8 setze kann, was mir meine 1Mhz liefert. Kann man da vlt. noch woanders schrauben um auf 4Mhz zu kommen? Alternativ würde ich einen externen Quarz verwenden. Das sollte ja problemlos funktionieren, oder?

Ohne den externen Quarz (bzw. Resonator) wirst Du nicht auf die 4MHz kommen. Achtung: wenn Du die Fuses mal auf externen Taktgeber gesetzt hast, kannst Du sie nicht mehr ändern, ohne den Taktgeber auch wirklich angeschlossen zu haben.