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
Hi, wo ist dein Programm ? Im Makefile wird i.a. für alle Projektdateien die Taktquelle/-frequenz festgelegt. Welche Fusebits sind gesetzt/ gelöscht ?
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 ...
Thomas H. schrieb: > #define F_CPU 737280UL Da fehlt noch eine Null. Die F_CPU wird in Hertz angegeben. Also: #define F_CPU 7372800UL
moin, mach mal an dein define noch ein 0 hinten ran. Du hast da eine Größenordnung zu wenig :) dann passt das auch.
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?
Das der Clock-Divide by 8 noch eingeschaltet -> fuse richtig setzen.
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.
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
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.
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.
Habe jetzt die Fuses geändert und den Haken bei LOW.CKDIV8 rausgenommen. Danke, es klappt jetzt.
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?
datatom@arcor.de schrieb: > Wo wird denn "normalerweise" F_CPU definiert? Irgendwo (abhängig von deiner IDE) in den Project Settings.
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.
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: > 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
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.