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ß
>Woran kann das liegen?
Woher sollen wir das wissen? Wir kennen weder das Programm noch die
Schaltung noch die Umgebung in EMV Hinsicht.
>- 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.
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...
>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.
Ich hoffe man kann es erkennen: _______________+3.3V | | | | | |_________ INT0 | | / _|_ / _ | | ____|______|___GND
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.
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
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.
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^^
>trotzdem wird abundzu der jeweils andere Interrupt mit ausgelöst was mir >mehr Sorgen macht^^ Dann stimmt was mit deiner Schaltung nicht.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.