Wenn ich in C einen 16-Bit Timer auslese, habe ich manchmal komische Fehler. Kann es sein, das der Compiler erst das eine 8_bit-Register und dann das andere 8-bit-Register ausliest wobei der Timer weiter läuft. Was tun? Timer vorher anhalten?
Ich weiß ja nicht, von welchem Compiler und uc du sprichst, aber z.b. der gcc für avr macht es richtig.
Warum willst du eigentlich einen laufenden Timer auslesen ? Das deutet eher auf ein grundsätzliches Problem hin...
>Warum willst du eigentlich einen laufenden Timer auslesen ? naja, machst du vieleicht in real-world auch ein paar mal am Tag und schaust auf deine Armbanduhr... >Das deutet eher auf ein grundsätzliches Problem hin... das grundsatzliche Problem ist das man wissen will, wie spät es ist.
Sowas interessiert einen uc aber im Normalfall nicht :-) Eher schon interessiert es ihn, wann er eine bestimmte Aufgabe ausführen soll. Und das wird nicht gut funktionieren, wenn man regelmässig auf die Uhr guckt. Wenn er eine Zeit anzeigen soll, macht man das mit einem sekündlichem Interrupt. Vielleicht beschreibst du mal, was er machen soll.
Asuro Anfänger schrieb: >>Warum willst du eigentlich einen laufenden Timer auslesen ? > > naja, machst du vieleicht in real-world auch ein paar mal am Tag und > schaust auf deine Armbanduhr... Wenn ich um 7 Uhr geweckt werden will, schaue ich nicht die ganze Nacht auf die Uhr, sondern stelle den Wecker, so dass die Uhr selbst nachsieht, ob die Zeit um ist. Die Uhr weiß nämlich wie man das macht. >>Das deutet eher auf ein grundsätzliches Problem hin... > > das grundsatzliche Problem ist das man wissen will, wie spät es ist. Das grundsätzliche Problem ist, dass du einen Wecker wie eine Armbanduhr benutzt. Anstatt den Wecker zu stellen, siehst du ständig auf die Uhr.
>Vielleicht beschreibst du mal, was er machen soll.
1. alle 50 us "Öink"
2. alle 1 ms "Üink"
3. alle 10 ms "twing"
4. alle 200 ms "plöng"
5. jede Sekunde "döng"
6. alle 10 Sekunden "klönk"
usw...
wobei jede der Aktionen wird höchstens 50% des Zeitintervals benötigen:
Z.B. "Öink" braucht ca. 20 us CPU-Zeit, während die Berechnungen bei
"klönk" so umfangreich sind, das einige Sekunden verballert werden.
Asuro Anfänger schrieb: >>Vielleicht beschreibst du mal, was er machen soll. > > 1. alle 50 us "Öink" > 2. alle 1 ms "Üink" > 3. alle 10 ms "twing" > 4. alle 200 ms "plöng" > 5. jede Sekunde "döng" > 6. alle 10 Sekunden "klönk" > usw... > > wobei jede der Aktionen wird höchstens 50% des Zeitintervals benötigen: > Z.B. "Öink" braucht ca. 20 us CPU-Zeit, während die Berechnungen bei > "klönk" so umfangreich sind, das einige Sekunden verballert werden. Mit verlaub, der Ansatz, dazu den laufenden Zähler auslesen zu wollen ist quatsch. Versuch mal einen Interrupt alle 10ms auszuführen. In diesem Interrupt zählt du eine eigene Zählvariable hoch (als "volatile" deklarieren!). Wenn interrupt: twing. Nach (jeweils) 20 interrupts: plöng, aber auch twing. Nach (jeweils) 100 interrupts: döng, plöng, und twing usw. Fang aber erstmal mit 10 ms an, darunter bekommst du evtl andere Probleme.
@ Frank Boe (frank_boe)
>Nach (jeweils) 100 interrupts: döng, plöng, und twing
Das Problem ist das döng und plöng viel länger als 10ms brauchen, so das
die 10ms Interrupts auflaufen.
Es bietet sich meist an, in einem Interrupt nur ein Flag zu setzen, welches besagt, dass der Interrupt ausgelöst wurde. In deiner Hauptschleife guckst du dann immer ob dieses Flag ausgelöst wurde, setzt es zurück und zählst die Zeit hoch. Und wenn du gerade ein döng oder plöng ausgibst dann wertest du dieses Flag eben garnicht erst aus.
@ Falk Brunner (falk) Leider scheint einer von uns beiden die Problematik Es gibt 6 verschiedene Task's: >1. alle 50 us "Öink" (höchste Priorität) >2. alle 1 ms "Üink" (zweit-höchste Priorität) >3. alle 10 ms "twing" (dritt-höchste Priorität) >4. alle 200 ms "plöng" (viert-höchste Priorität) >5. jede Sekunde "döng" (fünft-höchste Priorität) >6. alle 10 Sekunden "klönk" (niedrigste Priorität) >usw... >wobei jede der Aktionen wird höchstens 50% des Zeitintervals benötigen: >Z.B. "Öink" braucht ca. 20 us CPU-Zeit, während die Berechnungen bei >"klönk" so umfangreich sind, das einige Sekunden verballert werden. nicht zu verstehen. Ich weiss sehr wohl wie Interrupts funktionieren. Das Problem ist, ich kenne keinen Mikrocontroller der 6 (oder mehr) Timerinterupts mit verschiedenen Prioritäten hat. Sicherlich gibt es für diese Problematik eine allgemeine Lösung, da ich aber nicht Informatik studiert habe, weiss ich nicht mal nach was ich googeln könnte. Eventuel ist das schon sowas wie ein Betriebssystem...
Asuro Anfänger schrieb: > Das Problem ist, ich kenne keinen Mikrocontroller der 6 (oder mehr) > Timerinterupts mit verschiedenen Prioritäten hat. Brauchst du auch nicht. Deine Armbanduhr hat auch keine 6 Sekundenzeiger und trotzdem kannst du 6 Zeiträume gleichzeitig damit auf Sekundengenauigkeit abstoppen, wenn du es nur geschickt anstellst. Wo steht geschrieben, dass du für jeden Job einen eigenen Timer brauchst? Dein µC ist schnell, sau schnell! Der kann durchaus ein paar tausendmal in der Sekunde abprüfen, ob es Zeit ist einen Vorgang ein oder auszuschalten. Und in der Zwischenzeit macht er dann auch noch ein Nickerchen. Sein Wecker, äh Timer, weckt ihn dann schon, wenn wieder ein paar µs um sind und er wieder einen Rundumblick machen soll, ob es vielleicht etwas zu tun gibt. Und wenn das was es zu tun gibt wieder mal etwas länger dauert, dann muss man das eben in mehrere Abarbeitungsschritte unterteilen.
> Mit verlaub, der Ansatz, dazu den laufenden Zähler > auslesen zu wollen ist quatsch. Nö. Es kann sinnvoll sein, statt sich auf Interrupts zu verlassen, die Sache durch Betrachtung des aktuellen Zählerstandes zu lösen (und möglichst dabei Überläufe korrekt zu behandeln). Aber OB das in diesem Fall die richtige Lösung ist, kann man aus dem bischen Information von Asuro Anfänger nicht entnehmen. Auf jeden Fall ist es programmtechnisch eine Möglichkeit.
@ Asuro Anfänger (Gast) >Leider scheint einer von uns beiden die Problematik >nicht zu verstehen. Das hast du vollkommen richtig erkannt. Und ICH bin es nicht. > Ich weiss sehr wohl wie Interrupts funktionieren. Du weisst bestenfalls die Hälfte, sonst würdest du diese Frage nicht stellen. >Das Problem ist, ich kenne keinen Mikrocontroller der 6 (oder mehr) >Timerinterupts mit verschiedenen Prioritäten hat. Das brauchst du für deinen Tüdelkram auch nicht. > Sicherlich gibt es für >diese Problematik eine allgemeine Lösung, da ich aber nicht Informatik >studiert habe, weiss ich nicht mal nach was ich googeln könnte. Dann lies mal den Artikel Multitasking und Interrupt noch einmal und denk drüber nach, anstatt rumzumaulen. MFG Falk
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.