Wie Drehgeber entprellen?

Gast #2721418
Hallo,
ich habe so einen Drehgeber (siehe Bild) an einen ATXmega16A4 
angeschlossen.
1
unsigned char n=0;
2

3
ISR(PORTC_INT0_vect)
4
{
5
  if(PORTC_IN & (1<<PIN1)) n++; else n--;
6
  Show_turnwheel(n);
7
}
8

9
int main (void) 
10
{
11
  Set_osc_32();
12

13
  PORTA_DIRSET = 0xFF;
14
  PORTB_DIRSET = 0x0F;
15
  
16
  PORTC.DIRCLR = (1<<PIN0)|(1<<PIN1)|(1<<PIN3); // PC0, PC1, PC3 sind Input
17
  PORTC.INT0MASK = (1<<PIN0);  // PC0 löst den Interrupt aus
18
  PORTC.INTCTRL = PORT_INT0LVL_LO_gc;
19
  PORTC.PIN0CTRL = PORT_ISC_FALLING_gc;
20
  PMIC.CTRL |= PMIC_LOLVLEN_bm;  // Enable low interrupt level in PMIC
21
  sei();              // Enable global interrupts
22

23
  Show_turnwheel(n);
24
  while(1){}                      
25
}
Leider funktioniert der Drehgeber nur so zu 80%, manchmal reagiert er 
überhaupt nicht, oder die Anzeige springt um 2 oder 4 oder eine 
beliebige Anzahl von Positionen.
Ich müsste den Drehgeber vielleicht entprellen.
Wie kann ich das machen?
Oder ist da ein schlimmer Fehler in meinem Code?
Angehängte Dateien:
Gast #2721563
Versuche es mal mit einfachen R/C Gliedern.

Also z.B. 10nF parallel zu den Mikrocontroller Eingängeng und 1k 
Widerstände in Reihe zu den beiden Schaltkontakten.

Unter der Annahme, daß der interne Pull-Up des Mikrocontrollers etwa 50k 
Ohm hat, kommst Du so ganz grob gerechnet auf eine Entsprell-Zeit von:

t= 2*50k*10n = 1ms

Die Kontakte dürfen also maximal 1ms prellen, und Du kannst maximal 100 
Impulse pro Sekunde drehen. Falls das nicht reicht, versuche es mit 
4,7nF.

Eigentlich müsste man zwischen Mikrocontroller und R/C Filter einen 
Schmitt-Trigger schalten, aber in der Praxis hatte sowas bei mir bisher 
immer auch ohne Schmitt-Trigger zufriedenstellend funktioniert.
Gast #2721569
> Versuche es mal mit einfachen R/C Gliedern.

Du meinst, du selbst hast es zwar nie "versucht"
und weisst nicht ob es funktioniert,
aber warum nicht fremde Leute sinnlose Arbeit machen lassen,
da kann man sich doch schön auf die Schenkel klopfen ?

Und dann noch ohne Schmitt-Trigger, damit garantiert jede
Schwankung der Versorgungsspannung sauber mitgezählt wird...
Gast #2721653
Hallo

hier das Beispiel hab ich damals benutzt um einen Drehgeber 
abzutasten... Hat bei mir auf anhieb funktioniert.
Findet man in der Codesammlung unter Drehgeber.
1
SIGNAL (SIG_OVERFLOW0)
2
{
3
  static char enc_last = 0x01;
4
  char i = 0;
5

6
  if( PHASE_A )
7
    i = 1;
8

9
  if( PHASE_B )
10
    i ^= 3;        // convert gray to binary
11

12
  i -= enc_last;      // difference new - last
13

14
  if( i & 1 ){        // bit 0 = value (1)
15
    enc_last += i;      // store new as next last
16

17
    enc_delta += (i & 2) - 1;    // bit 1 = direction (+/-)
18
  }
19
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.