Forum: Mikrocontroller und Digitale Elektronik MSP430: Kein LPM3?


von Daniel Schwarz (Gast)


Lesenswert?

Hi zusammen!

Ich brauch mal bitte jemanden zum Mitdenken:

Mein MSP430F169 will scheinbar nicht in den Low Power Mode 3. Sagt 
zumindest meine Strommessung. Nach dem Initialisieren der Ports und 
aller Module braucht der Controller laut Messgerät ca. 600uA. Beim 
Aufrufen des LPM3 werdens nur etwa 40uA weniger. Wow.

Den LPM3 rufe ich im C-Code so auf:
1
  for (;;) {
2
    //(toller Code)
3
    
4
    START_TIMER();              //start timer for periodic wake up
5
    
6
    // MSP power down (LPM3: all clocks but ACKL disabled), general interrupts enable
7
    _BIS_SR(GIE + CPUOFF + SCG1 + SCG0);
8
  }

Das Makro "START_TIMER" lässt einen Timer zählen, dessen Interrupt den 
MSP aufweckt. Im Interrupt wird der Low Power Mode ausgeschaltet, zurück 
zur oberen Schleife gesprungen, diese ausgeführt und wieder in den 
Ruhezustand gewechselt.

Springe ich im Einzelschritt durch den Code, schläft der MSP wie 
erwartet nach dem abarbeiten von
1
_BIS_SR(GIE + CPUOFF + SCG1 + SCG0);
 und wacht durch den Timer wieder auf. Soweit klappt das Programm. 
Abgesehen vom Strom, der mit grob 599uA viel zu viel ist.

Lasse ich den programmierten MSP ohne Debugger laufen, ändert sich auch 
nichts. Das Messgerät stimmt, ich hab's gerade mit dem Strom an ein paar 
Widerständen überprüft. Eine Spannungsfolger muss ich also nicht 
aufbauen.

Vielleicht noch: Entwicklungsumgebung ist Code Composer Studio Version: 
4.0.2.01003. In den (1001) Einstellungen habe ich nichts gefunden, was 
zum beschriebenen Problem führen würde.

Hat jemand eine Ahnung, ob irgendwas den LPM3 (also DCO bzw. CPU OFF) am 
MSP verhindert?

von Fabio S. (codehamster)


Lesenswert?

Hast du das JTAG-Kabel noch am Entwicklungsboard?
Zieh das mal ab...

von Daniel Schwarz (Gast)


Lesenswert?

Auch der abgezogene Debugger (Olimex Tiny) bringt keine Veränderung. Ich 
hab noch einen Taster dran, der P1.5 gegen Masse schaltet. Ein 
Pullup-Widerstand erzeugt mir den stabilen Highpegel. Der isses aber 
auch nicht.

Während der Initalisierung der Portpins ändert sich auch nichts am 
Stromverbraucht. Die schließe ich daher aus. Ein EEPROM ist nicht dran.

Auf dem Board ist noch ein Funktransceiver (Chipcon CC2420). Den kann 
ich erfolgreich abschalten (verbraucht idle ca. 200uA, die sind bei den 
600uA nicht mitgerechnet).

Mir ist gerade noch aufgefallen, dass das Initialisieren der 
UART-Schnittstelle auf SPI-Mode bei ver-odern des SYNC-Bits (schaltet 
zwischen RS232 und SPI um) um 200uA ansteigt. Obwohl sich das Modul beim 
Initialisieren im Reset befindet. Komisch...

Hier ist die Initialisierung des UART-Moduls auf SPI-Funktion:
1
void InitSPI() {
2
    P5SEL |= (MOSI + MISO + SCK);
3
    P5DIR &= ~(MISO);
4
    U1CTL |= SWRST;
5
    U1CTL |= SYNC;
6
    U1CTL |= MM;
7
    U1CTL |= CHAR;
8
    U1TCTL |= STC + CKPH + SSEL1 + SSEL0;
9
    U1TCTL &= ~CKPL;
10
    U1BR0 = 0x02;
11
    U1BR1 = 0;
12
    UMCTL1 = 0;
13
    ME2 |= USPIE1;
14
    U1CTL &= ~SWRST;
15
}

