Forum: Mikrocontroller und Digitale Elektronik Mit Interrupt in LowPowerMode


von Mike (Gast)


Lesenswert?

Hallo

Der Timerinterrupt läuft nun einwandfrei, nochmals besten Dank an
Sebastian

Nun das nächste und letzte Problem, danach werde ich euch nicht mehr
belästigen ;o)

Facts:
Ich baue einen Drinkomaten. Bei diesem kann man über eine
Matrixtastatur einen von vordefinierten Cocktails wählen. Eine
entsprechende Mechanik mixt diesen dann.
Der Prozessor MSP430F149 wird über ein externes Netzteil gespiesen
3,6Volt und das LCD über 5V.
Da der Prozessor die Drinkrezepte, welche man verändern kann nicht
verliert bei Powerdown des Netzteiles, wird der MSP (3,6V Leitung)
mittels einer Batterie gestützt.
Nun soll er aber in den LowPowerMode gehen, da er sonst ca. 4mA braucht
und die Batterie so ca. alle 10Tage gewechselt werden muss.
Über einen Spannungsteiler der 5V Leitung wird auf P1.0 gemessen, ob
das Netzteil läuft(Pegel high) oder nicht(Pegel low).
Am Anfang der Menueführung befindet man sich im Hauptmenue, dieses
wiederholt sich laufend, bis eine Taste gedrückt wird. Ich definiere
also, dass das Netzteil nur abgeschalten werden darf, wenn der MSP sich
im Hauptmenue befindet.
Somit kam ich auf folgenden Code:

//Interrupt setzen

P1IE|=0x01;    // P1.0 ist jetzt Interrupt-fähig
P1IES|=0x00;   // Interrupt bei low_high Übergang




//Dies ist das Hauptmenue
main
{
unsigned fhauptmenuetastenwert=20;

do
    {
   if(fhauptmenuetastenwert==20)
     {
     lcd_comand(0x01);         //DP löschen
     lcd_dispstring(1,"Bitte Taste waehlen");
     lcd_dispstring(2,"1:alk.haltige Drinks");
     lcd_dispstring(3,"2:alk.freie Drinks");
     lcd_dispstring(4,"3:Drink selber mixen");
     if ((P1IN & 0x01) == 0)_BIS_SR(LPM0_bits + GIE);//In lowpowermode 0
gehen
     fhauptmenuetastenwert=matrixtasten();
     }
   if(fhauptmenuetastenwert==20)
     {
     lcd_comand(0x01);
     lcd_dispstring(1,"F:Drinks aendern");
     lcd_dispstring(2,"4:Mechanik bewegen");
     lcd_dispstring(3,"5:Fuellstand Flasche");
       fhauptmenuetastenwert=matrixtasten();
     }
   }while ((fhauptmenuetastenwert==20)
          ||(fhauptmenuetastenwert>6));    //solange keine Taste 
gedrückt
und grösser als 6

}


#pragma vector=PORT1_VECTOR
__interrupt void Port1_Interrupt (void)
{
    _BIC_SR_IRQ(LPM0_bits);             // Clear LPM3 bits from 0(SR)
}


Im Hauptmenue wird nun der LPM0 aufgerufen,wenn P1.0 = low.
Sobald P1.0 von low auf high geht soll der MSP wieder normal laufen.

Nun mein Problem
Im normalen Betriebszustand beträgt die Stromaufnahme ca.4mA
Wenn ich nun P1.0 auf low setze beträgt die Stromaufnahme ca.3,6mA

ist das normal, dass der Strom nur so wenig sinkt??
oder funktioniert meine Interrupt geschichte nicht so ganz??

Bitte helft mir, denn dies ist mein letztes Problem

von OldBug (Gast)


Lesenswert?

Hm, mal eine Frage zwischendurch: warum ignorierst Du alle Antworten?
:)

Ich habe Dir doch bei dem damaligen Thread schon gesagt, daß Du Dich
gar nicht um eine Batterie kümmern musst, wenn Du die Drinks und
Zustände (was auch immer) in einem der Info-Segmente des Flashs legst.
Das ist und bleibt die effektivste Methode um so etwas zu realisieren.
Flash-Access Routinen gibts als App-Notes bzw bei den Beispielen von
TI, und wenn Du fragen dazu haben solltest, dann kann man Dir hier mit
Sicherheit auch helfen. Diese Batterie-Lösung ist meiner Ansicht nach
"Prosch" und man erkennt auf Anhieb, daß man sich da keine Mühe mit
machen wollte (daß das auch sehr Aufwendig ist, mag sein, aber kommt
dem Ideal, daß die eingestellten Parameter möglichst auch ohne Strom
erhalten bleiben, bei weitem nicht nahe).
Irgendeinen der Stromsparmodi des MSP430 sollte man übrigens immer
verwenden. Macht man das nicht -> gleicher Eindruck wie
Batterielösung.

Zu Deiner Frage: ohne die Schaltung zu kennen kann man über die
Stromaufnahme keine Aussage treffen...

Gruß,
Patrick...

von Mike (Gast)


Lesenswert?

Hallo Patrick
Also mal kurz zu keine Mühe geben...
Ich habe deinen Vorschlag nicht ignoriert, sondern finde dies
schlichtweg einfach zu aufwendig. Ich habe ein Netzteil dimensioniert
und aufgebaut. Einen Schrittmotor welcher eine ansteuerschaltung
braucht, 2 DC Motoren, welche ich über PWM regle, diverse
Lichtschranken, Schalter, LCD, Magnetventil usw.
Also irgendwan muss man gewisse Sachen streiche, wenn man davon keine
Ahnung hat und Zeit in z.Bsp. eine saubere Ansteuerung der Motoren usw.
zu nehmen.
Darum habe ich mich für die Batterie entschieden, ob dies nun Scheisse
ist oder nicht interessiert mich überhaupt nicht. In vielen
Radioempfängern hat man ja schliesslich auch Stützbatterien, auch bei
den besseren Produkten...

