encoder problem - liegts an den caps?

Hi,
folgender code funktioniert mit meinem encoder, wenn ich den an meinen test arduino 2560 anschließe:

volatile boolean fired;
volatile boolean up;
volatile boolean turned;
#define PINA 2
#define PINB 14
#define INTERRUPT 0  // that is, pin 2
#define PUSHP 3
#define INTERRUPTB 1  // that is, pin 3
byte modus=0;
byte colour=0; //colour: 0=blue, 1=white, 2=red, 3=UV420, 4=UV400
long valuePercent[15];
long valueLight[15];


void setup () {
  digitalWrite (PINA, HIGH);     // enable pull-ups
  digitalWrite (PINB, HIGH); 
  digitalWrite (PUSHP, HIGH);
  attachInterrupt (INTERRUPT, isr, CHANGE);   // interrupt 0 is pin 2, interrupt 1 is pin 3
  attachInterrupt (INTERRUPTB, isrp, FALLING);  
  Serial.begin(115200);
  Serial.println("READY");
  
}  // end of setup

void isrp ()
{
  if (!digitalRead (PUSHP)) fired = true;
}   

void isr ()
{
  if (digitalRead (PINA)) up = digitalRead (PINB);
  else up = !digitalRead (PINB);
  turned = true;
} 



int calcPercentTLC(long value) {
  return 4095-(4095*value/100);
}

int calcPercentPWM(long value) {
  return 255*value/100;
}

void encoder() {
  if (turned) {
    if (up) {
      switch (colour) {
      case 0:
        for (int i=0; i<5; i++) {
          valuePercent[i]++;
          if (valuePercent[i]>100) valuePercent[i]=100;
          valueLight[i]=calcPercentTLC(valuePercent[i]);
        }
        break;
      case 1:
        for (int i=5; i<10; i++) {
          valuePercent[i]++;
          if (valuePercent[i]>100) valuePercent[i]=100;
          valueLight[i]=calcPercentTLC(valuePercent[i]);
        }
        break;
      case 2:
        for (int i=10; i<12; i++) {
          valuePercent[i]++;
          if (valuePercent[i]>100) valuePercent[i]=100; 
          valueLight[i]=calcPercentTLC(valuePercent[i]);
        }
        break;        
      case 3:
        for (int i=12; i<14; i++) {
          valuePercent[i]++;
          if (valuePercent[i]>100) valuePercent[i]=100; 
          valueLight[i]=calcPercentTLC(valuePercent[i]);
        }
        break;        
      case 4:
        valuePercent[14]++;
        if (valuePercent[14]>100) valuePercent[14]=100; 
        valueLight[14]=calcPercentPWM(valuePercent[14]);
        break;
      }
    }
    else {
      switch (colour) {
      case 0:
        for (int i=0; i<5; i++) {
          valuePercent[i]--;
          if (valuePercent[i]<0) valuePercent[i]=0;        
          valueLight[i]=calcPercentTLC(valuePercent[i]);
        }
        break;
      case 1:
        for (int i=5; i<10; i++) {
          valuePercent[i]--;
          if (valuePercent[i]<0) valuePercent[i]=0;        
          valueLight[i]=calcPercentTLC(valuePercent[i]);
        }
        break;
      case 2:
        for (int i=10; i<12; i++) {
          valuePercent[i]--;
          if (valuePercent[i]<0) valuePercent[i]=0;        
          valueLight[i]=calcPercentTLC(valuePercent[i]);
        }
        break;        
      case 3:
        for (int i=12; i<14; i++) {
          valuePercent[i]--;
          if (valuePercent[i]<0) valuePercent[i]=0;        
          valueLight[i]=calcPercentTLC(valuePercent[i]);
        }
        break;        
      case 4:
        valuePercent[14]--;
        if (valuePercent[14]<0) valuePercent[14]=0; 
        valueLight[14]=calcPercentPWM(valuePercent[14]);
        break;
      }
    }
    Serial.print("Blue: ");
  Serial.print(valueLight[0], DEC);
  Serial.print(" / ");
  Serial.print(valueLight[1], DEC);
  Serial.print(" / ");
  Serial.print(valueLight[2], DEC);
  Serial.print(" / ");  
  Serial.print(valueLight[3], DEC);
  Serial.print(" / ");  
  Serial.println(valueLight[4], DEC);
  Serial.print("White: ");
  Serial.print(valueLight[5], DEC);
  Serial.print(" / ");
  Serial.print(valueLight[6], DEC);
  Serial.print(" / ");
  Serial.print(valueLight[7], DEC);
  Serial.print(" / ");  
  Serial.print(valueLight[8], DEC);
  Serial.print(" / ");  
  Serial.println(valueLight[9], DEC); 
  Serial.print("Red: ");
  Serial.print(valueLight[10], DEC);
  Serial.print(" / ");
  Serial.println(valueLight[11], DEC); 
  Serial.print("420UV: ");
  Serial.print(valueLight[12], DEC);
  Serial.print(" / ");
  Serial.println(valueLight[13], DEC); 
  Serial.print("400UV: ");
  Serial.println(valueLight[14], DEC);
    turned = false;
  }  
  else if (fired) {
    colour++; 
    if (colour==5) colour=0; 
    Serial.print("Aktuelle Farbe: ");
    if (colour==0) Serial.println("BLUE");
    if (colour==1) Serial.println("WHITE");
    if (colour==2) Serial.println("RED");
    if (colour==3) Serial.println("UV420");
    if (colour==4) Serial.println("UV400"); 
    fired = false;
  }   
}

void loop ()
{ 
  encoder();
  }

Wenn ich den selben encoder nun an meine PLatine anschließe, erhalte ich ein komisches verhalten. Der einzige unterschied ist, dass vor die digitalen PINs (2,3, 14) noch einen Cap 0.1uF an GND gelötet habe, da dieses wohl einem bouncing vermeiden soll.

Jetzt das Problem:
Button funktioniert.
Encoder funktioniert nix, wenn ich drehe.
Wenn ich allerdings den Button gedrückt halte, und dann drehe, dann ändern sich tatsächlich die Werte.
An meiner Testumgebung ohne CAPs klappt der Code tadellos, allerdings bemerke ich dort bouncingprobleme mit dem Button, (ab und zu springt er einen click zu weit), das ist widerrum an der platine besser.

Kann mir irgendjemand weiterhelfen? Ist ein falscher Cap verbaut?

Ist Deine "Platine" auch ein Arduino? Läuft dort der selbe Code?

Ein Debouncing sollte bei einem Encoder nicht notwendig sein, die sind meist optisch gelöst und somit gibt es kein mechanisches Prellen.

Encoder funktioniert nix

Kannst Du genauer beschreiben, was das heissen soll? Kriegst Du keine Impulse? Kriegst Du falsche Impulse?

Kannst Du das verwendet Schema posten? Wie sind die Eingänge beschaltet, wie ist der Encoder eingebunden? Welchen Typ Encoder verwendest Du?

Hallo, bei Pollin gibt es einen Decoder mit Datenblatt.

http://www.pollin.de/shop/dt/Njg2OTU3OTk-/Bauelemente_Bauteile/Passive_Bauelemente/Potis_Trimmer_Encoder/Encoder_PANASONIC_EVEQDBRL416B.html

Datenblatt: http://www.pollin.de/shop/downloads/D240313D.PDF

im Datenblatt auf Seite 2 unten rechts gibt es ein Anschlußbeispiel. Das müßte Dir eigentlich helfen.

Gruss Kurti

Hi,
also die Platine wird einfach auf den arduino mega aufgesteckt, also im grunde alles gleich.
AN den Anschlüssen kann es ja nicht liegen, habe die gleichen Pins verbunden .Im Anhang ein Screenshot von der Platinenbelegung.

Pins 2,3 und 14. An Pin 2 und 14 liegen die encoder, an PIn 3 der Button. Und jeweils mit GND verbunden.

VG

EDIT//
Habe mir das Panasonic Datenblatt angeschaut.
Also mein Encoder hat auf einer Seite 3 Lötpins auf der anderen 2. Haben eigentlich die meisten, anders als der Panasonic.
Die 2 sind für den button, den hab ich an Pin 3 und an GND gelötet.
Die 3 sind für den Encoder, links und rechts sind A und B (2 und 14) und in der Mitte ist GND.
Zumal das ganze ja auch prima funktioniert, wenn ich ohne die Platine arbeite.

Liegt es ggfs an den Caps? Habe im Panasonic datenblatt was von 0.01 uF gesehen, ich habe 0.1 uF verlötet. Können die zu groß sein?

enc.jpg

Wenn ich allerdings den Button gedrückt halte, und dann drehe, dann ändern sich tatsächlich die Werte.

Ich sehe da eher einen Verdratungsfehler da. Kontrolliere bitte nochmal die Verdratung und Widerstandswerte.

Die Schaltung auf dem 2. Blatt rechts unten ist eine Testschaltung bei der verschiedene angegebene Parmeter gemessen wurden, und nicht ein Schaltungsvorschlag.

Auch mit einem größerer Kondensator müßte der Encoder funktionieren.

Grüße Uwe

Hallo,

currymuetze:
EDIT//
Habe mir das Panasonic Datenblatt angeschaut.
Also mein Encoder hat auf einer Seite 3 Lötpins auf der anderen 2. Haben eigentlich die meisten, anders als der Panasonic.

das ist Pech, dann kannst Du natürlich die Beispielschaltung nicht verwenden 8)

currymuetze:
Liegt es ggfs an den Caps? Habe im Panasonic datenblatt was von 0.01 uF gesehen, ich habe 0.1 uF verlötet. Können die zu groß sein?

[Ironie Mode]
das Deine Kondensatoren 10 mal so gross sind ist völlig egal.
Die Elektroniker von Panasonic hatten halt irgenwelche herumliegen und haben die dann ins Schaltbild gemalt.
Die Beispielschaltungen aus den Datenblättern sollte man sowieso immer ignorieren, die Hersteller haben eh’ keine Ahnung.
Und wenn die Entprellung der Kontakte jetzt ewig dauert und Impulse verschluckt: wen juckts
[/Ironie Mode]

viel Spass beim Basteln
Kurti