www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Komischer Fehler


Autor: Asuro Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: rtfm (Gast)
Datum:

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

Autor: rtfm (Gast)
Datum:

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

Autor: Asuro Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: rtfm (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Asuro Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank Boe (frank_boe)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Asuro Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Der Micha (steinadler)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe  Interrupt

Autor: Asuro Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.