Forum: Mikrocontroller und Digitale Elektronik Warteschleife schreiben?


von heiko_h (Gast)


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?

von Can C. (moklok)


Lesenswert?

while(timerstand<3000);

reset timer;

von Thomas E. (thomase)


Lesenswert?

Sofern es sich um einen AVR handelt, stellt die "util/delay.h" die 
Funktionen "_delay_ms(xxx)" bzw. "_delay_us(xxx)" zur Verfügung.

Damit werden die Verzögerungen vom Compiler in Abhängigkeit des 
CPU-Taktes genau berechnet.

mfg.

von Ralph (Gast)


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.

von heiko_h (Gast)


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.

von Axel D. (axel_jeromin) Benutzerseite


Lesenswert?

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR

Da steht wie man die Timerinterrupts programmiert.

Den Timer konfigurierst Du nun so, dass die Interrupt-Routine alle xxx 
ms aufgerufen wird.

Nun schreibst Du Deine Abfrage in die Interrupt-Routine



Axel

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.