Die Schaltung kann man sich ja eigentlich denken wie die aussieht. Der
MSP wird einfach mittels einer Batterie und Diode gestützt. Somit
bezieht nur der MSP von dieser Batterie strom....

Habe nun gemerkt, dass wenn man vom externen 7,7328Mhz Quarz auf den
DCO wechselt sich der Strom mehr als halbiert.

von OldBug (Gast)


Lesenswert?

Um so viel Strom wie möglich zu sparen setzt man erst mal, so lange
nichts Zeitkritisches passieren soll, die Clockrate runter. Das geht so
lange, bis man schliesslich die CPU anhält. In diesem Zustand fliesst
dann am wenigsten Strom, man muss die CPU aber auch wieder aus ihrem
Schlafzustand wecken, was dann auch wieder einige Taktzyklen in
Anspruch nimmt.
Ich mag Dich hier gar nicht schlecht machen, oder behaupten, daß
irgendwas "Scheisse" ist, ich versuche Dir nur zu vermitteln, was
jemand denken mag, wenn er das ganze Konstrukt objektiv beurteilt. Und
da spielen heutzutage solche Sachen wie Stromsparmodi,
Umweltfreundlichkeit etc. gerade bei einer Diplomarbeit leicht
verdiente Punkte ein! Ich habe Dir ja auch damals schon meine Hilfe
angeboten, die Flash-Routinen zu integrieren. Du bewertest den Aufwand
an dieser Stelle einfach falsch! Es ist einfach nicht sehr aufwendig
und auch nicht schwierig zu verstehen, weshalb dann wieder der Eindruck
beim beurteilen entsteht, daß man in einfache sachen keinen Aufwand
steckt...
Meines erachtens falsche Prioritäten gesetzt.
Das soll jetzt nicht abwertend sein, nicht falsch verstehen ;)

Also: überdenk das noch mal...

Gruß,
Patrick...

von Mike (Gast)


Lesenswert?

ok, habe nun überlegt und verzichte auf das flash schreiben, denn sowas
ist mir zu komplex.

vieleicht könnt ihr mir ja da weiterhelfen:

ich habe eine routine die den externen quarz einschaltet. DIese sieht
folgendermassen aus:
void clk (void)
 {

int i=0;

 BCSCTL1 |= 0xC0;                   // ACLK = LFXT1 = HF XTAL

    do

  {

  IFG1 &= ~OFIFG;                       // Clear OSCFault flag

  for (i = 0xFF; i > 0; i--);           // Time for flag to set

  }

  while ((IFG1 & OFIFG) != 0);          // OSCFault flag still set?




  BCSCTL2 |= 0xC8;                 // MCLK = LFXT1 (safe)


  }

wie kann ich nun während em Programm wieder auf den DCO (interner
Takt)umschalten

von OldBug (Gast)


Lesenswert?

Na dann... viel mühe um nichts...

RTFM!

von Mike (Gast)


Lesenswert?

meinst du wirklich, dass das flashschreiben einfacher ist. ich meine ich
habe 18 drinkrezepte, welche als  datenstruktur gespeichert sind und
diverse static variablen....

von OldBug (Gast)


Lesenswert?

Einfacher als die Batteriestützschaltung auf jeden Fall! Spart auch noch
Bauteile... Du hast ja beim F149 256Bytes frei Verfügbar, ohne groß
Aufwand treiben zu müssen. Und da lässt sich schon ne ganze menge
Speichern. Wie groß sind denn Deine Strukturen?

von Stefan Kleinwort (Gast)


Lesenswert?

Hi Mike,

um den Stromverbrauch in den Griff zu bekommen, ist auch meiner Meinung
nach mehr Aufwand nötig als die Daten ins Flash zu schreiben.

Betrachte den MSP nicht nur als Bauteil, in das "um seiner selbst
willen" Strom reinfliesst. Der Strom, den der MSP zieht, wird ganz
wesentlich von der Beschaltung seiner I/O-Pins und deren
Software-Ansteuerung beeinflusst. Wenn Du wirklich diesen Weg gehen
willst: überleg Dir bei jedem Pin genau, welcher Strom aus ihm
herausfliesst, wenn Du im PWDN-Mode bist.

Stefan

von Mike (Gast)


Lesenswert?

Danke auch Stefan für deinen Beitrag. So langsam überzeugt ihr mich
ja.....
Wo sehe ich wie gross meine structuren sind. Nach dem linken steht
folgendes

 17572bytes of CODE  memory
     139 bytes of DATA  memory (+ 43 absolute )
  3 294 bytes of CONST memory

von OldBug (Gast)


Lesenswert?

Du musst doch wissen, was Du in die Structs reinschreibst... Daraus
ergibt sich dann die Gesamtgröße nach dem addieren der einzelnen
Members.

von Mike (Gast)


Lesenswert?

ok, gesammthaft befinden sich in den structs 67 variablen vom typ
unsigned char...

von OldBug (Gast)


Lesenswert?

Ist das die Summe aller_ Structs oder _aller Member (Variablen)
einer Struct?

von Mike (Gast)


Lesenswert?

also, ich habe 17struct
in denen befinden sich insgesammt ca.60 variablen

ausserdem habe ich noch die flaschenfüllstände als static char
variablen 8mal vertreten

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.