AVR Frequenz definieren

OP #2339732
Lesenswert?

Mal eine Verständnisfrage:

Ich verwende das AVR-Studio um meinen AVR zu programmieren.
In der Vordefinierten Delay-Funktion ist ein F_CPU von 1000000 Hz (1MHz) 
eingetragen.
Wenn ich jetzt meinen AVR allerdings mit 8MHz laufen lasse und dies als 
F_CPU in den Einstellungen eintrage, stimmt ja das Timing nicht mehr von 
dem Code.

Nimmt man dann einfach für F_CPU einen anderen passenden Wert oder passt 
man seinen Code für 8MHz an. Wie geht man da üblicherweise vor?
Gast #2339743
Lesenswert?

Normal passt man den Wert von F_CPU, dafür ist das ja ein Parameter und 
kein fester Wert.

Dass kann man entweder irgendwo am Anfang des Programms, über das 
Makefile, oder bei AVRstudio mit GCC auch über die Menüs machen (wird 
dann beim Aufruf von GCC eingesetzt).
#2339773
Lesenswert?

Manfred W. schrieb:
> Was heißt tatsächlich? Tatsächlich wäre für mich die Frequenz mit der
> der AVR läuft.

Ganz genau. Nahezu jede ausgearbeitete Bibliothek nutzt den Wert (oder 
zumindest vergleichbare Einstellungen) um das Timing an den CPU-Takt 
anzupassen.

Schreibst Du einen falschen Wert rein stimmt das Timing nicht mehr.

Manfred W. schrieb:
> Also wenn ich das richtig verstanden habe ist F_CPU nur eine
> stinknormale Variable die eigentlich nichts mit der Taktfrequenz des AVR
> zu tun hat. Ist das so?

Falsch.
#2339786
Lesenswert?

Nur der Compiler benötigt Taktfrequenz und Laufschleifen für 
Verzögerungen richtig in einen ASS-Code umzusetzen. Auch um Delay's für 
die internen seriellen Schnittstellen zu berechnen oder auch Wartezeiten 
für LCD-Ausgaben u.s.w.
Wird das nicht benötigt, so kann man getrost 100MHz angeben und über die 
Fuses oder Quarz 8MHz (16MHz) einstellen.

W.
OP #2339828
Lesenswert?

Wenn ich jetzt einen Timer Interrupt von 10ms benötige und ich F_CPU auf 
8000000Hz eingestellt habe, wie berechne ich den dann?

Ich möchte gerne die "Universelle Tastenabfrage" aus dem Tutorial hier 
verwenden. Die geht allerdings von einer Taktfrequenz von 1MHz aus.

Muß ich den Code dann komplett umstricken?
#2339842
Lesenswert?

Manfred W. schrieb:
> Wenn ich jetzt einen Timer Interrupt von 10ms benötige und ich F_CPU auf
> 8000000Hz eingestellt habe, wie berechne ich den dann?

http://www.mikrocontroller.net/articles/FAQ#Timer

> Ich möchte gerne die "Universelle Tastenabfrage" aus dem Tutorial hier
> verwenden. Die geht allerdings von einer Taktfrequenz von 1MHz aus.
>
> Muß ich den Code dann komplett umstricken?

Nein.
Ob die den Interrupt alle 5 oder alle 10 oder alle 20 ms aufruft, ist 
ziemlich wurscht. Die Zeit sollte sich irgendwo im Bereich 5 bis 50ms 
bewegen. Dann passt das schon. Du kannst das Nachladen auch komplett 
rauswerfen, wenn die ISR Aufruffrequenz sich in diesem Bereich bewegt.
#2339848
Lesenswert?

Manfred W. schrieb:
> wie berechne ich den dann?

Du rechnest aus, wie lang ein Takt ist:

Timerprescaler / F_CPU

Dann musst du den Timer so lange zählen lassen, bis die gewünschte Zeit 
erreicht ist.

Manfred W. schrieb:
> Muß ich den Code dann komplett umstricken?
Nein.
Damit wird der Timer eingestellt:
>TCNT0 = (u8)(s16)-(XTAL / 1024 * 10e-3 + 0.5);  // preload for 10ms

XTAL entspricht deinem F_CPU
Das ist oben definiert:
>#define  XTAL    1e6    // 1MHz


mfg.
OP #2339876
Lesenswert?

Genau dieses Beispiel.

Wie kommt man da eigentlich auf 10ms? Wenn wir mal von 1MHz ausgehen und 
ich mir die Formel XTAL / 1024 * 10e-3 + 0.5 ausrechne kommt bei mir ein 
Wert von 6836,4375 heraus.

Andererseits wenn ich das ganze mit 4MHz rechne bekomme ich einen Wert 
von 27344,25.

Das wäre doch um einiges mehr.
Warum eigentlich überhaupt die + 0,5? Die machen das Kraut doch auch 
nicht mehr Fett.
#2339899
Lesenswert?

Manfred W. schrieb:
> Wert von 6836,4375 heraus.
Das ist eine Dezimalzahl. Ins Register wird aber ein Integer 
geschrieben. D.h. die Nachkommastellen werden abgeschnitten.

Manfred W. schrieb:
> von 27344,25.

Bei 4 MHz ist ein Takt 4 mal kürzer als bei 1 MHz. Also muß der Timer 4 
mal weiter zählen. Und 4 * 6836 ist 27344.

Manfred W. schrieb:
> Warum eigentlich überhaupt die + 0,5?
Das dient zum Runden, da die Nachkommastellen abgeschnitten werden.

>Die machen das Kraut doch auch nicht mehr Fett.
Wir sind hier aber auch nicht auf'm Wochenmarkt.

mfg.
Gast #2340649
Lesenswert?

Manfred W. schrieb:
> In der Vordefinierten Delay-Funktion ist ein F_CPU von 1000000 Hz (1MHz)
> eingetragen.

Das ist nur die halbe Wahrheit.

Normalerweise steht da
1
#ifndef F_CPU
2
/* prevent compiler error by supplying a default */
3
# warning "F_CPU not defined for <util/delay.h>"
4
# define F_CPU 1000000UL
5
#endif

Damit ist der dort eingetragene Wert nur ein Default-Wert, der zum 
Tragen kommt, wenn vorher im Code bzw. über die Entwicklungsumgebung 
keine Taktfrequenz als F_CPU festgelegt ist. In delay.h muß folglich 
überhaupt nicht angepaßt werden, sondern nur vorher F_CPU über eine 
Preprozessordirektive festgelegt sein.

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