Forum: Mikrocontroller und Digitale Elektronik Counterfunktion


von Markus (Gast)


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

von Karl heinz B. (kbucheg)


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

von Karl heinz B. (kbucheg)


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.

von schlumpf (Gast)


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

von Karl heinz B. (kbucheg)


Lesenswert?

@schlumpf

Mist.
Danke für die Richtigstellung.

von Markus (Gast)


Lesenswert?

oha danke für die super schnelle hilfe, ich werde es gleich ausprobieren

von schlumpf (Gast)


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

von Stephan H. (stephan-)


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 !!!!

von Stephan H. (stephan-)


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

von Wolfram (Gast)


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.

von schlumpf (Gast)


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

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.