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...
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.
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.
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.
... "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.
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
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.
Vergessen: Kann es vielleicht sogar sein, dass innerhalb der 10 Sekunden Daten eintreffen?
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?
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 :)
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).
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.
void wait(unsigned long int time) { do { time--; } while(time != 0); } wait (10000) sind bei mir IAR&MSP einige 100 ms
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
> 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.
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
wie benutze ich den timer von msp430 mit 8mhz,dass er 10sec lang in sleep modus bleibt? und dann 5s aktiv
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
> 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.
> 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 . . .
@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ß
das weiss ich doch ehde. ich geht nicht um msp sonderen um ganze platine. ich will kein µA sparren sondern mA bereich.
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.
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?
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?
> 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.
funk ist an UART angeschlossen. daten werden durch TX/RX, gesendet/empfangen. Funk mit 5v versorgt, die ausschaltbar durch msp ist.
Dann wirst du wohl die Versorgung des FUNK schalten müssen, wenn das Ding keinen "ENABLE"-Pin oder so besitzt.
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?
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.
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
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, ...
>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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.