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
intmain(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?
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.
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*.
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.
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.