Forum: Mikrocontroller und Digitale Elektronik Delay mit ATTiny15 in Assembler


von sammy (Gast)


Lesenswert?

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!

von Frank Linde (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

Timer ist generell immer zu empfehlen.
Nur wenn sehr kurz, oder nicht genau, kann man auch Zählschleifen
nehmen.


Peter

von Gerhard Schmidt (Gast)


Lesenswert?

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

von Frank Linde (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

"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

von crazy horse (Gast)


Lesenswert?

@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.

von Gerhard Schmidt (Gast)


Lesenswert?

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

von Ulrich Strobel (Gast)


Lesenswert?

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