10 Sekunde Pause()

Gast #430175
Lesenswert?

Man lässt keinen Mikrocontroller 10 Sekunden lang nichts tun, oder 
guckst du konstant auf die Uhr, wenn du auf eine bestimmte Uhrzeit 
wartest (z.B. Beginn der Sendung mit der Maus oder Spongebob, je nach 
Anspruch...).
Eigentlich guckt man eher in (halbwegs) regelmässigen Abständen auf die 
Uhr und vergleicht die aktuelle Uhrzeit mit der "Wunschuhrzeit".
Man kann auch bei jedem Ticken der Uhr einen Strich machen, und wenn 
genug Striche vorhanden sind, dann tritt das gewünschte Ereignis ein.

Also:
Nimm einen Timer, lasse ihn in regelmässigen Abständen einen Interrupt 
erzeugen. In der Interrupt Service Routine (ISR) wird dann ein Zähler 
heruntergezählt. Sobald der Zähler die 0 erreicht hat, sind deine 10 
Sekunden um, und der Controller konnte während dieser Zeit andere 
(sinnvolle) Aufgaben erledigen.
Gast #430201
Lesenswert?

... "andere sinnvolle Aufgaben" können dabei auch "Abkühlen" oder "Strom 
sparen" sein, wenn es wirklich nichts zu tun gibt. Moderne µCs haben 
eigentlich immer irgendwelche Stromsparmodi, aus denen sie per 
Timerinterrupt wieder aufwachen können.

Bei batteriebetriebenen Anwendungen ist das Pflicht während solcher 
Pausen ohne Aufgabe. Wenn der µC am Netz hängt wäre es immerhin 
wünschenswert.

Und gerade in C (und je nach µC-Architektur immer) ist es aufwendig 
auszurechnen, wieviel Leerschleifen man da wirklich bräuchte. Und man 
weiß immer noch nicht, ob sich bei der nächsten Codeänderung nicht die 
Dauer ändert, weil die Schleife anders übersetzt wird.

Da ist es auch einfacher, den Timer zu benutzen.
Gast #430206
Lesenswert?

philip hast du etwa meine gedanken gelesen?? :)
 aufjedenfall es geht um strom sparren, da es batteriebetieb ist.
nach jede 10 s soll der µC schauen ob er daten empfängt. wenn ja dann 
bearbeiten usw, wenn nicht dann wieder in 10s warten. usw...
also ich soll ein Timer benutzen wie ihr gesagt habt. vielleicht habt 
ihr ein bsp für  mich?
danke
Gast #430214
Lesenswert?

Ich kenne mich nicht mit dem MSP aus, aber beim AVR gibt es verschiedene 
Möglichkeiten den Controller zu wecken. Das kann auch der RXC-Interrupt 
(Daten über die serielle Schnittstelle empfangen) sein.

Du solltest dir vielleicht mal das Datenblatt in Bezug auf die Sleepmodi 
und die Weckmöglichkeiten des MSP angucken.
Gast #430220
Lesenswert?

hast recht Rahul, nach deiner meinung wie soll das ganze laufen. aber 
das sind 2 Funkmodule. dh wenn einer sendet und der andere schon in der 
10 s liegt dann werden die daten solange gesendet bis der erste von der 
10 s wach wird oder?
Gast #430266
Lesenswert?

mal am rande um auf die for-schleife zurückzukommen: 10000 sind keine 
10000 millisekunden falls du diesen ansatz gehabt haben solltest...die 
verzögerung würde sich ja nach dem takt richten...
das aber nur am rande :)
#430572
Lesenswert?

Wenn du in deiner Schaltung einen Echtzeituhrbaustein benutzt: Viele 
dieser Bausteine bieten die Möglichkeit, in programmierbaren Intervallen 
ein Signal zu senden. Diesen kann man dann einfach mit z.B. per 
Interrupt weiterverarbeiten. So sind auch längere Intervalle kein 
Problem.
#430674
Lesenswert?

> void wait(unsigned long int time)
> {
>   do
>   {
>     time--;  } while(time != 0);
> }

Das ist genau die Methode, die man nicht benutzt.
Danke BlaBla für diesen wenig konstuktiven Beitrag.
Das ganze Forum versucht den OP dazu zu bringen sich
mit Timern zu beschäftigen und du unterläufst dieses
Vorhaben aufs gröblichste.
Nochmal: Vielen Dank dafür.


Gast #430693
Lesenswert?

ich kenne zwar diesen controller nicht, aber i.d.r. geht man 
folgendermaßen vor:

- gucken, wieviele osz-clocks er braucht um den timer zu inkrementieren 
(das ist von controllerfamilie zu controllerfamilie unterschiedlich)

- die entsprechende zeit für ein timerinkrement passend zu deiner 
taktfrequenz (osz-clock) ausrechnen

- mit dieser einzelzeit kannst du bestimmen, wie oft der timer 
inkrementiert werden muss um deine wunschzeit 'abzuzählen'

- dann kannst du deinen start/rückladewert für den timer bestimmen

- interrupt programmieren

- fertig

pumpkin
#430711
Lesenswert?

> wie benutze ich den timer von msp430 mit 8mhz,dass er 10sec lang in
> sleep modus bleibt? und dann 5s aktiv

Du setzt den Timer so auf, dass er dir beispielsweise alle
10 ms einen Interrupt auslöst. Welche Zeiten du konkret
erreichen kannst, hängt vom Timer selbst und vom benutzten
Quarz ab. Die Quarzfreuquenz kennst du, die Details vom
Timer musst du dir aus dem Datenblatt auslesen.
Wenn du das hast, hast du den schwierigsten Teil geschafft.

Ab da ist es dann simpel. Du brauchst noch einen Zähler
in der Software, die mitzählt wie oft der Timer ausgelöst hat.
Wenn der Timer alle 10 ms einen Interrupt auslöst, dann ist
nach 100 Interrupts 1 Sekunde vergangen, nach 6000 eine Sekunde
und nach 60000 sind 10 Sekunden vergangen.
Anstatt der 10 ms kannst du auch versuchen längere Zeiten als
Basis zu kriegen. Aber wie gesagt: Das hängt von deiner Quarzfrequenz
ab und welche Teilermodi dein Timer unterstützt. Daher: Blick
ins Datenblatt.
Gast #430724
Lesenswert?

> dann ist
>nach 100 Interrupts 1 Sekunde vergangen, nach 6000 eine Sekunde
>und nach 60000 sind 10 Sekunden vergangen.

Drei verschiedene Zeiten für eine Sekunde? ;)

100 Interrupts sind 1 Sekunde
6000 Interrupts sind 1 Minute
60000 Interrupts sind 10 Minuten
.
.
.
Gast #430736
Lesenswert?

@XMEN:
der MSP430 hat 4 verschiedene Stromsparmodie, ich glaube LPM 1-4, die 
den MSP430 in den Sleep Modus (bis 1uA Stromverbrauch) versetzen und per 
Interrupt unterbrochen werden... diese sind genau für diese Anwendung 
wie du sie brauchst implementiert worden, also lies endlich mal das 
Datenblatt von dem Ding...

Gruß
#430824
Lesenswert?

inoffizieller WM-Rahul wrote:
>> dann ist
>>nach 100 Interrupts 1 Sekunde vergangen, nach 6000 eine Sekunde
>>und nach 60000 sind 10 Sekunden vergangen.
>
> Drei verschiedene Zeiten für eine Sekunde? ;)
>

:-)
Da sind mir wohl in Gedanken iregendwo die Sekunden
und Minuten durcheinander gekommen.
Gast #430832
Lesenswert?

Leute das tut mir leid ichi bekomme jedes mal ein andere aufgabe.
jetzt soll wieder was anders gemacht. HILFEEEEEEEEEEEEEEEE.

da ist ein FUNK an µC msp angeschlossen. soll jetzt der FUNK für 
bestimmte zeit ausschalten bis der daten bekommt dann soll ich 
einschalten daten an µC weiterleiten, und wieder ausschalten (wegen 
Strom sparen).

FUNK kann nicht doch nur ausschalten wenn ich die Versogungspannung 
ausschalte oder???
aber wie soll er dann mitbekommen dass daten ankommen??

gibts eine möglichkeit?
Gast #431932
Lesenswert?

hi zusammen,

der Funk schalte ich nur dursch der 5V versorgung aus. jetzt will ich 
was anders versuchen. dass ich der erste Funk nur dann einschalte wenn 
ich was von dem zweiten was senden will. geht sowas? IDEE??
 erste ist als Slave und 2. als master. also slave einschalten wenn 
master was sendet? geht das softwaremässig?
Gast #431937
Lesenswert?

Vielleicht solltest du mal etwas mehr zu deinem Aufbau schreiben. Da 
kommt sonst nur "Rumgestocher" bei raus.

>jetzt will ich was anders versuchen. dass ich der erste Funk nur dann >einschalte 
wenn ich was von dem zweiten was senden will. geht sowas?

