LED Frequenz

Gast #4636302
Lesenswert?

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
Moderator (Firma: Titel) Persönliche Seite #4636306
Lesenswert?

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.
Gast #4636308
Lesenswert?

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.
Gast #4636313
Lesenswert?

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".
Gast #4636318
Lesenswert?

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.
Moderator (Firma: Titel) Persönliche Seite #4636323
Lesenswert?

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"...
Gast #4636329
Lesenswert?

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.
Gast #4636357
Lesenswert?

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.

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