Forum: Mikrocontroller und Digitale Elektronik Quarz initialisieren


von Lukas (Gast)


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?
von Peter II (Gast)


Lesenswert?

Lukas schrieb:
> Kann mir bitte jemand einen Tipp geben?

ja

#ifndef F_CPU
#define F_CPU 20000000UL
#endif

muss vor

#include <util/delay.h>
von Thomas (Gast)


Lesenswert?

Wenn du erst die delay.h einbindest und danach erst die F_CPU festlegst, 
wie soll die delay.h dann die richtige Frequenz erfahren?
von rudi (Gast)


Lesenswert?

Lukas schrieb:
> mit diesen 15µF Kondensatoren
du meinst sicherlich 15pF
und den ganzen code bitte
von Lukas (Gast)


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;
}
von Rolf Magnus (Gast)


Lesenswert?

Lukas schrieb:
> #ifndef F_CPU
> #define F_CPU 20000000UL
> #endif

F_CPU wurde nicht zufällig im Makefile schon definiert?
von Lukas (Gast)


Lesenswert?

Das weiß ich leider nicht
wie kann ich das herausfinden und ändern?
von Rolf Magnus (Gast)


Lesenswert?

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.
von Chris (Gast)


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.
von Lukas (Gast)


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?
von Thomas (Gast)


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
von Lukas (Gast)


Lesenswert?

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
von Chris (Gast)


Lesenswert?

Du wirst keine makefile finden in AVR Studio 5, ausser du hast eine 
extern eingebunden. Was ich mir nicht denken kann.
von Lukas (Gast)


Lesenswert?

ok, aber was muss ich jetzt eigentlich machen damit der Mikrokontroller 
weiß dass er einen 20Mhz Quarz hat? Wo muss ich das hinschreiben?
von Cyblord -. (cyblord)


Lesenswert?

Das musst du in den Projekt-Einstellungen im AVR Studio angeben. Dort wo 
du auch angibst welchen Controller Typ du verwendest.
von Chris (Gast)


Lesenswert?

Davon ausgehend dass dein Quarz ein 20MHz Quarz ist.
1. Fuse richtig setzten
2. F_CPU in deinem Code definieren.
das war es eigentlich schon.
von Frank M. (ukw) (Moderator) Benutzerseite


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.
von Lukas (Gast)


Lesenswert?

ich finde es noch immer nicht, keine ahnung wo ich hinklicken soll... :(
von Peter II (Gast)


Lesenswert?

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?
von Jakob B. (teddynator)


Lesenswert?

Peter II schrieb:
> welcher Compiler meckert denn bei einem Doppelte #define?

AVR GCC bringt mir zumindest eine Meldung.
von Peter II (Gast)


Lesenswert?

Jakob B. schrieb:
> AVR GCC bringt mir zumindest eine Meldung.

ich habe es mit dem GCC unter linux mit -Wall getestet da kommt nichts
von Chris (Gast)


Lesenswert?

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.
von Dietrich L. (dietrichl)


Lesenswert?

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
-
von Peter II (Gast)


Lesenswert?

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.
von Lukas (Gast)


Lesenswert?

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...
von Frank M. (ukw) (Moderator) Benutzerseite


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.
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Lukas schrieb:
> die Fuses sollten stimmen, [...]

Zeig bitte die Werte von l-fuse, h-fude und e-fuse.
von Lukas (Gast)


Lesenswert?

L-fuse: 0x77
H-fuse: 0xD9
E-fuse: 0xFF
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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!
von Lukas (Gast)


Lesenswert?

da hat das problem leider nicht gelöst, jetzt blinkt die LED za. 5 mal 
in der sekunde (schwer zu sagen)
von Chris (Gast)


Lesenswert?

Hatte oben schon geschrieben dass er CKDIV noch drin hat...
von Frank M. (ukw) (Moderator) Benutzerseite


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.
von Lukas (Gast)


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
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Lukas schrieb:

> L-fuse: 0xFF
> H-fuse: 0xD9
> E-fuse: 0xFF

Also wenn es jetzt noch falsch blinkt, liegt es am Delay-Bug im 
AVR-Studio 5 (LED blinkt dann 4 mal zu schnell), siehe:

  Beitrag "AVR-Studio 5, Delay-Bug behoben?"

bzw.

  Beitrag "Re: Thermomixer noch einmal neu - dieses mal nur ein MEGA16"
von Chris (Gast)


Lesenswert?

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.
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.
von Chris (Gast)


Lesenswert?

Dann schau mal bitte im Datenblatt nach :)
von Lukas (Gast)


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!!
von Chris (Gast)


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.
von Lukas (Gast)


Lesenswert?

also mit 0xFF passiert genau das selbe als mit 0xF7
Also ich kann keinen unterschied erkennen
von ich (Gast)


Lesenswert?

Hier gibt es eine funktionierende delay.h
Kopiere die mal über deine vorhandene (im richtigen Verzeichnis!)

Beitrag "Re: Problem mit Atmega32 und LCD (HD44780 kompatibel)"
von Lukas (Gast)


Lesenswert?

damit ändert sich leider auch nichts :(
von Lukas (Gast)


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...
von Ernst B. (puravida)


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
von Lukas (Gast)


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