Forum: Mikrocontroller und Digitale Elektronik Komischer Fehler


von Asuro Anfänger (Gast)


Lesenswert?

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?

von rtfm (Gast)


Lesenswert?

Ich weiß ja nicht, von welchem Compiler und uc du sprichst, aber z.b. 
der gcc für avr macht es richtig.

von rtfm (Gast)


Lesenswert?

Warum willst du eigentlich einen laufenden Timer auslesen ?
Das deutet eher auf ein grundsätzliches Problem hin...

von Asuro Anfänger (Gast)


Lesenswert?

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

von rtfm (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Asuro Anfänger (Gast)


Lesenswert?

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

von Frank B. (frank_boe)


Lesenswert?

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.

von Asuro Anfänger (Gast)


Lesenswert?

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

von Der M. (steinadler)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

Siehe  Interrupt

von Asuro Anfänger (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von MaWin (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@  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
Noch kein Account? Hier anmelden.