Hardwareentprellung Problem

OP #2878428
Lesenswert?

Hallo Leute,

ich habe versucht die Harwareentprellung mit dem Schmitt-Trigger aus dem 
Artikel "Entprellung" nachzubauen, doch wenn ich den Taster einmal 
betätige geht er trotzdem noch zwei mal in den Interrupt. Ich habe mein 
Quelltext sowie ein Bild der Schaltung beigefügt. Wodran liegt das? 
Vielen Dank schonmal!


Gruß Marc
Angehängte Dateien:
Gast #2878474
Lesenswert?

>Uups. Dann hast du einen pegelgetriggerten Interrupt.
Und ich hab, glaube ich, gerade ein Brett vor dem Kopf.
Wie kommst Du zu dem Schluss?

Selbst wenn er einen Interrupt auf High-Pegel aktiv hat,
dann sollte der doch nur einmal auftreten, vorausgesetzt er sperrt den 
nach dem ersten Auftreten bzw. ändert ihn auf Low-Pegel.
Oder habe ich was falsch verstanden.
Gast #2878542
Lesenswert?

>Leider hilft sowas jetzt hier gar nicht.
Hä? Du hast mich doch danach gefragt.

Und ich denke doch, das meine Nachfrage und Deine Antwort geholfen hat.
Denn Du hast ja erst nur Deine Schlussfolgerung geschrieben. Und dann 
kam Deine Bestätigung der Herleitung (aus meiner Frage).
Gast #2878552
Lesenswert?

Zum Entprellen kannst du doch auch einen Tiefpass (RC) nehmen, welcher 
die höher frequenten Anteile des Schaltsignals (Prellen) herausfiltert.

Wozu nimmt man denn so eine komplizierte Schaltung für ne einfache 
Taste? ^^

PS:
Tasten kommen nie an den Interrupteingang! Das ist schlechter Stil. 
Tasten werden gepollt.

lg
stm
Gast #2878562
Lesenswert?

stm schrieb:

> Zum Entprellen kannst du doch auch einen Tiefpass (RC) nehmen, welcher
> die höher frequenten Anteile des Schaltsignals (Prellen) herausfiltert.
>
> Wozu nimmt man denn so eine komplizierte Schaltung für ne einfache
> Taste? ^^

Die Hardwareentprellung per Schmitt-Trigger stammt wohl aus einem 
älteren Thread.

> PS:
> Tasten kommen nie an den Interrupteingang! Das ist schlechter Stil.
> Tasten werden gepollt.

Nein. Für den Single-Step am 8051 beispielsweise ist das elementar 
wichtig.
Gast #2878580
Lesenswert?

void EXTI2_IRQHandler(void) {
  uint8_t ucStatus = 0;
  ucStatus = GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_3);

  ints++;

  if(ucStatus == 1) {
    GPIO_ResetBits(GPIOC, GPIO_Pin_3);
  } else {
    GPIO_SetBits(GPIOC, GPIO_Pin_3);
  }

  EXTI_ClearITPendingBit(EXTI_Line2);
}
----------------------------------------------------------------

Tu die letzte Zeile wo du das PendingBit clearst ganz an den Anfang der 
Interrupt Routine und dann berichte was passiert!
also so:


void EXTI2_IRQHandler(void) {
  uint8_t ucStatus = 0;
EXTI_ClearITPendingBit(EXTI_Line2);
  ucStatus = GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_3);

  ints++;

  if(ucStatus == 1) {
    GPIO_ResetBits(GPIOC, GPIO_Pin_3);
  } else {
    GPIO_SetBits(GPIOC, GPIO_Pin_3);
  }
}
Gast #2879266
Lesenswert?

Marc Herrmann schrieb:
> Hallo,
>
> vielen Dank für den Hinweis. Ich werde es im Laufe des Tages mal
> versuchen.
>
> Was soll es denn bringen, das zu Beginn zu clearen?

ist nur ein Verdacht. Es gab zu einem ähnlichen Thema mal einen Thread:
Da ging es um das Interrupt-Flag, welches noch kurz aktiv war, nachdem 
die Interrupt Routine verlassen wurde.

Beitrag "Timer Interrupt Problem"
Gast #2879779
Lesenswert?

Marc Herrmann schrieb:
> Sau geile Sache funktioniert nun 1a :D
>
> Wodran liegt das? Ist der Interruptbaustein zu langsam getaktet?

Frag mich was Leichteres ^^

So wie ich das verstanden habe liegt es daran, dass das Interruptflag 
noch einige Takte nach dem Rücksetzbefehl aktiv bleibt, so dass nach 
verlassen des Interrupts dieser direkt wieder ausgeführt wird.

Habe aber auch mal irgendwo gelesen, dass man vor dem Rücksetzen des 
Flags keine GPIO Befehle ausführen darf. Warum auch immer. Muss man halt 
nur wissen ^^

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren