Counterfunktion

Gast #339158
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
#339159
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
#339160
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.
Gast #339161
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 ;-)
Gast #339167
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.
Gast #339168
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren