Forum: Mikrocontroller und Digitale Elektronik MSP430F1612_Batteriebetrieb


von Mathias U. (munter)


Angehängte Dateien:

Lesenswert?

Hallo ich habe immer noch ein Problem mit dem Batteriebetrieb beim 
MSP430.
Es ist MSP430F1612.
Hab vor ein paar Tagen schon mal gefragt wegen der zugehörigen ISR.
Aber ich denke, es liegt erstmal ein Hardware-Problem vor, deshalb der 
neue
Thread.
Meine derzeitige Anbindung ist im Bild zu sehen...

Folgende Messungen habe ich bereits mit nem Multimeter gemacht:

Leerlaufspannung der Batterie: 3,276V (drauf steht 3V)
Aus dem Netzteil kommen, wenn der MSP dran und an ist 3,296V
Wenn die Batterie NICHT dran ist, dann liegen an AVcc 2,994V an.
Ist die Batterie mit in der Schaltung, dann sinds 3,008V.
Wenn die Batterie drin ist, und die Netzspannung wegfällt, liegen an
AVcc 3,127V an.

Was ich jetzt merkwürdig finde, bzw. nicht verstehe:
Ist die Batterie draussen und die Netzspannung an, dann liegen an Punkt 
1 von D7 0,77V an. Ist die Netzspannung weg, dann liegen dort 0,74V an.
Wo bitte kommt denn an der Stelle eine Spannung her?

Wenn die Netzspannung wegfällt, dann tut sie das nicht abrupt, sondern 
sie fällt langsam! Es dauert wirklich etliche Sekunden, bis sie auf < 
0,5V fällt.
Dementsprechend fällt auch das Potential an P2.7 sehr langsam!
Und es liegt bestimmt nicht an der Trägheit des multimeters. Es sind 
wirklich bestimmt 15s...

Wenn ich den MSP starte, dann die Batterie rein mache, und dann die 
Netzspannung aus mache, dann hab ich eigentlich erwartet, dass das 
Programm (vor allem die Uhr) weiterläuft.


Aber nach erneutem zuschalten der Netzspannung macht der MSP wieder ganz 
von vorne los.
Und die Uhrzeit lief auch nicht weiter.

Sieht jemand einen offensichtilichen Fehler in der Beschaltung?

Jetzt hab ich grad was seeehr merkwürdiges gefunden:
Wenn keine Batterie in der Schaltung ist, und auch keine Netzspannung 
vorhanden ist, dann liegt an Pin64 vom MSP trotzdem 2,43V an.
An P2.7 liegen aber nur mV. Das kann ja nur von den C's kommen, die an 
Pin64 anliegen...

Was stimmt da nicht?
Danke

von Jörg S. (Gast)


Lesenswert?

> Ist die Netzspannung weg, dann liegen dort 0,74V an.
> Wo bitte kommt denn an der Stelle eine Spannung her?
Eine Diode hat auch einen (geringen) Strom in Sperrichtung.

> Wenn die Netzspannung wegfällt, dann tut sie das nicht abrupt, sondern
> sie fällt langsam!
Wo gemessen und wie wird die Netzspannung abgeschaltet (Netzteil aus 
oder abgesteckt)?

> Wenn ich den MSP starte, dann die Batterie rein mache, und dann die
> Netzspannung aus mache, dann hab ich eigentlich erwartet, dass das
> Programm (vor allem die Uhr) weiterläuft.
Wo ist denn dein Reset Pin angeschlossen?

> Das kann ja nur von den C's kommen, die an Pin64 anliegen...
Richtig, daher ist das auch vollkommen normal. Die Ladung kann ja 
nirgends hin wenn der MSP so wenig verbraucht.

von Mathias U. (munter)


Lesenswert?

Jörg S. wrote:

> Wo ist denn dein Reset Pin angeschlossen?

Genau DAS war das Problem! Der Resetschaltkreis wird auch mit den 3,3V 
vom Netzteil gespeist. Fällt diese weg, bzw. ist die Netzspannung wieder 
da, gibt der dem MSP nen Reset.
Ich habe jetzt die Spannung für den Resetschaltkreis "nach" meinen 
beiden Dioden abgenommen, so dass der Schaltkreis notfalls die Vcc von 
der batterie bekommt.
Und siehe da, es geht ohne Probleme.
--> manchmal sind die Dinge soooo einfach!

von Mathias U. (munter)


Angehängte Dateien:

Lesenswert?

Hmmm, so ganz geht die Sache doch noch nicht.
Ich habe mal die Schaltung mit meinem Resetschaltkreis angehängt.

Das Datenblatt zum TLC7701 gibts hier:
http://focus.ti.com/lit/ds/symlink/tlc7701.pdf

Folgendes passiert:

Die Batterie ist in der Scahltung drin. Ich schalte das Netzteil aus und 
warte ne kleine Weile, bis die Spannung am P2.7 auf < 0,5V gesunken ist.
Damit sollte der Interrupt ausgelöst werden, und meine ISR wird 
abgearbeitet.
Dann schalte ich wieder ein, und das Gerät läuft genau da weiter, wo ich 
es möchte (es wird auf dem Display was anderes angezeigt, als das, was 
vor dem Ausschalten zu sehen war).
Warte ich zu kurz vor dem Wiedereinschalten, dann macht er an der Stelle 
weiter, an der er aufgehört hat. Genaugenommen hört er wohl nicht 
wirklich auf, weil der Interrupt noch nicht ausgelöst wurde.

Warte ich allerdings zu lange, dann fängt der MSP wieder bei Null an, 
d.h. er hat nen Reset bekommen.

Jetzt ist die Frage, warum.
Könnte es daran liegen, dass ich dem Resetschaltkreis für die 
Betriebspannungsversorgung zusätzlich zu dem im Datenblatt 
vergeschlagenen 100nF Kondensator noch einen 10µ Elko spendiert habe?

Was sagen die Experten dazu?
Vielen Dank schonmal

von Falk B. (falk)


Lesenswert?

@ Mathias U. (munter)

>warte ne kleine Weile, bis die Spannung am P2.7 auf < 0,5V gesunken ist.
>Damit sollte der Interrupt ausgelöst werden, und meine ISR wird
>abgearbeitet.

Warum glaubst du, dass der Interrupt erst bei 0,5V ausgelöst wird? Ein 
LOW wird typisch schon bei 0,4*Vcc erkannt, hier ca. 1,5V. Um die 
fallende Batteriespannung eher zu erkennen, aknnst du ja einen 
hochohmigen Spannungsteiler bauen, der bei Normalspannung ca. 
0,6...0,7Vcc ausgibt. Damit spricht er schneller auf eine sinkende 
Betriebsspannung an.

>Könnte es daran liegen, dass ich dem Resetschaltkreis für die
>Betriebspannungsversorgung zusätzlich zu dem im Datenblatt
>vergeschlagenen 100nF Kondensator noch einen 10µ Elko spendiert habe?

>Was sagen die Experten dazu?

Du musst deine Signale zur Peripherie (LCD etc.) auch schnellstmöglich 
auf Null setzen. Sonst versorgt dein MSP über seine Ausgänge und die 
Schutzdioden in den ICs die externen ICs. Dabei bricht die 
Batteriespannung zusammen, denn diese Lithiumzellen bringen nur recht 
kleine Ströme im Bereich von 1..5mA.

MfG
Falk

von Mathias U. (munter)


Lesenswert?

Ich werde erstmal den 500K gegen Masse für den P2.7 gegen einen 20k 
austauschen. Damit ist der Spannungsteiler an der Stelle schon 
günstiger, und die fehlende Betriebsspannung wird eher erkannt.

>Du musst deine Signale zur Peripherie (LCD etc.) auch schnellstmöglich
>auf Null setzen. Sonst versorgt dein MSP über seine Ausgänge und die
>Schutzdioden in den ICs die externen ICs.

