Forum: Mikrocontroller und Digitale Elektronik AVR Ausgänge frieren ein


von Alu (Gast)


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.

von Ingo (Gast)


Lesenswert?

Alu schrieb:
> Wenn ich mit einem 1:1 Tastkopf am Quarz

Das macht man auch nicht...



Ingo

von Oliver S. (oliverso)


Lesenswert?

Ich würde mal sagen, ein Schaltplan und ein Layout wären jetzt ganz 
hilfreich. Am Programm liegt es nicht.

Oliver

von Andreas B. (bitverdreher)


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

von Alu (Gast)


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.

von Andreas B. (bitverdreher)


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

von Alu (Gast)


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?

von Andreas B. (bitverdreher)


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

von Kai S. (kai1986)


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

von Electronics'nStuff (Gast)


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.

von Peter D. (peda)


Lesenswert?

Alu schrieb:
> Die Fuses sind auf EXTOSC_8MHZ_XX_16KCK_65MS eingestellt

Nimm mal den FullSwing Mode, der ist unempfindlicher.


Peter

von Andreas B. (bitverdreher)


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

von Alu (Gast)


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.

von Andreas B. (bitverdreher)


Lesenswert?

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

von Alu (Gast)


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.

von Andreas B. (bitverdreher)


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

von Peter D. (peda)


Lesenswert?

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

von Thomas E. (thomase)


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.

von Wilhelm F. (Gast)


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.

von Alu (Gast)


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.

von Alu (Gast)


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.

von Peter D. (peda)


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

von Alu (Gast)


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.

von Peter D. (peda)


Lesenswert?

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

von spess53 (Gast)


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

von Dr G. Reed (Gast)


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!

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.