Forum: Mikrocontroller und Digitale Elektronik 10 Sekunde Pause()


von XMEN (Gast)


Lesenswert?

hallo,
kann mir bitte jemand sagen wie ich eine Pause-Funktion schreibe, wo das 
Programm 10 sekunden lang warten soll? dies soll in C und mit dem IAR 
funktionieren.
danke...

von Sonic (Gast)


Lesenswert?

Für einen AVR? Dann den Output-Compare-Interrupt (CTC-Mode) so 
einstellen, dass er einmal pro Sekunde überläuft, der Rest dürfte klar 
sein.

von XMEN (Gast)


Lesenswert?

für msp430. was soll ich da einstellen? ich dachte ich soll nur ein 
for-schleife bis for(i=0;0<10000;i++) dann habe ich die 10 sec erreicht, 
aber anscheined bin total falsch.

von Sonic (Gast)


Lesenswert?

Sorry, den msp430 kenn' ich leider nicht!

von inoffizieller WM-Rahul (Gast)


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.

von Philipp (Gast)


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.

von XMEN (Gast)


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

von inoffizieller WM-Rahul (Gast)


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.

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Vergessen:
Kann es vielleicht sogar sein, dass innerhalb der 10 Sekunden Daten 
eintreffen?

von XMEN (Gast)


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?

von ich&er (Gast)


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 :)

von XMEN (Gast)


Lesenswert?

wie bekomme ich denn die 10 sec wartezeit? bsp-code wäre nicht 
schlecht..

von Karl H. (kbuchegg)


Lesenswert?

Indem du mal ins Datenblatt schaust und erkundest
welche Möglichkeiten du mit dem Timer hast (Ich hoffe
ja doch dass der msp einen Timer hat).

von Holger M. (holger)


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.

von BlaBla (Gast)


Lesenswert?

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

wait (10000) sind bei mir IAR&MSP einige 100 ms

von beaugoss (Gast)


Lesenswert?

Danke blabla.

von pumpkin (Gast)


Lesenswert?

der code von BlaBla ist jedoch eine variante, in dem der controller 
unsinn macht, das heisst, er schaut unentwegt auf die uhr. nutze die 
zeit lieber sinnvoll!

pumpkin

von Karl H. (kbuchegg)


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.



von pumpkin (Gast)


Lesenswert?

mensch karl, sei doch nich gleich so fuchtig. muss doch jeder selber 
wissen. hier wird so viel stuss geschrieben dass man sich doch nicht 
jedesmal aufregen sollte.  ; )


pumpkin

von beaugoss (Gast)


Lesenswert?

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

von pumpkin (Gast)


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

von Karl H. (kbuchegg)


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.

von inoffizieller WM-Rahul (Gast)


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
.
.
.

von ehde76 (Gast)


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ß

von XMEN (Gast)


Lesenswert?

das weiss ich doch ehde. ich geht nicht um msp  sonderen um ganze 
platine. ich will kein µA sparren sondern mA bereich.

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


Lesenswert?

XMEN wrote:
> das weiss ich doch ehde. ich geht nicht um msp  sonderen um ganze
> platine. ich will kein µA sparren sondern mA bereich.

Das versteh ich jetzt nicht.
Was hat das eine mit der Erzeugung eines 10 Sekunden
Intervalls zu tun?

von XMEN (Gast)


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?

von Karl H. (kbuchegg)


Lesenswert?

> FUNK kann nicht doch nur ausschalten wenn ich die Versogungspannung
> ausschalte oder???

Das solltest du wohl eher denjenigen fragen, der dir die
Aufgabe stellt. Wir wissen ja nicht wie die Hardware aufgebaut
ist und welche Möglichkeiten sie bietet.

von XMEN (Gast)


Lesenswert?

funk ist an UART angeschlossen. daten werden durch TX/RX, 
gesendet/empfangen.
Funk mit 5v versorgt, die ausschaltbar durch msp ist.

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Dann wirst du wohl die Versorgung des FUNK schalten müssen, wenn das 
Ding keinen "ENABLE"-Pin oder so besitzt.

von XMEN (Gast)


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?

von inoffizieller WM-Rahul (Gast)


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.

von XMEN (Gast)


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

von Karl heinz B. (kbucheg)


Lesenswert?

Und woher soll der Slave wissen, dass jetzt Daten vom Master
kommen? Um das rauszufinden müsste er den Funk abhorchen,
der ist aber abgeschaltet, ...

von inoffizieller WM-Rahul (Gast)


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.

von XMEN (Gast)


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.

von Philipp (Gast)


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 %.

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.