Ich versteh jetz nicht genau, was Du damit meinst. Was für Signale 
meinst Du?
Ich habe keine Peripherie, die vom MSP mit Spannung versorgt wird.
Das Display geht über 5V. Und die andere Peripherie auch. D.h., wenn das 
Netzteil aus ist, bekommen die eh keinen Strom mehr.

Danke

*edit: Ich habe eben mitbekommen, dass nach dem Wiedereinschalten, der 
MSP erst kurz da weiter macht, wo er nach der ISR weitermachen soll, 
dann bekommt er aber einen Reset...

von Falk B. (falk)


Lesenswert?

@ Mathias U. (munter)

>Ich versteh jetz nicht genau, was Du damit meinst. Was für Signale
>meinst Du?

Steuersignale vom MSP zur Peripherie.

>Ich habe keine Peripherie, die vom MSP mit Spannung versorgt wird.
>Das Display geht über 5V. Und die andere Peripherie auch. D.h., wenn das
>Netzteil aus ist, bekommen die eh keinen Strom mehr.

Denkst DU! Überleg mal was passiert, wenn ein Signal zum LCD auf HIGH 
(3,3V) liegt und das LCD keinen Saft mehr hat. Stichwort Schutzdioden, 
siehe Pegelwandler.

>*edit: Ich habe eben mitbekommen, dass nach dem Wiedereinschalten, der
>MSP erst kurz da weiter macht, wo er nach der ISR weitermachen soll,
>dann bekommt er aber einen Reset...

Komisch.

MfG
Falk

von Mathias U. (munter)


Lesenswert?

Falk Brunner wrote:

>>*edit: Ich habe eben mitbekommen, dass nach dem Wiedereinschalten, der
>>MSP erst kurz da weiter macht, wo er nach der ISR weitermachen soll,
>>dann bekommt er aber einen Reset...
>
> Komisch.

Ja, das macht er aber auch nur manchmal...also nicht ganz 
reproduzierbar.

Die Sache mit den Steuersignalen:
Du meinst also, ich müsste ALLE Steuersignale, bovor sie zu den 
Steckverbindern für die Peripherie gehen, per Pull-Down auf Masse legen?
Das wären fürs LCD 10 Stück, dann 5 Steuersignale für Relais und 
Analog-Switches, 2 für die AD-Wandler Eingänge, 3 für den PGA.
Was ist mit der SD-Card. Da ist ja sicher auch irgendwas wie ein IC mit 
drin, oder?
Ich hab gar keinen Platz mehr, die ganzen R's zu verbauen...
Damn, so ein Mist.

@Falk: könnte der zusätzliche Elko beim TLC7701 für die Betriebsspannung 
Probleme machen?
Danke

von Falk B. (falk)


Lesenswert?

@ Mathias U. (munter)

>Du meinst also, ich müsste ALLE Steuersignale, bovor sie zu den
>Steckverbindern für die Peripherie gehen, per Pull-Down auf Masse legen?

NEIN! Du musst sie im MSP auf LOW setzen, wenn deine ISR angesprungen 
wird und in den Sleep Mode schalten will.

>Was ist mit der SD-Card. Da ist ja sicher auch irgendwas wie ein IC mit
>drin, oder?

Neeee, ein Marienkäfer ;-)

>Ich hab gar keinen Platz mehr, die ganzen R's zu verbauen...

Die sind auch sinnlos.

>@Falk: könnte der zusätzliche Elko beim TLC7701 für die Betriebsspannung
>Probleme machen?

Du meinst C7? Nein, das passt schon.

MfG
Falk

von Jörg S. (Gast)


Lesenswert?

Also R24 würde ich komplett einsparen.

30µF an der 3,3V Leitung sind auch schon recht viel wenn nur der MSP 
dadurch versorgt wird.

