mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Warteschleife schreiben?


Autor: heiko_h (Gast)
Datum:

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

Autor: Can Cobe (moklok)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
while(timerstand<3000);

reset timer;

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

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

Autor: Ralph (Gast)
Datum:

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

Autor: heiko_h (Gast)
Datum:

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

Autor: Axel Düsendieb (axel_jeromin) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

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

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.