www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Sleep modus mit MSP430


Autor: beaugoss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo
der msp430 soll in sleep modus gehen, und erst wenn er ein signal 
bekommt dann kann er auf normal modus gehen dann daten senden, und 
wieder in die sleep modus.
kann mir bitte jemand dabei helfen, und mir sagen wie kann ich die 
befehle und wo einsetzen.

so sieht mein programm aus.

#include
1. Port init

2. for(;;)
   {
programm

    }
ich danke euch im voraus.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm...du hast offensichtlich die C-Beispiele von TI nicht angeguckt, 
oder?

Was ist das denn für ein Signal, bei dem er aufwachen soll? 
Hardware-Interrupt? UART-Interrupt? Timer?
Aufwachen aus dem Sleep-modus geht nur per Interrupt, im Datenblatt 
steht, wie tief man schlafen gehn kann, wenn man auf einen bestimmten 
Interrupt wartet.

Im Hauptprogramm steht dann im einfachsten Fall lediglich:
for(;;)
{
BIS_SR(LPM3_bits + GIE);
}

In der entsprechenden Interrupt-Service Routine wird dann die Arbeit 
erledigt, wenn es nicht allzu lange dauert. Ansonsten dort Flag setzen, 
Statusregister auf dem Stack verändern und im hauptprogramm auf das Flag 
reagieren.

Der MSP wacht automatisch in den Active-Mode auf, wenn ein Int kommt, 
und geht autoamtisch wieder in den vorhergehenden SleepMode, wenn die 
ISR zu ende ist, es sein denn, man ändert das Statuswort auf dem Stack. 
Wie das geht, steht alles in den Appnotes von TI.

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zumindest beim IAR Compiler reicht der Aufruf
LPM3;
um den µC schlafen zu legen.

Autor: beaugoss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ein funk ist am UART angeschlossen und dadurch sende ich 
daten(byteweise) zu den anderen Funk. aber ich sende erst wenn ich ein 
mitteilung bekomme dass ich sende. dh µc soll erstmal schalfen und wenn 
er die meldung bekommt zum senden, dann sendet er und dann wieder 
schlafen.
das geschieht in der for(;;) schleife. bleibt mir diese sleep modus 
weiss nicht wie das gehlt

danke euch nochmal

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Woher kommt denn das Signal, dass er was senden soll? Auch per UART? 
Also der sendet nur von einer UART was an eine andere weiter? Oder wie 
jetzt? kopfkratz
Deine Ausfüghrungen sind schwer verständlich. Kein Deutsch als 
Muttersprache? versuch´s mal in Englisch zu erklären, falls du das 
besser kannst....

Autor: beaugoss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nochmal :)

also 2 µC, einer sendet und der andere empfängt.
das signal wird über UART gesendet, natürlich davor wird bearbeitet usw. 
und wird über UART anderer µC empfangen.

1.
der empfänger soll im sleep modus sein, der sender = "µC-1" sendet 
zuerst ein kruz signal(bsp "1"). damit soll der Empfänger = "µC-2" aktiv 
sein. danach sendet nochmal µC-1 daten(bsp byte) an µC-2. bekommt er die 
daten! wird die bearbeitet ... und wenn fertig dann wieder in Sleep 
modus gehen.
USW

2.
oder µC2 soll zb. 1 minute aktiv sein und 15 sec sleep. oder inaktiv.

aber Nr 1 für mich lieber.
danke

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, da kannst du schon mal keinen LPM3 nehmen, denn dann ist der Takt 
für deine UART abgeschaltet. Schau mal in die AppNote slaa294a von TI, 
da steht, drin, wie man sowas macht. (Flag in der ISR setzen, Stack 
manipulieren...)

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn der UART nur mit max. 9600 läuft, geht auch LPM3.

Also:

Port init
UART init (inkl. Interrupt)

for(;;)
{
  Programm
  :
  LPM3;
  Daten von UART verarbeiten
}


// Interrupt für UART0 -------------------------
// RX UART0 -------------------------
interrupt[UART0RX_VECTOR] void USART0RX_ISR (void)
{
 Daten_Eingang = RXBUF0;
 LPM3_EXIT;
}

Autor: Martin Schneider (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das geht auch mit LPM4 und 38,4kBd - allerdings nur mit (getrimmten) 
DCO,
externe Quarze brauchen zu lange zum Anschwingen.

Autor: beaugoss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke, ich werde es mal probieren. und sag euch bescheid.
zur Info der UART arbeitet mit 19200 baud.

Autor: beaugoss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
leider habe das nicht geschafft.
der Sinn ist Stromverbrauch zu sparren. vielleicht habe ich mich nicht 
richtig ausgedrückt, der µC soll im Sleep Modus sein wenn kein Daten 
ankommt, und zwischen durch abfragen ob daten ankommt.

Autor: beaugoss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ein BSP-Code wäre nicht schlecht, danke

wie gesagt mein Programm sieht so aus:

#include..msp430
..
main
{
  inti...
  for(;;)
   {
    daten empfangen. bsp ("ein A schicken").  // µC1 to µC2
    daten senden. bsp("A") durch TXBUF1.      // µC2 to µC1
    daten empfangen. bsp ("OK") durch RXBUF1. // µC1 to µC2
    }
}
 µC2 soll jeder 10s etwa 3s aktiv dann wieder in sleepmodus also um 
Stromverbrauch zu sparen.

welche befehl kann ich dafür einsetzen und wo genau in dem progamm.
danke euch...

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bentze Interrupts und lies die C-Demos von TI! Dann klappt das.

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie schon geschrieben: Ohne Interrupts wird das nichts!

Du must generell die Interrups einschalten:
_EINT(); // Interrupt generell an

...und dann die Interrupts für UART einschalten:
IE2 |= URXIE1;   // Interrupt UART1 an für RX

Und dann halt die Interrupt Routine mit leben füllen.

Siehe auch:
http://www.mathar.com/msp_usart1.html

Autor: beaugoss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das mit dem senden und empfangen geht schon. wie du gesagt hast mit 
interrupts. die frage: wie bekomme ich den µC zum sleepmodus? dass ich 
nicht die gleiche menge strom verbrauche??
danke

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na z.B. mit

BIS_SR(LPMx_bits + GIE);

das x steht für den gewünschten LPM.

Lies doch endlich mal die C-Demos von TI durch, da ist doch fast in 
jedem der LPM benutzt....

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für Low Power Mode 0:
LPM0;
für Low Power Mode 1:
LPM1;
für Low Power Mode 2:
LPM2;
für Low Power Mode 3:
LPM3;
für Low Power Mode 4:
LPM4;

:)

Autor: beaugoss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
die C Demo habe ich schon gelsen, und auch benutzt,
BIS_SR(LPM3_bits + GIE); es wird immer ein Intettupts ausgelöst und es 
funktioniert.
ich sehe aber kein änderung der Strom. also der Strom bleibt konstant
wenn ich auf LPMx gehe.

danke euch

