Forum: Mikrocontroller und Digitale Elektronik Wie Drehgeber entprellen?


von Peter Z. (Gast)


Angehängte Dateien:

Lesenswert?

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?

von mr. mo (Gast)


Lesenswert?

Hier in der Artikelsammlung findest genau das was du suchst.

von MaWin (Gast)


Lesenswert?

Auf Flanke einen Interrupt ausgelöst ? Klar geht das schief.

http://www.dse-faq.elektronik-kompendium.de/dse-faq.htm#F.29

von Peter Z. (Gast)


Lesenswert?

mr. mo schrieb:
> Hier in der Artikelsammlung findest genau das was du suchst.

Was meinst du genau?
Welche Artikelsammlung?

von Harald W. (wilhelms)


Lesenswert?

Peter Zz schrieb:
> mr. mo schrieb:
>> Hier in der Artikelsammlung findest genau das was du suchst.
>
> Was meinst du genau?
> Welche Artikelsammlung?

www.mikrocontroller.net/articles/Drehgeber
Gruss
Harald

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


Lesenswert?

Such mal hier im Forum nach Encoder und Dannegger...

von Werner (Gast)


Lesenswert?

Oder guck dir den Beitrag zu Auswertung mit einem Zustandsautomaten an 
...
Beitrag "Re: Drehgeber mit viertelter Auflösung"

von Stefan Frings (Gast)


Lesenswert?

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.

von MaWin (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

>Versuche es mal mit einfachen R/C Gliedern.

Jetzt hat wieder jemand etwas losgetreten.

MfG Spess

von Peter (Gast)


Lesenswert?

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
}

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.