Go Down

Topic: Mega 2560 - Power Saving - Strom sparen (Read 17115 times) previous topic - next topic

Doc_Arduino

Hallo,

habe das heute nochmal mit der ganzen Jumperei wiederholt. Mit meinem Board ohne 5V Spannungswandler.

Alle Werte im Sleep Mode:

nur 5V anlegt: 21,4mA
5V angelegt gelassen und Jumper gesetzt: 9,9mA
Jumper gesetzt gelassen, 5V weggenommen und wieder angelegt: 12,2mA
5V bleiben angelegt und Jumper entfernt: 16,2mA
Jumper wieder gesetzt: 9,9mA

Bedeutet wirklich, der Jumper darf erst nach Spannung anlegen gesetzt werden um minimalen Strom zu messen.

Dann habe ich den Code um Deine Idee ergänzt und siehe da, funktionert stabil und dauerhaft. Egal ob ich 5V wegnehme und wieder anlege oder mehrfach resete, lande immer im Sleep bei 9,9mA. Wenn das mal nicht geil ist.   :)   Auf die Idee einfach einen Pin dafür zubenutzen wäre ich wohl nicht gekommen. Hätte das mit Transisitor erstmal gelöst bzw. lösen wollen. Habe vorher noch sicherheitshalber den Resetstrom vom 16U2 gemessen. Sind 0,6mA. Wirklich nahe den ausgerechneten 0,5mA.

Besten Dank für die Unterstützung!

Code: [Select]

/* Sleep Demo Serial
* -----------------
* Example code to demonstrate the sleep functions in a Arduino. Arduino will wake up
* when new data is received in the serial port USART
* Based on Sleep Demo Serial from http://www.arduino.cc/playground/Learning/ArduinoSleepCode

"Aufwach-Taster" an Pin 2 gegen Masse

Originalboard Arduino Mega 2560
Idle 59,2mA   Sleep 22,3mA   ohne 16U2 Jumper
Idle 54,5mA   Sleep 15,5mA   mit Jumper auf GND-Reset für 16U2

ohne Spannungsregler auf Board, abgegelötet
Idle 55,1mA   Sleep 16,5mA   ohne 16U2 Jumper
Idle 49,9mA   Sleep  9,8mA   mit Jumper auf GND-Reset für 16U2

alles Sleep Mode nochmals durchgemessen:
nur 5V anlegen: 21,4mA
5V anlegt und Jumper gesetzt: 9,9mA
Jumper gesetzt gelassen, 5V weggenommen und wieder angelegt: 12,2mA
5V bleiben angelegt und Jumper entfernt: 16,2mA
Jumper wieder gesetzt: 9,9mA

Reset Pin 16U2 ergänzt für sicheren und dauerhaften 9,9mA Effekt.

*/   
   

#include <avr/sleep.h>

#define RESET16U2  22       // Reset für 16U2 an Pin 22

int sleepStatus = 0;        // variable to store a request for sleep
int count = 0;              // counter

int ledPin = 13;            // LED connected to digital pin 13
//int interruptPin = 10;      // LED to show the action of a interrupt
int wakePin = 2;            // active LOW, ground this pin momentary to wake up
//int sleepPin = 12;          // active LOW, ground this pin momentary to sleep
int ledState = LOW;

void wakeUpNow()        // here the interrupt is handled after wakeup
{
  // execute code here after wake-up before returning to the loop() function
  // timers and code using timers (serial.print and more...) will not work here.
  // digitalWrite(interruptPin, HIGH);  // LED an Pin 10 ein
}


