Forum: Mikrocontroller und Digitale Elektronik Welchen Quarz beim Mega2561?


von Thomas H. (datatom)


Lesenswert?

Hallo zusammen,

ich habe mir ein Board mit einem ATMEGA2561 gekauft. Im Lieferumfang war 
ein Quarz mit 7.37280 MHz mit dabei. Im Programm, in welchen ich einen 
Pin mit einem angeschlossenen LED toggle, definiere ich den Quarz so:

#define F_CPU 737280UL


Zwischen dem Blinken habe ich ein delay mit 500ms festgelegt.

Kann es sein, dass die 500ms aufgrund des Quarzes keine echten 500ms 
sind? Wenn es so ist, wie bekomme ich es hin, dass aus den falschen 
500ms echte 500ms werden? Benötige ich einen Quarz mit 16 MHz?

Vielen Dank für eure Hilfe.

Grüße

Datatom

von Karl M. (Gast)


Lesenswert?

Hi,

wo ist dein Programm ?
Im Makefile wird i.a. für alle Projektdateien die Taktquelle/-frequenz 
festgelegt.

Welche Fusebits sind gesetzt/ gelöscht ?

von Arduinoquäler (Gast)


Lesenswert?

Was sind denn "falsche" 500ms?

Thomas H. schrieb:
> Kann es sein, dass die 500ms aufgrund des Quarzes keine echten 500ms
> sind?

Ja, wenn du etwas falsch gemacht hast.

Du beschreibst auch nicht welches Board du verwendest .... da
darf man dann wieder Rätsel raten ...

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Thomas H. schrieb:
> #define F_CPU 737280UL

Da fehlt noch eine Null. Die F_CPU wird in Hertz angegeben.
Also:
#define F_CPU 7372800UL

von nicht"Gast" (Gast)


Lesenswert?

moin,

mach mal an dein define noch ein 0 hinten ran. Du hast da eine 
Größenordnung zu wenig :) dann passt das auch.

von Thomas H. (datatom)


Lesenswert?

Mein Programm:

#include <avr/io.h>

#define F_CPU 7372800UL  // 7,3728 MHz
#include <util/delay.h>

int main(void)
{
  DDRB |= (1<<DDB5);

  while (1)
  {
    PINB |= (1<<PINB5);
    _delay_ms(500);
  }
}

Ich habe, wie empfohlen, noch eine 0 an dem #define F_CPU angefügt. Die 
LED schaltet nun ca. alle 4 Sekunden um.

Wenn ich eine 0 wegnehme, ist das Blinken schneller. 5x an und 5x aus 
dauern ca. 6 Sekunden. Aber die 500ms sind damit auch keine echten 
500ms.

Was ist falsch?

von Quarzprogrammierer (Gast)


Lesenswert?

Thomas H. schrieb:
> Was ist falsch?

Die Fuses. --> Clock - Einstellung

von Wilhelm M. (wimalopaan)


Lesenswert?

Das der Clock-Divide by 8 noch eingeschaltet -> fuse richtig setzen.

von sinn los (Gast)


Lesenswert?

Clkdiv 8 gesetzt... dann werden aus 500ms 4 Sekunden

von sinn los (Gast)


Lesenswert?

Zu langsam :D

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Thomas H. schrieb:
> Wenn ich eine 0 wegnehme, ist das Blinken schneller.

Wenn du F_CPU mit gesetzter CKDIV8 Fuse eintragen willst, sollte sie bei 
(7372800 / 8) = 921600UL sein. Wenn du diese Zahl als F_CPU einträgst, 
stimmt alles.
Aber es ist wirklich sinnvoll, die CKDIV8 Fuse zu löschen und die 
Quarzfrequenz dann in Hz einzutragen.

von M. K. (sylaina)


Lesenswert?

Und ob es wirklich sinnvoll ist den uC 500 ms sinnlos Energie verbraten 
zu lassen...auch mal einen Blick auf die Interrupts werfen. ;)

