Counterfunktion

Gast #339158
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
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
<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
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 ;-)
@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.......
Gast
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
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

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.