www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Counterfunktion


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin,

ich habe letzte woche angefangen mich mit mikrocontroller zu
beschäftigen, mit assembler bin ich zunächst einmal durch und probiere
mich gerade in C.

mein problem ist, das ich eine zeitverzögerung einbauen möchte, aber
nicht weiss, wie ich auf die genauen werte kommen
ich benutze als IDE RIDE und auch den entsprechenden C-Compiler, der µC
ist ein T89C8252  von Atmel, aus der 8051 baureihe

in einer mitgelieferten datei fand ich folgendes :
for(int i = 0; i<millisec;){
 i++;
}

oder zumindest so ähnlich (bin noch nicht ganz mit dem C-Syntax
vertraut), darum gehts mir auch nicht sondern um folgendes:
in einer anderen datei ist
millisec mit 492 definiert aber nur bei einer Quarzfrequenz von
14,7456MHz

wie komme ich auf den Wert ?
un wieviele durchläufe benötige ich für 12 MHz ?

ich bedank mich schonmal für eure hilfe

mfg

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Wert hat mal irgendjemand ausgetüftelt, der sich
den vom Compiler generierten Maschinencode angesehen
hat. Er hat einfach die Taktzyklen für den Schleifendurchlauf
zusammengezählt und hat sich ausgerechnet, wieoft dir
Schleife bei 14,7456 Mhz durchlaufen werden muss, damit das
genau 1 ms dauert.

Ich wuerde mal sagen: Volksschule 2., oder wars doch 3.
Klasse. 14 Äpfel kosten 20 Euro. Wieviel kosten 12 Äpfel?

   14,7456   .........    492
   12        .........     x
 -------------------------------

  ( Zahl über x, mal Stumpf, durch Spitz )

         492 * 12
   x = -----------
         14,7456

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
<in den Boden versinken>
Alles falsch!
Bei 0 MhZ wuerde man dann ja 0 Durchläufe brauchen
um 1 ms zu warten :-)

Also umgekehrt:
        492 * 14,7456
    x = -------------
             12

Stimmt übrigens nicht ganz exakt, da ja in den 492
Durchläufen auch ein konstanter Anteil drinnen ist,
den man immer hat, egal wieviele Durchläufe gemacht werden.
Aber dein 12Mhz Quarz hat auch nicht exakt 12,0000000 MhZ.

Autor: schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt hast dich aber glaub verrant ;-)

Nach deiner zweiten Gleichung würdest du bei dem langsameren Takt, mehr
Zyklen brauchen, um auf die gleiche Zeit zu kommen! Das kann nicht
sein.

492 * t14 = x * t12

wobei t = Durchlaufzeit für eine Schleife

wenn t12 größer ist, als t14, dann muss x kleiner 492 sein

Deine erste gleichung stimmt schon!
bei 0Mhz braucht genau null durchläufe, weil dann ja auch die Zeit
durch einen durchlauf unendlich lange wird!!!

Also, oft ist der erste Ansatz doch der richtige ;-)

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@schlumpf

Mist.
Danke für die Richtigstellung.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oha danke für die super schnelle hilfe, ich werde es gleich ausprobieren

Autor: schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl Heinz

Mir hat´s aber auch kurz das Hirn verbogen. Das Dumme ist, da es sich
hier nicht um Äpfel handelt, sondern um 1/Äpfel ;-)

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>> ich habe letzte woche angefangen mich mit mikrocontroller zu
beschäftigen, mit assembler bin ich zunächst einmal durch und probiere
mich gerade in C.

Welch ein Wunderknabe !!!! Assembler in 1. Woche.

Respekt !!!!

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Marcus,
nun wir etwas langsamer lernenden kennen für gewöhnlich die
Taktfrequenz und können damit die Periodendauer bestimmen. Wenn man
dann weis das der 8051 12 Takte/Befehl braucht kann man sich alles
ausrechnen.
..... solange keine ISR dazwischen kommt.......

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da du erst seit dieser Woche C machst, noch der kleine Hinweis:
Eine Schleife der Art
for(int i = 0; i<millisec;){
 i++;
}
liegt in der Ausführungszeit je nach Intelligenz des Optimierers
zwischen 0 und x Takten.
0 Takte wenn der Compiler erkennt das du da eigentlich nichts machst.
x wenn er dies nicht tut

Wie du x ausrechnest wurde ja oben schon ausführlich beschrieben,
allerdings hast du das Problem das du erst den Code schreibst und dann
Anhand des Ergebnisses nachjustierst, was evt. anderen Code zu Folge
hat.
Da du schon letzte Woche Assembler gemacht hast sollte es dir ein
leichtes sein eine Delayfunktion in Assembler zu schreiben.
Besser wäre es aber sich mit dem Mikrocontroller zu beschäftigen,
für so etwas gibt es Timer.

Autor: schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da hat wolfram recht!
Jeder µC hat Timer on chip. Damit kann man sich nen Interrupt auslösen
und der ist dann hochgenau und unabhängig vom Compiler.
Bedienen kann man den Timer natürlich auch in C

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.