Sowas geht bestimmt.
Wie oben schon geschrieben: Erkläre uns mal bitte deinen Aufbau und was 
der machen soll. Dazu wäre auch eine Skizze sehr aufschlußreich.
Gast #431985
Lesenswert?

nochmal :)

2 Funkmodule MASTER und SLAVE jeweils durch msp430 gesteurt,

der master ist an PC angeschlossen (durch rs232), der Slave soll dann 
erst aktiv sein wenn ich daten vom PC (master) schicke, sonst soll er 
inaktiv sein damit ich Strom bei der Slave sparre, da es batterie 
betrieben.
ist jetzt klar? danke euch...

datasheet vom FUNK.

http://www.roboter-teile.de/datasheets/ER900_2_D.pdf
Gast #432003
Lesenswert?

>sonst soll er inaktiv sein damit ich Strom bei der Slave sparre, da es >batterie 
betrieben.

Wie soll er dann mitbekommen, dass der Master etwas gesendet hat?
Das erinnert mich irgendwie an eine (mobile) Funktürklingel, bei der der 
Sender (Master) nur eingeschaltet wird, wenn der Klingelknopf betätigt 
wurde. Der Empfänger (Slave) ist aber konstant eingeschaltet, um kein 
Klingelzeichen zu verpassen.

Meiner Meinung nach kann man sowas eigentlich nur dann realisieren, wenn 
Sender und Empfänger synchronisiert sind: Der Sender also in 
regelmässigen Intervallen (z.B. 10 Sekunden) sendet. Ist dies nicht 
möglich, muß der Empfänger konstant eingeschaltet sein (19mA 
Stromaufnahme...).
Somit wären wir wieder am Anfang des Threads angekommen:
Guck dir die Funktion deines Timers an (den man problemlos innerhalb der 
Threadlaufzeit hätte verstehen und ausprobieren können), und realisiere 
damit deine 10 Sekunden.
So schwierig kann das nicht sein:
Timer starten (z.B. 100ms Interval)
Controller schlafen legen
Timer löst Interrupt aus und weckt dadurch den Controller.
Controller zählt eine Variable um eins weiter.
Controller guckt nach, ob Variable den gewünschten Wert erreicht hat.
Controller legt sich wieder schlafen (und wartet so auf den nächsten 
Interrupt), wenn der gewünschte Wert noch nicht erreicht wurde.
Wurde der der gewünschte Wert erreicht, wird der Empfänger eingeschaltet 
und auf Daten gewartet.
Entweder wartet der Controller bis Daten ankommen und schaltet danach 
den Empfänger wieder ab, oder er wartet eine gewisse Zeit und schaltet 
ihn dann ab, auch wenn keine Daten angekommen sind. (Eine Kombination 
aus beiden ist natürlich auch möglich...)
Und wenn du mit der Aufgabe überfordert sein solltest bzw. dich 
überfordert fühlst, solltest du dich mal mit dem Aufgabensteller darüber 
unterhalten.
Gast #432048
Lesenswert?

danke euch für eure mühe wirklich.
also Rahul ich finde das was du sagst schon ok. ich werde den Timer so 
einstellen dass er ein interuppt nach 15 sec auslöst und dann 3 sec 
warten, wenn daten ankommt bearbeiten und dann wieder 15 sec schlafen. 
mal sehen dann ob das klapt erstmal. ich habe grade versucht mit dem 
Timer klar zu kommen. ich habe 8Mhz quarz 16bit. er soll dann nach 100ms 
zählen bis er 100 mal gezählt hat dann interrupt auslösen. und abfrage 
ob daten ankommen . usw.
Gast #432073
Lesenswert?

Gibt es denn eine Vorgabe, wie schnell der Empfänger reagieren soll? 
Wenn es wirklich reicht, wenn er nach 15 Sekunden reagiert -- wunderbar. 
Den Sender z.B. 10 mal pro Sekunde ein Handshakebyte senden lassen. Da 
er am PC hängt, sollte der Energiebedarf ja kein Problem sein.

Der Empfänger wacht alle 15 Sekunden auf und prüft für eine 
Zehntelsekunde, ob etwas empfangen wird (Achtung! Die Zeit verlängert 
sich, wenn das Funkmodul Zeit braucht, um empfangen zu können!). Wenn 
etwas kommt, schickt er dem Sender ein Quittungsbyte, damit der weiß, 
daß er weitersenden soll. Der Energiebedarf des Empfängers sinkt auf 
unter 1 %.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren