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
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.
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.
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
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.
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
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.
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
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
[[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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.