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.
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 ;-)
@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 ;-)
>>> 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 !!!!
@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.......
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.