Wie sieht denn der Rest der Schaltung aus? Die Peripherie läuft mit 5V 
weiter und der MSP nur mit Batterie???

von Mathias U. (munter)


Lesenswert?

Jörg S. wrote:
>Die Peripherie läuft mit 5V weiter und der MSP nur mit Batterie???

Nee, alle Betriebsspannungen gehen aus, sobald der Netzschalter aus 
gemacht wird.
Der MSP wird dann nur per Batterie versorgt, der Uhrzeit wegen...

von Mathias U. (munter)


Lesenswert?

Also ich habe jetzt den 500k gegen einen 20k Widerstand ausgetauscht.
Ich habe auch in meine ISR alle Pins aller Ports auf Null gesetzt, bevor
er in den LPM3 gehen soll, aber so recht funktionieren tut es immer noch
nicht.

hier mal meine ISR:
1
#pragma vector=PORT2_VECTOR
2
__interrupt void Port2_Interrupt (void)
3
{
4
  P2IFG = 0;                                        // flag wird zurueckgesetzt
5
   
6
  if((P2IES & INTERRUPT_P2_7) == 1)                 // wenn high --> low
7
  {
8
    // mache die notwendigen Operationen für den Shutdown
9
    P1OUT = 0x00;
10
    P2OUT = 0x00;
11
    P3OUT = SPI_CS;
12
    P4OUT = 0x00;
13
    P5OUT = 0x00;
14
    P6OUT = 0x00;    
15
    gehe_in_LPM3 = 1;                               // flag fuer main() setzen
16
    P2IES &= ~INTERRUPT_P2_7;                       // P2IFG wird gesetzt bei low --> high
17
  }
18
  else
19
  {    
20
    gehe_in_LPM3 = 0;                               // flag zuruecksetzen
21
    LCD_Init();                                     // LCD initialisieren ...
22
    LCD_Clear();                                    // ...loeschen, cursor an anfang
23
24
    Seite = 3;                                      // zeigt die uhrzeit an...
25
    pga_auf_wert(PGA_Wert_Gain_eff_A_max);          // pga auf max. gain fuer a-wichtung setzen    
26
    P2IES |= INTERRUPT_P2_7;                        // P2IFG wird gesetzt bei high --> low
27
    LPM3_EXIT;    
28
  }
29
}
Der PinChangeInterrupt ist folgendermaßen initialisiert:
1
P2IES  |= 0x80;                                   // high --> low bei P2.7 an
2
P2IE   |= 0x80;                                   // interrupt an P2.7 an
3
BIS_SR(GIE);                                     // allgemeiner Interrupt an

Ich finde es auch sehr sehr merkwürdig, dass:
Wenn das Gerät läuft, und ich dann die Spannung an P2.7 messen will, 
dann macht er GENAU die Sachen, die im else-Zweig meiner ISR stehen.
Er scheint beim Berühren der Messspitze an den Pin einen Interrupt zu 
bekommen, der aber nicht von high --> low geht, weshalb er in den 
anderen Zweig rutscht.

Wenn ich das Gerät ausschalte, und dann wieder ein, dann zeigt er mir 
kurzzeitig die "Seite 3" auf dem Display, mach dann aber ein Reset.
Vorhin hat er wenigstens nach knapp 10s ausgeschatet sein und wieder 
anschalten die ISR korrekt abgearbeitet.
Jetzt macht er ständig diesen Blödsinn...

Hat noch jemand eine Idee?
Danke

*edit:
So langsam wirds unheimlich:
Manchmal zeigt er mir bei Einschalten einen Text, der eigentlich beim 
Hochfahren des MSP angezeigt wird...die komplette init_mcu() wird aber 
nicht durchlaufen, weil er da noch andere Sachen anzeigt, und dann geht 
er auf die Seite, die im else-Zweig der ISR steht, lässt die Uhrzeit 
aber vom default-Wert loslaufen...
Er fängt also mit der init_mcu() an, bekommt dann nen Interrupt an P2.7 
und macht dann weiter...das begreif ich nicht.

