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
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...
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.
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...
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
meinst du wirklich, dass das flashschreiben einfacher ist. ich meine ich habe 18 drinkrezepte, welche als datenstruktur gespeichert sind und diverse static variablen....
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?
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
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
Du musst doch wissen, was Du in die Structs reinschreibst... Daraus ergibt sich dann die Gesamtgröße nach dem addieren der einzelnen Members.
ok, gesammthaft befinden sich in den structs 67 variablen vom typ unsigned char...
Ist das die Summe aller_ Structs oder _aller Member (Variablen) einer Struct?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.