: Bearbeitet durch User
von Quarzprogrammierer (Gast)


Lesenswert?

M. K. schrieb:
> Und ob es wirklich sinnvoll ist den uC 500 ms sinnlos Energie verbraten
> zu lassen...auch mal einen Blick auf die Interrupts werfen. ;)

Ja, vieeel später, wenn er mal den Weg aus dem Urschleim
herausgefunden hat.

von Pete K. (pete77)


Lesenswert?

Seit wann gehört das #define F_CPU in den Programmcode?

von Quarzprogrammierer (Gast)


Lesenswert?

Pete K. schrieb:
> Seit wann gehört das #define F_CPU in den Programmcode?

Kann man machen ..... für den Anfänger.

Später wird er auch darüber mal stolpern.

von Thomas H. (datatom)


Lesenswert?

Habe jetzt die Fuses geändert und den Haken bei LOW.CKDIV8 rausgenommen.

Danke, es klappt jetzt.

von datatom@arcor.de (Gast)


Lesenswert?

Pete K. schrieb:
> Seit wann gehört das #define F_CPU in den Programmcode?

Habe das aus den Atmel-Beispiel. Wo wird denn "normalerweise" F_CPU 
definiert?

von Quarzprogrammierer (Gast)


Lesenswert?

datatom@arcor.de schrieb:
> Wo wird denn "normalerweise" F_CPU definiert?

Irgendwo (abhängig von deiner IDE) in den Project Settings.

von M. K. (sylaina)


Lesenswert?

datatom@arcor.de schrieb:
> Pete K. schrieb:
>> Seit wann gehört das #define F_CPU in den Programmcode?
>
> Habe das aus den Atmel-Beispiel. Wo wird denn "normalerweise" F_CPU
> definiert?

Eigentlich gehört das ins makefile, da wo auch deine CPU steht. Wie 
schon gesagt wurde ist das von der benutzten IDE abhängig.

von Wilhelm M. (wimalopaan)


Lesenswert?

Ob das nun im Makefile steht, und damit dem Cpp beim Kompilieren 
übergeben wird, oder in einer projektweiten Header-Datei oder sonst wo, 
ist vollkommen egal. Das ist eher eine Frage, wie man sein Projekt bzw. 
die Korrespondenz zwischen SW und HW organisiert. Wichtig ist nur, dass 
alle (!) beteiligten Übersetzungseinheiten dieselbe (!) Definition von 
F_CPU sehen.

von Pete K. (pete77)


Lesenswert?

Wilhelm M. schrieb:
> Wichtig ist nur, dass
> alle (!) beteiligten Übersetzungseinheiten dieselbe (!) Definition von
> F_CPU sehen.

Genau deswegen macht man das im Makefile. Oder in dem entsprechenden 
Eintrag in der jeweiligen IDE.

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

Pete K. schrieb:
> Wilhelm M. schrieb:
>> Wichtig ist nur, dass
>> alle (!) beteiligten Übersetzungseinheiten dieselbe (!) Definition von
>> F_CPU sehen.
>
> Genau deswegen macht man das im Makefile. Oder in dem entsprechenden
> Eintrag in der jeweiligen IDE.

Eben nicht notwendigerweise!

von Ralf D. (doeblitz)


Lesenswert?

Wilhelm M. schrieb:
> Pete K. schrieb:
>> Wilhelm M. schrieb:
>>> Wichtig ist nur, dass
>>> alle (!) beteiligten Übersetzungseinheiten dieselbe (!) Definition von
>>> F_CPU sehen.
>>
>> Genau deswegen macht man das im Makefile. Oder in dem entsprechenden
>> Eintrag in der jeweiligen IDE.
>
> Eben nicht notwendigerweise!

ACK, ein Headerfile, das in allen Sourcen eingebunden wird, tut es auch 
sehr gut.

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.