Forum: Compiler & IDEs mehrere Timer programmieren


von Chris (Gast)


Lesenswert?

Hallo zusammen,
ich Programmiere derzeit etwas mit WINAVR und einem ATMEGA32 rum. Aber
um konkrete Steuerfunktionen mit dem Controller ausführen zu können,
braucht man ja mehrere Zeitfunktionen und Timer.

Also ähnlich wie bei einer SPS, wo ich duzende von Timern mit
verschiedener Funktion also z.B. einschaltverzögert, verlängerter
Impuls usw. haben kann.
Ich frage mich also, wie man so etwas am besten mit den zwei
vorhandenen ATMEGA-Timern zustande bringt.
Die Timerfunktionen müßen auch die delay_ms und delay_us Funktionen aus
der onewire.c ersetzen können.
Es sollte halt der Zyklus des Controllers nicht unnötig unterbrochen
bzw. im Leerlauf sein.

Ich hatte schon überlegt, ob ich den Timer laufen lasse und dann alle
10ms oder so, mehrere Register in der ISR des Timers hochzählen lasse.
Auf diese Register greife ich dann aus einer Funktion heraus darauf zu.
Z.B Timer(Timer1, TE, Wert).
Allerdings ist das dauernde und sehr häufige hochzählen ja sehr
Zeitintensiv.
Weis jemand wie das eine SPS intern regelt, bzw. wie es dort
ausprogrammiert ist (ich meine jetzt natürlich nicht in AWL,FUP,KOP).

Was sagt ihr zu dem Problem? Hättet ihr irgendwelche Vorschläge?

Gruß,
Chris

von peter dannegger (Gast)


Lesenswert?


von Chris (Gast)


Lesenswert?

Hallo Peter,
mitlerweile bin ich dir ja zu größtem Dank verpflichtet. Muß echt sagen
das finde ich super wie du hier jedem hilfst.

Mit dem Scheduler weiß ich leider noch nicht wie ich den am besten
einbinde.
Z.B beim 1-Wire-Bus habe ich ja einen sequenziellen Ablauf, in dem ich
immer wieder delays() habe (vor allem die wartezeit auf die Wandlung
ist schlimm). Mit dem Scheduler müßte ich ja die Programmierung nach
jedem delay in eine eigene Funktion packen, die ich dann wiederum dem
Scheduler übergeben kann. Gefällt mir auch nicht gerade. Ich müßte den
Scheduler so abändern, damit er eine reine Timerverwaltung ist.
Hast du den Scheduler selber geschrieben. Wenn ja, muß ich sagen
respekt. Ich hätte in dem Fall aber evtl. noch ein paar Fragen.

Gruß,
chris

von peter dannegger (Gast)


Lesenswert?

Wenn Du jede Sekunde nen Wert auslesen willst, dann schreibe eine
Funktion, die den Sensor ausliest, die nächste Wandlung startet und
dann sich selber mit einem Delay von 1s in den Scheduler stellt.

Und zu Initialisierung ruft Du diese Funktion einmalig auf.

Danach wird diese Funktion zyklisch jede Sekunde ausgeführt.


Peter

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.