Forum: Mikrocontroller und Digitale Elektronik Entprellen an unterschiedlichen Ports


von Daniel D. (__daniel__)


Lesenswert?

Liebe Forumsgemeinde,

ich würde euch gerne um Rat fragen bzgl. der Möglichkeiten meine Taster 
zu entprellen. Mit der Komfort-Routine von Peter Dannegger habe ich mich 
schon etwas auseinander gesetzt. Ich würde aber gerne wissen ob ich 
diese für meinen Fall auch abändern kann.

So sieht mein Fall aus:
Da ich für alle Taster einen Interrupt auslösen möchte, habe ich diese 
auf die 3 external Interrupt Eingänge gelegt und zusätzlich noch (über 
eine Schaltung entkoppelt) jeweils auf einen weiteren Port-Pin meines 
ATmega32. Über Maskieren kann ich dann in den ISR zwischen den 
anliegenden Signalen unterscheiden:

1.)
                   _PINA1
                  |
Hallsensor1-------|----------.
                   _PINA2    |
                  |          |
Hallsensor2-------'----------|----- INT0 (PIND2)
                   _PINA3    |
                  |          |
Taster1-----------'----------'


2.)
                   _PINA4
                  |
Hallsensor3-------|----------.
                   _PINA5    |
                  |          |
Hallsensor4-------'----------|----- INT1 (PIND3)
                   _PINA6    |
                  |          |
Taster2-----------'----------'


3.)
                   _PINA0
                  |
Taster3-----------'----------.
                   _PINB4   |
                  |          |
Rotary Encoder A--'----------|
                   _PINB1    |_  _  INT2 (PINB2)
                  |          |
Rotary Encoder B--'----------|
                   _PINB0    |
                  |          |
Rotary Encoder D--'----------'


Also ziemlich viele Pins an verschiedenen Ports. Die Signale sind alle 
active low. Was wäre denn hier für mich sinnvoll? Taster 1,2 und 3 
prellen ziemlich. Hier springt er ja bei jedem Prellen in die ISR. Die 
Hallsensoren liefern digitale Signale, müssten also theoretisch nicht 
entprellt werden.

Für eine Hilfestellung bin ich sehr dankbar!

Vielen Dank und viele Grüße,

Daniel

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Daniel D. schrieb:
> Da ich für alle Taster einen Interrupt auslösen möchte,
Warum?
Wie schnell sind die Signale?
Alles, was langsamer als 1kHz ist, braucht keinen Interrupt. Du bekommst 
die Neben- und Seitenwirkungen bei Verwendung vieler Interrupts sowieso 
nicht mehr zuverlässig verwaltet...

Kurz: viele Probleme kommen von vielen Interrupts.


Daniel D. schrieb:
> Mit der Komfort-Routine von Peter Dannegger habe ich mich schon etwas
> auseinander gesetzt.
Offenbar noch nicht genug, denn sonst könntest du diese Frage:
> würde aber gerne wissen ob ich diese für meinen Fall auch abändern kann.
selber mit "Ja" beantworten.
Ich entprelle mit dieser Routine z.B. ganz problemlos knapp 100 
Schaltkontakte eines Orgelpedals. Das klappt absolut problemlos. Du 
musst einfach deine Signale in ein Byte einlesen, und das dann in den 
"Entpreller" einspeisen. Hinten kommen die dann hübsch entprellt wieder 
raus.

von Tom (Gast)


Lesenswert?

Lothar Miller schrieb:
> Alles, was langsamer als 1kHz ist, braucht keinen Interrupt

Kann man das wirklich so pauschalisieren?

Wenn ich einen Hallsensor habe, an dem ein Magnet vorbeisaust pro 360°, 
dann löst der Hallsensor nur ein paar Grad das Signal aus, solange der 
Magnet in seinem Feld steht.
Das Signal mag dann zwar max. 1kHz betragen, die effektive Zeit, in der 
ich das Signal erfassen kann durch pollen ist aber1kHz*360/10 oder bin 
ich da jetzt ganz verkehrt?