von Falk B. (falk)


Lesenswert?

@ Mathias U. (munter)

>er in den LPM3 gehen soll, aber so recht funktionieren tut es immer noch
>nicht.

Tjaaaaa.


>
>  if((P2IES & INTERRUPT_P2_7) == 1)                 // wenn high --> low

Hast du mal überlegt, wie die einzelnen Werte aussehen? Und wie da 1 
rauskommen soll? Diese Bedingung ist IMMMER falsch, demzufolge wird der 
True Zweig NIE ausgeführt.

P2IES ist 0x00 oder 0x80
INTERRUPT_P2_7 ist sicherlich 0x80

Was du hier willst, ist ein
1
if(P2IES & INTERRUPT_P2_7)

Diese Ausdruck wird LOGISCH ausgewertet, nicht numerisch

== 0x00 -> true
!= 0x00 -> false

;-)

>    gehe_in_LPM3 = 0;                               // flag zuruecksetzen

Das sollte sinnvollerweise in der main-Schleife passieren. Ist 
strategisch besser.

>Wenn das Gerät läuft, und ich dann die Spannung an P2.7 messen will,
>dann macht er GENAU die Sachen, die im else-Zweig meiner ISR stehen.
>Er scheint beim Berühren der Messspitze an den Pin einen Interrupt zu
>bekommen, der aber nicht von high --> low geht, weshalb er in den
>anderen Zweig rutscht.

Was für ein Messgerät hast du denn? Ein normales Digitalmultimeter mit 
10 MOhm Eingangswiderstand darf bei dem Spannungsteiler eigentlich 
keinen Interrupt auslösen. Ich hoffe du misst im Spannungsmessbereich, 
nicht im Strommessbereich . . .

>Jetzt macht er ständig diesen Blödsinn...

Verständlich.

MfG
Falk

von Mathias U. (munter)


Lesenswert?

>if(P2IES & INTERRUPT_P2_7)
Hab die Sache mal so abgeändert, aber es hat nur kurz was gebracht.
Der MSP hat die ersten paar Male nach dem Einschalten die "Seite 3" mit 
der Uhrzeit angezeigt, allerdings nie mit der vor dem Ausschalten 
eingestellten Zeit. Er fing aber auch nicht bei default an (default ist 
1:00:00), sondern mal bei 1:00:04 mal etwas weiter...
Jetzt macht er nach jedem Einschalten immer einen Reset, fängt also bei 
Null an.
Hab auch schon die Batterie rein und raus gemacht, und auch manuell, per 
Taster, neu gestartet, aber das bringt alles nix.

>Was für ein Messgerät hast du denn?
Es ist ein Metrix MX54, das sollte reichen...
Ich habe es gearde noch einmal getestet: Sobald ich mit der Mess-spitze 
an P2.7 komme, dann macht er das, was im else-Zweig der ISR steht!!!
Und JA, ich messe Spannungen, keine Ströme.

Mal was anderes: Für den TimerA ist ja nur der ACLK notwendig, oder? 
Weil der MCLK usw. wird ja beim LPM3 ausgeschalten...

So langsam bin ich am verweifeln...Das kann doch nicht so schwierig 
sein...

von Falk B. (falk)


Lesenswert?

@ Mathias U. (munter)

>Der MSP hat die ersten paar Male nach dem Einschalten die "Seite 3" mit
>der Uhrzeit angezeigt, allerdings nie mit der vor dem Ausschalten
>eingestellten Zeit. Er fing aber auch nicht bei default an (default ist
>1:00:00), sondern mal bei 1:00:04 mal etwas weiter...

Ohne das Gesamtprogamm zu sehen kann man da nicht viel zu sagen.

>Jetzt macht er nach jedem Einschalten immer einen Reset, fängt also bei
>Null an.

Stimmt der Name des ISR Vektors?

>Hab auch schon die Batterie rein und raus gemacht, und auch manuell, per
>Taster, neu gestartet, aber das bringt alles nix.

