Forum: Mikrocontroller und Digitale Elektronik bestimmte Zeit warten


von Anfänger (Gast)


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 ?)

von Wegstabenverbuchsler (Gast)


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

von Meiomei (Gast)


Lesenswert?

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

von Hannes L. (hannes)


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.


...

von Reiner (Gast)


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

von Hannes L. (hannes)


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

...

von Reiner (Gast)


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

von Wegstabenverbuchsler (Gast)


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.

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.