Hallo,
Mein Problem wäre dass ich wahrscheinlich den Quarz nicht richtig
eingestellt habe, und ich weiß nicht genau wie ich das machen kann.
Ich habe an einem ATmega328P einen externen 20 Mhz Quarz angehängt.
(auch mit diesen 15µF Kondensatoren)
Ich arbeite mit AVR studio 5 und habe schon bei den Fusebits
„EXTFSXTAL_16KCK_14CK_65ms“
(Ext. Full-swing Crystal; Start- up time PWRDWN/RESET: 16 K CK/14 CK
+65ms) eingestellt.
In das Programm hab ich auch noch dies geschrieben:
#include <avr/io.h>
#include <util/delay.h>
#ifndef F_CPU
#define F_CPU 20000000UL
#endif
Eine LED sollte nun 1 Sekunde leuchten und 1 Sekunde nicht leuchten.
Das passiert aber nicht. Statdessen Leuchtet die LED etwas über einer
halben Sekunde, und leuchtet nicht für etwa eine halbe Sekunde.
Ich denke dass der Quarz nicht richtig initialisiert wurde, oder dass
man das woanders machen muss…
Bin schon am verzweifeln. Seit fast zwei Wochen sitz ich auf dem Problem
und komm nicht weiter.
Kann mir bitte jemand einen Tipp geben?
Lukas schrieb:> wie kann ich das herausfinden und ändern?
Du kannst auch mal einfach diese drei Zeilen auskommentieren. Wenn dann
ein Fehler kommt, daß F_CPU nicht definiert ist, dann lag's nicht daran.
Er arbeitet ja mit AVR-Studio 5 da müssten man dann schon selbst eine
Makefile einbinden, ansonsten macht das AVR S5 für dich.
Du kannst auch einfach _delay_ms(1000) eingeben.
Dann kann es noch sein dass bei den fuse ckdiv aktiv ist.
ok, ich habs auskommentiert -> es kam keine fehlermaldung nach dem
kompilieren -> also muss es bereits in diesem Makefile definiert sein
also muss ich das Makefile finden und die frequenz ausbesser. Simmt das
so?
Rolf Magnus schrieb:> Du kannst auch mal einfach diese drei Zeilen auskommentieren. Wenn dann> ein Fehler kommt, daß F_CPU nicht definiert ist, dann lag's nicht daran.
Da wird keine Fehlermeldung sondern eine Warnung kommen, weil in der
delay.h steht:
1
#ifndef F_CPU
2
/* prevent compiler error by supplying a default */
ok, jetzt bin ich erst verwirrt
ich weiß nicht geau was gemeint ist
ich dachte ich soll das makefile finden und da die Frequenz ändern, und
nicht im delay.h
Chris schrieb:> Du wirst keine makefile finden in AVR Studio 5, ausser du hast eine> extern eingebunden. Was ich mir nicht denken kann.
Stell das dort ein, wo Du auch den µC-Typ eingestellt hast. Im Studio 4
ist das unter "Project -> Configuration Options".
Btw: Ich finde dieses Konstrukt
#ifndef F_CPU
#define F_CPU 20000000UL
#endif
für das schlechteste, was man machen kann. Entweder man definiert es im
Source oder man definiert es nicht im Source. Aber so eine
Wischiwaschi-Angabe nach dem Motto "Compiler, wenn Du es nicht besser
weisst, nimm halt 20 MHz" ist das unbestimmteste und unberechenbarste,
was man machen kann.
Lieber entweder kein define, um eine Fehlermeldung zu bekommen oder ein
unbedingtes(!) define, z.B.
#define F_CPU 20000000UL
In beiden Fällen bekommt man vom Compiler eine anständige Fehlermeldung,
wenn es nicht oder doppelt definiert wurde.
Frank M. schrieb:> In beiden Fällen bekommt man vom Compiler eine anständige Fehlermeldung,> wenn es nicht oder doppelt definiert wurde.
welcher Compiler meckert denn bei einem Doppelte #define?
Frank M. schrieb:> Stell das dort ein, wo Du auch den µC-Typ eingestellt hast. Im Studio 4> ist das unter "Project -> Configuration Options".
Aber im Studio 5 nicht mehr...
@Frank
Hast du dir mal AVR Studio 5 angeschaut? Da ist das alles etwas anderst.
Peter II schrieb:> welcher Compiler meckert denn bei einem Doppelte #define?
Habe ich gerade beim AVR Studio 4.18 probiert:
#define F_CPU 1000000UL
#define F_CPU 1000000UL
-> keine Fehlermeldung
#define F_CPU 1000000UL
#define F_CPU 100000UL
-> 2 Warnungen
Gruß Dietrich
-
Peter II schrieb:> Jakob B. schrieb:>> AVR GCC bringt mir zumindest eine Meldung.> ich habe es mit dem GCC unter linux mit -Wall getestet da kommt nichts
sorry, wenn das define gleich ist kommt keine Meldung, nur wenn es sich
unterscheidet.
Ich schaff es einfach nicht,
die Fuses sollten stimmen, im programm hab ich jetzt:
#include <avr/io.h>
#define F_CPU 20000000UL
#include <util/delay.h>
stehen, und es funktioniert einfach nicht...
Peter II schrieb:> sorry, wenn das define gleich ist kommt keine Meldung, nur wenn es sich> unterscheidet.
So ist es. Dann weiß man direkt Bescheid, dass man 2 sich
widersprechende Einstellungen getätigt hat. Deshalb ist das "#ifdef
F_CPU" einfach suboptimal. Es macht weder den Compiler schlauer noch den
Entwickler, der verzweifelt nach dem Fehler sucht.
Lukas schrieb:> L-fuse: 0x77> H-fuse: 0xD9> E-fuse: 0xFF
l-fuse ist falsch. Das muss 0xFF sein, siehe auch
http://www.engbedded.com/fusecalc/
Edit: Also "Ext Crystal Osc" und CKDIV nicht vergessen! Sonst wird der
Takt durch 8 geteilt!
Lukas schrieb:> da hat das problem leider nicht gelöst, jetzt blinkt die LED za. 5 mal> in der sekunde (schwer zu sagen)
Wahrscheinlich blinkt es 8 mal pro Sekunde.
Was hast Du eingestellt? 0x7F oder 0xFF? Sorry ich hatte meine Antwort
eben nachträglich berichtigt, weil ich zunächst übersehen habe, dass Du
auch CKDIV falsch eingestellt hattest. Es muss 0xFF sein. Überprüfe das
nochmal.
Ja entschuldigung Chris, ich hatte deine antwort nicht gesehen, da ich
warscheinblich meine antwort schrieb währund du deine geschriegen hast,
oder so
also ich hab jetzt:
L-fuse: 0xFF
H-fuse: 0xD9
E-fuse: 0xFF
ja das kann durchaus auch 8 mal pro sekunde sein...
aber eigentlich sollte es 1s leuchten und 1s nicht leuchten
Jetzt hat er aber den Low Power Crystal Oscillator aktiviert. Das kann
auch nicht stimmen.
Richtig wäre wohl eher für L-Fuse: 0xF7
Aber schau noch mal im Datenblatt nach.
Chris schrieb:> Jetzt hat er aber den Low Power Crystal Oscillator aktiviert.
Das glaube ich nicht. Schau Dir bitte http://www.engbedded.com/fusecalc/
an, das ist ein nettes Tool :-)
Mit 0xFF ist ein Quartz oberhalb 8 MHz eingestellt. So muss es auch
sein.
also einer der diesen fehler hat, meint dass in version 5.0.1163 behoben
sei und genau diese version hab ich.
naja dann werd ich mal alles deinstallieren neu runterladen und neu
installieren, wenn das nichts hilft, tja dann...
kein Mikrokontroller für mich!!
Laut Datenblatt geht die Einstellung mit 0xFF für Low Power Crystal von
8MHz bis 16MHz.
Er hat aber einen 20 MHz Quarz dran womit diese Einstellung falsch ist.
0xF7 wäre die richtige für 20 MHz.
Oder es steht im Datenblatt falsch.
Wobei ich dem Datenblatt von Atmel eher glaube als dem Tool.
So ich habe avr studio 5 auf einem anderen Rechner installiert und den
Mikrokontroller mit den gleichen Einstellungen wie vorher programmiert
Die LED sollte ursprünglich 1s leuchten und 1s nicht leuchten
auf dem ursprünglichen Rechner blinkt die LED ca. 8 mal pro Sekunde
auf dem anderen Rechner leuchtet die LED jetz etwas länger als 1s und
ist auch für etwas länger als 1s dunkel
(nach 30s ist´s schonwieder um einem halbe Sekunde daneben)
woran kann das jetzt liegen?
es ist zumindest ein Teilerfolg, aber das sollte schon genauer sein...
Hi Lukas!
Ich bin zwar auch so ein Anfänger wie Du oder vielleicht sogar noch ein
blutigerer Anfänger aber ich meine mich zu erinnern, daß die
Delay-Funktion nicht gescheit funktioniert wenn man nicht die
Optimization auf zumindest "Optimize for Size" eingestellt hat.
Hast Du das gemacht?
Finden tust Du das unter Project ->DeinProjekt Properties. Dann auf
"Toolchain" und dort unter "AVR/GNU C Compiler" auf "Optimization" und
da kannst es dann rechts im Fenster auswählen.
Wie stellst Du denn die Fuses ein? Auch im AVR-Studio?
Aber, wie gesagt, bin selbst erst blutiger Einsteiger. Allerdings meine
LEDs blinken brav wie sie sollen nach ersten Mühen. ;-))
LG
Ernst
wow es scheint echt zu funktionieren
ich habs auf "Optimize for size (-Os)" eingestellt und es tut nun das
was es soll
komisch find ich nur dass auf den ersten rechner von hausaus "Optimize
for size (-Os)"
auf auf dem zweiten rechner (wos jetzt eigenartigerweiße funktioniert)
war "None (-O0) eingestellt..
aber es geht
Ich danke dir
DANKE, DANKE, DANKE!!!!