Ich nutze für sämtliche mechanisch betätigte Tasten auch die Routine von 
Peter Danegger. Diese kannst du auch verfielfachen und so mehrere Ports 
à 8 bit entprellen.

von Bernd (Gast)


Lesenswert?

Tom schrieb:
> Das Signal mag dann zwar max. 1kHz betragen, die effektive Zeit, in der
> ich das Signal erfassen kann durch pollen ist aber1kHz*360/10 oder bin
> ich da jetzt ganz verkehrt?

nein, da liegst du richtig

von Karl H. (kbuchegg)


Lesenswert?

Daniel D. schrieb:

> Für eine Hilfestellung bin ich sehr dankbar!

In der PeDa Routine wird in der ISR ganz am Anfang das PIN Register 
ausgelesen, um den Zustand der Tastenleitungen festzustellen.

Es spricht nun nichts dagegen, dass man hier nicht einfach nur 1 PIN 
Register einliest, sondern mehrere, sich die interessierenden Bits 
herausmaskiert und sich ein Byte zusammenbaut, welches aus den 
Taster-Bits von unterschiedlichen Ports besteht. Die weitere 
Verarbeitung geht dann halt mit diesem Byte weiter, in welches man die 
unterschiedlichen Taster zusammengeführt hat.

von Stefan W. (dl6dx)


Lesenswert?

Daniel D. schrieb:
> Taster 1,2 und 3 prellen ziemlich. Hier springt er ja bei jedem
> Prellen in die ISR. Die Hallsensoren liefern digitale Signale,
> müssten also theoretisch nicht entprellt werden.

Und genau deswegen solltest du diese unterschiedlichen Signalquellen 
auch unterschiedlich behandeln.

Hier 
http://pdf.aminer.org/000/563/974/an_engineering_approach_to_determining_sampling_rates_for_switches_and.pdf 
findest du einige grundlegende Überlegungen, weitere Literatur ist im 
Artikel "Entprellung" 
http://www.mikrocontroller.net/articles/Entprellung angegeben.

Die Entscheidung "Polling" oder "Interrupt" solltest du primär von den 
Eigenschaften des Eingangssignals abhängig machen.

Ist das Signal (aus µC-Sicht) langsam (also im ms-Bereich oder darüber) 
und prellt es eventuell auch noch, würde ich immer pollen und die 
gewonnenen Samples durch einen softwarebasierten Filter schicken.

Ist das Signal schnell (hohe Wiederholfrequenz oder sehr kurze 
Pulslänge), wirst du wirklich einen externen Interrupt benötigen. Falls 
du aber Zeitbedingungen beachten musst (z.B. für eine Entprellung), wird 
es schwieriger, denn du musst die Zeiten zwischen den Ereignissen 
(Interrupts) über eine separate Zeitquelle (Timer) messen.

In deinem Beispiel würde ich die Taster pollen und einen 
Filtermechanismus analog dem von Peter Danegger anwenden. (Der ist sehr 
elegant gelöst. Lies mal 
http://www.mikrocontroller.net/articles/Entprellung#Funktionsweise . 
Viel sparsamer geht es kaum noch.)

Bei der Auswertung der Hallgeber (die sind prellfrei, ja?) musst du dir 
die Signalcharakteristik ausrechnen (Frequenz, Pulsbreite) und kannst 
dann entscheiden, ob Polling noch machbar ist, oder nicht.

Solltest du Interrupts wählen und mehrere Hallgeber Oder-verknüpft auf 
einen Interrupteingang legen, musst du daran denken, dass ein 
Interruptereignis durch einen oder mehrere (beliebig kombinierte) Geber 
ausgelöst werden kann. Davon darfst du dann keinen verpassen. Das gilt 
auch für die, die aktiv werden, während du gerade in der ISR bist. 
(Wichtig bei Flankentriggerung!) Falls die Reihenfolge der Ereignisse 
wichtig ist, musst du dir zusätzlich überlegen, wie du das erkennen 
kannst.

