wie realisiert man sowas am guenstigsten? alle x ms moechte ich ein paar LEDs ein und ausschalten. Nehme ich dafuer am besten einen Timer Interrupt, oder eine Schleife mit x- NOP drin? Thx fuer eure Antworten!
Kommt drauf an, was Du sonst noch so machen möchtest. Wenn mehrere zeitabhängige Funktionen realisiert werden sollen, ist es sinnvoll, einen Timer auf die höchste benötigte Auflösung zu programmieren und bei Bedarf über Zähler andere Zeitraster zu realisieren. Wenn Du z.B. eine Aktion jede Millisekunde ausführen möchtest und eine andere Aktion nur alle 100 ms, dann nimmst Du einen Timer für die 1 ms und zählst bei jedem Aufruf des Timer-Interrupts einen Zähler für die zweite Aktion hoch. Wenn der Zähler dann gleich 100 ist, löst Du die Aktion aus und löscht den Zähler. Auf diese Weise kannst Du nahezu unbegrenzt zeitabhängige Aktionen mit einem Timer steuern. Gruß, Frank
Timer ist generell immer zu empfehlen. Nur wenn sehr kurz, oder nicht genau, kann man auch Zählschleifen nehmen. Peter
Glaube ich nicht, dass Zählschleifen (ohne Int) nicht genau sind. Die Schleife ldi R25,HIGH(50000) ldi R24,LOW(50000) loop: sbiw R24,1 brne loop ist auf den Takt genau berechenbar, obwohl sie bei 1 MHz Takt immerhin 200 Millisekunden verzögert (ok, ohne Schönheitsreparatur genau 200,001 Millisekunden). Man versuche, diese Genauigkeit mal mit einem Timer mit Int-Mechanismus hinzukriegen. Da wachsen viele graue Haare, bis es so genau klappt. Ich jedenfalls arbeite sehr gerne mit Schleifen. Nur wenn es unbedingt sein muss, sind Timer zu empfehlen. MfG Gerd
Peters Aussage ist trotzdem richtig, weil bei Zählschleifen Prozessorleistung ungenutzt verbraten wird, während ein Timer "nebenher" läuft und das Programm bis zum Erreichen der gewünschten Zeitspanne andere Dinge erledigen kann. Man nutzt die Ressourcen also wesentlich besser. Sicherlich spielt das bei einem Programm, welches LED blinken lassen soll, keine Rolle, aber erfahrungsgemäß lassen sich einmal angewöhnte schlechte Programmiertechniken nur schwer wieder abstellen. Gruß, Frank
"Da wachsen viele graue Haare, bis es so genau klappt." Nur dem der meint, das hinzukriegen ohne das Datenblatt zu lesen. Und auf den Zyklus genau ist er auch, wenn die Main-Loop nichts tut, d.h. im Sleep ist, bis der Interrupt sie aufweckt. "Ich jedenfalls arbeite sehr gerne mit Schleifen. Nur wenn es unbedingt sein muss, sind Timer zu empfehlen." Ich jedenfalls arbeite gern mit Interrupts, da dadurch wenig Ressourcen belegt werden und somit das Programm leicht erweiterbar bleibt. Nur wenn es unbedingt sein muß, sind Schleifen zu empfehlen (sehr kurze Delays <100µs). Programme mit langen Schleifen sind dagegen überhaupt nicht oder sehr schwer erweiterbar. Peter
@Gerhard: mit den Zeitschleifen ist das so eine Sache: solange der Prozessor nicht anderes tun muss, ausser Zeit vernichten, kann ich dir recht geben. Ungenau wird die Sache sofort, sobald Interrupts dazwischenfunken, stimmts nicht mehr (während der Int-Programmlaufzeit ruht die Zeitschleife). Und selbst wenn das nicht der Fall ist, ist es nicht so doll. STell dir mal folgendes Szenario vor: du willst eine Uhr basteln, Zeitschleife 1s, dann Update des Displays. Dann darf die Zeitschleife eben nicht mehr exakt 1s sein, sondern muss kürzer sein, da du ja auch noch Rechenzeit für den Rest benötigst. Kann man korrigieren, ist aber schwierig. Laufzeit des Restprogramms kann je nach Zählerstand variieren, müsste dort also mühsam auf konstante Laufzeit getrimmt werden (was gar nicht unbedingt trivial ist), und bei jeder kleinen Änderung am "Restprogramm" bist du wieder auf Taktjagd. Timer ist immer die bessere Lösung, da der unabhängig vom Rest stur sein Zeitraster einhält. Wenn es nicht gerade um ein paar µs Verzögerung geht (wie z.B. manchmal bei bestimmten LCD-Routinen erforderlich ist) würde ich immer den Timer wählen.
Natürlich, wenn mehrere Teilprozesse asynchron laufen müssen, kommt man um Timer meist nicht herum. Ich dachte jetzt eher an Maschinen, wie sie sammy vorhat, die rein sequentiell arbeiten und immer straight forward einen Ablauf abarbeiten. Die Sache mit den Timern kriegt man außerdem kaum gebacken, wenn man extrem schnelle Signale braucht, wie z.B. eine PWM mit möglichst hoher Frequenz, und keine Hardware-PWM zur Verfügung hat (wie in den kleineren Tiny). Dann kommt man um solche ausgeklügelten Schleifensysteme kaum herum, auch wenn es wirklich eine Quälerei ist. MfG Gerd
man kann aber ohne weiteres das ganze program in die timerschleife einbinden, wenn das program nicht selbst zugrosse zyklenzeitdifferenzen hat. siehs positiv. mit den softwaretimern sparst du dir unter umständen schon mal die tasterentprellung.
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.