Dann ist noch ein prizipielles Problem da.

>>Was für ein Messgerät hast du denn?
>Es ist ein Metrix MX54, das sollte reichen...

>Ich habe es gearde noch einmal getestet: Sobald ich mit der Mess-spitze
>an P2.7 komme, dann macht er das, was im else-Zweig der ISR steht!!!
>Und JA, ich messe Spannungen, keine Ströme.

Hast du mal dein Verdrahtung geprüft. Könnte auch ne kalte Lötstelle 
sein. Und probier mal, das Flag am ENDE der ISR zu löschen.

P2IFG = 0;                                        // flag wird 
zurueckgesetzt

Denn durch das Umschalten der Flanke kann ein neuer Interrupt generiert 
werden, ohne dass ein Pegelwechsel stattfindet!

>Mal was anderes: Für den TimerA ist ja nur der ACLK notwendig, oder?

Wenn er darauf konfiguriert ist.

>So langsam bin ich am verweifeln...Das kann doch nicht so schwierig
>sein...

Locker bleiben. Tee trinken. Oder Bier. Je nach Geschmack.

MFG
Falk

von Mathias U. (munter)


Lesenswert?

So, ich habe eine neue Erkenntnis:

Wenn ich mit mit der Messspitze meines MM an P2.7 komme, dann kommt ein 
Interrupt, der if-Zweig wird durchlaufen, das Dislpay bleibt dort 
stehen, wo es gerade ist...die Uhrzeit läuft auf dem Display nicht 
weiter, ABER:

Beim nochmaligen Berühren von P2.7 kommt noch ein Interrupt.
Diesmal wird der else-Zweig durchlaufen, denn dann macht er genau das, 
was im else-Zweig drin steht. Die Uhrzeit ist im Hintergrund 
weitergelaufen...

Dabei ist es egal, ob das MM an oder aus ist, und ob das Ding 
Masse-Bezug hat, ist auch Wurscht.
Scheint also was hardwaremäßiges zu sein...
Es wird *hoffentlich ne kalte Lötstelle sein. Aber das werde ich morgen 
mal durchtesten. Bitte, bitte, lass es eine kalte Lötstelle sein!!!

von Mathias U. (munter)


Lesenswert?

>Was du hier willst, ist ein

>if(P2IES & INTERRUPT_P2_7)

>Diese Ausdruck wird LOGISCH ausgewertet, nicht numerisch

>== 0x00 -> true
>!= 0x00 -> false

Und weiter gehts:
Ist es nicht genau anders herum?
True ist doch gleichbedeutend mit einem Wert ungleich Null...?

Wo ist denn bei
>if(P2IES & INTERRUPT_P2_7)
der Vergleich? Das ist doch nur ein bitweises UND...
Wird da auf == 0x00 oder !=0x00 getestet?

Ich werd mich jetzt mal auf die Suche nach einer kalten Lötstelle 
machen.

von Jörg S. (Gast)


Lesenswert?

> Wo ist denn bei
> >if(P2IES & INTERRUPT_P2_7)
> der Vergleich? Das ist doch nur ein bitweises UND...
Richtig. Und wenn bei der UND Verknüpfung was positives rauskommt ist 
die if Bedingung erfüllt.

von Mathias U. (munter)


Lesenswert?

Gut, also an einer schlechten Lötstelle liegt es wahrscheinlich 
auchnicht.
Die sah zwar nicht so gut aus, habs ausgebessert, aber das Problem ist 
immer noch da.