Danke trotzdem für die Antwort!

von Daniel Schwarz (Gast)


Lesenswert?

Hab gerade IAR Workbench anstatt dem CodeComposer ausprobiert. Keine 
Veränderung. Auch ein neuer MSP zeigt gleiches Verhalten.

Mein Problem ist wohl zu speziell, als dass hier groß Tipps reinkokmmen 
würden, oder?

von jensen (Gast)


Lesenswert?

Hi Daniel,

Kann man den Funktransceiver abziehen?
Wenn ja, dann teste mal ohne.

Hatten ein ähnliches Problem bei UART.

Lösung: Ein Impedanzwandler in der Datenleitung zwischen µc und 
Funkmodul.

Gruß

von Heinz (Gast)


Lesenswert?

Mit welcher Clock läuft dein Timer ?

Schreib einfach mal ein LPM3 in deine Main-Funktion, ohne Timer etc. und 
schau dir den Strom an.

von Daniel Schwarz (Gast)


Lesenswert?

@jensen:
Nein, den Funktransceiver kann ich leider nicht abziehen. Meinst du, 
dass Abschalten zwar funktioniert, aber verbundene Leitungen trotzdem 
stören?

@Heinz:
Der MSP läuft mit dem internen DCO auf ~800kHz. Der Timer wird mit einem 
externen Uhrenquarz betrieben. Im LPM3 sollte der DCO abgeschaltet 
werden.

Der LPM3 hat schonmal in einem anderen Projekt funktioniert, da bin ich 
mir sicher. Ich kann aber nicht sagen, was jetzt anders ist.

Eben habe ich noch etwas festgestellt:

Wenn ich den Pullup-Widerstand an P1.5 wegnehme und P1.5 als Eingang 
unbeschaltet lasse, geht der Stromverbrauch bei Aktivieren des LPM3 
tatsächlich auf wenige uA zurück. Allerdings nur für 1-2 Sekunden. 
Dannach steigt der Strom wieder an. Halte ich den Widerstand kurz an den 
Pin und nehme ihn wieder weg, fällt der Strom und steigt dann wieder.

(Das kann ich ewig wiederholen... Workaround: Widerstand periodisch 
anschließen? ;-))

von jensen (Gast)


Lesenswert?

Daniel Schwarz schrieb:
>Nein, den Funktransceiver kann ich leider nicht abziehen. Meinst du,
>dass Abschalten zwar funktioniert, aber verbundene Leitungen trotzdem
>stören?

Durchaus möglich.
Bei uns war es so, das nach dem Initialisieren der UART (Port 3) der 
Stromverbrauch sich extrem steigerte (4mA), obwohl MSP im LPM3 war.
Mit abgezogenem Funkmodul funktionierte es tadellos (80µA).

Abhilfe durch OPV in Datenleitung und nun "funzt" es.

von Daniel Schwarz (Gast)


Lesenswert?

Der Funkbaustein ist leider fest draufgelötet. An die Leitungen komm ich 
nicht ohne Weiteres ran. Ich habe den UART mal nicht initialisiert, das 
hat aber auch nichts gebracht.

Wie Heinz schon vorgeschlagen hat, habe ich den LPM auch direkt in Main 
geschrieben. An allen möglichen Positionen und mit allen möglichen 
Initialisierungen.

Kann da irgendein blöder Anschluss floaten?

von Christian R. (supachris)


Lesenswert?

Sowas hatte ich auch mal beim MSP430. Durch viel probieren der einzelnen 
Zustände der I/Os zwischen dem MSP und den übrigen Bauteilen bin ich 
dann irgendwann in die Nähe des Datenblatt-Verbrauchs gekommen. Manche 
Leitungen als Eingang, manche als Ausgang, manche Low, manche High. Es 
macht sogar einen Unterschied, ob mal PxOUT auf Low oder High setzt, 
wenn der Pin als Eingang geschaltet ist. Alles sehr mysteriös und leider 
mit viel Probieren verbunden.

