Forum: Mikrocontroller und Digitale Elektronik externe Interrupts


von Herby (Gast)


Lesenswert?

Hallo,

ich hab vollgendes Problem (mega644): Wenn ich den externen Interrupt 
INT0 auslösen möchte, mit einem Taster, dann passieren hin und wieder 
kuriose Dinge:
- der ebenfalls scharf gemachte INT1 wird mit ausgelöst
- die ISR von INT0 wird zweimal hintereinander ausgelöst - beim 1. 
Sprung in die INT0_vect ist das Flag wo diesen Interrupt signalisiert 
schon wieder gesetzt, wird also 2x hintereinander ausgelöst

Woran kann das liegen?
Die Effekt werden besser wenn ich die Schalter mit denen ich die 
Interrupts auslöse mit Kondensatoren entprelle - auf dem Oszi ist 
überhaupt kein prellen mehr zu sehen
Die Fehler passieren aber immer noch, nur seltener

Könnte das ein EMV Problem sein?

Gruß

von Huch (Gast)


Lesenswert?

>Woran kann das liegen?
Woher sollen wir das wissen? Wir kennen weder das Programm noch die 
Schaltung noch die Umgebung in EMV Hinsicht.

von holger (Gast)


Lesenswert?

>- die ISR von INT0 wird zweimal hintereinander ausgelöst - beim 1.
>Sprung in die INT0_vect ist das Flag wo diesen Interrupt signalisiert
>schon wieder gesetzt, wird also 2x hintereinander ausgelöst

>Woran kann das liegen?

Herzlichen Glückwunsch, auch du hast gerade rausgefunden
das Taster prellen und ein externer Interrupt völlig
ungeeignet ist um Taster abzufragen. Setzt einen Timerinterrupt
mit ca. 20ms Abtastrate und frag deinen Taster darin ab.

von Herby (Gast)


Lesenswert?

holger schrieb:
> Herzlichen Glückwunsch, auch du hast gerade rausgefunden
> das Taster prellen und ein externer Interrupt völlig
> ungeeignet ist um Taster abzufragen. Setzt einen Timerinterrupt
> mit ca. 20ms Abtastrate und frag deinen Taster darin ab.

ja, darum hab ich dann Kondensatoren dran gemacht - kein Prellen mehr 
(zumindest aufm Oszi nicht mehr sichtbar)

das mit dem Timerinterrupt mache ich auch

Aber es wird auch teilweise ein falscher Interrupt ausgelöst (?) also 
ich möchte INT0 auslösen, der kommt auch aber INT1 folgt auch gleich.
Die beiden Leitungen sind schon ein paar cm lang und recht nahe 
beisammen...

von holger (Gast)


Lesenswert?

>ja, darum hab ich dann Kondensatoren dran gemacht - kein Prellen mehr
>(zumindest aufm Oszi nicht mehr sichtbar)

Die Frage ist wie du die Kondensatoren angebracht hast.
Einen geladenen Kondensator per Taster kurzzuschliessen
kann auch einen erheblichen Stromfluss verursachen.
Das möchte der Taster auf Dauer auch nicht (Kontaktabbrand).
Deshalb macht man sowas auch nicht um Taster zu entprellen.

von Herby (Gast)


Lesenswert?

Ich hoffe man kann es erkennen:

_______________+3.3V
     |
    | |
    | |
     |_________ INT0
     |      |
       /   _|_
      /    _
     |      |
 ____|______|___GND

von Karl H. (kbuchegg)


Lesenswert?

Herby schrieb:
> Ich hoffe man kann es erkennen:

NOchmal langsam zu mitschreiben:

Taster


abfragen


per


Interrupt


ist


mies.


Es gibt nur einen Grund warum man einen Taster überhaupt an einen 
Interrupt hängt: Wenn der Taster den µC aus dem Tiefschlaf aufwecken 
soll. Und selbst dann macht man die eigentliche Tasterauswertung nicht 
im Interrupt sondern per Polling der Eingänge.

Siehe Wiki-Arikel zum Thema "Entprellung"

Man braucht dann keinen Widerstand, keinen Kondensator. Einfach nur 
einen Taster, der nach Masse schaltet an die Eingangsleitung. Den Rest 
macht die Software.

von Herby (Gast)


Lesenswert?

ich möcht ihn ja ausm Schlaf erwecken :-(
einmal durch den Benutzer mittels Taster, einmal wenn ein Peak von einem 
anderen Gerät kommt - das andere Gerät hab ich erstmal mit dem 2. Taster 
simuliert, da ich es noch nicht hab

von Karl H. (kbuchegg)


Lesenswert?

Herby schrieb:
> ich möcht ihn ja ausm Schlaf erwecken :-(
> einmal durch den Benutzer mittels Taster, einmal wenn ein Peak von einem
> anderen Gerät kommt - das andere Gerät hab ich erstmal mit dem 2. Taster
> simuliert, da ich es noch nicht hab

Dann weckt der Taster den µC aus dem Sleep.
Die Auswertung des Tastendrucks erfolgt trotzdem immer noch durch die 
üblichen Entprellmethoden in Software.

Glaub es endlich. Es IST die einfachste und zuverlässigste Lösung.

von Herby (Gast)


Lesenswert?

ich glaubs ja^^
mach ich ja^^ (schalte nen TimerInterrupt ein)

trotzdem wird abundzu der jeweils andere Interrupt mit ausgelöst was mir 
mehr Sorgen macht^^

von holger (Gast)


Lesenswert?

>trotzdem wird abundzu der jeweils andere Interrupt mit ausgelöst was mir
>mehr Sorgen macht^^

Dann stimmt was mit deiner Schaltung nicht.

von Peter D. (peda)


Lesenswert?

Herby schrieb:
> einmal durch den Benutzer mittels Taster, einmal wenn ein Peak von einem
> anderen Gerät kommt

Wie kurz ist denn dieser Peak?

Einen Interrupt sollte man nie über ne lange Leitung führen, da er auf 
sehr kurze Impulse reagiert.
Und wenn doch, dann mußt Du die Leitung störfest machen, z.B. 
differentielle Übertragung per RS-485 Treiber.

Meistens braucht man für externe Signale aber nicht die maximale 
Geschwindigkeit. Dann reicht oft, es wie ein Tastensignal zu behandeln.


Peter

von Herby (Gast)


Lesenswert?

Die Peaks sind 50ms - 100ms lang

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.