Hallo, möchte einen ATtiny24A für eine Langzeit Batterieanwendung benutzen. Die meiste Zeit soll der ATtiny24A im Tiefschlaf (Power-Down Mode) verbringen. Dabei so wenig wie möglich Strom benötigen. Alle Peripherie Funktionen abschalten. Im PRR – Power Reduction Register = b0000 1111; Aufwecken sporadisch nur über einen "Pin Change Interrupt". http://ww1.microchip.com/downloads/en/DeviceDoc/doc8183.pdf Beim Hochfahren des ATtiny24A von "Power-down" soll der interne 8MHz Oszillator anspringen, dann sollen einige Befehle ausführt werden und anschließend soll er wieder in den Tiefschlaf gehen. Am Besten, daß unter anderem kein Oszillator mehr an ist. Geht das überhaupt und wenn ja, wie? Danke Mathias
Mathias H. schrieb: > Geht das überhaupt und wenn ja, wie? Das geht. Schau dir dazu die Library #include <avr/sleep.h> an. Du brauchst im Code
1 | set_sleep_mode(SLEEP_MODE_PWR_DOWN); |
und aktiviert wird der Sleepmode dann mit
1 | sleep_mode(); |
Mathias H. schrieb: > Im PRR – Power Reduction Register > = b0000 1111; Gewöhne dir hierbei unbedingt eine andere Schreibweise an. Hierfür muss jetzt jeder erstmal ins Datenblatt schauen um zu wissen wofür die unteren vier Bits stehen. Schneller weis man es wenn man schreibt
1 | PRR |= (1 << PRTIM1)|(1 << PRTIM0)|(1 << PRUSI)|(1 << PRADC); |
Und nicht vergessen den Analog Comparator auszuschalten:
1 | ACSR |= (1 << ACD); |
;)
Mathias H. schrieb: > Geht das überhaupt und wenn ja, wie? genau so wie du es beschrieben hast? Vorraussetzung: - du wählst den richtigen sleep mode - du hast 8MHz intern clock schon vorher - du hast keinen Watchdog an - du hast den PC Interrupt an das PRR zu setzen kannst du dir sparen, wenn alles schläft ohne Takt ist es aus, egal was im PRR steht. siehe Datenblatt: The Power Reduction Register provides a method to reduce power consumption by allowing peripheral clock signals to be disabled. -> wenn die main clock source nicht da ist (durch sleep), dann außer dem Watchdog auch keine andere. nicht vergessen dann auch in DIDR0 den digital input buffer auszuschalten für alle Pins die analoge Signale bekommen, das könnte im gegensatz zu allem anderen hier genannten extra Abschaltungen tatsächlich Strom sparen.
:
Bearbeitet durch User
M. K. schrieb: > Und nicht vergessen den Analog Comparator auszuschalten: Rein Interesse halber, muss man den extra ausschalten? im Datenblatt steht nur dass man ihn nicht verwenden kann wenn der ADC aus ist, aber ist der dann automatisch auch abgeschaltet?
Mathias H. schrieb: > Geht das überhaupt und wenn ja, wie? Dort wir das für einen anderen ATtiny in Assembler erklärt: http://stefanfrings.de/avr_workshop/index.html#aufwachen > Rein Interesse halber, muss man den (analog Comparator) extra ausschalten? Weiss ich jetzt nicht auswendig. Im Zweifelsfall würde ich alles aus Schalten, was das Power Reduction Register hergibt.
K. S. schrieb: > das PRR zu setzen kannst du dir sparen, wenn alles schläft ohne Takt ist > es aus, egal was im PRR steht. Öhm, nein. Es macht einen Unterschied ob im PRR steht ob ein Modul an oder aus sein soll, auch im Power-Down. Auf den Quatsch bin ich auch reingefallen und es dauerte etwas bis ich dahinter kam warum ich bei einem Attiny10 im Power-Down kaum unter 10 uA Stromaufnahme kam, dabei sollte er ja unter 0.15 uA kommen. Erst als ich im ACSR und im PRR die entsprechenden Einstellungen vornahm kam ich auf die 0.15 uA. Die Einstellungen des PRR kann man sich also nicht sparen. Auch nicht die Einstellung des ACSR K. S. schrieb: > Rein Interesse halber, muss man den extra ausschalten? Ja, muss man wenn man die Stromaufnahme runter drücken will. Stefanus F. schrieb: > Weiss ich jetzt nicht auswendig. Im Zweifelsfall würde ich alles aus > Schalten, was das Power Reduction Register hergibt. Der Analog Comparator wird nicht im PRR an-/ausgeschaltet sondern im ACSR ;)
:
Bearbeitet durch User
Mathias H. schrieb: > Am Besten, daß unter anderem kein Oszillator mehr an ist. > > Geht das überhaupt und wenn ja, wie? Lies dir mal das Datenblatt durch, im PowerDown sind sämtliche Taktgeber und auch der Takt der Peripherie abgeschalt. Den ADC usw. musst du aber vorher abschalten, damit dir die Referenzspannungsquelle nicht sinnlos den ganzen Strom wegzieht. Mit abgeschaltetem Watchdog-Timer im PowerDown zieht so ein ATmega8 (an einem LiIon-Akku) etwa 0,6µA. An einem 1Ah LiIOn-Akku könnte der Controller so 190 Jahre im PowerDown-Modus verbringen, wenn er nicht zwischendurch immer mal wieder aufgeweckt wird, der Akku langsam degeneriert oder sich selbst entlädt.
:
Bearbeitet durch User
Atmega8 A. schrieb: > Mit abgeschaltetem Watchdog-Timer im PowerDown zieht so ein ATmega8 (an > einem LiIon-Akku) etwa 0,6µA. Echt? Ist das bei dem Urgestein so viel? Der ATTiny24A zieht nicht mehr als 0.1A, der ATMega328P (Nachfolger des ATMega8) auch. ;)
:
Bearbeitet durch User
Schon mal Danke fürs Interesse. Habe auf die schnelle einen ATmega328P zum Testen . Das Board für den ATtiny 24A oder 44A ist in Vorbereitung. Programmiere nicht in C deshalb der etwas andere Syntax im Quelltext. Habe den MC auf low Quarz 7,3728 MHz eingestellt. "Pin Change Interrupt" ist eingestellt und funktioniert. Hier die Einstellung zum "Power-down Mode": DisableInts; // globaler Interrupt: aus. PRR:= %1110 1111; // Power reduction: all. MCUCR:= MCUCR Or %0110 0000; // Brown-Out abschalten. MCUCR:= MCUCR And %1011 1111; EnableInts; // globaler Interrupt: ein. SMCR:= %0000 0101; // einstellen auf Power-down Mode und ausführen. // MC ist im Power-down Mode. PRR:= %1100 0111; // MC ist durch "Pin Change Interrupt" aufgewacht, normal Operation. Das Board braucht im "Power-down Mode" ca. 2,7 mA. Der Quarzoszillator läuft (warum: ???), sehe es auf dem Oszi. Ohne ATmega328P (aus der Fasssung, ausgesteckt) ca. 3,2 µA,. Das passt, die Peripherie braucht auch ein bißchen. Aber die ca. 2,7 mA???
:
Bearbeitet durch User
Mathias H. schrieb: > Aber die ca. 2,7 mA??? Es kann gut sein, das du einen oder mehrere Portpins nicht auf inaktiv geschaltet hast. Der Ausgangspegel muss also in den Modus des geringsten Verbrauchs gesetzt werden (und die äussere Beschaltung auch in Ruhe gehen). Keine Pins floaten lassen - nicht benutzte auf Ausgang stellen. Ein Attiny2313, der hier so läuft, zieht etwa 300nA im PowerDown.
:
Bearbeitet durch User
Nochmals alle Portpins überprüft. Nichtbenutzte Pins sind als Ausgang und auf low gelegt. Was mich wundert, daß der Oszillator läuft. Egal ob Quarz oder interner, je nach Einstellung. Im SMCR Register sind die Bits SM1 und SE gesetzt. "Also Power-down". Wie kriegt man den Oszillator abgeschalten?
Hatte den WatchDog vergessen abzuschalten. So, bin jetzt bei ca. 250 µA. Immer noch zu viel. Was kann man noch alles abschalten?
Mathias H. schrieb: > So, bin jetzt bei ca. 250 µA. Wie sieht denn deine Platine aus? Ist da vielleicht ein Spannungsregler drauf? Der Ruhestrom der meisten Regler ist oft recht hoch. Sehr gute Spannungsregler verbrauchen nur 7µA (China, billig) oder sogar nur 1µA. Mach mal ein Bild.
Matthias S. schrieb: > Ein Attiny2313, der hier so läuft, zieht etwa 300nA im PowerDown. Selbst das wäre noch zu viel für Power Down...oder haste da 5V dran? Dann könnte das hinkommen...glaub ich. Mathias H. schrieb: > Hatte den WatchDog vergessen abzuschalten. > So, bin jetzt bei ca. 250 µA. > Immer noch zu viel. > Was kann man noch alles abschalten? Welche Versorgungspannung hast du dabei? Könnte bei 5V hinkommen. Wenn ich mir deinen Code oben anschaue: Hast du den Analog Comparator auch ausgeschaltet (ACSR |= (1 << ACD);)?
M. K. schrieb: > Matthias S. schrieb: >> Ein Attiny2313, der hier so läuft, zieht etwa 300nA im PowerDown. > > Selbst das wäre noch zu viel für Power Down...oder haste da 5V dran? > Dann könnte das hinkommen...glaub ich. Das ist ein ungeregelter 18650, also zwischen 4,1 bis runter auf etwa 3,3V. Aber weniger als etwa 0,25µA sind lt. DB nicht drin, wenn man sich die Grafik ' Power-down Supply Current vs. VCC (Watchdog Timer Disabled)' ansieht und 4V annimmt (In meinem DB ist das Fig.98).
Matthias S. schrieb: > Aber weniger als etwa 0,25µA sind lt. DB nicht drin, wenn man sich die > Grafik ' Power-down Supply Current vs. VCC (Watchdog Timer Disabled)' > ansieht und 4V annimmt (In meinem DB ist das Fig.98). So genau hatte ich ins DB nicht geschaut, deshalb sagte ich ja, dass das hinkommen kann. Wie gesagt, wenn man den AC nicht deaktiviert hat kann man da auch noch das ein und andere uA raus holen ;)
1 | > SMCR:= %0000 0101; // einstellen auf Power-down Mode und |
2 | > ausführen. |
3 | > // MC ist im Power-down Mode. |
4 | > PRR:= %1100 0111; // MC ist durch "Pin Change Interrupt" |
5 | > aufgewacht, normal Operation. |
Und wo, bitte, ist hier das sleep versteckt? 'Power-Down Mode: When the SM[1:0] bits are written to 10, the SLEEP instruction makes the MCU enter Powerdown mode.'
Nachtrag. Bei entferntem ATmega328P ist die Stromaufnahme ca. 3µA. Mit ATmega328P Cca. 250 µA. Alle nichtbenutzen Pins sind als Ausgänge und auf low geschaltet. Was kann man noch alles Abschalten? WatchDogStop; ACSR:= ACSR or %1000 0000; // Analogcomparator aus. DisableInts; MCUCR:= MCUCR or %0110 0000; // Brown-Out abschalten. MCUCR:= MCUCR and %1011 1111; EnableInts; PRR:= %1110 1111; // Power reduction: all. CPUsleep (SMCR or %0000 0101); // Sleep. PRR:= %1100 0111; // T0, T1 ein. DisableInts; MCUCR:= MCUCR or %0110 0000; // Brown-Out einschalten. MCUCR:= MCUCR or %0110 0000; EnableInts; WatchDogStart;
Mathias H. schrieb: > Habe den MC auf low Quarz 7,3728 MHz eingestellt Wieso lässt du den nicht auf einen MHz laufen. Wenn der sowieso kaum was tun muss. Dann braucht er auch im Betrieb weniger Strom.
Mathias H. schrieb: > Alle nichtbenutzen Pins sind als Ausgänge und auf low geschaltet. Schon schön. Aber jetzt solltest du auch die benutzten Pins untersuchen und zwar darauf, ob ihre Ruhepegel nicht etwa Strom aus der Peripherie ziehen oder in die Peripherie speisen. Oszillator sollte im Powerdown nicht die Rolle spielen, da er sowieso nicht läuft. Mathias H. schrieb: > ACSR:= ACSR or %1000 0000; // Analogcomparator aus. Das sieht mir nach Pascal o.ä. aus. Kann man solche Ausdrücke in der Sprache nicht ein wenig leserlicher machen?
:
Bearbeitet durch User
F. F. schrieb: > Wieso lässt du den nicht auf einen MHz laufen. Diese Taktquelle ist im PowerDown doch eh abgeschaltet, sollte also egal sein. Matthias S. schrieb: > Aber jetzt solltest du auch die benutzten Pins untersuchen Er könnte einfach ein mal einen Schaltplan oder ein Foto seiner Platine zeigen, oft werden dadurch viele Probleme schnell erkannt. Ist jedenfalls besser als hier herumzuraten und Glaskugel-Tipps zu geben ...
Mike J. schrieb: > Diese Taktquelle ist im PowerDown doch eh abgeschaltet, sollte also egal > sein. Das stimmt schon, aber im Betrieb ist dann zwischen 8Mhz und 1Mhz der Strom auch ungefähr halbiert. Aber bei allem was ich bisher gemacht habe mit den Tinys, habe ich weder auf Strom noch auf Geschwindigkeit achten müssen. Vielleicht kommt das bald. Wollte jetzt auch wieder anfangen, nach all der Zeit und den harten Einschlägen der letzten Jahre. Mal sehen, ob ich jetzt etwas verschont bleibe.
:
Bearbeitet durch User
F. F. schrieb: > Das stimmt schon, aber im Betrieb ist dann zwischen 8Mhz und 1Mhz der > Strom auch ungefähr halbiert.
1 | | (1MHz, 3,3V) | (8MHz, 3,3V) | |
2 | ------------------------------------------ |
3 | ATmega8L | 1,8mA | 6,5mA | |
4 | ATmega328P | 0,5mA | 3,2mA | |
5 | ATtiny24A | 0,41mA | 2,5mA | |
1/8 der Frequenz führt bei den neueren Chips zu 1/6 des Stromverbrauchs. Wenn er seine Arbeit aber 8 mal so schnell erledigen könnte ... dann verbraucht er weniger Strom bei 8MHz da er früher wieder schlafen gehen kann. :-D Wenn er allerdings eh irgend welche Wartezeiten drin hat um einen Sensor zu initialisieren oder abzufragen, dann spart er im StandBy-Modus trotzdem etwas Strom. Kommt halt immer drauf an was er in der Zeit gerade macht.
Diese Stromwerte in der Tabelle - mit oder ohne eingeschaltete Peripherie?
Mathias H. schrieb: > Bei entferntem ATmega328P ist die Stromaufnahme ca. 3µA. > Mit ATmega328P Cca. 250 µA. > Alle nichtbenutzen Pins sind als Ausgänge und auf low geschaltet. Daraus und aus der Tatsache, dass der 328P im PowerDown bei Zimmertemperatur sehr deutlich unter 1µA verbrauchen sollte, kann man problemlos folgern: Es muss an den benutzten Ausgängen liegen. Vielmehr: an deren Zusammenwirken mit der Hardware, die daran hängt. Da du die Schaltung nicht veröffentlicht hast, bist du also der einzige, der das/die Problem(e) finden kann. Wenn allerdings das entfernen des AVR dazu führt, dass die Stromaufnahme im genehmen Bereich liegt, KÖNNTE es helfen, ohne weitere Analyse der Schaltung einfach alle benutzten Ausgänge hochohmig zu machen, bevor man schlafen geht. Hilft auch das nicht, liegt wohl an irgendeinem Ausgang eine Spannung außerhalb der Betriebsspannung des µC an. Um sowas zu ermitteln, wurde die faszinierende Möglichkeit der Spannungsmessung entwickelt...
c-hater schrieb: > Daraus und aus der Tatsache, dass der 328P im PowerDown bei > Zimmertemperatur sehr deutlich unter 1µA verbrauchen sollte Gut, es ging um einen Tiny24A. Da gilt aber genau dasselbe.
Nee, war schon richtig:
> Habe auf die schnelle einen ATmega328P zum Testen
Jetzt bin ich irritiert, vielleicht wissen Mike J. oder c-hater den Grund für folgendes Verhalten: ATmega328P-PU von '1515' bei 3.3 V mit internen 8 MHz:
1 | .include "m328Pdef.inc" |
2 | ldi r16,$FF |
3 | sts PRR,r16 |
4 | out PORTB,r16 |
5 | out PORTC,r16 |
6 | out PORTD,r16 |
7 | nop |
8 | main_loop: |
9 | rjmp main_loop |
Mit dem nop fließen 2.16, ohne 1.94 mA.
S. Landolt schrieb: > Mit dem nop fließen 2.16, ohne 1.94 mA. Wie genau (also womit) gemessen? Wie lange lief diese Messung jeweils? Aus welcher Quelle wurde das Messgerät versorgt? Kurzfassung: Wer misst, misst Mist. Es ist immer eine gute Idee, bei überraschenden Meßergebnissen erstmal den Messaufbau anzuzweifeln.
Da der Messaufbau beide Male ja derselbe ist, verstehe ich die Fragen nicht ganz, aber: gemessen mit Digital-Handmultimeter (also batteriebetrieben). Ein altes Zeigermultimeter bringt, im Rahmen seiner Messgenauigkeit, dieselbe Differenz. (eigentlich hatte ich gehofft, dass sich jemand kurz hinsetzt und versucht, das nachzuvollziehen)
S. Landolt schrieb: > Mit dem nop fließen 2.16, ohne 1.94 mA. Das überrascht mich, würde ich direkt 10x gleich und anders wiederholen um es zu bestätigen.
> ... würde ich direkt 10x ...
Nur zu, ich harre der Ergebnisse. Ich selbst hatte es dreimal
wiederholt.
S. Landolt schrieb: >> ... würde ich direkt 10x ... > Nur zu, ich harre der Ergebnisse. Ich selbst hatte es dreimal > wiederholt. Ich bin wirklich neugierig, aber ich habe keinen losen ATMega328 herum liegen. Nur als Arduino Nano Klon.
PS: Mir ist durchaus bewusst, dass ich kurz davor bin, mich zum Affen zu machen, egal ...
S. Landolt schrieb: > Da der Messaufbau beide Male ja derselbe ist, verstehe ich die Fragen > nicht ganz Weil derselbe Messaufbau unter unterscheidlichen Randbedingungen durchaus unterschiedliche Ergebnisse liefern kann. Das sollte selbsterklärend sein... > aber: gemessen mit Digital-Handmultimeter (also > batteriebetrieben) OK, fehlt immer noch die Antwort auf die Frage: > Wie lange lief diese Messung jeweils? Außerdem ergänzend: Ist dieses Handmultimeter TrueRMS-fähig? Wenn ja, bis zu welcher Frequenz? > (eigentlich hatte ich gehofft, dass sich jemand kurz hinsetzt und > versucht, das nachzuvollziehen) Geht nicht, weil kein 328P im Haus. Aber mit allen folgenden: M1284P M644 M32 M16 Gibt es diesen Effekt nicht. Gemessen habe ich allerdings mit einem 200MHz-Oszi. Und das offenbart, dass die Wellenform in den beiden Fällen stark unterschiedlich ist, der RMS-Wert des Stroms aber im Rahmen der 8Bit-Messgenauigkeit praktisch identisch (letztes Digit wackelt). Gäbe es wirklich solche Unterschiede, hätte ich sie sehr deutlich sehen müssen, denn ich habe natürlich einen Shunt gewählt, der es mir erlaubt, die Meßgenauigkeit nahezu voll auszunutzen.
Erstmal vielen Dank für die Mühe mit gleich vier Controllern.
Das DVM ist ein Metex M-4650CR, also kein 'trueRMS'. Bei dem alten
Analoginstrument hätte ich jetzt aber gedacht, dass es mittelt. Es geht
schließlich um eine Differenz von 10 %.
> unterscheidlichen Randbedingungen
Wo ist der Unterschied? Ich 'flashe' zweimal, fertig.
S. Landolt schrieb: > Wo ist der Unterschied? Ich 'flashe' zweimal, fertig. Mein Bauch sagt mir, dass da noch ein anderer relevanter Unterschied sein muss. Irgendwo.
Hallo, könnten das Leckströme von anderen Bauteile sein , z.B. Kondensatoren? Gerade sehr kleine hochkapazitive MLCC sind dafür oft verantwortlich. Jogibär
> ein anderer relevanter Unterschied
Nun, das könnte ja die von c-hater festgestellte "stark unterschiedliche
Wellenform" sein. Wobei mir unklar ist, woher diese kommt.
S. Landolt schrieb: > Bei dem alten > Analoginstrument hätte ich jetzt aber gedacht, dass es mittelt. Tut es auch. Allerdings nur über das, was es überhaupt mitbekommt. Analoginstrumente sind sind ziemlich untauglich für die Messung an digitalen Gerätschaften, wo praktisch der gesamte Stromverbrauch in den Taktflanken passiert. >> unterscheidlichen Randbedingungen > Wo ist der Unterschied? Ich 'flashe' zweimal, fertig. Zwei verschiedene Wellenformen, zwei unterschiedliche Messinstrumente, beide ziemlich untauglich für die Aufgabe...
Gut, dann muss ich jetzt passen. Bleibt noch die Frage, wie Mike J. die Werte in seiner Tabelle gemessen hat.
S. Landolt schrieb: > Diese Stromwerte in der Tabelle - mit oder ohne eingeschaltete > Peripherie? Immer mit abgeschalteter Peripherie, da gäbe es zu viele Variationen die möglich sind. Gemessen wurde gar nichts, das sind die Daten aus dem Datenblatt ... nur mal zum Vergleich zwischen den einzelnen Typen. Die PowerDown-Werte stimmen mit der Praxis (gemessen beim ATmega8 von Atmega8) aber gut überein. S. Landolt schrieb: > Bei dem alten Analoginstrument hätte ich jetzt aber gedacht, dass > es mittelt. Es geht schließlich um eine Differenz von 10 %. Das alte ist konstruktionsbedingt ein true RMS Messgerät. @ Mathias H. (mathias) Auch wenn deine Schaltung mit Fädeldraht frei schwebend aufgebaut wurde ist das okay. Blöd ist nur wenn man einem versucht zu helfen und man nicht sehen soll wo das Problem liegt, weil der Aufbau vielleicht etwas schlampig wirken könnte. Eine Skizze wäre aber schon sinnvoll und je mehr Informationen du gibst, desto besser wird dir geholfen.
:
Bearbeitet durch User
Kann es sein, daß wenn man eine signifikante "Wellenform" im Versorgungsstrom einer im MHz-Bereich taktenden Digitalschaltung erspät, es an Puffer-Cs mangelt?
Schwankender Strom ist Ok, solange die Stromversorgung ihn liefern kann, ohne dass die Spannung zu stark schwankt.
> Kann es sein ...
Also ich konnte ja, mangels angemessener Ausrüstung, nichts
"erspähen"; bei mir waren am uC dreimal 0.1 uF Keramik sowie 220 uF Elko
angeschlossen (Steckbrett).
Stefanus F. schrieb: > Schwankender Strom ist Ok, solange die Stromversorgung ihn liefern kann, > ohne dass die Spannung zu stark schwankt. Der AVR führt mit 8MHz immer wieder den selben Befehl aus. In welchen Spektrum sollte man da Stromänderungen erwarten und warum mittelt sich dieses nicht in einem geeigneten C aus. Und zur eigentlich Frage: warum sollte er nach ein paar Millionen Runden nicht vergessen haben, daß er mal ein NOP zusätzlich ausgeführt hat.
:
Bearbeitet durch User
Carl D. schrieb: > Kann es sein, daß wenn man eine signifikante "Wellenform" im > Versorgungsstrom einer im MHz-Bereich taktenden Digitalschaltung erspät, > es an Puffer-Cs mangelt? Nö. Der beste Kondensator kann nicht alles schlucken, das ist eine Sache, die nur mit idealen Bauelementen möglich wäre. Zum Glück braucht er das aber auch nicht, es genügt, wenn er soviel schluckt, dass die Spannung jederzeit im zulässigen Bereich bleibt.
Noch niemand zuhause bei c-haters? Nun denn. Ich bin nämlich noch immer irritiert: ATmega1284P-PU von '1024' bei 3.3 V mit internen 8 MHz:
1 | .include "m1284Pdef.inc" |
2 | rjmp init |
3 | main: |
4 | nop |
5 | nop |
6 | main_loop: |
7 | rjmp main_loop |
8 | |
9 | init: |
10 | ldi r16,$FF |
11 | sts PRR0,r16 |
12 | sts PRR1,r16 |
13 | out PORTA,r16 |
14 | out PORTB,r16 |
15 | out PORTC,r16 |
16 | out PORTD,r16 |
17 | rjmp main |
Mit zweimal nop fließen 3.81, mit einem 3.38 mA. Soll natürlich heißen, bei mir; und da hätte mich interessiert, welche Ströme c-haters trueRMS-200 MHz-Oszilloskop misst; wenn er sich denn nochmals die Mühe machen könnte, dankenswerterweise. Vielleicht finden wir ja heraus, was ich falsch mache, bzw. ob.
S. Landolt schrieb: > an c-hater: > Wie sah Ihr Programm für den ATmega1284P aus? Im Prinzip ganz genauso wie dein's. Unterschiede: Für alle vier aufgezählten: Includezeile natürlich jeweils passend. PortA Pullups aktiviert. Und dann natürlich jeweils alles ausgeschaltet, was sich irgendwie ausschalten läßt, entsprechend dem, was das DB jeweils im Kapitel "Minimizing Power Consumption" vorgeschlagen hat. Wobei ein Teil davon natürlich jeweils über die Fuses abzuhandeln war, bei den ollen M16/M32 sogar das meiste. Der entsprechende Teil des Code für den M1284P sieht so aus: ldi R16,1<<ACD out ACSR,R16 ldi R16,0 sts ADCSRA,R16 ldi R16,1<<JTD out MCUCR,R16 ldi R16,(1<<PRTWI)|(1<<PRTIM2)|(1<<PRTIM0)|(1<<PRUSART1)|(1<<PRTIM1)|(1<<PRS PI)|(1<<PRUSART0)|(1<<PRADC) sts PRR0,R16 ldi R16,1<<PRTIM3 sts PRR1,R16
S. Landolt schrieb: > Noch niemand zuhause bei c-haters? Nun denn. Manche Leute müssen tagsüber arbeiten...
S. Landolt schrieb: > Noch niemand zuhause bei c-haters? Nun denn. > > Ich bin nämlich noch immer irritiert: > > ATmega1284P-PU von '1024' bei 3.3 V mit internen 8 MHz: > >
1 | > .include "m1284Pdef.inc" |
2 | > rjmp init |
3 | > main: |
4 | > nop |
5 | > nop |
6 | > main_loop: |
7 | > rjmp main_loop |
8 | > |
9 | > init: |
10 | > ldi r16,$FF |
11 | > sts PRR0,r16 |
12 | > sts PRR1,r16 |
13 | > out PORTA,r16 |
14 | > out PORTB,r16 |
15 | > out PORTC,r16 |
16 | > out PORTD,r16 |
17 | > rjmp main |
18 | > |
> > Mit zweimal nop fließen 3.81, mit einem 3.38 mA. > Soll natürlich heißen, bei mir; und da hätte mich interessiert, welche > Ströme c-haters trueRMS-200 MHz-Oszilloskop misst; wenn er sich denn > nochmals die Mühe machen könnte, dankenswerterweise. Vielleicht finden > wir ja heraus, was ich falsch mache, bzw. ob. Steigt der Verbrauch auch, wenn vor main noch ein paar Dummy-Bytes eingefügt werden, z.B. per .ds? Oder genauer gefragt, hängt es von der Position im Speicher ab. Gibt es einen erkennbaren Zusammenhang zu n*NOP (n=0..20)? Würde ich mal systematisch untersuchen.
Okay, da fehlte eine, vielleicht wichtige, Information - Fuses bei mir: low: E2, high: D1, extended: FF
> Würde ich mal systematisch untersuchen.
Solange c-hater sagt, dass ich mit meiner bescheidenen Ausrüstung nicht
vernünftig messen kann, lehne ich mich erstmal zurück - wäre vertane
Zeit.
S. Landolt schrieb: > Soll natürlich heißen, bei mir; und da hätte mich interessiert, welche > Ströme c-haters trueRMS-200 MHz-Oszilloskop misst Das is nich meins. Gehört meinem Brötchengeber und da steht's jetzt auch wieder. Ich hatte es nur mehr oder weniger zufällig über's lange WE bei mir zu Hause. Für ein ganz anderes Projekt. Wo es mir aber leider nicht wirklich weitergeholfen hat. Dein Kram traf einfach auf den glücklichen Umstand, dass der Messaufbau sowieso gerade stand und damit der Aufwand, das mal durchzuspielen, minimal war. Außerdem hat's mich auch selber interessiert, ob's den Effekt wirklich gibt.
Tja, Mist - und jetzt? "Wir wissen wohl, das ist kein rechter Schluß. ... Wir stehen selbst enttäuscht und sehn betroffen Den Vorhang zu und alle Fragen offen."
S. Landolt schrieb: >> Würde ich mal systematisch untersuchen. > > Solange c-hater sagt, dass ich mit meiner bescheidenen Ausrüstung nicht > vernünftig messen kann, lehne ich mich erstmal zurück - wäre vertane > Zeit. 8-Bit ADC auf 3Stellen genau. Lol. Bei dem Ding geht's um schnell und nicht um sichere 5stellige Anzeige.
Also, mangels Alternative, den Vorschlag von Carl D. aufgegriffen: In obigem Programm die Anzahl der nop zwischen §main und §main_loop: 0: 3.65 mA 1: 3.38 mA 2: 3.81 mA 3: 3.38 mA 4: 3.65 mA 5: 3.38 mA 6: 3.70 mA
Mal ganz dumm - sicherlich unnötige Anmerkung: Während der Strommessung war das Programmiergerät doch hoffentlich abgeklemmt.
Carl D. schrieb: > 8-Bit ADC auf 3Stellen genau. Lol. ??? Es ging um satte 10%. Die siehst du auch bei nur 8Bit völlig problemlos. Wenn es sie denn tatsächlich gibt... Nach meiner Messung würde ich behaupten, die Abweichung liegt unter 1/242 (das ist, was durch den verwendeten Shunt als reale Auflösung von den 8Bit überblieb). Also nachweislich bei weniger als einem halben Prozent. Ich würde sogar stark vermuten, dass sie tatsächlich sogar noch sehr viel geringer ist...
S. Landolt schrieb: > Also, mangels Alternative, den Vorschlag von Carl D. aufgegriffen: > > In obigem Programm die Anzahl der nop zwischen §main und §main_loop: > > 0: 3.65 mA > 1: 3.38 mA > 2: 3.81 mA > 3: 3.38 mA > 4: 3.65 mA > 5: 3.38 mA > 6: 3.70 mA Wenn man spitzfindig wäre, könnte man vermuten, daß gerade oder ungerade Code-Adressen (müßte man im Listing nachsehen) einen Unterschied machen.
Carl D. schrieb: > Wenn man spitzfindig wäre, könnte man vermuten, daß gerade oder ungerade > Code-Adressen (müßte man im Listing nachsehen) einen Unterschied machen. Allerdings ist der wie alle anderen 16bit aligned.
S. Landolt schrieb: > Mit dem nop fließen 2.16, ohne 1.94 mA. Das ist mir auch schon aufgefallen. Die Stromaufnahme hängt etwas von der Adresse im Flash ab. Ich hab es aber nicht näher untersucht. Auch die Interruptlogik braucht nicht unerheblich Strom. Z.B. in einem Projekt war die Stromaufnahme geringer, wenn ich die Interruptquellen gepollt habe, gegenüber Interrupts enabled und Idle.
Das finde ich wirklich interessant. Dass ein Nop mehr oder weniger etwas ändert überrascht mich nicht, aber die Größe des Unterschieds tut es. Egal ob mit oder ohne Messfehler (wegen RMS und so).
Peter D. schrieb: > Das ist mir auch schon aufgefallen. Die Stromaufnahme hängt etwas von > der Adresse im Flash ab. Ich hab es aber nicht näher untersucht. Peter, ich bin immer dankbar für deine Beiträge solcher Art, zumal ich weiß, was du von dir gibst ist alles fundiert. Bitte halte dich nicht zurück und lass uns (oder auch nur mich, wenn andere das anders sehen) von deinem Wissen und Erfahrungen lernen.
> Das ist mir auch schon aufgefallen ...
Sehen Sie, Peter D., ging mir genau so, vor Jahren bei einem
Fahrradfahrtenschreiber mit dem ATmega328P; ich hatte das aber sofort
weit von mir geschoben nach dem Motto "dass nicht sein kann, was nicht
sein darf". Und seit gestern weiß ich, dass meine Reaktion richtig war,
denn ohne so ein trueRMS-200 MHz-Wundertüten-Oszilloskop darf man an
eine Messung ja nicht einmal ansatzweise denken. Mit einem solchen
aber darf man getrost softwareseitig irgendetwas zusammenstoppeln, was
mit der Vorgabe fast nichts mehr zu tun hat, es kommt trotzdem das
richtige Ergebnis heraus.
S. Landolt schrieb: > "dass nicht sein kann, was nicht > sein darf" Warum darf das denn nicht sein? Natürlich braucht auch die interne Umladung von Kapazitäten Strom, je nach Anzahl der Pegeländerungen. Man könnte das weiter untersuchen, indem man die RJMP-Loop auf bestimmte Adreßwechsel legt, z.B. 07ff->0800 (ATtiny85).
> Warum darf das denn nicht sein?
Nun, die Größenordnung (hier sind es ja 10 %) ließ mich damals zweifeln.
Und auch heute sind der Zweifler ja einige.
> bestimmte Adreßwechsel ... z.B. 07ff->0800
Okay.
ATtiny85-20PU von '1706' bei 3.3 V mit internen 8 MHz:
Fuses: low: E2, high: DF, extended: FF
1 | .include "tn85def.inc" |
2 | rjmp init |
3 | .org $07FE |
4 | main: |
5 | nop |
6 | main_loop: |
7 | rjmp main_loop |
8 | |
9 | init: |
10 | ldi r16,$FF |
11 | out PRR,r16 |
12 | out PORTB,r16 |
13 | rjmp main |
Ohne das nop fließen 2.33, mit 2.65 mA, immerhin eine Differenz von knapp +14 %, bei allem Vorbehalt gegenüber meinen Messmöglichkeiten. Jetzt aber verabschiede ich mich erstmal, komme mir schon vor wie ein Alleinunterhalter.
S. Landolt schrieb: > Jetzt aber verabschiede ich mich erstmal, komme mir schon vor wie ein > Alleinunterhalter. Anno 1960 hat man Tresorkodes mit dem Stethoskop geknackt. Den Source eine AVRs liest man in Zukunft mit nem Multimeter aus. Also mach ruhig weiter, das ist Grundlageforschung.
Stefanus F. schrieb: > Carl D. schrieb: >> Wenn man spitzfindig wäre, könnte man vermuten, daß gerade oder ungerade >> Code-Adressen (müßte man im Listing nachsehen) einen Unterschied machen. > > Allerdings ist der wie alle anderen 16bit aligned. Im Flash gibt es gerade und ungerade Wort-Adressen. Nur weil wir an Bytes gewohnt sind (und vielleicht auch weil LPM Byteweise adressiert) bekommen wir das anders präsentiert. Der PC aber hat definitiv ein LSB, das "gerade platzierte" oder "ungerade platzierten" Befehle unterscheidet. Selbst wenn man nur wenig mit ARM gearbeitet hat, vermißt man die AVR-Besonderheiten nicht wirklich. Peter D. schrieb: > Und wenn Du das NOP wegläßt und nur das ORG hochsetzt? S. Landolt schrieb: > Ebenfalls 2.65 mA. also nicht das NOP, sondern die Position im Flash.
:
Bearbeitet durch User
DanielV2 schrieb: > Anno 1960 hat man Tresorkodes mit dem Stethoskop geknackt. Den Source > eine > AVRs liest man in Zukunft mit nem Multimeter aus. Was fehlt dir denn an dem Code, den S. Landolt gepostet hat?
S. Landolt schrieb: > komme mir schon vor wie ein Alleinunterhalter. Ich bin weiterhin am Thema interessiert, also auch an deinen Beiträgen.
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.