Autor: Dirk Dörr (dirkd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie misst Du Deinen Stromverbrauch? Wie genau ist die Anzeige?

Kann es vielleicht sein, daß deine restliche Peripherie z. B. das 
Funkmodul sovie Strom verbraucht, daß der MSP430 überhaupt nicht 
auffällt und daher auch keine Änderung sichtbar ist wenn er im 
Sleep-Mode ist.

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aktiv verbraucht ein MSP430F149 bei 1MHz und 3,3V ~390µA
Im LPM3 ~2µA

Autor: beaugoss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das stimmt, es liegt an die Peripherie. der Funkmodul verbraucht 20 mA 
beim senden oder empfangen, frage ist wie kann das Funk ausschalten wenn 
Daten zum beispiel empfangen oder gesendet sind ????

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das können wir ja nun beim besten willen nicht wissen, wie mein dein 
Funkmodul ausschaltet. Und wenn´s aus ist, kannst du ja nix mehr 
senden/empfangen.

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Zauberwort heisst in dem Fall wohl polling!

Funkmodul 1 wacht auf und sendet an Modul 2 "bin wach, gib mir Daten"
Funkmodul 1 geht in Empfangsmodus und wartet auf Daten.
Funkmodul 2 sendet Daten.
Funkmodul 1 empfängt Daten und geht dann in Standby

Autor: beaugoss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da der Funkmodul mit 5V arbeitet wollte ich die 5V regler ausschalten 
wenn daten empfangen sind. habe ich gemacht, habe entdeckt dass der 5V 
regler liefert immer noch 1,4V damit ist auch dann das Funkmodul mit 
1,4V versorgt. ddeshalb bleibt die Empfang und Send im betrieb.

muss jetzt schauen woher kommt mir diese 1,4V rest obwohl der 5V regler 
aus ist..
falls jemand Idee hat, dann bitte hierher damit:
danke

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich nichts übersehen habe, hast Du Deinen Schaltplan noch nicht 
gepostet. Das solltest Du tun, ansonsten nochmal im Hellseher-Forum 
posten.

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funkmodule sollte im Übrigen entweder per Software oder über einen Pin 
schlafen gelegt werden können.

Autor: beaugoss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja der Funkmodul kann ich jetzt per software ins schlafen gelegt, nur 
bleibt immer noch 0,8mV von 5V. ich bin am überlegen woher soll das 
sein?

Autor: beaugoss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry 0,8V meine ich, und nicht 0,8mV.

Autor: Wolli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann es sein das noch ein paar ports offen sind? wie wird das funkmodul 
in den sleep mode versetzt? geht das überhaupt oder musst du die UB 
abschalten? etwas mehr an informationen wären schon gut, ansonsten musst 
du selber weiter wurschteln

Autor: beaugoss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja ich muss die UB abschalten, am anfang habe ich die versorgung von 
Funk abgeschaltet (5v).

Autor: beaugoss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe ein einfaches schliefe gemacht , da wird der 5V regler 
ausgeschaltet und damit die Funkversorgungsspannung. aber es kann nicht 
mehr empfangbereit sein solange der ausgeschaltet ist.

Autor: Wolli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Logisch oder? Was willst Du eigentlich machen?

Autor: beaugoss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja natürlich ist logisch. mal eine Frage! kann man nur den Funkmodul 
ausschalten? vielleicht duch RTS oder CTS? hat jemand eine Idee dass ich 
nicht mehr den 5V ausschalte sondern den Funk deaktivieren für bestimmte 
zeit sagen wir 5s oder so?

Autor: beaugoss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der 1.te funkmodul sendet immer, der 2.te soll in sleepmodus sein bsp 
30sec, danach 10s aktiv. wenn daten empfangen dann bearbeiten, anzeigen 
und wieder in sleepmodus. usw...

Autor: Wolli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du so wie ich mit dem AMB8420 arbeitest, schaltest Du das HF-Ic in 
den sleel mode, lässt aber den Quarz laufen, dann ist eine kurze 
Aufweckzeit möglich. Den Controller lässt Du genau so, in diesen 
Zeitintervallen aufwecken und für eine bestimmte Zeit das HF-IC auf Rx 
gehen. Wenn nichts empfangen wird, wieder schlafen legen. Es gibt bei 
diesem Modul die theoretische Möglichkeit auch mit einem wake on radio 
zu arbeiten. In diesem Fall wacht das HF-IC selber auf, wenn eine 
bestimmte Feldstärke erreicht wird. Der Stromverbrauch ist dann aber 
höher als in der Variante mit dem Sleepmode des Prozessors. Auch kann es 
passieren, dass bei jeder Feldstärkenänderung das Modul aufwacht und das 
kostet auch Strom.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab ich es überlesen oder hast du uns immer noch nicht gesagt, welches 
Funkmodul du benutzt???

Autor: beaugoss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
christian es ging nicht um msp in sleep modus zu bringen sondern die 
ganze platine.
ich bin echt durcheinander, also nochmal:
2 funkmodule,einer als master und der andere als slave.
slave muss in sleep modus gehen (15s), danach aktiv(5s). hat er daten 
von master bekommt!! dann bearbeiten und speichern und wieder in 
sleepmodus. usw...das sleepmodus gescheht wenn ich 5V ausschalten, damit 
kein versorgung mehr für FUNK steht. nach 15s schalte ich wieder den 
Funk an.
hardwaremässig ist alles gemacht, software leider immer in 
schwerigkeiten.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wo ist dann jetzt noch das problem? Wie man den LPM3 am MSP430 
aufruft, haben wir ja schon mehrfach geschrieben. Wenn du deinem 
Funkmodul die 5V abschaltest, ist das auch aus. Aber wie schaltest du 
die eigentlich weg? Deine 0,8V könnten durch irgendwelche nicht 
definierten Eingangsströme herkommen, klingt nach Diodenspannung einer 
Schutzdiode.

Autor: XMEN (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
als 2 Funkmodule einer als master und der andere als slave.
geht das wenn ich den slave erst einschalte wenn ich vom master was 
senden will?.  Master ist immer dauerbetrieb.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tjaaaa...da gehört bissl Gehirnschmalz dazu. Zum Beispiel könnte der 
Master dem Slave seine aktuelle Uhrzeit mitteilen und die Weckzeit, wann 
der Slave aufwachen soll.

Autor: beaugoss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der Anwender(master) weisst selber nicht wann er daten sendet, ist 
unterschiedlich.

bin am timer programmieren und versuche erstmal einfaches beispiel zu 
schreiben.

Autor: beaugoss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe das geschrieben, wie bekomme ich hier die 10 sekunden dass LED 
leuchtet?
{
  WDTCTL = WDTPW + WDTHOLD;
  P4DIR |= 0x01;
  TBCCTL0 = CCIE;
  TBCCR0 = 50000;
  TBCTL = TBSSEL_2 + MC_1 + ID_3;

  _BIS_SR(LPM0_bits + GIE);
}

// Timer B0 interrupt service routine
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B (void)
{
  P4OUT ^= 0x01;
}

Autor: beaugoss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe TBCTL so initialisiert weil ich ein 8Mhz Takt habe, und er soll 
mir 100 mal 50ms zählen. also 5s lang.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
beaugoss wrote:
> der Anwender(master) weisst selber nicht wann er daten sendet, ist
> unterschiedlich.

Dann kannst du das Empfängerfunkmodul nicht schlafen legen. Oder du 
weckst es alle paar Sekunden auf und fragst am Master an, ob er Daten 
hat. Allerdings muss der Master die Daten dann erst mal 
zwischenspeichern.

Autor: LED (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Christian R.

>>Ansonsten dort Flag setzen,
>>Statusregister auf dem Stack verändern und im hauptprogramm auf das Flag
>>reagieren.

Kannst du bitte mehr erklären? Ich kapiere dies nicht ganz.
LED

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau dir einfach die SLAA294A von TI an.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.