Forum: Mikrocontroller und Digitale Elektronik Hardwareentprellung Problem


von Marc H. (_marc_)


Angehängte Dateien:

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

von Wilhelm F. (Gast)


Lesenswert?

Marc Herrmann schrieb:

> doch wenn ich den Taster einmal
> betätige geht er trotzdem noch zwei mal in den Interrupt.

Uups. Dann hast du einen pegelgetriggerten Interrupt. Manche µC wie auch 
der olle 8051 unterscheiden zwischen Flankentriggerung und 
Pegeltriggerung.

von Hmm (Gast)


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.

von Wilhelm F. (Gast)


Lesenswert?

Hmm schrieb:

> Und ich hab, glaube ich, gerade ein Brett vor dem Kopf.
> Wie kommst Du zu dem Schluss?

Na ja. Der pegelgesteuerte Interrupt kommt immer wieder, wenn die 
Pegelbedingung stimmt.

Das ist zumindest beim 8051 so.

von Hmm (Gast)


Lesenswert?

>Na ja. Der pegelgesteuerte Interrupt kommt immer wieder, wenn die
>Pegelbedingung stimmt.
Ah. Doch kein Brett.
Danke :-)

von Wilhelm F. (Gast)


Lesenswert?

Hmm schrieb:

> Ah. Doch kein Brett

Wieso ein Brett?

von Hmm (Gast)


Lesenswert?

Vor dem Kopf.

von Wilhelm F. (Gast)


Lesenswert?

Hmm schrieb:

> Vor dem Kopf.

Leider hilft sowas jetzt hier gar nicht, und paßt irgendwie auch gar 
nicht...

von Hmm (Gast)


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).

von stm (Gast)


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

von Wilhelm F. (Gast)


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.

von Marc H. (_marc_)


Lesenswert?

Das heißt ich soll den Modus für den Interrupttrigger ändern?

von stm (Gast)


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);
  }
}

von Marc H. (_marc_)


Lesenswert?

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?

von stm (Gast)


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"

von Marc H. (_marc_)


Lesenswert?

Sau geile Sache funktioniert nun 1a :D

Wodran liegt das? Ist der Interruptbaustein zu langsam getaktet?

von wutz (Gast)


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 ^^

von wutz (Gast)


Lesenswert?

achso: stm = wutz. ^^

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.