mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Delay mit ATTiny15 in Assembler


Autor: sammy (Gast)
Datum:

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

Autor: Frank Linde (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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


Peter

Autor: Gerhard Schmidt (Gast)
Datum:

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

Autor: Frank Linde (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: crazy horse (Gast)
Datum:

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

Autor: Gerhard Schmidt (Gast)
Datum:

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

Autor: Ulrich Strobel (Gast)
Datum:

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

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.