void sleepNow()
{
    /* Now is the time to set the sleep mode. In the Atmega8 datasheet
     * http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf on page 35
     * there is a list of sleep modes which explains which clocks and
     * wake up sources are available in which sleep modus.
     *
     * In the avr/sleep.h file, the call names of these sleep modus are to be found:
     *
     * The 5 different modes are:
     *     SLEEP_MODE_IDLE         -the least power savings
     *     SLEEP_MODE_ADC
     *     SLEEP_MODE_PWR_SAVE
     *     SLEEP_MODE_STANDBY
     *     SLEEP_MODE_PWR_DOWN     -the most power savings
     *
     *  the power reduction management <avr/power.h>  is described in
     *  http://www.nongnu.org/avr-libc/user-manual/group__avr__power.html
     */ 
       
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);   // sleep mode is set here

  sleep_enable();          // enables the sleep bit in the mcucr register
                           // so sleep is possible. just a safety pin
 
    /* Now it is time to enable an interrupt. We do it here so an
     * accidentally pushed interrupt button doesn't interrupt
     * our running program. if you want to be able to run
     * interrupt code besides the sleep function, place it in
     * setup() for example.
     *
     * In the function call attachInterrupt(A, B, C)
     * A   can be either 0 or 1 for interrupts on pin 2 or 3. 
     *
     * B   Name of a function you want to execute at interrupt for A.
     *
     * C   Trigger mode of the interrupt pin. can be:
     *             LOW        a low level triggers
     *             CHANGE     a change in level triggers
     *             RISING     a rising edge of a level triggers
     *             FALLING    a falling edge of a level triggers
     *
     * In all but the IDLE sleep modes only LOW can be used.
     */

  attachInterrupt(0,wakeUpNow, LOW); // use interrupt 0 (pin 2) and run function
                                     // wakeUpNow when pin 2 gets LOW
     
  sleep_mode();            // here the device is actually put to sleep!!

                           // THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP
  sleep_disable();         // first thing after waking from sleep:
                           // disable sleep...
 
  detachInterrupt(0);      // disables interrupt 0 on pin 2 so the
                           // wakeUpNow code will not be executed
                           // during normal running time.
   
}


void setup()
{
  pinMode(RESET16U2,OUTPUT);       // 16U2 wird dauerhaft
  digitalWrite(RESET16U2, LOW);    // im Reset Mode gehalten, spart 2mA
 
  pinMode(ledPin, OUTPUT);         // LED connected to digital pin 13

  pinMode(wakePin, INPUT);         // active LOW, ground this pin momentary to wake up
  digitalWrite(wakePin, HIGH);     // Pullup aktiv
     
  attachInterrupt(0,wakeUpNow, LOW);   // use interrupt 0 (pin 2) and run function
                                       // wakeUpNow when pin 2 gets LOW
                           
}


void loop()
{
 
   if ( digitalRead(2) == LOW ) {
     digitalWrite(ledPin, HIGH);     
   }
   else {
     digitalWrite(ledPin, LOW);
     sleepNow();                   // sleep function called here
   }
     

}




Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Doc_Arduino

Hallo,

paßt hier vielleicht besser rein, als in den anderen Thread mit dazu unpassender Betreffzeile.


Mit Ausbau vom IC7 (OPV) und T1 (Mosfet) komme ich nun auf 9,6mA. Bei 4,96V gemessen direkt am Arduino. Ist immer noch nicht der große Bringer. Da bleibt doch wirklich nur noch der Ausbau vom 16U2?  Der sich im Reset-Zustand bestimmt immer noch wenige mA gönnt. Oder? Wie seht ihr das?

Warum ist der Schwellwert für die  Brownout Detection mit 2,7V so niedrig angesetzt? Hab ich mir gerade überlegt. Wenn der µC mit 16MHz mindestens 4,5V benötigt.


Wenn ich den 16U2 nun doch vielleicht ausbaue, muß ich danach über den ISP Anschluss programmieren. Ist der AVR mkII immer noch der geeigneste Programmer dafür? Ist der mit dem kommenden Arduino Zero kompatibel?
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

sschultewolter

#32
Oct 23, 2014, 04:53 pm Last Edit: Oct 23, 2014, 04:56 pm by sschultewolter
Hallo Doc,

über den ISP Anschluss kannst du die M0 Cortex nicht programmieren!
Anstatt des AVRISP mkii bräuchtest du einen AVR JTAGICE mkII bzw. AVR JTAGICE mkIII. Die Preise sind da aber ganz andere. Letztere wäre noch so eben verschmerzbar.

Warum in den Fuses 2V7 für BOD genutzt wird, kann ich dir nicht genau sagen. Kannst es doch auf 4V3 setzen. Alternativ kannst du das ganze auch noch komplett abschalten, wenn du andere Vorkehrungen treffen kannst.
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

Doc_Arduino

Hallo,


nochmal. Mit einem AVR JTAGICE mkII oder AVR JTAGICE mkIII kann man einen "AVR Cortex" am ISP programmieren? Das funktioniert dann nur noch über AVR Studio, nicht mehr mittels Arduino IDE?

Damit sich der AVR JTAGICE lohnt, könnte man ihn zum debuggen verwenden. Ist der Debugger mit dem Kauf freigeschalten oder muß man dafür extra bezahlen? Der Debugger von Visual Micro kostet ja Geld. Der vom AVR Studio sicherlich auch. Weist Du mehr darüber?

Am liebsten würde ich den Mega2560 dauerhaft mit 8MHz laufen lassen. Das geht nur über Bootloader flashen am ISP und Quarzwechsel. Richtig? Meine Sorge ist aber, dass danach sämtliche Timings nicht mehr stimmen. Ist die Annahme auch richtig? Also dann ein delay(5)  in der Software, als Bsp., in Wirklichkeit dann 10ms sind. Was die Hardwareschnittstellen machen weis ich nicht. ?


Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

sschultewolter

Hallo Doc,

ich gehe mal davon aus, dass wenn du dir auch nur den mkIII zulegen würdest. Der ICE mkII ist doch recht teuer für den Privaten gebrauch.

AVR JTAGICE mkIII
• Unterstützt Programmieren via JTAG, SPI, PDI, aWire
• Unterstützt Debuggen via debugWire, JTAG, PDI, aWire

Wobei du den Zero auch einfach wie den Due über USB programmieren kannst. Habe noch keinen JTAG Programmer.

Für die AVR 8Bit kannst du fast jeden beliebigen Programmer von der Bucht nehmen. Sinnvoller ist dort aber direkt etwas gescheites zu holen um sich viel Arbeit zu ersparen. Die Diamex die ich habe sind hochwertig verbaut (oranges Acrylglas) aber können auch manchmal zicken. Habe mir den orginalen von Atmel bereits im Reichelt Warenkorb gelegt
http://www.reichelt.de/Programmer-Entwicklungstools/AT-AVR-ISP/3/index.html?&ACTION=3&LA=2&ARTICLE=45040&GROUPID=2969&artnr=AT+AVR+ISP

Zum Debugger kann ich nichts sagen. Habe ich noch nicht im Einsatz gehabt.
 Den Visual Micro Debugger kann man soweit ich weiß auch testen.

Den Mega2560 nur mit 8MHz zu betreiben ist kein Problem. Musst nur aufpassen das alles reibungslos verläuft. Resonator 16MHz stecken lassen, über AVR Studio die Fuses umsetzen für die Taktquelle. Programmieren. Nun alten Resonator auslöten und 8MHz verbauen, oder diese weglassen und die interne Taktquelle nutzten.

Timing ist, solange du das Programm nicht änderst natürlich falsch. Aus delay(5) wird 10. In der IDE sollte es reichen, wenn du das #define F_CPU überschreibst. Danach passen die Timings wieder.

Kann leider nicht nachschauen, keine A IDE auf dem Laptop.
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

Spexx

Schau dir mal die Datei "board.txt" an. Dort kannst du dir einen neuen Eintrag für den Mega2560 erstellen mit 8MHz. Du kannst dann in der Arduino IDE dieses Board auswählen, somit passt das Timing dann auch wieder.

Doc_Arduino

Hallo,

Danke ihr zwei. Das bringt mich auf eine neue Idee. Am 8MHz Quarz sollte es nicht scheitern. Aber. Wäre es denkbar den Takt in der Board.txt zu ändern und im Sketch gleich zu Anfang den Takt auf 8MHz zu ändern? Alles weiterhin mit 16MHz Quarz. Oder kommt dann alles durcheinander?

Wird eigentlich der Inhalt der Board.txt jedesmal beim Sketch Upload mit neu übertragen? Also jedesmal die Fuse Bits usw. neu gesetzt? Oder geht das nur mit so einem ISP Programmer? Oder sagt die Board.txt nur dem Compiler was gespielt wird?





Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Doc_Arduino

Hallo,


obige Fragen bleiben bestehen. Nur weis ich jetzt etwas mehr über die Programmer/Debugger mehr.

Die AVR µC kann man mit einem mkII oder mkIII nur per ISP programmieren. Nicht debuggen.
Mit Debugfunktion wäre der AVR One! oder JTAGICE3 notwendig.

Wenn man AVR und AVR Cortex programmieren/debuggen möchte muß man zum neuen Atmel-ICE greifen. Der SAM-ICE versteht sich nur mit AVR Cortex µC.

Der neue Atmel ICE kostet bei Reichelt 111,- €uro. Etwas viel für meine Nutzung.

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Spexx

Die Fuses aus der Board.txt werden nur gesetzt, wenn du auf "Burn Bootloader" klickst, also nicht bei jedem Upload.

Wenn ich mich nicht Irre, dann muß der Takt in der Board.txt und der eingestellte im Mikrocontroller der gleiche sein, sonst kannst du keinen Sketch uploaden. Ob es nun einen Unterschied macht, den Takt über den Sketch festzulegen, kann ich dir auch nicht sagen.