von Jörg S. (joerg-s)


Lesenswert?

Und auch temperaturabhängig das ganze. Einmal die Platine anhauchen, 
schon steigt der Strom auf's doppelte an :)

von Daniel Schwarz (Gast)


Lesenswert?

Hab ich erwähnt, dass ich das gerade zum Kotzen finde?!

Das mit den Pegeln an den Ports stimmt wohl irgendwie. Im Datenblatt ist 
auch die "Connection of unused pins" angegeben. Daran hab ich  mich 
jetzt mal gehalten. Es ist ein bisschen besser geworden, aber noch weit 
weg von optimal.

von Christian R. (supachris)


Lesenswert?

Ist leider so. Bei vielen Ports bei mir hab ich PxDIR auf Eingang stehen 
und den Ausgangstreiber auf Low. Generell geht der Stromverbrauch auch 
etwas zurück, wenn man die Zweitfunktion abschaltet.

von Jörg S. (joerg-s)


Lesenswert?

Wie machst du denn eigentlich die Strommessung wenn er alle x ms 
aufwacht?

von Heinz (Gast)


Lesenswert?

> Der MSP läuft mit dem internen DCO auf ~800kHz. Der Timer wird mit einem
> externen Uhrenquarz betrieben. Im LPM3 sollte der DCO abgeschaltet
> werden.
Aha, also ein LPM3 direkt als ersten Befehl bringt nicht die erwünschte 
Änderung ?

Dann gehe jede Peripherie/Port/Pin einzeln durch und schau ob/wann es 
besser wird. Wildes rumgesuche führt zwar auch mal zum Ziel, aber danach 
weißt du genauso viel wie vorher.

Also schön aufschreiben und nachdenken !

von Bernd O. (bitshifter)


Lesenswert?

Jörg S. schrieb:
> Wie machst du denn eigentlich die Strommessung wenn er alle x ms
> aufwacht?
Der einfachste Weg ist, den Spannungsabfall an einem hochohmigen 
Reihenwiderstand zu messen (200 mV Bereich) und parallel zum Widerstand 
eine Si-Diode. Im Stromsparbereich stört die Diode kaum, weil der Strom 
sehr klein ist und viel weniger als 700 mV an Diode/Widerstand abfallen, 
man erhält also eine genaue Messung. Wenn der Controller "aufwacht" 
bricht seine Versorgungsspannung um max. 700 mV wegen der Diode ein -> 
meist kein Drama.

Gruß,
Bernd

von Pothead (Gast)


Lesenswert?

Man sollte auch mal die Errata bemühen. Manchmal gibt es Bugs in denen 
Clocks oder der ADC nicht abgestellt werden - da bringt dann ein 
gefummele am Port nicht sonderlich viel. Wenn alles korrekt ist, dann 
sollte man bei maximal 10µA landen.

von Daniel Schwarz (Gast)


Lesenswert?

Auf der Suche nach Mikroamperes bin ich jetzt auf 12uA runter!

3 Auslöser habe ich gefunden:

- Zum einen war's wohl wirklich der Funktransceiver am Port 5: Werden 
die Datenleitungen (MOSI, MISO und SCK) von der Option "Special 
function" zurück auf allgemeine I/O-Leitung geschaltet, werden's 
schonmal ein paar Hundert uA weniger

- Wie im Datenblatt beschrieben: alle unbenutzten Pins auf I/O-Funktion, 
Ausgang und low schalten bringt noch ein paar uA

- Zu dumm zum Programmieren: Takt der ACKL teilen lief bei mir über
1
BCSCTL1 = DIVA_3;
Fehler hier: Oder-Operator vergessen. Das schaltet im Register den 
Quarzoszillator ein und braucht damit 250uA.

