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?
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.