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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren