Quarz initialisieren

Gast #2405652
Lesenswert?

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?
Gast #2405662
Lesenswert?

ja, stimmt ich meinte 15pF sorry
also der code siht jetzt so aus:

#include <avr/io.h>
#ifndef F_CPU
#define F_CPU 20000000UL
#endif
#include <util/delay.h>


int main(void)
{
  DDRB = (1 << PB1);        //PB1 als Ausgang


  while(1)
  {

  PORTB ^= (1 << PB1);        //PB1 toggln

  for(int i=0 ; i<100 ; i++)      //wartet 1000ms
  {
    _delay_ms(10);
  }


  }
  return 0;
}
Gast #2405687
Lesenswert?

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.
Gast #2405688
Lesenswert?

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?
Gast #2405731
Lesenswert?

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 */
3
# warning "F_CPU not defined for <util/delay.h>"
4
# define F_CPU 1000000UL
5
#endif
Moderator Persönliche Seite #2405801
Lesenswert?

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.
Moderator Persönliche Seite #2405850
Lesenswert?

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.
Moderator Persönliche Seite #2405891
Lesenswert?

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.
Gast #2405899
Lesenswert?

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
Gast #2405934
Lesenswert?

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!!
Gast #2405939
Lesenswert?

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.
Gast #2406164
Lesenswert?

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...
#2406212
Lesenswert?

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
Gast #2406240
Lesenswert?

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!!!!

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