Ich habe mal die Spannung am Reset-Eingang (Pin 58) des MSP verfolgt.
Wenn die Netzspannung an ist, dann liegt sie bei relatic konstanten 
2,96V.
Sie schwankt ganz leicht aber 2,9V sind es auf jeden Fall.
Mache ich jetzt die Netzspannung aus, dann geht die Spannung am Reset 
runter.
Die Spannung sinkt allmälig...
Und dann plötzlich sinkt sie auf 1,8V und springt dann öfter zwischen 
1,8V und 2,2V hin un her.
Das darf doch nicht sein.
Der TLC7701 muss doch, wenn er seine Betriebspannung bekommt, den 
Reset-Ausgang (Pin 5) auf gleichem Potential lassen, oder?
Ausser natürlich V(sense) geht unter die Schwellspannung von 1,1V für 
den TLC7701.
Habe gerade bemerkt, dass der Spannungsteiler vor dem Sense-Eingang des 
TLC7701 nicht so wirklich sinnvoll ist in meiner Anwendung.
Ich werde den mal rausmachen...

von Falk B. (falk)


Lesenswert?

@ Mathias U. (munter)

>Habe gerade bemerkt, dass der Spannungsteiler vor dem Sense-Eingang des
>TLC7701 nicht so wirklich sinnvoll ist in meiner Anwendung.
>Ich werde den mal rausmachen...

???
Vielleicht mal nachrechnen? Der ist im Moment auf ~2,5V Triggerspannung 
eingestellt. Und verbraucht ca. 11uA. Könnte weniger sein, aber passt 
schon.

MfG
Falk

von Mathias U. (munter)


Lesenswert?

@Falk:

??? Spannungsteiler 150k über 120k ergibt bei mir:

Ua = Ue*(120k)/(150k + 120k) = 0,444*Ue
Das ergibt bei knapp 3V am Eingang knapp 1,33V am Sense-Eingang.
Wie kommst Du auf ~2,5V??

von Falk B. (falk)


Lesenswert?

@  Mathias U. (munter)

>Das ergibt bei knapp 3V am Eingang knapp 1,33V am Sense-Eingang.
>Wie kommst Du auf ~2,5V??

Weil die Schaltschwelle beim TLC7701 1,1V beträgt.

MfG
Falk

von Mathias U. (munter)


Lesenswert?

Nochmal was Softwaremäßiges:

>    gehe_in_LPM3 = 0;                               // flag zuruecksetzen

>Das sollte sinnvollerweise in der main-Schleife passieren. Ist strategisch 
>besser.

Warum?
Dann müsste ich das in meiner main() nach JEDEM Funktionsaufruf 
machen...
1
void main(void)
2
{
3
for(;;)
4
{
5
  if (gehe_in_LPM3 != 1)
6
  {
7
    funktion_1();
8
    gehe_in_LPM3 = 0;
9
  }
10
  else {LPM3;}    
11
  if (gehe_in_LPM3 != 1)
12
  {
13
    funktion_2();
14
    gehe_in_LPM3 = 0;
15
  }
16
  else {LPM3;}
17
  
18
  usw...
19
}
20
21
}

Da finde ich es sinniger, es EINMAL in der ISR zu machen, wenn der LPM3 
verlassen wird.

von Falk B. (falk)


Lesenswert?

@  Mathias U. (munter)

>Warum?
>Dann müsste ich das in meiner main() nach JEDEM Funktionsaufruf
>machen...

Ist so sowieso nicht korrekt. Es müsste VOR dem LPM3; gelöscht werden, 
nicht nach der Funktion denn dort ist es bereits 0 ;-)

>Da finde ich es sinniger, es EINMAL in der ISR zu machen, wenn der LPM3
>verlassen wird.

Kann man schon machen. Ist die Variable als volatile deklariert?

MfG
Falk

von Mathias U. (munter)


Lesenswert?

>Ist so sowieso nicht korrekt. Es müsste VOR dem LPM3; gelöscht werden,
>nicht nach der Funktion denn dort ist es bereits 0 ;-)

Nein, ist es nicht, denn wenn ich "gehe_in_LPM3" nicht in meiner ISR 
lösche, dann bleibt es ja erstmal "1".
Ist jetzt die Betriebspannung wieder da, dann macht ja der MSP an der 
Stelle weiter, wo er vorher aufgehört hat, also in *irgendeiner 
Funktion.
Und wenn er mit dieser Funktion fertig ist, DANN muss doch die Variable 
zurückgesetzt werden, damit bei der nächsten Abfrage nicht schon wieder 
in den LPM3 geschalten wird.