Doc_Arduino

Hallo,

okay, denke das erstmal verstanden zu haben. Danke!

Noch eine kleine Korrektur. Der AVRISP mkII ist ein reiner Programmer. Der Rest ist Debugger und Programmer.

Ich liebäugel stark mit dem neuen Atmel ICE. Wegen dem kommenden Arduino Zero und der eierlegendenwollmilchsau.



Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

sschultewolter

Warum nicht den Zero weiterhin über USB programmieren, oder hast du vor, diese später standalone aufzubauen? -> PN
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

Doc_Arduino

Hallo,

ich habe nicht vor einen µC standalone aufzubauen. Egal welcher. Nur wenn ich bei meinem Mega2560 den 16U2 runterlöte, brauche ich mindestens einen Programmer. Dafür wäre der AVRISP mkII ausreichend. Wenn ich mir noch einen Arduino kaufe, hab noch einen zweiten Mega2560 da, dann wird es der Arduino Zero als logische Folge. Hier wollte ich dann den Programmer und Debugger nutzen. Dafür bräuchte ich dann aber den neuen Atmel ICE. Den gibt es für 88,39 Euro. Damit könnte man den Zero auch debuggen. Ist aber viel wenn, könnte und sein im Gedankenspiel. Ob man das dann wirklich nutzt steht auf einen anderen Blatt.

Der Arduino Zero hat aber zwei USB Schnittstellen laut Bildern. Wenn der schon von Haus aus mit Debug Zugriff vorgesehen ist über die Arduino IDE, dann wäre der Kauf eines Atmel ICE natürlich sinnlos. Ich schwanke in der Entscheidung ständig hin und her.

Ich weis nicht wie ich Sätze wie die hier verstehen soll?


"Zusätzlich enthält das Board Atmels Embedded Debugger (EDBG), einen Hardware-Debugger für Microcontroller von Atmel. Er soll die direkte Programmierung des Controllers vereinfachen."

oder

"Das Board verfügt außerdem über flexible Peripherie sowie Atmels Embedded Debugger (EDBG). Es bietet ein Debugging-Interface auf den SAMD21 ohne zusätzliche Hardware und vereinfacht das Software-Debugging. EDBG unterstützt einen virtuellen COM-Port für die Geräteprogrammierung sowie die herkömmliche Arduino-Boot-Loader-Funktion."

Heißt das, der hat den Debugger wirklich mittels Atmels EDBG IC onboard und der Rest ist Software? (die JTAG und SWD Schnittstelle sieht man allerdings auf dem Board) Dann hätte Arduino alles komplett richtig gemacht. Naja, fast alles, die 38 I/O Pins können im Uno Format nicht alle herausgeführt werden.

Wie versteht ihr das?
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Doc_Arduino

#42
Nov 07, 2014, 07:50 pm Last Edit: Nov 08, 2014, 03:34 pm by Doc_Arduino
Hallo,

ein Update.  :)

Habe heute den 16U2 runtergelötet, wobei man löten eigentlich nicht mehr sagen konnte. Es ging etwas grob zu, sagen wir mal so. ;)   Der dicke 16MHz Quarz daneben ist auch runter.

Leute was soll ich sagen, im Sleep-Mode geniale 3,3mA, wobei die Power-On LED noch drauf ist. Die kommt erst zum Schluss runter. Also sind es im Endeffekt ca. 1,3mA im Sleepmode. Geil!  :)   Damit wird mein bestellter XTPower Akku sehr lange halten.

Edit: XTPower kam heute, geladen, probiert, Dauerbetreib funktioniert tatsächlich.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Doc_Arduino

Hallo,

für alle die das interessiert wie die Powerbank von innen aussieht. :)
Voll geladen 4,17 Volt Zellenspannung.
An den Zellen sieht man hellgelben Klebstoff. Wie dicker Schaumgummi. Damit war der Deckel mit verklebt. Seitlich sind nur paar Nasen nach innen zusätzlich verteilt.

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Doc_Arduino

#44
Jul 09, 2015, 06:12 pm Last Edit: Jul 09, 2015, 06:12 pm by Doc_Arduino
Hallo,

das Projekt nähert sich dem Ende woraufhin ich heute noch als letztes die Power LED runtergelötet habe. Effekt ist im sleep mode geniale 220µA bei 5,00V Ub für den kastrierten Arduino Mega 2560.  :) :) :)
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Go Up