Die Verwendung eines externen Interrupts macht es also keinesfalls 
einfacher.

Wie gesagt: Schau dir deine Signale an, spiele alle möglichen Zustände 
durch und entscheide dann. Alles andere wird dir irgendwann (schwer zu 
findende!) Probleme bereiten.

Grüße

Stefan

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Tom schrieb:
> Lothar Miller schrieb:
>> Alles, was langsamer als 1kHz ist, braucht keinen Interrupt
> Kann man das wirklich so pauschalisieren?
Jain.
Bei fast allen alle "üblichen" Schaltern oder Tastern die per Nocken, 
Hand, Näherung, Temperatur, oder sonswelche physikalischen Größen 
angesteuert werden, ist ein Spike mit 100us eine Störung. Und so eine 
Störung kann gerne noch vor oder von der Auswertung ignoriert werden.

Signale, die schneller kommen (z.B. Impulsgeber oder Drehgeber) werden 
i.A. nicht auf diese Art entprellt sondern haben andere 
Auswertealgorithmen.

Stefan Wagner schrieb:
> Bei der Auswertung der Hallgeber (die sind prellfrei, ja?)
Aber noch nicht unbedingt störungsfrei. Und das ist das Abfallprodukt 
einer Entprellung: kurze Störspikes werden ebenfalls ausgefiltert.

von Peter D. (peda)


Lesenswert?

Daniel D. schrieb:
> Da ich für alle Taster einen Interrupt auslösen möchte, habe ich diese
> auf die 3 external Interrupt Eingänge gelegt und zusätzlich noch (über
> eine Schaltung entkoppelt)

Wie soll denn diese geheimnisvolle Schaltung aussehen?
Ein AND geht ja nicht. Sobald ein Kontakt geschlossen ist, kann kein 
anderer einen Interrupt auslösen. Lower als Low geht nicht.


Wenn alle Eingänge auf nur 2 Ports liegen, würde ich die Entprellung 
einfach auf uint16_t erweitern.


Peter

von Stefan W. (dl6dx)


Lesenswert?

Lothar Miller schrieb:
>> Hallgeber
> Aber noch nicht unbedingt störungsfrei. Und das ist das Abfallprodukt
> einer Entprellung: kurze Störspikes werden ebenfalls ausgefiltert.

Das ist in der Tat ein angenehmer Zusatzeffekt.

Wobei man periodische Störungen, die frequenz- und phasengleich zum 
Sampletakt sind (also genau in das Samplefenster fallen), so nicht 
filtern kann. (Wird in > 99,9% aller Fälle aber kein Problem sein.)

Grüße

Stefan

von Peter F. (Gast)


Lesenswert?

[[Beitrag "Entprellen an unterschiedlichen Ports"]]

[..]
> Hallsensor
[..]

Mal eine bescheidene Frage: Haben die Dinger nicht i. A. eine Hysterese? 
Ist da überhaupt eine Entprellung nötig? Oder ist noch Mechanik (Relais) 
im Spiel?

von Daniel D. (__daniel__)


Lesenswert?

Lothar Miller schrieb:
> Daniel D. schrieb:
>> Mit der Komfort-Routine von Peter Dannegger habe ich mich schon etwas
>> auseinander gesetzt.
> Offenbar noch nicht genug, denn sonst könntest du diese Frage:

Tatsächlich habe ich die Routine bisher nur grob nachvollzogen, bzw. es 
mal angegangen sie nachzuvollziehen. Durch die haufenweise 
Bitoperationen zieht sich das ziemlich hin..

