Hallo!
Ich habe eine generelle Frage zur Verwendung von externen
Interrupt-Eingängen an Mikrocontrollern. Diese sind typischerweise recht
empfindlich, d.h. relativ kurze Pulse (5 ns?), die eigentlich einfach
nur Störungen (Einkopplungen) in der Signalleitung sind oder durch
Anfassen des Gerätes entstehen, können schon triggern. Ich wollte mal
nach einem generellen "Kochrezept" gegen das Problem fragen. Würde man
einfach ein passives RC Glied in den Signalweg legen, das nur die
relevanten Frequenzen noch durchlässt oder gibt es andere Möglichkeiten?
Danke für alle Tipps!
John
John schrieb:> Interrupt-Eingängen an Mikrocontrollern. Diese sind typischerweise recht> empfindlich, d.h. relativ kurze Pulse (5 ns?), die eigentlich einfach> nur Störungen (Einkopplungen) in der Signalleitung sind oder durch> Anfassen des Gerätes entstehen, können schon triggern. Ich wollte mal> nach einem generellen "Kochrezept" gegen das Problem fragen. Würde man
Immer für niederohmige Pegel an den Eingängen sorgen.
Die Eingangsbeschaltung hängt von deiner Signalquelle ab. Wenn du da
aber normale CMOS-Logik hast und ein Berühren des Gerätes führt zum
Triggern des IRQ, dann ist dein Aufbau fehlerhaft.
Möglichkeiten gibt es viele, kommt halt auch ein bisschen drauf an, was
deine Interrupts denn genau machen. Neben den Lösungen in der
Hardware-Ebene bleibt auch noch:
- Glitch-Erkennung nutzen (falls vorhanden)
- "entprellen" per Software
- auf höheren Protokollschichten handhaben
John schrieb:> Diese sind typischerweise recht> empfindlich, d.h. relativ kurze Pulse (5 ns?)
Genau dazu sind sie gedacht, ohne Verzögerung zu reagieren.
Will man schnarchlangsame Signale auswerten, z.B. mechanische Kontakte,
macht man das am besten mit einem Timerinterrupt. Damit kann man sehr
schön festlegen, was ist Nutzsignaldauer und was nur ne Störung.
Der Timerinterrupt hat auch den Vorteil, daß man beliebig viele Eingänge
parallel abtasten kann.
John schrieb:> Interrupt-Eingängen an Mikrocontrollern. Diese sind typischerweise recht> empfindlich, d.h. relativ kurze Pulse (5 ns?),
Das ist ne Halbwahrheit. Interrupts sind wie alles andere in jedem µC
synchron zum Systemtakt. Störungen erzeugen daher nur Interrupts, wenn
sie direkt zum jeweiligen Abtastzeitpunkt auftreten.
Manche Systeme (z.B. die Cortexe von Nuvoton) haben deshalb zum
Entstören einstellbare Glitchfilter in der Port-Logik. Wo sowas nicht
vorhanden ist, muß man sich im Systemaufbau eben selber drum kümmern.
W.S.
W.S. schrieb:> John schrieb:>> Interrupt-Eingängen an Mikrocontrollern. Diese sind typischerweise recht>> empfindlich, d.h. relativ kurze Pulse (5 ns?),>> Das ist ne Halbwahrheit. Interrupts sind wie alles andere in jedem µC> synchron zum Systemtakt. Störungen erzeugen daher nur Interrupts, wenn> sie direkt zum jeweiligen Abtastzeitpunkt auftreten.
Zeitlich betrachtet sind sie damit empfindlicher als etwa Ports zu
pollen, was man je nach Architektur vielleicht mit maximal 1/4 vom
Systemtakt oder so schafft.
John schrieb:> d.h. relativ kurze Pulse (5 ns?),
5ns für einen Zyklus sind schon sehr schnell, bestimmt ein µC mit Takt
200MHz. Genau muß man das dem User Manual entnehmen, wie der
Interruptcontroller arbeitet.
Beim 8051 wird das Interruptsignal schon grob gefiltert, Spikes machen
da nichts. Dazu wird der Pegel des Interruptpins in einem
Maschinenzyklus an zwei Stellen abgetastet, egal ob Pegel- oder
Flankentriggerung. Beide Pegel müssen gleich sein, um einen Interrupt zu
erkennen oder nicht. Das ist schon eine Grobmaßnahme der Maschine
selbst.
Mit 5ns macht man am 8051 nicht viel, der Maschinenzyklus liegt da eher
bei 1µs, bei modernen Derivaten immer noch im Bereich 100ns.
@ Wilhelm F. (ferkes-willem)
>> d.h. relativ kurze Pulse (5 ns?),
Ja.
>5ns für einen Zyklus sind schon sehr schnell, bestimmt ein µC mit Takt>200MHz. Genau muß man das dem User Manual entnehmen, wie der>Interruptcontroller arbeitet.
Eben. Und da wird man feststellen, dass ASYNCHRONE Interrupts auch
asynchron erkannt werden, d.h. unabhängig vom Systemtakt. Sprich, dort
ist ein D oder RS-FlipFlop dahinter, das auf SEHR kurze Pulse reagiert.
Anders sieht es bei synchron abgetasteten Interrupts aus, z.B. Input
Capture, dort wird maximal mit Systemtakt abgetastet, zusätzlich kann
man noch einen Glitcvhfilter zu schalten, der nur Pulse breiter als eine
bestimmte Anzahl Takte erkennt.
Falk Brunner schrieb:> ASYNCHRONE Interrupts auch> asynchron erkannt werden, d.h. unabhängig vom Systemtakt.
Bei AVR steht sinngemäss im Datenblatt das Ereignisse die kürzer sind
als ein Takt-Zyklus nicht sicher zur Auslösung führen.
Vielen Dank für die Antworten! Mir ging's tatsächlich um die allgemeine
Seite des Problems, trotzdem war der Anlass ein konkreter: ich lese
gerade so eine digitale Schiebelehre mit einem AVR aus. Es kommt hin und
wieder zu Einlesefehlern die ich mir nach eingehender Analyse des Codes
nicht anders als durch Störungen auf der Daten-/Clockleitung von der
Schieblehre erklären kann. Niederohmiger kann ich das System ja ohne
weiteres nicht machen, insofern dachte ich ein ein RC-Glied.
W.S. schrieb:> Das ist ne Halbwahrheit. Interrupts sind wie alles andere in jedem µC> synchron zum Systemtakt.
Tsss... Viele µC bieten (gerade für externe Interrupts) auch oder sogar
ausschließlich asynchrone Auslösungsmechanismen.
Allein die bloße Existenz von Quellen zum Aufwachen aus Schlafzuständen,
bei denen der Systemtakt angehalten ist, macht das jedem klar, der auch
nur minimal logisch denken kann...
Die Auslösung der Interrupt_behandlung_ erfolgt natürlich immer synchron
zum Systemtakt. Die Auslösung des Interrupts selber aber nicht
notwendigerweise...
@ Rudolph (Gast)
>> ASYNCHRONE Interrupts auch>> asynchron erkannt werden, d.h. unabhängig vom Systemtakt.>Bei AVR steht sinngemäss im Datenblatt das Ereignisse die kürzer sind>als ein Takt-Zyklus nicht sicher zur Auslösung führen.
Nö, das gilt nur für SYNCHRONE Interrupts, also Input Capture etc.
Schrieb ich bereits. Das THema hatten wir vor Jahren schon mal.
Wie könnte ich denn eine mir im Detail unbekannte Quelle (hier: Ausgang
einer digitalen Schiebelehre) niederohmiger machen um die
Störanfälligkeit zu verringern? Belastet man die Quelle einfach stärker
durch einen Widerstand nach Masse?
Grüße
John
>Wie könnte ich denn eine mir im Detail unbekannte Quelle (hier: Ausgang>einer digitalen Schiebelehre) niederohmiger machen um die>Störanfälligkeit zu verringern? Belastet man die Quelle einfach stärker>durch einen Widerstand nach Masse?
Man sorgt normalerweise dafür (mit Filter), dass das Signal nicht
schneller als nötig in die Schaltung reinkommt.
John schrieb:> Wie könnte ich denn eine mir im Detail unbekannte Quelle (hier: Ausgang> einer digitalen Schiebelehre) niederohmiger machen um die> Störanfälligkeit zu verringern?
Warum niederohmiger?
Du mußt ermitteln, welches die kürzeste Pulsdauer auf dem Eingang ist.
Und dann kann man alle kürzeren Pulse als Störung ansehen.
Allgemein:
Man muß ermitteln, worin sich Nutzsignal und Störsignal unterscheiden.
Peter Dannegger schrieb:> Warum niederohmiger?
Das war ein Hinweis vom User "Kühne" weiter oben, der mir soweit
durchaus einleuchtete. Wenn der Signalweg relativ hochohmig ist, können
Störungen leichter einkoppeln (sehe ich doch richtig, oder?). Mein
erster Gedanke war in der Tat auch einen passiven Filter in den
Signalweg zu legen (s.o.). Die (bedeutungstragenden) Pulslängen sind mir
bekannt. Mich interessierte nur was es evnt. für Varianten abgesehen vom
Filter gibt. Vielen Dank nochmal für das Bisherige und ggf. Weitere!
Gruß
John
John schrieb:> Peter Dannegger schrieb:>> Warum niederohmiger?>> Das war ein Hinweis vom User "Kühne" weiter oben,
Da war aber auch noch nicht von einer Schiebelehre die Rede, sondern
davon, dass du den (angenommenerweise offenen) Pin einfach anfasst.
Merke: WEnn man immer nur die Hälfte seines Problems präsentiert, kriegt
man keine gescheiten Antworten, die zum konkreten Problem passen.
Wenn deine Schiebelehre auf dem Pin für stabile Verhältnisse sorgt und
das bischen Strom aufbringen kann, welches der Eingang benötigt, dann
kannst du mit dem Patschehändchen draufschlagen soviel du willst, da
rührt sich nichts (es sei denn du hast einen Wackelkontakt). Was anderes
sind beispielsweise hingegen schon wieder stärkere ELektromotoren in der
Nähe.
> Ich wollte mal nach einem generellen "Kochrezept" gegen> das Problem fragen.
generelle Kochrezepte, die in allen Lebenslagen funktionieren, gibt es
eher selten.
Niederohmiger geht nur bei open-drain Ausgängen.
Ein push-pull ist schon maximal niederohmig. Ein Serienwiderstand (50
Ohm) könnte noch die Reflexionen dämpfen.
Vielleicht solltest Du dem Aspekt: Zwischen zwei Werten etwas mehr
Aufmerksamkeit schenken. Oft "flattern" da die Zustände.
Was die Unterbrechungen betrifft, ich weis noch nicht mal ob alle Atmels
gleich sind, ansonsten kocht jeder Herstellen hier sein eigenes
Süppchen. Ob ansteigende Flanke oder die abfallende, ob ein Wechsel
reicht. Ob Smitt-Trigger oder 08/15 Logik-Pegel. Ob null, ein, zwei oder
50 Takte steht im zugehörigen Handbuch.
Mit offenen oder hochohmigen Eingängen lässt sich mittelprächtig
Rundfunk empfangen, aber sonst kein Staat machen.
Vielleicht solltest Du eine weitere, serielle Schnittstelle
implementieren, welche den angeblichen Input direkt zum PC sendet. Ist
Hardwaremäßig nichts mehr frei, so kannst Du diese auch Emulieren. So
schnell braucht’s ja sowieso nicht sein.