Guten Morgen, kurze Frage: wenn ich eine delay Funktion in meinem makefile habe und diese sich auf die CPU Frequenz bezieht. was passiert wenn ich jetzt eine LED blinken lasse mit 0,5 Hz und im makefile die CPU Frequenz halbiere ? - ist die LED Frequenz dann wirklich doppelt so groß, wenn ja warum? und was passiert wenn ich im AVR - Studio die Frequenz halbiere, dann hab ich ja die Hardware geändert, läuft die LED dann auch wieder mit der doppelten Frequenz ? Wäre echt super wenn ihr mir helfen könntet, bin grade echt verwirrt davon Gruß Tom
Tomus schrieb: > - ist die LED Frequenz dann wirklich doppelt so groß, wenn ja warum? Weil du dem Compiler "vorgelogen" hast, einen halb so schnellen Takt verwenden zu wollen. Das tust du aber nicht... > was passiert wenn ich im AVR - Studio die Frequenz halbiere, dann hab > ich ja die Hardware geändert, läuft die LED dann auch wieder mit der > doppelten Frequenz ? Ja, Grund siehe oben. > Wäre echt super wenn ihr mir helfen könntet Du solltest dem Compiler die Frequenz angeben, die du tatsächlich verwendest. Sonst geht der von falschen Annahmen aus und berechnet Werte falsch.
:
Bearbeitet durch Moderator
die Delay Funktion wartet intern keine Zeit sondern CPU-Takte. Die Zeit die du als Parameter übergibst, wird vom Compiler in Takte umgerechnet. Damit sollte klar sein, wenn die Takte schneller oder langsamer sind, was dann mit der Delay Funktion passiert.
aber dann müsste doch die Frequenz doch halb so groß sein, da ja mehr takte zum erreichen der gegebenen Zahl im Delay benötigt werden? Oder täusch ich mich da?
Es besteht ja durchaus die Möglichkeit, dass die Frage ernst gemeint ist, aber um Dich von einem Troll hinreichend abzuheben, wäre es hilfreich, wenn Du 1. Eigene Versuche anstellst die Frage zu beantworten und diese dokumentierst. Im Grunde äusserst simpel, falls Du mal versuchst von Hand und auf dem Papier nachzuvollziehen in welcher Weise das delay realisisiert wird. 2. Deine Ansicht begründest, in welcher Weise Du die Hardware änderst, falls Du im AVRStudio "die Frequenz halbierst".
Tomus schrieb: > aber dann müsste doch die Frequenz doch halb so groß sein, da ja mehr > takte zum erreichen der gegebenen Zahl im Delay benötigt werden? Wenn du dem Compiler die halbe Frequenz vorgaugelst, dann macht er für eine gegebene Zeit halb so viele Takte zum Warten einer gegebenen Zeit. Tatsächlich hast du aber eine höhere Taktfrequenz, somit ist die Wartezeit schneller vorbei, denn an der Anzahl Takten, die er wartet, ändert sich ja nichts.
Tomus schrieb: > aber dann müsste doch die Frequenz doch halb so groß sein, da ja mehr > takte zum erreichen der gegebenen Zahl im Delay benötigt werden? > Oder täusch ich mich da? Denk nochmal nach. Wenn du dem Compiler sagst: 1. Taktfrequenz ist 10 MHz. 2. Warte eine Sekunde. Dann rechnet der Compiler aus: 10000000 Takte warten. Wenn du ihm sagst: 1. Taktfrequenz ist 5 MHz. 2. Warte eine Sekunde. Dann wartet er 5000000 Takte. Und wenn du diesen Controller dann aber trotzdem mit 10MHz betreibst, dann ist er schon in der halben Zeit mit warten fertig. Er ist also doppelt so schnell, du hast ihn mit 10MHz statt 5MHz quasi "übertaktet"...
:
Bearbeitet durch Moderator
Hi, es geht hier also um 2 Sachen : 1) wie schnell läuft der Mikrokontroller wirklich 2) von welcher Geschwindigkeit des Mikrokontrollers geht die Software aus Punkt 1 lässt sich nur durch ändern der Konfiguration der Takterzeugung (irgendwelche Slow Modes zähle ich jetzt der Einfachheit halber dazu), bzw. durch Austausch des Quarzes ändern. Dies dürfte mehr als das ändern eines Defines oder ein paar Klicks in der IDE erfordern. Punkt 2 ist schon eher in einem Define festgelegt, bzw. übergibt die IDE dem Compiler ein Define mit dem bei ihr eingestellten Wert. Ist dieser Wert zu hoch, läuft alles langsamer. Ist der Wert zu niedrig läuft alles schneller. Klar, denn delay() macht an diesem Wert fest, wieviele zu nichts anderem nützende Befehle es abarbeiten lassen muß, bis die Zeit um ist. Gaukelst Du nun dem Code vor Du hättest einen schnellen Mikrokontroller, sind es mehr Befehle. Hast Du aber in Wirklichkeit gar keinen so schnellen Mikrokontroller dauerts eben länger als geplant. Um einen Knoten im Gehirn zu vermeiden, stellt man hier jedoch den richtigen Wert ein und legt sich ein weiteres Define für die Blinkgeschwindigkeit an. Und irgendwann ist man auch so weit, dass die Software die Zeit besser nutzt, als nur auf die nächste Flanke des Blinkens zu warten.
Ja ich weiß dass die Frage nicht so der Hit ist, ich versuche es halt irgendwie zu verstehen wie das Ganze funktioniert.
Im zweifelsfall schaue ich mir oft den Assembler-Code an, den der Compiler erzeugtn hat. Ich bin zwar kein Experte in Assembler, aber zumindest kann ich den erzeugten Code lesen und verstehen. Das lernst man in wenigen Stunden und ist gelegentlich hilfreich. Falls du ein kleines bisschen AVR Assembler lernen möchtest, schau Dir mein Tutorial an: http://stefanfrings.de/avr_workshop/index.html Als C Programmierer muss man kein Assembler können, manchmal hilft es aber. Eben weil C in Assembler übersetzt wird.
Danke euch allen, nach einer etwas längeren Nacht hab ich´s jetzt endlich geblickt. Danke euch!
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.