Hallo Community,
bei einem fertigen Layout mit einem ATMega1284P tritt ein merkwürdiger
Effekt auf: Wenn ich mit einem 1:1 Tastkopf am Quarz mit 14,7456 MHz
messe, spinnt der AVR gelegentlich herum. Mir ist klar, dass ich den
Quarz dermaßen störe, dass er seine Frequenz stark ändert oder stoppt.
Demnach würde ich erwarten, dass der AVR ebenfalls stehen bleibt oder
nach loslassen des Quarzes wieder anläuft.
Er tut aber folgendes: Mal bleibt irgendein Portpin tot, während alles
andere läuft (immer mal ein anderer). Einmal habe ich an einem Portpin
als Augang 2V gemessen, obwohl der AVR mit 5V läuft. Lauter so
verrücktes Zeug, was erstmal unerklärlich erscheint. Da der vorliegende
Prototyp mal ein Serienprodukt werden soll, mache ich mir natürlich
Sorgen, ob ein Fehler vorliegt oder irgendetwas auf letzter Rille läuft.
(Beim normalen Powerup erscheint zumindest alles einwandfrei.)
Zum Test enthält der AVR lediglich ein primitives Testprogramm (s.u.),
welches je eine an PD4 und PD5 angeschlossene LED im Millisekundentakt
toggelt. Berühre ich nun mit dem Tastkopf den Quarz und lasse ihn wieder
los, blinkt oft nur noch eine LED (immer mal die eine oder die andere),
während die andere aus bleibt. Im Debugmodus sehe ich, dass das Programm
das Port-Register richtig setzt, aber der Ausgang folgt dem nicht. Im
Pin-Register wird nur der tatsächlich geschaltete Ausgang zurückgelesen.
Das DD-Register enthält nach wie vor den korrekten Inhalt. Wie kann bei
einem als Ausgang geschalteten Pin das jeweilge Bit im Pin-Register vom
Port-Register abweichen? Das ist die große Frage.
Das Testprogramm aktiviert keine speziellen Funktionen auf den Pins und
in Hardware sind an den Pins lediglich LEDs mit Vorwiderstand gegen GND
angeschlossen.
Hallo,
das liegt daran, daß der Quarzoszillator erst einmal richtig anschwingen
muß, bevor man den AVR starten läßt. Vorher gibt es keine saubere
Schwingung mit konstanter Amplitude,
Nicht umsonst haben die AVR's Fuses, mit denen man die Anzahl der Takte
einstellen kann, bis ein Power on Reset ausgelöst wird.
So gesehen, verwundert mich dieses Verhalten nicht.
Gruß
Andreas
Ingo schrieb:> Das macht man auch nicht...
Hab ich ja oben geschrieben. Aber die Reaktion vom AVR ist das, was mir
Sorgen macht. In anderen Schaltungen habe ich daraufhin den gleichen
Test gemacht. Sie bleiben hängen und nach loslassen des Quarzes mit dem
Tastkopf schwingen sie wieder an.
Oliver S. schrieb:> Ich würde mal sagen, ein Schaltplan und ein Layout wären jetzt ganz> hilfreich
Hmm, das müsste ich erst kastrieren. Ich darf das so nicht
veröffentlichen. Hoffentlich schrecke ich damit nicht gleich ab.
Im Prinzip ist aber alles brav nach Vorschrift: Quarz auf kurzem Weg
angebunden mit je 22pF gegen GND an beiden Quarzseiten. Versorgung ist
stabilisiert und wurde auf Brownouts in dem Zusammenhang geprüft. Wurde
nichts gefunden. An jedem VCC-Pin sitzt 100nF direkt daneben. Kurze
Masseanbindung durch Massefläche auf Leiterplattenrückseite.
Gesamtstromaufnahme der Schaltung ist ca. 10mA, also nichts bruzelt
unauffällig vor sich hin.
Andreas B. schrieb:> das liegt daran, daß der Quarzoszillator erst einmal richtig anschwingen> muß, bevor man den AVR starten läßt.
Tut er ja. Die Fuses sind auf EXTOSC_8MHZ_XX_16KCK_65MS eingestellt. Da
ja eine LED mit der richtigen Frequenz schwingt, während die andere aus
bleibt, muss der Quarz ja wieder richtig angeschwungen sein.
Alu schrieb:> Tut er ja. Die Fuses sind auf EXTOSC_8MHZ_XX_16KCK_65MS eingestellt. Da> ja eine LED mit der richtigen Frequenz schwingt, während die andere aus> bleibt, muss der Quarz ja wieder richtig angeschwungen sein.
Tut er eben nicht. Da Du zwischendurch mit dem Oszi am Quarz
rumgefummelt hat, muß der Oszillator wieder neu anschwingen. Der AV
resettet diesmal aber nicht wie es normalerweise vorgesehen ist (der
Power on fehlt ja diesmal).
Und während dieses unsauberen Anschwingens passieren eben nicht
definierbare Dinge in Deinem AVR.
Gruß
Andreas
Andreas B. schrieb:> der Power on fehlt ja diesmal
Aha, das ist eine wertvolle Information, die mir fehlte.
Dennoch wundert mich, dass der AVR nicht einfach da weitermacht, wo er
aufgehört hat. Da die Spannung ja nie unterbrochen wird, sollten ja
keine Registerinhalte verloren gehen oder irgendwie unvollständig
verarbeitet werden. Und im Debugmodus sehe ich, dass die hier relevanten
Register noch ok sind.
Ich vermute, dass der Quarztakt im AVR zu einem soliden logischen Signal
aufbereitet wird. Die Zeiten, die zwischen den Takten liegen, ob nun
100ns oder 1s, sollte der AVR doch gar nicht bemerken. Wo ist mein
Denkfehler?
Dein Denkfehler liegt daran, daß Du davon ausgehst, daß der
Quarzoszillator nach Deiner Messung wieder sauber anschwingt.
Diesen Gefallen tut er Dir aber nicht. Er schwingt wieder mit
wechselnder Amplitude an, bis er sich stabilisiert hat. Genau wie beim
Einschalten eben.
Ein digitale Schaltung benötigt aber definierte Pegel. Das gilt
insbesondere für den Takt. Daher werden manche Flip-Flops umschalten,
manche den Zustand halten usw.. Es ist einfach nicht definierbar, was
dann passiert.
Gruß
Andreas
Ich hab mich nie so genau mit dem exakten Aufbau von nem µC
auseinandergesetzt, ich würde aber mal behaupten, das der µC mit nem
Schwellwert auf die steigende und fallende Flanke vom Takteingang
reagiert.
Wenn der Quarz jetzt gerade wieder im Anschwingen ist, dann kommt
irgendwann die Stelle, an der kurz die Schwelle überschreitet, womit der
µC dieses kurze Überschreiten als Takt nimmt. Wenn die Zeit zwischen
über Schwelle steigen und wieder darunter fallen jetzt nur halbsolange
ist wie vorgesehen, dann versucht der Controller mit dem doppelten Takt
zu arbeiten, was belibigen Blödsinn produziert. Wird dann vom Programm
abhängen, was er mit diesem kurzzeitig viel zu hohem Takt versucht zu
machen.
Wenn es in dem Produkt nicht vorgesehen ist, das jemand diese Messung am
Quarz macht, würde ich mir da wenig gedanken drüber machen, wenn sonst
alles wie gewünscht funktioniert.
Gruß Kai
Dein Problem ist gar keines: Das macht man einfach nicht, daher ist die
Reaktion des AVR unter Umständen auch unvorhersehbar.
Eine Fehlersuche ist zwecklos, da der Fehler einfach nur der falsche
Umgang ist.
Kai S. schrieb:> ich würde aber mal behaupten, das der µC mit nem> Schwellwert auf die steigende und fallende Flanke vom Takteingang> reagiert.
Eben nicht. Es gibt in diesem Fall nicht "den" uC. Und einen einzigen
Schwellenwert gibt es leider auch nicht. Jedes Flip-Flop (und davon gibt
es viele in einem uC) reagiert bei einem anderen Pegel. Definiert ist
das Ganze nur, wenn der Takt über allen möglichen vorkommenden Pegeln
liegt. Das ist erst dann der Fall, wenn der Oszillator eingeschwungen
ist (und mit maximaler Amplitude schwingt).
Gruß
Andreas
Andreas B. schrieb:> Er schwingt wieder mit> wechselnder Amplitude an, bis er sich stabilisiert hat. Genau wie beim> Einschalten eben.> Ein digitale Schaltung benötigt aber definierte Pegel. Das gilt> insbesondere für den Takt.
Aha, ich "messe" am Quarz allerdings nur eine Amplitude von wenigen
hundert Millivolt (und glaube nicht, dass er ohne Messung eine
nennenswert größere Amplitude hat). Es handelt sich nicht um einen
TTL-Pegel o.ä.. Dazu hat der AVR ja intern eine Aufbereitung, die dann
auch noch Prescaler und solche Klamotten enthält.
Im Datenblatt sehe ich übrigens, dass der Systemtakt bis 0 runter gehen
darf. Wenn der AVR also statisch getaktet werden kann, könnte ich ihn
auch mit einem (entprellten) Taster von Hand takten, ohne dass der AVR
sich über lange Pausen zwischen den Takten beschwert.
Ich vermute, ihr meint, dass der Quarz sich beim erneuten Anschwingen
noch nicht sofort auf eine stabile Amplitude und Frequenz eingefahren
hat. Die Frequenz sollte aber wegen des genannten statischen Verhaltens
egal sein. Also es ist m.E. völlig unerheblich, ob beim
Einschwingvorgang mal ein paar schnellere Takte kommen, dann mal wieder
nichts, dann wieder ein Takt, usw.
Was den Pegel angeht, sollte die AVR-interne Aufbereitung der ohnehin
schwachen Quarzamplitude doch sicher funktional wie ein Komparator mit
Hysterese arbeiten. Auch hier müssten dann beim Anschwingen eben mal ein
paar Takte kommen oder solange die Amplitude noch nicht ausreicht,
bleibt der interne Komparator eben stehen und reicht keine Takte in
Logikpegelform durch. Auch hier kann ich mir ein undefiniertes Verhalten
noch nicht erklären.
Hat jemand hierzu mehr technische Details über die Innerein parat?
Und nochmal: Mir ist klar, dass man nicht mit einem Tastkopf am Quarz
messen sollte. Die Sorgen zu dem Thema begannen erst, als ich ein
seltsam abweichendes Verhalten zu mehreren anderen Schaltungen ähnlicher
Art feststellte. Ich will ja schließlich Entwicklungsfehler vermeiden.
Alle anderen Schaltungen sind nach der Messung anständig wieder
angeschwungen und haben ihr Programm fortgesetzt.
Wenn das so sauber mit Komparatoren abgefangen würde, dann würde man die
verschiedenen Settings des Oszillators nicht benötigen. Ich denke mal,
man hat den einfacheren Weg gewählt.
Mal interessehalber: Welche anderen Schaltungen hatten denn bei Dir
keine Probleme?
Gruß
Andreas
Andreas B. schrieb:> Mal interessehalber: Welche anderen Schaltungen hatten denn bei Dir> keine Probleme?
Nuja, ähnliche Steuerbaugruppen im Bereich Messtechnik und Powerwächter.
Teilweise wurde der gleiche Controller (ATMega1284P) verwendet mit
relativ ähnlicher Standardbeschaltung. Für die "kleinen" Aufgaben sind
die Megas eigentlich ganz schön.
Ich habe also auch andere Baugruppen auf dem Tisch liegen und die
verhalten sich völlig anders, so wie ich es auch erwarten würde. Wenn
ich dort am Quarz messe und ihn damit aus dem Tritt bringe, dann bleiben
die Schaltungen kurz hängen, aber sobald ich ihn loslasse, laufen sie
weiter oder gehen manchmal ins Reset, aber starten definiert wieder neu.
Alu schrieb:> oder gehen manchmal ins Reset, aber starten definiert wieder neu.
das sieht für mich aber nicht sonderlich definiert aus. ;-) Ich würde
eher sagen: Glück gehabt!
Man kann 99x bei einer roten Ampel über die Kreuzung gehen.....
Du kannst das ja mal mit einem anderen Controller in der gleichen
Schaltung versuchen. Wetten, daß das Ergebnis sich unterscheidet?
Gruß
Andreas
Alu schrieb:> Ich habe also auch andere Baugruppen auf dem Tisch liegen und die> verhalten sich völlig anders, so wie ich es auch erwarten würde.
Sind die denn auch auf den Stromspar-Oszillator gefused?
Der ist störempfindlich. Damit hatte ich auch schon Probleme (Attiny26).
Peter
Alu schrieb:> Mir ist klar, dass ich den> Quarz dermaßen störe, dass er seine Frequenz stark ändert oder stoppt.> Demnach würde ich erwarten, dass der AVR ebenfalls stehen bleibt oder> nach loslassen des Quarzes wieder anläuft.
Das ist das Ergebnis einer gemeinsamen Verschwörung der Illuminaten,
einiger Ufologen und Apple.
Hast du eigentlich nichts besseres zu tun, als deinen Controller in
einen undefinierten Zustand zu bringen und dich dann zu wundern, daß er
nicht mehr das macht, was er soll?
mfg.
Alu schrieb:> bei einem fertigen Layout mit einem ATMega1284P tritt ein merkwürdiger> Effekt auf: Wenn ich mit einem 1:1 Tastkopf am Quarz mit 14,7456 MHz> messe, spinnt der AVR gelegentlich herum. Mir ist klar, dass ich den> Quarz dermaßen störe, dass er seine Frequenz stark ändert oder stoppt.
Ist der µC intern voll statisch aufgebaut? Aber auch dort kann es bei
Taktstörungen Hazards, Spikes, Races, geben.
Ein 8051 stürzt bei sowas garantiert ab, er ist in Teilen intern
dynamisch aufgebaut.
Verstärke den Takt mit einem Transistor oder Gatter. Dann kannst du
messen.
Ok, danke euch. Ich werde das Problem dann nicht weiter verfolgen. Im
Normalbetrieb gibt es ja keine Schwierigkeiten. Wundern tut es mich nach
wie vor, da ich noch nicht verstanden habe, WAS genau im Controller in
einen undefinierten Zustand gerät. Programmzähler und Register sehen
soweit gut aus. Es müsste dann etwas in der Hardware betreffen, wo ich
keinen Zugriff mehr habe.
So, jetzt ist doch noch eine plausible Erklärung aufgetaucht, mit der
sich das Verhalten nun auch technisch begründen lässt.
Wenn der Quarz durch die Störung mit dem Tastkopf undefiniert schwingt,
kann er dabei auch höhere Frequenzen erzeugen, also flattern. Dabei
handelt es sich natürlich nicht um definierte Frequenzen, aber er
zappelt halt. Der AVR kann damit überfahren werden, wenn er den Takt
(d.h. die paar-hundert-Millivolt-Schwingung) in ein zu schnelles
logisches Taktsignal umwandelt. So kann es dazu kommen, dass der AVR
beim Beschreiben von Registern oder bei anderen Tätigkeiten durch den
nächsten Takt vor Beendigung seiner Tätigkeit unterbrochen wird und dann
haben wir natürlich Müll.
Bei den XMegas kann das demnach wohl nicht mehr passieren, da die mit
der synchronisierten PLL fahren.
Kai S. hat im Prinzip das gleiche gesagt, aber ich hatte es noch nicht
verstanden. Danke dir.
Wie schon gesagt, Du kannst die Störempfindlichkeit deutlich verbessern.
Ich nehme nur den Fullswing-Mode, der Stromsparmode macht zuviel Ärger.
"This Crystal Oscillator is a low power oscillator, with reduced voltage
swing on the XTAL2 output.
It gives the lowest power consumption, but is not capable of driving
other clock inputs, and
may be more susceptible to noise in noisy environments."
Peter
Peter Dannegger schrieb:> Ich nehme nur den Fullswing-Mode
Ich weiß nicht was das ist. Dazu benötige ich doch einen anderen
Frequenzgeber, oder? Das wäre dann höchstens etwas für zukünftige
Neuentwicklungen. Allerdings braucht ein so schneller Taktgeber (>10MHz)
ja auch kräftig Slew Rate, wenn er das mit größerer Amplitude stemmen
will. 100V/µs und mehr müssten drin sein.
Energiesparen muss ich nicht. Nur offensichtliche Verschwendungen sind
zu vermeiden.
Alu schrieb:> Ich weiß nicht was das ist.
Ooch nöö.
Steht doch alles im Datenblatt:
9.2 Clock Sources
Table 9-1. Device clocking options select
Low Power Crystal Oscillator <- sauempfindlich
Full Swing Crystal Oscillator <- super stabil
Alu schrieb:> Dazu benötige ich doch einen anderen> Frequenzgeber
Nö, nur die Fusebits umprogrammieren.
Peter
Hi
>Ich weiß nicht was das ist. Dazu benötige ich doch einen anderen>Frequenzgeber, oder?
Nein. Damit ist gemeint, bei den Fuses statt
EXTOSC_8MHZ_XX_16KCK_65MS
diese Einstellung
FSOSC_16KCK_65MS_XOSC_SLOWPWR
zu benutzen.
MfG Spess
Du kannst zB den Watchdog-Timer aktivieren, mit kurzem Timeout.
Der läuft Quarz-unabhängig.
Wenn Du also an den Oszillator-Pins rummachst und der Prozessor kommt
aus dem Tritt, kannst Du das auf diese Weise evtl Abfangen.
Andere Prozessoren haben auch eine Oszillator-Überwachung, die in
solchen Fall einen Reset auslösen kann!