PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : int0/ int1 löst unerwünscht aus



malthy
05.09.2010, 16:53
Hallo zusammen!

Ich habe eine kleine, eigentlich recht simple AVR-Schaltung in einem Alu-Gehäuse untergebracht. Die Schaltung löst u.a. einen HW-Interrupt aus, wenn ein Signal auf Int0 bzw. Int1 seinen Pegel ändert (0V -> 5V). Der interne Pullup für die entsprechenden Pins ist jeweils eingeschaltet. Prinzipiell funktioniert die Schaltung. Allerdings wird der Interrupt auch unabhängig von dem zu detektierenden Flankenwechsel ausgelöst, oft wenn ich das Gehäuse mit den Fingern berühre - aber nicht nur, manchmal auch aus "heiterem Himmel". Das Gehäuse liegt an verschiedenen Punkten auf Masse, das kann ich auch kaum ändern. Hat jemand eine Idee, was da genau passiert und vor allem was ich dagegen tun kann?

Vielen Dank!
Malte

Besserwessi
05.09.2010, 17:09
Das Problem werden vermutlich Störungen sein.
Die Eingänge reagiern ja auch schon auf ziehmlich kurze Störungen - bei ganz kurzen Pulsen nicht unbedingt zuverlässig, aber ab etwa 5 ns Pulslänge könnte der AVR schon gelegentlich reagieren. Das Problem ist ähnlich wie mit eingekoppelten Störungen am Reset Pin. Entsprechend ähnlich ist auch der Lösungsansatz:
1) ein etwas kleineren Pullup (z.B: 10 K)
2) ein kleiner Kondensator gegen GND (z.B. 1 nF)

Es gibt hier auch noch eine Software Lösung, die aber nicht bei jedem Programm geht: In der ISR jeweils nochmal den Eingang testen und so kurze Störungen (sind dann unter etwa 20 Zyklen) erkennen und die ISR gleich wieder verlassen.

Für einen Eingang könnte man eventuell auch den ICP Eingang statt einem externen Interrupt nehmen, der hat eine extra Funktion zur Unterdrückung von Pulsen unter 4 Zyklen.

malthy
05.09.2010, 17:23
Hallo!

Danke, ich war auch von soetwas ausgegangen... Blöde Frage: spielt es noch eine Rolle, wo sich der zusätzliche Pullup befindet? Ich hatte einen ein ganzes Stück weg vom Controller eingebaut, der hat leider nichts geholfen. Eine Kapazität hab ich noch nicht probiert, weil ich nicht einschätzen konnte, wie "rund" dadurch die Flanke wird, sprich, ob ich Gefahr laufe, was sehr kurzes am Eingang zu verpassen. Ich werde es mal mit 1 nF probieren.

ICPs kann ich nicht verwenden, die werden schon anderweitig gebraucht. Muss mal überlegen, ob ich das auch in Software versuchen kann.

Danke!
Malte

Besserwessi
05.09.2010, 18:33
Wo der Pullup-Widestand ist, ist nicht so wichtig. Dicht am µC hat aber einen kleinen Vorteil, wenn größere Störungen über die GND leitung kommen. Der Kondensator sollte besser dicht an den µC.

Wie schnell muß den reagiert werden ?

Eine bessere Abschirmung oder Masseführung ist natürlich auch eine Option.

malthy
05.09.2010, 19:49
Hallo!

Wenn ich das jetzt richtig überschlage, ist der Puls, den ich zeitlich möglichst genau erkennen möchte, im Bereich von 1 ms lang. Ich möchte aber gerne eine größere Genauigkeit erreichen. Ich kann in kürze nochmal genauere Zahlen nachliefern...

Die Masseführung sollte eigentlich recht ordentlich sein, die Schaltung ist auf einer sauber geätzten Platine mit Massefläche aufgebaut. Und zur Schirmung: ich dachte eigentlich, dass das Aluminiumgehäuse abschirmend wirkt.

Wie ich leider festrstellen musste, ist das Problem noch etwas genereller. Zum einen habe ich das Problem mit den Ints (s.o.). Sehr selten (aber eben öfters als nie...) gerät der Controller außerdem in einen undefinierten Zustand, wenn ich das Gehäuse berühre. Mir ist nicht wirklich klar, was der Controller in diesem Zustand macht, auf jeden Fall fällt dann das angeschlossene LCD aus. Einige Funktion, zB Tastenabfrage und entsprechende Reaktionen funktionieren aber noch.

Ich bin mit meinem Latein etwas am Ende, weil es sich hierbei nun nicht um mein erstes Projekt handelt - ich denke ich habe keine extrem blöden Fehler gemacht...

Ich werde morgen mal versuchen, das Gehäuse von der Masse zu trennen (Kunstoffschrauben u.ä.). Aber das ist ja ein kurieren an den Symptomen, es kann ja nicht so schwer sein eine primitive µC-Schaltung in einem Blechgehäuse zum Laufen zu bekommen...

Wenn noch jemandem was einfällt, ich wäre intertessiert :-)

Etwas frustriert,
Malte

wkrug
05.09.2010, 21:15
Wie sieht denn die Stromversorgung des Gerätes aus ?
Mit welcehn externen Schaltungen ist das Gerät verbunden ?

Besserwessi
05.09.2010, 21:28
Da der Fehler beim Berühren des Gehäuses auftritt, spricht das für ein ESD Problem oder was ähnliches. Die Schaltung gegen das Gehäuse zu isolieren hilft da nur bedingt. Mehr als eine Verbindung zur Schaltung ist vielleicht nicht ideal. Kritisch sollte das berühren des Gehäuses eigentlich nur sein, wenn da noch irgendwo Kabel abgehen, da müßte man dann mit dem ESD Schutz anfange.

Ist denn der Brounoutdetektor aktiv, und die Spannungsversorgung OK ?

Wenn der Strom nicht so knapp ist, kann man die Pullups auch noch deutlich niederohmiger machen (z.B. 1 K). Der Kondensator bringt schon etwas Verzögerung, bei 1 K und 1 nF halt grob 1 µs, aber diese Verzögerung ist im wesentlichen konstant, sollte also nicht so stören.

Wenn das Programm noch teilweise funtioniert, spricht das doch etwas gegen ein Hardwareproblem und etwas für ein Softwareproblem. Das der µC nur teilweise läuft ist durch einen Hardwarefehler nur schwer zu erreichen. Der Teilweise Ausfall könnte auf das LCD beschränkt sein. Nur selten auftretende Fehler könnte z.B. durch ein zusammentreffen von 2 ISRs, einen Stacküberlauf oder ähnliches passieren.

wkrug
05.09.2010, 21:52
Das der µC nur teilweise läuft ist durch einen Hardwarefehler nur schwer zu erreichen. Der Teilweise Ausfall könnte auf das LCD beschränkt sein.
Meine Vermutung ist, das der Controller neu Bootet, das Display, das ja schon initialisiert war, sich nicht mehr vernüftig neu initialisiert.

Mit der Folge, das eigentlich alles soweit läuft, nur das Display nicht mehr richtig funktioniert.

Ich würd in das Gehäuse zu Testzwecken einen Akku als Stromversorgung einbauen und dann gucken was dann passiert.

malthy
06.09.2010, 09:41
Hallo!

Danke für die Hinweise! Zur Stromversorgung: das Gerät wird mit einem 9V Steckernetzteil versorgt. Auf der Platine befindet sich nach einer Diode als Verpolungsschutz ein 7805 mit einer kleinen Siebung. Da sollte eigentlich alles okay sein. Ich probiere bei nächster Gelegenheit eine andere Stromversorgung aus.

Ich hab natürlich auch schon an ein Softwareproblem gedacht, allerings ist sehr auffällig, dass die Probleme nach Berührung des Gehäuses auftreten.

Tatsächlich ist die Masse der Platine über mehr als nur einen Punkt mit dem Gehäuse verbunden, allderings sollten das alles sehr niederohmige Verbindungen sein (6kantbolzen die auf der Massefläche der Platine und dem Gehäuse aufliegen). Mir ist allerdings nicht ganz klar, warum die Trennung des Gehäuses von Schaltungsmasse nichts bringen soll - ich dachte der "Dreck" kommt über die Masse...

Ich melde mich, wenn ich noch was rausgefunden habe. Falls ansonsten noch jemandem etwas einfällt: ich bin sehr interessiert...

Dank&Gruß
Malte

Gock
06.09.2010, 13:17
Ich schlage ebenfalls vor, die Spannungsversorgung zu überprüfen, zwingenderweise mit einem Oszi.
Es wäre möglich, dass Du Dir hochfrequente Störungen mit der Beschaltung ansich in die Versorgung einkoppelst, zB indem Du Pulse an Ausgängen ausgibst, die an langen Leitungen und möglicherweise in der Luft hängen, zB weil Stecker abgezogen sind, usw.
Gruß

malthy
07.09.2010, 11:04
Hallo,

ich wollte nochmal eben Rückmeldung geben. Im Endeffekt war das Problem sehr simpel - und (natürlich) mein Fehler. Das Gehäuse war entgegen meiner Annahme doch nicht ordentlich auf Massepotential. Wenn ich mit dem Oszi Masse gegen Gehäuse gemessen habe, hatte ich irgendwelche wilden Zackelkurven auf dem Oszi (FFT-Peaks bei 50 Hz und Harmonischen), m. a. W., das Gehäuse war eine prima Antenne. Wenn ich das Gehäuse berührt habe, verstärkte sich dieser Effekt, dann wirkte ich als zusätliche Antenne. Nun liegt alles sauber auf Masse, und siehe da, die Probleme sind weg :-).

Danke nochmal an alle, die mit überlegt haben!

Gruß
Malte