Die restlichen 10-11uA sind mir jetzt egal. Für die Batterie reicht bei 
diesem Profil für mehr als ein Jahr. Ich hab an genug Portpins gewackelt 
und finde einfach nichts mehr (Exemplarstreuung, obwohl der Wert gut vom 
Datenblatt abweicht?).

Danke für eure Hilfe, mein Problem kann als gelöst betrachtet werden!
Daniel

======================================================================== 
===

Hier noch ein kleiner Einschub, weil die Frage aufkam. Vielleicht hilfts 
ja dem ein oder anderem:

Jörg S. schrieb:
> Wie machst du denn eigentlich die Strommessung wenn er alle x ms
> aufwacht?

Entweder wie Bernd das beschrieben hat, oder man hat ein Multimeter, 
dass schon im uA-Bereich zuverlässig messen kann oder rückwirkungsfreie 
Messung kleiner Ströme mit einem OP:

Strommessungen mittels Spannungsabfall über einen niederohmigen 
Messwiderstand (Shunt) würden hier zu ungenaue Ergebnisse liefern. Um 
den Stromverbrauch der zu betreibenden Hardware auch bis in den unteren 
Mikroamperebereich sicher messen zu können, kannst du einen sog. 
Transimpedanzwandler aufbauen. Das ist ein als invertierender Verstärker 
beschalteter Operationsverstärker, der zwischen die MASSELEITUNG(!) der 
Last geschaltet wird. (Schaltung siehe 
http://www.elektronik-kompendium.de/sites/slt/0210141.htm).

Der Operationsverstärker (OPV) versucht, die Differenzspannung UNP an 
seinen Eingängen (+ und -) auf 0 V zu halten. Der Widerstand R2 (siehe 
Link zur OP-Schaltung) dient zur Rückkopplung der Ausgangsspannung, um 
dieses Ziel zu erreichen. Tritt über eine Last eine Spannungsdifferenz 
auf (der Widerstand R1 stellt die Last mit dem fließenden Laststrom Ie 
dar), wird die Spannung am Ausgang Ua solange erhöht, bis UNP = 0 V ist. 
Der Punkt S besitzt demnach auch das Potential 0 V, obwohl dieser gar 
nicht real auf Masse liegt. S wird deshalb auch als „virtuelle Masse“ 
bezeichnet. Der fließende Strom ist nach dem Ohmschen Gesetz der 
Quotient aus der Ausgangsspannung Ua und dem Rückkoppelwiderstand R2 
(mit negativem Vorzeichen, wegen des invertierenden Eingangs).

Bei dieser Schaltung ist folgendes zu beachten:

- Der OPV muss schnellen Lastwechseln und damit schnellen Änderungen der 
Spannungsdifferenz am Eingang entsprechend schnell folgen können
- Der OPV sollte symmetrisch mit Spannung versorgt werden (dual supply), 
damit Ströme in beiden Richtungen gemessen werden können
- Wird der Laststrom zu groß, steigt die Ausgangsspannung max. bis zur 
Versorgungsspannung des OPVs. Die Spannungsdifferenz kann nicht mehr 
ausgeregelt werden und der Massebezug fällt weg. Durch zwei antiparallel 
geschaltete Schottkydioden zwischen dem invertierenden Eingang und Masse 
kann das Einbrechen der Spannung vermieden werden: Je nach Polung der 
Spannung wird eine der beiden Dioden gegen Masse leitend. Der 
Spannungsabfall von ca. 0,2 V muss in diesem Fall allerdings in Kauf 
genommen werden

Die Spannung misst du dann am besten mit dem Oszi (schnelle Lastwechsel 
macht ein Multimeter der Torzeit wegen nicht mit bzw. kannst du ein 
Stromprofil aufzeichen), invertierst den Kanal und rechnest von 
gemessener Spannung in den Strom zurück (wie oben beschrieben).

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.