www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik bestimmte Zeit warten


Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Ich muss in meinem µc Programm ( in C ) 125ms wartem.
In einem Fachbuch wurde das mit einer for Schleife gelöst.

z.B. for(x=0; x<525000 ; x++)

Wie kommt man auf diese Zahl 525000?
Ist das richtig:  Wartezeit/ CPU takt?

Muss man da noch etwas anderes beachten , weil die Zahlen stimmen bei
den Beispielen nicht überein

z.B. 525000 für 1sek
     20000  für 10ms  (müsste doch eigentlich 5250 sein ?)

Autor: Wegstabenverbuchsler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"In einem Fachbuch wurde das mit einer for Schleife gelöst."

Sowas gehört im Fachbuch maximal in das Kapitel "Schlechte Beispiele,
und wie man es nicht machen sollte"


"Wie kommt man auf diese Zahl 525000? "
Der Fachbuch-Schreiber hat es ausprobiert oder das Orakel von Delphi um
eine konkrete Berechnung  der compilierten Schleifendurchlaufzeiten
gebeten


"Ist das richtig:  Wartezeit/ CPU takt?"
multipliziert mit (Summe aller Takte aller benötigten Assemblerbefehle,
um Schleifenrumf und Schleifenkopf darzustellen)

"Muss man da noch etwas anderes beachten"
Sicherlich. Dies erklärt auch den beschriebenen Effekt

Autor: Meiomei (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst entschuldigen, der Herr Wegstabenverbuchsler hat seine ersten
Gehversuche in Sachen µC gleich mit Timer-Interrupts incl.
Stackmanagement gemacht...;]

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Meiomei:

Die ersten Gehversuche macht man gefälligst in Assembler, denn sonst
lernt man die Möglichkeiten der I/O-Features nie kennen, da man so mit
der Hochsprache beschäftigt ist, dass man nicht mehr in das Datenblatt
schaut.


...

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, das hilft unserem Anfänger sicher weiter, aber vielleicht kann er ja
die Hochsprache und ist nicht nur mit ihr beschäftigt ..

Das mit der Schleife kann man machen.  Das Problem in C ist, daß man
allerdings dazu in den erzeugten Assemblercode schauen muß, da man ja
nicht genau weiß was der Compiler aus der "for" Schleife gemacht hat.
 Die Schleife besteht aus mehreren Assemblerinstruktionen.  Dazu kommt
die Initialisierung der Schleife die je nach Größe der Zahlen auch
unterschiedlich ausfallen muß. Die Gesamtzeit setzt sich also zusammen
aus Initialisierung (konstant bei gleichem Integertyp) und der Zeit in
der Schleife.  Daher die Unterschiede bei 10ms und 1s.

Eine elegantere Möglichkeit ist einen Timer zu starten.  Hierbei läßt
sich die Zeit sehr genau einstellen.  Mal ins Datenblatt schauen.

Gruß
Reiner

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Reiner:
So in etwa meinte ich das, du hast es allerdings diplomatischer
formuliert.

Ohne ASM-Kenntnisse nutzt (beim AVR, nicht beim PC) die beste
Hochsprache nix. Leider meinen Viele, sich durch den Einsatz einer
Hochsprache vor dem Erlernen von ASM drücken zu können. "Takte
zählen" geht aber nur in ASM korrekt.

Ich bevorzuge aber Timer. Meist in Form eines ständig durchlaufenden
Timers mit zyklischem Interrupt, in dessen ISR die gesamte
Synchronisation des Programms stattfindet (auch Software-Timer für
längere Verzögerungen).

Oft ist man sich aber auch beim Programmierstil selbst im Weg.
Die Aussage: "Eine bestimmte Zeit warten" erwartet, dass man das
Programm an dieser Stelle blockiert. Natürlich auch für andere Aufgaben
(Erweiterungen).

Stattdessen würde ich lieber formulieren: "Eine bestimmte Zeit diesen
Programmteil nicht abarbeiten". Dann kann man wenigstens während der
"Wartezeit" andere Dinge erledigen und blockiert nicht das ganze
Programm.
Somit haben sich "Warteschleifen" erübrigt. Sowas braucht man nur im
Spezialfall für extrem kurze Verzögerungen (z.B. bei OWI).

...

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Hannes,
Ich gebe Dir ja recht.  Aber das Problem für einen Anfänger stellt sich
nun erst mal auf dieser Ebene.  Ich kenne nicht sehr viel Literatur wo
man für den Anfang Softwarearchitektur für Mikrocontrolleranwendungen
einfach dargestellt nachlesen kann.  Techniken wie präventives oder
kooperatives Multitasking, ISRs, Scheduler etc. kommen später.

@Anfänger
Ich empfehle dringendst, nach einem Compilerlauf mal das erzeugte
Assemblerlisting anzusehen.  Man versteht dann leichter was da
eigentlich passiert und lernt nebenher auch noch ein bißchen
Assembler.
Konkret zu Deiner Frage:  Schau dir mal die Assemblerbehlstabelle im
Datenblatt des entsprechenden Prozessors an.  Da steht wieviel
Taktschritte ein Befehl braucht.  Schreib' die Anzahl der Schritte
neben die entsprechenden Assemblerbefehle, addiere dann die Werte und
multipliziere mit der Taktzeit (1/fosz).  Das Ergebnis ist die Zeit.

Gruß
Reiner

Autor: Wegstabenverbuchsler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Meiomei
@Reiner

Nee, sicherlich hab ich meine ersten Brems-Schleifen auch so
programmiert. Was ich (möglicherweise undiplomatisch oder nicht ganz so
direkt) aussagen wollte war genau das, was Reiner und HanneS so schön
prosaisch ausgeführt haben.

In ein FACHBUCH gehört sicherlich nicht unbedingt als nachahmenswert
hinein "for(x=0; x<525000 ; x++)", ohne nähere Erläuterung des
Prozessors, der Taktrate und der Erklärung, wie der Autor denn nun auf
52500 kommt. Der nächste der so ein "Fachwissen" ernst nimmt und
programmiert, kommt garantiert NICHT auf 1 Sekunde Wartezeit.

Wenn da schon im FACHBUCH auf C im Mikroprozessor-Umfeld hingewiesen
wird, ohne Bezug zu irgendwelchen Prozessoren etc, dann kann auch auf
einen (möglicherweise nicht vorhandenen) Bibliotheks-Funktions-Aufruf
"wait(ms)" verwiesen werden.

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.