Welchen Quarz beim Mega2561?

OP #4854622
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
Gast
Hi,

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

Welche Fusebits sind gesetzt/ gelöscht ?
Gast
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 ...
OP
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?
(Firma: matzetronics)
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.
Gast
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.
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.
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.