>Ist die Variable als volatile deklariert?

Nein, ist sie nicht. Warum, was hätte das für einen Vorteil, bzw. was 
zeigt das volatile an?

von Falk B. (falk)


Lesenswert?

@ Mathias U. (munter)

>Nein, ist es nicht, denn wenn ich "gehe_in_LPM3" nicht in meiner ISR
>lösche, dann bleibt es ja erstmal "1".

Eben, und wie soll dann der True zweig des If() erreicht werden?

>Ist jetzt die Betriebspannung wieder da, dann macht ja der MSP an der
>Stelle weiter, wo er vorher aufgehört hat, also in *irgendeiner
>Funktion.

Was bringt dich zu der irrigen Annahme? Er macht NACH dem LPM3; weiter!

>>Ist die Variable als volatile deklariert?

>Nein, ist sie nicht. Warum, was hätte das für einen Vorteil, bzw. was
>zeigt das volatile an?

Sie muss! Denn sonst kann es pasieren, dass dir der Compiler mächstig 
ins Handwerk pfuscht!

Interrupt

MfG
Falk

von Mathias U. (munter)


Lesenswert?

Gut, dass hab ich jetzt auch verstanden...
Habe die Variable jetzt volatile gemacht. Gebracht hat es leider nix.
Manchmal geht es, aber wenn ich zu lange warten mit dem 
Widereinschalten, dann bekommt der MSP nen kompletten Reset, aber seit 
ich die beiden Widerstände vom Spannungsteiler vom TLC7701 rausgemacht 
habe, bleibt er dann beim Initialisieren hängen.
Gebe ich ihm per Taster nen Reset, dann gehts...
Irgendwo nicht ganz logisch die ganze Sache...

von Falk B. (falk)


Lesenswert?

@  Mathias U. (munter)

>ich die beiden Widerstände vom Spannungsteiler vom TLC7701 rausgemacht
>habe, bleibt er dann beim Initialisieren hängen.

Ohhh Mann! Und der Pin hängt nun in der Luft? Nicht wirklich gut.

>Gebe ich ihm per Taster nen Reset, dann gehts...
>Irgendwo nicht ganz logisch die ganze Sache...

Ja, hör mal mit der Rumstochern auf und teste solide.

MfG
Falk

von Mathias U. (munter)


Lesenswert?

>Und der Pin hängt nun in der Luft?

Nein, den hab ich schon mit Vcc verbunden... ;-) Wie es im Datenblatt 
vorgeschlagen wurde...

von Falk B. (falk)


Lesenswert?

@ Mathias U. (munter)

>Nein, den hab ich schon mit Vcc verbunden... ;-) Wie es im Datenblatt
>vorgeschlagen wurde...

Damit wird aber schon bei 1,1V der Reset losgelassen (plus 
Verzögerungszeit ggf.)

Hmmm.

MfG
Falk

von Mathias U. (munter)


Lesenswert?

Ich würde nicht sagen "schon", sondern eher "erst", weil die Spannung ja 
sinkt (naja, im Idealfall bleibt sie am Sense-Eingang gleich durch die 
Batterie, und ÜBER den 1,1V)

Wichtig ist das ja wiirklich nur beim allerersten Mal, wenn das Gerät 
eingeschalten wird.
Dann bleibt der MSP idealerweise ja ständig unter Spannung (durch die 
Batterie). D.h. der TLC7701 generiert erst dann wieder einen Reset, 
wenn:

1) der Reset-Taster gedrückt wird, oder
2) die Batterie völlig leer ist.

Aber wenn die Bat. leer ist, und die V(sense) 1,1V errcith hat, dann ist 
der MSP ja eh schon aus.

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.