Fehler bei Interrupt über steigende Flanke

  • Hallo an alle!


    Ich habe ein einfaches Programm, das auf Interrupts (steigende Flanke) an J5 - Pin 3 ein kurzes Signal an J5- Pin 2 ausgibt. Wenn man den Eingang und Ausgang auf einem Oszilloskop beobachtet, dann kann man feststellen, daß unabhängig von der Interruptfrequenz, das Ausganssignal nicht nur bei jeder steigenden Flanke sondern sporadisch auch bei manchen fallenden Flanken auftritt.
    Dies hat auch nichts mit Prioritäten od. Sytemlast zu tun, mein IST läuft mit Priorität 0 und auf dem System läuft kein anderer Prozess!
    Das kann auch nicht vom Signalgeber verursacht werden, sondern muß in der Interruptbehandlung der NetDCU liegen, denn wenn ich die Flanke auf fallende Flanke umkonfiguriere (Registry), dann ist dieser Effekt nicht mehr festzustellen. Außerdem habe ich verschiedene Signalquellen und Eingangsfilter probiert und der Effekt war der selbe.


    Mein Programm:


    Und die Einstellungen in der Registry:


    reg open \drivers\builtin\digitalio
    reg set value port dword 0
    reg set value index dword 0
    reg set value datadir dword 0x080
    reg set value datainit dword 0x0
    reg set value useasio dword 0x0C0
    reg set value IRQCfg0 dword 0x040
    reg set value IRQCfg1 dword 0x0
    reg set value IRQCfg2 dword 0x0
    reg save



    Ich wäre für jeden Tip dankbar!

  • Die Eingänge der NetDCU sind sehr hochohmig. Kann es sein, dass das Signal bei der fallenden Flanke prellt? Dass also ein Überschwinger im Signalverlauf dazu führt, dass die NetDCU doch eine steigende Flanke erkennt? Gerade mit einem Oszilloskop müsste man sowas vielleicht erkennen können (Zeit auf wenige ns runterdrehen).


    Die Verarbeitung der Interrupts ist immer gleich. Da gibt es keinen Unterschied bei steigender oder fallender Flanke. Das entsprechende Interruptregister des Prozessors wird initialisiert und dann kommen eben die Interrupts. Ich würde darum vermuten, dass der Prozessor tatsächlich in diesen fehlerhaften Fällen eine steigende Flanke sieht.


    Ich bin nun nicht der große Hardware-Experte, aber vielleicht hilft ein Busabschluss oder ein Kondensator (Tiefpass) auf der Eingangsleitung?


    Mit freundlichen Grüßen,


    H. Keller

    F&S Elektronik Systeme GmbH
    As this is an international forum, please try to post in English.
    Da dies ein internationales Forum ist, bitten wir darum, Beiträge möglichst in Englisch zu verfassen.

  • Hallo Herr Keller!


    Leider bin ich ziemlich sicher, daß dies kein Problem des Interruptsignals sein kann. Ich habe dazu Hr. Zutter bereits eine E-Mail mit näherer Beschreibung geschickt.


    1. Ich habe verschiedenste Tiefpassfilter am Interrupteingang angeschlossen und der Effekt hat sich nicht verändert.


    2. Ich habe die Signalamplitude und den Offset des Interruptsignals verändert und das hat den Effekt nicht beeinflusst.


    3. Wenn ich den Trigger von steigender Flanke auf fallende Flanke (Registry) ändere, dann habe ich KEINE zusätzlichen Aufrufe meines IST mehr! Dies ist auch unabhängig von der Art des Interruptsignals.


    4. Und das ist eigentlich für mich der wichtigste Beweis dafür: Egal ob ich auf fallende od. steigende Flanken triggere kann ich beobachten, daß einige Interruptsignale KEINEN Aufruf des IST erzeugen (ist auch im Kernel Tracker zu sehen). Und das bei einer Periode des Signals von z.B. 30 msec auf einer NetDCU8 auf der nur dieser IST läuft und die keinerlei Systemlast hat und einem wirklich kurzen IST.


    Ich wäre sehr dankbar, wenn mir jemand ein Beispiel (Programm + Registry Einträge + Beschreibung des Hardwareaufbaus) schicken könnte, von einem System, das korrekt auf einen externen Hardwareinterrupt über den DIO reagiert ohne Signale zu verlieren bzw. zusätzliche zu erzeugen.
    Im Moment habe ich keine Ahnung was ich machen sollte um das Problem noch weiter einzugrenzen od. zu eleminieren.


    Vielen Dank für jede Hilfe!



    Gunther

  • Quote from "gunther"

    3. Wenn ich den Trigger von steigender Flanke auf fallende Flanke (Registry) ändere, dann habe ich KEINE zusätzlichen Aufrufe meines IST mehr! Dies ist auch unabhängig von der Art des Interruptsignals.


    Was ja nun kein Widerspruch ist. Angenommen, Sie haben jeweils beim Umschalten einen 1V Überschwinger. Betrachten wir die beiden Fälle:


    Umschalten high->low:
    Das Signal geht auf 0V, aber der Überschwinger hebt es anschließend nochmal auf 1V an. Ein Low-Level wird aber nur bis maximal 0.8V erkannt. Das heißt der Prozessor erkennt dies eventuell schon wieder als steigende Flanke und löst einen neuen Interrupt aus.


    Umschalten low->high:
    Das Signal geht auf 3.3V, der Überschwinger senkt es anschließend nochmal auf 2.3V. Ab 2.0V wird aber eindeutig ein High erkannt. Das heißt das Signal ist definiert und kontinuierlich logisch 1, es wird definitiv *kein* neuer Interrupt ausgelöst.


    Insofern können Sie sehr wohl ein unterschiedliches Verhalten je aktivierter Interruptflanke haben.


    Quote

    Egal ob ich auf fallende od. steigende Flanken triggere kann ich beobachten, daß einige Interruptsignale KEINEN Aufruf des IST erzeugen (ist auch im Kernel Tracker zu sehen).


    Sieht man im Kernel Tracker, ob zu diesem Zeitpunkt ein anderer Thread am Laufen ist? Es könnte sein, dass ein nicht-unterbrechbarer Systemthread läuft, beispielsweise ein Flash-Zugriff.


    Wie auch immer, ich werde mir die Sache mal noch etwas genauer anschauen. Vielleicht finde ich da ja noch was.


    Mit freundlichen Grüßen,


    H. Keller

    F&S Elektronik Systeme GmbH
    As this is an international forum, please try to post in English.
    Da dies ein internationales Forum ist, bitten wir darum, Beiträge möglichst in Englisch zu verfassen.

  • Im Kernel Tracker ist zu diesem Zeitpunkt Thread 00000 (Idle) am laufen.
    Ich habe Ihnen dazu einen Screenshot zugemailt.


    Vielen Dank, daß Sie an meinem Problem dranbleiben,



    Gunther Beck