AVR Ausgänge frieren ein

Gast #2864027
Lesenswert?

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.

1
#include <avr/io.h>
2
#include "Test.h"
3
#include <util/delay.h>
4

5
int main(void)
6
{
7
    DDRD = 0b00110000;
8
  
9
    while(1)
10
    {
11
        PORTD = 0b00110000;
12
        _delay_ms(1);
13
        PORTD = 0;
14
        _delay_ms(1);
15
    }
16
}

Danke für Tipps.
#2864043
Lesenswert?

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

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

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

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?
#2864087
Lesenswert?

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
#2864116
Lesenswert?

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

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

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

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

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

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
#2864409
Lesenswert?

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

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

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

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

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

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

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

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!

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