Warteschleife schreiben?

Gast #2082254
Lesenswert?
• ▲
▼
Hallo, habe folgendes Problem. Ich lese in einem Programm nach jedem 
Durchlaufzyklus den Timer0 aus, den Wert den ich auslese variert 
jedesmal zwischen 0 und 10000 us, das auch so gewollt ist. Ich speichere 
den Wert in einer Variablen Korrektur1 ab. Ich möchte mit dem Wert den 
Programm ablauf verzögern, das heisst der Wert der in Korrektur1 steht, 
so lange darf das Programm nicht weiterlaufen. Ich habe mir überlegt das 
mit einer For Schleife zu machen z.B.

for (Korrektur1 !0=; Korrektur1 --)
{}

die Schleife soll nun bei z.b. Korrektur1=3000 solange runterzählen bis
bis Korrektur1 = 0 erreicht hat. Aber das Problem ist, das dir FOR 
Schleife
zu ungenau ist. Der Wert 3000 ist aus einem Timer ausgelesen und die 
FOR-Schleife braucht ja mehr Zyklen zum durchlaufen. Deshalb wäre es 
sehr ungenau. Gibt es eine andere Möglichkeit eine Schleife zu 
programmieren die mir genau die 3000 TimerZyklen runterzählt bzw. so 
lange das Programm stoppt und erst wenn 3000 = 0 ist, dann erst 
weiterläuft?
Gast #2082316
Lesenswert?
• ▲
▼
Anderst ausgedrückt soll dein Durchlaufzyklus immer im gleichen Abstand 
starten.
Hab ich das so richirg verstanden ?

Wenn ja, ist das genau die Aufgabe für die ein Timer da ist.
Warum willst du das in Software nachbauen ?

Ich weiß ja aus deinem Post nicht auf welchem µC du unterwegs bist.
Eine Lösung könnte sein das du einen Timer die niedrigste 
Interrutpriorität gibst und deine Logik in diese Interruptroutine 
packst.
Eine andere Lösung wäre mit dem Interrupt ein Flag zu setzen und in der 
MainLoop auf dieses Flag zu warten.
Gast #2083163
Lesenswert?
• ▲
▼
Ralph schrieb:
> Anderst ausgedrückt soll dein Durchlaufzyklus immer im gleichen Abstand
> starten.
> Hab ich das so richirg verstanden ?
>
> Wenn ja, ist das genau die Aufgabe für die ein Timer da ist.
> Warum willst du das in Software nachbauen ?
>
> Ich weiß ja aus deinem Post nicht auf welchem µC du unterwegs bist.
> Eine Lösung könnte sein das du einen Timer die niedrigste
> Interrutpriorität gibst und deine Logik in diese Interruptroutine
> packst.
> Eine andere Lösung wäre mit dem Interrupt ein Flag zu setzen und in der
> MainLoop auf dieses Flag zu warten.

Ich habe einen Atmega16.
Das wäre glaube ich ne Möglichkeit. Könntest du mir nen kurzes 
Programmbeispiel posten. Ich kann mir das noch nicht so ganz vorstellen 
wie das gehen soll.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.