Forum: Mikrocontroller und Digitale Elektronik Strom sparen beim Xmega A1 eXplained


von Altug T. (altug_t)


Lesenswert?

Hallo,

Der Atmel Xmega A1 eXplained hat ja einige sehr ausgefallene 
Stromsparmodi. Ich bin gerade dabei mit diesen zu experimentieren.

Zur Zeit macht mein Chip die folgenden Dinge:

- LEDS blinken
- Ton ausgeben
- Temperatur ausgeben
- Lichtstärke ausgeben

Jetzt möchte ich nach und nach unbenötigte Ports ausschalten ohne diese 
Funktionalität zu beeinträchtigen.

Da bin ich natürlich zu Atmels Super Doku gegangen und habe diesen Code 
(https://github.com/Synapseware/xmega-intro/blob/master/avr1521-low-power/code/Task4-IdleDMA/task4.c) 
und auch dieses Manual (http://www.atmel.com/images/doc8077.pdf) 
gefunden.

Frage 1:
Jetzt habe ich meinen eigenen Code produziert und möchte von Menschen 
mit Erfahrung wissen, ob dieser Code das macht was ich annehme.
1
#include <avr/io.h>
2
int main(void) {
3
  PORTCFG.MPCMASK = 0xFF;
4
  PORTA.PIN0CTRL = PORT_OPC_PULLUP_gc;
5
  PR.PRPA = PR_DAC_bm | PR_ADC_bm | PR_AC_bm;
6
}

Das Snippet müsste ALLES was am Port A hängt einfach ausschalten. 
Stimmt das oder fehlt noch etwas?

Frage 2:
Warum wird  in dem Atmel Source Code ein "Pull-Up on all ports" gemacht, 
wenn ich auch einfach gleich einen beliebigen Port (X kann hier 
A,B,C,D,E,F sein) mit
1
PR.PRP_X_ = PR_DAC_bm | PR_ADC_bm | PR_AC_bm;

ausschalten könnte?

Frage 3:
Natürlich möchte ich auch messen, ob der Code dann tatsächlich auch 
weniger Strom frisst. Welches AM-Meter könnt ihr empfehlen, dass 
möglichst leicht anden Xmega A1 eXplained anzubringen ist und möglichst 
genau misst?

: Bearbeitet durch User
von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

Altug T. schrieb:

> Jetzt möchte ich nach und nach unbenötigte Ports ausschalten ohne diese
> Funktionalität zu beeinträchtigen.

Klingt für mich nach einem klassischen Widerspruch...

> Jetzt habe ich meinen eigenen Code produziert und möchte von Menschen
> mit Erfahrung wissen, ob dieser Code das macht was ich annehme.

(...)
>   PORTA.PIN0CTRL = PORT_OPC_PULLUP_gc;

Der Pull-Up spart Dir nur dann Strom, wenn der entsprechende Port ein 
Eingang ist und unbeschaltet ist. Bei Ausgängen ist die Maßnahme unnötig 
und, wenn der Ausgang auch mal Low-Pegel annimmt, ist diese Maßnahme 
sogar kontraproduktiv. Das selbe gilt für Eingänge, an denen binäre 
Signale anliegen.

> PR.PRPA = PR_DAC_bm | PR_ADC_bm | PR_AC_bm;

Macht es wirklich Sinn den ADC abzuschalten, wenn Du

> - Temperatur ausgeben
> - Lichtstärke ausgeben

willst? Ich würde mal vermuten, dass diese über den ADC erfasst werden.


> Frage 2:
> Warum wird  in dem Atmel Source Code ein "Pull-Up on all ports" gemacht,
> wenn ich auch einfach gleich einen beliebigen Port (X kann hier
> A,B,C,D,E,F sein) mit
>
> PR.PRP_X_ = PR_DAC_bm | PR_ADC_bm | PR_AC_bm;

Du schaltest damit nicht den PortA ab, sondern DAC, ADC und Comparator.

Ansonsten, einfach mal einen Blick ins Handbuch wagen. Interessant wäre 
z.B. Table 13-6. Input/sense configuration beim xmega AU:
(...)
INTPUT_DISABLE Digital input buffer disabled (2)
(...)
2. Only PORTA - PORTF support the input buffer disable option. If the 
pin is used for analog functionality, such as AC or ADC, it is 
recommended to
configure the pin to INPUT_DISABLE

Also, bei Pins, an welchen analoge Signale anstehen, Input-Buffer 
abschalten. Aber zuerst Handbuch lesen!

Grüßle,
Volker.

: Bearbeitet durch User
von Altug T. (altug_t)


Angehängte Dateien:

Lesenswert?

Zuerst einmal Danke Volker für deine schnelle Antwort.

------------

Nun zuerst zu diesem Punkt:

Volker B. schrieb:
> Macht es wirklich Sinn den ADC abzuschalten, wenn Du
>
>> - Temperatur ausgeben
>> - Lichtstärke ausgeben
>
> willst? Ich würde mal vermuten, dass diese über den ADC erfasst werden.

Den ADC, DAC und AC am Port A kann ich ausschlaten, da mein Code diese 
bei mir über Port B laufen. Das habe ich im Code auch schon getestet. 
Aber Danke für deine doppelte Überprüfung.

------------

Volker B. schrieb:
> Der Pull-Up spart Dir nur dann Strom, wenn der entsprechende Port ein
> Eingang ist und unbeschaltet ist.  Bei Ausgängen ist die Maßnahme unnötig
> und, wenn der Ausgang auch mal Low-Pegel annimmt, ist diese Maßnahme
> sogar kontraproduktiv. Das selbe gilt für Eingänge, an denen binäre
> Signale anliegen.

Ok, dann lautet meine Frage jetzt: Wie stelle ich fest, ob der beliebige 
Port, den ich mir gerade auf der Schaltskizze angucke ein Eingang, 
Ausgang, binärer Eingang oder Low-Pegel-Ausgang ist ?

------------

Volker B. schrieb:
> Ansonsten, einfach mal einen Blick ins Handbuch wagen.
> ...
> Aber zuerst Handbuch lesen!

Danke für den Tipp. Ich denke ich wäre nicht so weit gekommen, wenn ich 
das nicht gemacht hätte. (Es funzt ja schon ganz viel.)

------------

Volker B. schrieb:
> Also, bei Pins, an welchen analoge Signale anstehen, Input-Buffer
abschalten.

Ok ich werde es mal probieren in Code zu fassen:

Port A benutze ich gar nicht. Auf der Schaltskizze sehe ich überall 
ADC für Port A. Ich mache einfach alles aus (mit deinem Tipp):
1
  PORTCFG.MPCMASK = 0xFF;
2
  PORTA.PIN0CTRL = PORT_OPC_PULLUP_gc | INTPUT_DISABLE; /*Hier dein Tipp*/
3
  PR.PRPA = PR_DAC_bm | PR_ADC_bm | PR_AC_bm;


Für die anderen Ports verfahre ich ähnlich. Auf Schaltskizze gucken ob 
analog, wenn ja mit INTPUT_DISABLE, wenn nein ohne INTPUT_DISABLE ? 
(Oder wenn in Benutzung durch mich natürlich auch nicht.)

Bitte korrigiere mich.

-------------

Leider ist Frage 3 noch offen geblieben:

Gibt es Ampere-Meter, die man einfach an den Xmega anschließen kann?

Sollte dann ein Ampere-Meter im Micro-Ampere Bereich sein wahrscheinlich 
(dem Datenblatt nach zu urteilen)?

Habe ein Foto angehängt, da ist noch ein Jumper dran und laut 
Schaltskizze ist es *1x2 pin header, right angle, 2.54 mm pitch, 
through-hole*.

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

Altug T. schrieb:

> Den ADC, DAC und AC am Port A kann ich ausschlaten, da mein Code diese
> bei mir über Port B laufen. Das habe ich im Code auch schon getestet.

OK. Diese Information fehlte mir. Du siehst, mit dem Hellsehen habe ich 
es nicht so...


> Ok, dann lautet meine Frage jetzt: Wie stelle ich fest, ob der beliebige
> Port, den ich mir gerade auf der Schaltskizze angucke ein Eingang,
> Ausgang, binärer Eingang oder Low-Pegel-Ausgang ist ?

Hängt der Pin in der Luft, bzw. führt zu einem Steckverdinder, an 
welchen nichts angeschlossen ist, dann handelt es sich um einen offenen 
Eingang. In diesem Fall macht es Sinn, den Pull-Up zu aktiveren. Ist der 
Pin mit etwas verbunden, dass einen definierten Logik-Pegel erzeugt, 
also mit einem anderen binären Ausgang, mit Masse oder mit Vdd, dann den 
Pull-Up nicht aktivieren.

> Ok ich werde es mal probieren in Code zu fassen:
>
> Port A benutze ich gar nicht. Auf der Schaltskizze sehe ich überall
> ADC für Port A. Ich mache einfach alles aus (mit deinem Tipp):

Da mir der Schaltplan nich vorliegt (und ich auch keine Lust dazu habe, 
diesen zu suchen), kann ich diese Aussage nicht kommentieren...

>   PORTCFG.MPCMASK = 0xFF;
>   PORTA.PIN0CTRL = PORT_OPC_PULLUP_gc | INTPUT_DISABLE; /*Hier dein
> Tipp*/

Wenn Du den Input-Buffer deaktivierst, benötigst Du auch keinen Pull-Up 
mehr. Ob's schadet, weiß ich nicht. Versuch macht kluch, also selber 
messen.

> Für die anderen Ports verfahre ich ähnlich. Auf Schaltskizze gucken ob
> analog, wenn ja mit INTPUT_DISABLE, wenn nein ohne INTPUT_DISABLE ?
> (Oder wenn in Benutzung durch mich natürlich auch nicht.)
>
> Bitte korrigiere mich.

Das gilt nur für die Ports, die auch analoge Signale verarbeiten können. 
Bei den anderen Ports gucken, ob die Eingänge auf definiertem Pegel 
liegen. Wenn nicht: Pull-Up aktivieren.

> Leider ist Frage 3 noch offen geblieben:
>
> Gibt es Ampere-Meter, die man einfach an den Xmega anschließen kann?

Ich würde mal ganz dreist behaupten, dass sich jedes Amperemeter an den 
Xmega anschließen lässt. Ob es Sinn macht, ein Zangenamperemeter für 10 
kA anzuschließen, steht auf einem anderen Blatt...

> Sollte dann ein Ampere-Meter im Micro-Ampere Bereich sein wahrscheinlich
> (dem Datenblatt nach zu urteilen)?

Dann verwende doch ein entsprechendes Amperemeter. Was spricht dagegen?

> Habe ein Foto angehängt, da ist noch ein Jumper dran und laut
> Schaltskizze ist es *1x2 pin header, right angle, 2.54 mm pitch,
> through-hole*.

Das schmeichelt mir, dass Du mir zutraust, aus einem schlecht 
aufgelösten Photo einer Leiterplatte, deren Verschaltung erkennen zu 
können. Ich muss Dich aber leider enttäuschen, das kann ich leider nicht 
:-(

Grüßle,
Volker.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Für meinen Datenrecorder mit dem Xplained schalte ich im 
Datensammelbetrieb auf 2Mhz Takt und nur beim Online Betrieb zum 
Auslesen etc. auf die 32Mhz. Das spart ne Menge.

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.