Im Prinzip ist es so:
Taster1 und Taster2 werden nur als Startknöpfe benötigt. Wenn nicht 
einer der beiden gedrückt wird, soll das Programm nicht gestartet 
werden. Allerdings hätte ich den Rotary Encoder und Taster3 schon gerne 
konsequent zur Verfügung z.B. für ein Setup das auf einem 2-zeiligen 
Display angezeigt wird (bzw. zum Dimmen der Display-Beleuchtung).
Wenn ich jetzt beispielsweise die Pins von INT0 und INT1 entprelle 
(wegen Taster1 und 2), muss ich dann auch die Eingänge auf denen die 
Hallsensoren liegen (PINA1,2,4,5) entprellen? Ich hab mich noch nicht 
aureichend mit der Routine auseinander gesetzt aber mein Gedanke war, 
dass ich diese Signale ja in der ISR auseinander so sortiere:
1
ISR(INT0_vect)               
2
{
3
if( !(PINA & (1<<PA1)) )          // Hallsensor 1 (Drehzahl)
4
  { 
5
            irgendwas passiert;
6
  }
7
.....
8
}
wenn ich hier den INT0-Pin entprelle, aber den Eingangspin PA1 nicht 
(bzw andersrum) funktioniert die Abfrage if( !(PINA & (1<<PA1)) ) dann 
immer noch? Da ja einige ms durch die Entprellroutine vergehen, bis der 
Zustand tatsächlich übernommen wird?! Das ist jetzt nur meine erste 
Sorge, ohne mich ausreichend damit beschäftigt zu haben mit dem 
tatsächlichen Vorgang.

Prinzipiell hätte ich mir wegen sowas schon beim Layouten der Platine 
oder Schaltplanerstellung Gedanken machen sollen, nicht erst nachdem die 
Platine fertig geätzt wurde. Aber solche Fehler macht man wohl beim 
ersten eigenen Projekt.

Stefan Wagner schrieb:
> In deinem Beispiel würde ich die Taster pollen und einen
> Filtermechanismus analog dem von Peter Danegger anwenden. (Der ist sehr
> elegant gelöst. Lies mal
> http://www.mikrocontroller.net/articles/Entprellun... .
> Viel sparsamer geht es kaum noch.)

Welchen Code meinst du da denn genau? Entprellen für Anfänger?

Peter Dannegger schrieb:
> Wie soll denn diese geheimnisvolle Schaltung aussehen?

GND ---.
       .\ Taster1 (oder Hallsensor)
       |
       |------- µC_PIN1 (Pullup-Widerstand aktiviert)
       |
      /_\ Diode1 (z.B. 1N4004)
       |
       |------- µC_PIN_INT0 (Pullup-Widerstand aktiviert)
      _|_
      \ / Diode2 (z.B. 1N4004)
       |
       |------- µC_PIN1 (Pullup-Widerstand aktiviert)
       |
        \ Taster2 (oder Hallsensor)
GND ---'

so hab ich mir das ausgedacht und es funktioniert auch so.

Peter F. schrieb:
> Ist da überhaupt eine Entprellung nötig?

Nein, die Sensoren liefern schon saubere digitale Signale.


Danke für eure zahlreichen Antworten! Wenn ich die 3 Eingänge für 
externe IR entprelle + alle anderen PINs, wie in meinem ersten Beitrag 
gezeigt, dann wären das ja 13 PINs zu entprellen. Ich wünschte mir wäre 
schon klar wie ich da am besten vorgehe :)

Vielen Dank und viele Grüße,

Daniel

von Daniel D. (__daniel__)


Lesenswert?

Daniel D. schrieb:
> _|_
>       \ / Diode2 (z.B. 1N4004)
>        |
>        |------- µC_PIN1 (Pullup-Widerstand aktiviert)
>        |
>         \ Taster2 (oder Hallsensor)
> GND ---'

Soll natürlich   |------- µC_PIN2 (Pullup-Widerstand aktiviert) heißen.

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.