Tag. Ich habe eine Frage zu der Fuse CKOPT. Wenn die nicht programmiert
ist habe ich es schon mehrfach erlebt das ein Controller eine Zeit lang
lief und von einem Moment zum anderen den Dienst verweigerte. Wenn ich
dann mit einem Oszillator einen Takt an XTAL1 gebracht habe konnte ich
wieder auf den Controller zugreifen. Wenn ich dann CKOPT programmiert
habe gab es nie wieder Probleme.
Die Funktion von CKOPT ist mir klar. Aber wieso gibt es solche Probleme
wenn die Fuse unprogrammiert ist? Kann das am Quarz liegen? Oder müssen
die Kondensatoren anders sein (ich hab immer 2x 22pF). Oder ist das
wieder ein Versuch von Atmel etwas besser zu machen und das macht dann
nur mehr Probleme? Bei den neueren (zb Mega168) findet man die Fuse
nämlich schon nicht mehr.
Bei den neueren AVRs ist diese Fuse schon mit in die
Frequenzauswahlfuses eingearbeitet.
Es ist nunmal so, daß Quarze mit höherer Frequenz niederohmiger sind,
und da muß man eben ein bischen mehr Strom fließen lassen, damit es
stabil schwingt.
Ist ja auch im Datenblatt so angegeben, daß man bei hohen Frequenzen die
CKOPT setzen soll.
Wenn jemand das Datenblatt nicht liest, dafür kann doch Atmel nichts.
Peter
So, nach dem "Rumtheoretisieren" besser ein paar Fakten:
Ich zitiere erst mal ein paar Sätze von Dave vanHorn (Englisch ist
hoffentlich kein Problem):
"There is a bit of design work required to get it right:
First, the crystal determines the cap values, in it's loading cap
spec. If your crystal dosen't have a loading cap spec, then it's a
series mode rock, and you shouldn't use it in a parallel mode circuit
like this. It won't operate at the nameplate frequency since the
parallel and series resonant points cannot be at the same frequency,
and it may not even start up reliably in this mode.
Second, from the crystal's point of view, the caps are in series, so
they need to be almost twice the value specified by the crystal.
Almost, because there is always some amount of stray capacitance on
the board. You can guess at 5pF and start there. CL = (2*Cs)-5
Third, you need to check drive power, it is possible to damage or
even shatter a crystal with too much drive. This involves a
measurement of drive current and crystal impedance, see data sheet.
Power is of course I^2 * R where R is the crystal impedance at
resonance. You can add a small value resistor in series with the
drive pin, and measure voltage across it.
Fourth, it's always a good idea to do a margin check, which involves
adding series resistance between the micro's output pin and the
crystal. You adjust this value upward till the oscillator just starts.
This value should be at least three times the crystal's ESR value,
and higher ratios are better.
With the AVR in particular, there is one more consideration, the
CKOPT fuse should be programmed. The default (unprogrammed) state
enables a low power "vittoz" mode oscillator that typically operates
at about 1/2VCC amplitude, and will cause significant problems unless
the crystal is specifically designed for this mode."
Dave setzt AVRs in kommerziellen Designs ein, seit es sie gibt und hatte
mit der CKOPT-Fuse schon mächtig viel "Spass" (was ihn eine
Rückrufaktion kostete). Er wird deshalb nicht müde z.B. in der
Yahoo-Newsgroup "AVR-Chat" immer wieder darauf hinzuweisen, dass CKOPT
nicht im Defalult-State bleiben darf.
Noch ein Wort zum erwähnten "Vittoz-Mode":
Eric A. Vittoz ist ein schweizer Wissenschaftler der u.a. in Richtung
Ultra-Low-Power Quarzoszillatoren für (Armband-)Uhren forscht. Daher der
Name für den (dummerweise bei manchen AVRs per Default eingeschalteten)
Oszillator-Typ mit reduzietrter Schwingungsamplitude (und entsprechend
erhöhter Störempfindlichkeit).
Mehr als ihr jemals über Quarze und Oszillatorschaltungen wissen wolltet
findet ihr hier:
http://gaia.ecs.csus.edu/~bist/pll_team_docs/papers.html, bei Oliver
Betz (http://www.oliverbetz.de/quarz/quarz.htm) und im "Quarz-Kochbuch"
von Bern Neubig, welches man mittlerweile frei im Netz findet:
http://www.qsl.net/dk1ag/
Noch Fragen, Kienzle? ;-))
Nein Hauser ;)
Naja, 100% hab ich das noch nicht verstanden, aber ich sehe schon das da
noch ein bissel Arbeit auf mich zukommt. Danke für die Links, die werd
ich mir mal anschauen.
Kein Ami wrote:
>>(Englisch ist hoffentlich kein Problem)>> Doch ist es.
Schade.
Dann musst Du wohl einen Übersetzer finden (oder einen der
elektronischen verwenden, aber die taugen meiner Meinung nach eher zur
Belustigung denn zum Verständnis).
Kurz zusammengefasst: Bei einem Quarz sollte man immer CKOPT setzen und
hat keine Probleme. Das ist zumindest meine Erfahrung. Ich muss
allerdings dazu sagen, dass ich nur normale Quarze mit 4MHz aufwärts
nutze.
Man kann es natürlich auch kompliziert machen oder sich einfach nach dem
Datenblatt richten:
"The CKOPT Fuse selects between two different Oscillator amplifier
modes. When CKOPT is programmed, the Oscillator output will oscillate a
full rail-to-rail swing on the output. This mode is suitable when
operating in a very noisy environment or when the output from XTAL2
drives a second clock buffer. This mode has a wide frequency range. When
CKOPT is unprogrammed, the Oscillator has a smaller output swing. This
reduces power consumption considerably. This mode has a limited
frequency range and it cannot be used to drive other clock
buffers."
In deutsch:
Ohne CKOPT hat man nur nen eingeschränkten Frequenzbereich und ne höhere
Störempfindlichkeit und kann keine zusätzlichen Lasten treiben. Dafür
sinkt die Stromaufnahme etwas.
Oder einfach gesagt, wenns nicht wirklich auf jedes µA ankommt, einfach
CKOPT brennen, das ist zuverlässiger.
Peter
Der teil hier ist google noch am besten gelungen:
Zweitens vom Gesichtspunkt des Kristalles, sind die Kappen in der Reihe,
also müssen sie fast zweimal der Wert sein, der durch den Kristall
spezifiziert wird. Fast weil es immer irgendeine Menge der
Streukapazitanz
auf dem Brett gibt. Du kannst 5pF schätzen und dort beginnen. CL =
(2*Cs) - 5
;)
Ich setze das CKOPT fuse auch immer, auf einem Brett von mir
funktioniert der 16MHz Kristall so auch komplett ohne externe Kappen ;)
Der Streukapazitanz auf dem Brett sei dank!
Ok, ich hab hier grad so einen Fall reparieren können. Ich hab einen
anderen AVR so programmiert das er einfach an einem Port einen Takt
rausgibt und hab den an XTAL1 gehalten. Dann konnte ich wieder auf den
AVR zugreifen und CKOPT programmieren. Jetzt läuft er wieder :)
Hab ich das richtig verstanden: Für die Kondensatoren muss ich den Wert
der aufm Quarzt aufgedruckt ist verdoppelt und 5 abziehen?
In sämtlichen Schaltungsbeispielen die ich bis jetzt gesehen hab wird
mit 2x22pF Quarzen gearbeitet - auf meinem 16 Mhz Quartz steht 32pF -
ich bräuchte also theoretisch 2x59pF?
Deine Portpins inkl. den Leierzügen haben auch noch Kapazitäten, die du
berücksichtigen musst. Mit 32 pF kommt es dann ganz gut hin, wenn du
22pF nimmst. So 10pF Portpinkapazität, wenn man kurze Leiterzüge
verwendet, ist glaube ich typisch.
Danke für diesen Fred und diesen Tipp!
Habe erst Fehler in meinem Code gesucht (modifizerte
UART-Buffer-Routinen von Peter Danegger), da es immer wieder zu
spontanen Resets gekommen ist.
Ein Hinweis noch den ich hier nicht so klar gefunden habe - findet sich
aber natürlich im Datenblatt:
Da einige neue AVRs keine CKOPT Fuse haben, wie Peter schreibt, ist das
in die CKSEL Fuses gewandert -> in AVR-Studio musste ich statt "Ext.
Crystal Oszillator" -> "Full Swing Cristal Oscillator" auswählen.
Seitdem läuft UART stabil und selbst bei 115200 ist das
AVR-Software-Loopback fehlerfrei.
Danke!, Martin.
Darf ich euch noch ein weiteres Mysterium zur Untersuchung anbieten?
Meistens arbeite ich mit fertigen Oszillatoren, die im 14-Pin großen
DIP-Gehäuse.
Bei einem Prototypen auf Streifenraster saß neben dem Atmega eine Mosfet
H-Brücke, die reichlich Störungen verursacht hat.
Der Oszillator war fast direkt am Atmega angeschlossen, die Leiterbahn
war höchstens 10-15mm lang.
Vor allem wenn der Motor blockierte, haben die Störungen den Atmega zum
Absturz gebracht. Dadurch ist die Regelung natürlich völlig
durcheinander geraten und der Motor schaukelte sich auf, was noch mehr
Störungen verursachte.
Jetzt kommts: Nachdem ich die CKOPT-Fuse gesetzt hatte, war der Atmega
wesentlich weniger anfällig für Störungen!
Wie ist das möglich? Die Firmware wurde nicht verändert, nur die Fuse
gesetzt.
Eigentlich wird der Takt doch von außen vom Oszillator eingespeist, der
Atmega braucht dazu keinen Schwingkreis...
Die fuse ckopt stellt doch die Stromaufnahme des Oszillators auf
"deutlich größer" ein, sie schaltet ja die interne Hardware des
Kontrollers um.
Das wirkt sich natürlich auch bei externem Takt aus: der auf mehr Strom
geschaltete Oszillator wird bei ext. Osz. als Eingangsverstärker
benutzt. Sein Eingangswiderstand ist wegen des größeren Stroms geringer
und damit nimmt der Eingang weniger Störsignal auf.