Forum: Mikrocontroller und Digitale Elektronik LED Frequenz


von Tomus (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

: Bearbeitet durch Moderator
von Peter II (Gast)


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.

von Tomus (Gast)


Lesenswert?

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?

von Hanswurst (Gast)


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".

von HildeK (Gast)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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"...

: Bearbeitet durch Moderator
von fop (Gast)


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.

von Tomus (Gast)


Lesenswert?

Ja ich weiß dass die Frage nicht so der Hit ist, ich versuche es halt 
irgendwie zu verstehen wie das Ganze funktioniert.

von Stefan F. (Gast)


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.

von Tomus (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.