INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Konflikt bei Rotary Encoder
02.01.2021, 10:26
Beitrag #1
Konflikt bei Rotary Encoder
Hallo und Prosit Neujahr!
Ich bin neu in diesem Forum und auch relativ unerfahren mit Arduino-Programmierung.
Ich möchte in einem Sketch eine SD-Karte, eine Real-Time-Clock (DS3231), einen Rotary-Encoder (KY-040), ein LCD-Display (1602) und einen NeoPixel-String (WS2812) gemeinsam nutzen. Leider zeigt mein Rotary-Encoder ein Verhalten als wenn er prellen würde. Ich habe dann einmal die Schaltung nur mit dem Arduino und dem Rotary-Encoder (in einem Taster, den ich aber nicht anspreche) aufgebaut: der Sketch funktioniert einwandfrei.
Hier ist der Sketch, der mit allen Modulen und auch nur allein benutzt wurde:
PHP-Code:
// -------------- Settings für Rotary Encoder ----------------
#define CLK 3                                // CLK am rotary encoder
#define DT 5                                 // DT am rotary encoder
#define SW 2                                 // SW am rotary encoder (2 wegen Interrupt)
int old_button LOW;                        // Merker für button
int rotary 0;                              // encoder value für CLK und DT
int old_rotary 0;                          // Merker für encoder value

void setup() {
// Setup Rotary Encoder
  
pinMode(CLKINPUT);
  
pinMode(CLKINPUT_PULLUP);                // Turn on pullup resistor
  
pinMode(DTINPUT);
  
pinMode(DTINPUT_PULLUP);                 // Turn on pullup resistor
  
pinMode(SWINPUT);
  
pinMode(SWINPUT_PULLUP);                 // Turn on pullup resistor
  
attachInterrupt(digitalPinToInterrupt(SW), ISR_SWCHANGE);

  
Serial.begin(9600);
}

void loop() {
    
rotary += read_rotary();

    if (
rotary >= 5rotary 5;             // Begrenzung nach oben auf Anzahl Entries
    
if (rotary 1rotary 0;              // Begrenzung nach unten auf 0
    
if (rotary != old_rotary) {              // werde aktiv nur wenn sich etwas geändert hat
      
old_rotary rotary;
      
Serial.println(rotary);
    }

}

// Rotary Encoder lesen und entprellen
// zum Verständnis: John Main - best-microcontroller-projects.com
int8_t read_rotary() {
  static 
int8_t rot_enc_table[] = {0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0};
  static 
uint8_t prevNextCode 0;             // uint8_t = unsigned integer 8bit
  
static uint16_t store=0;                     // uint16_t = unsigned integer 16bit

  
prevNextCode <<= 2;
  if (
digitalRead(DT)) prevNextCode |= 0x02;
  if (
digitalRead(CLK)) prevNextCode |= 0x01;
  
prevNextCode &= 0x0f;

   
// If valid then store as 16 bit data.
   
if  (rot_enc_table[prevNextCode] ) {
      
store <<= 4;
      
store |= prevNextCode;
      if ((
store&0xff)==0x2b) return -1;     // valid CCW (clock counter wise)
      
if ((store&0xff)==0x17) return 1;      // valid CW (counter wise)
   
}
   return 
0;                                 // invalid
}

// -------------- Interrupt Service Routines -----------------
// ISR für Rotary Encoder Button
void ISR_SW() {
  
int button = !digitalRead(SW);                    // sobald gedrückt wird -> ein
  
if (button != old_button) {
    
delay(20);
    
old_button button;
    if (
button == HIGH) {
      
Serial.println("high");
    }
  }

Ich habe auch die Pinbelegung beigefügt. Dazu ist folgendes zu sagen: CLK vom Rotary-Encoder hatte ich zuerst auf Pin 10; das habe ich durch Pin3 ersetzt (ohne Erfolg).
Ich vermute, dass irgend ein Gerät hier Störungen verursacht, oder dass ich einen Pin so nicht belegen darf. Jedenfalls bin ich ratlos...
Hat jemand eine Idee, was es sein kann?

LG Karl


Angehängte Datei(en)
.ino  Rotary_test01.ino (Größe: 2,48 KB / Downloads: 32)
.docx  Pinbelegung.docx (Größe: 18,76 KB / Downloads: 27)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.01.2021, 10:29 (Dieser Beitrag wurde zuletzt bearbeitet: 02.01.2021 10:31 von Tommy56.)
Beitrag #2
RE: Konflikt bei Rotary Encoder
Während der Übertragung (show) der Daten zu den WS2812 werden alle Interrupts abgeschaltet.
Auch ein Rotary-Encoder prellt.
Delay und Serial.print haben in einer ISR nichts zu suchen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.01.2021, 10:38
Beitrag #3
RE: Konflikt bei Rotary Encoder
Und hier kannst du jeweils die erste Zeile einsparen.

Code:
pinMode(CLK, INPUT);
pinMode(CLK, INPUT_PULLUP);                // Turn on pullup resistor

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.01.2021, 11:22
Beitrag #4
RE: Konflikt bei Rotary Encoder
Danke für die Infos.
Die ersten Zeilen nehme ich jeweils raus - danke für den Tipp.
Die Serial.println-Ausgabe ist nur zum testen und kommt natürlich wieder raus.
Die delay-Angabe dient zum Entprellen des Drucktasters am Rotary-Encoder. Die wollte ich eigentlich drin lassen. Hast du da eine bessere Idee, wie ich den Drucktaster entprellen kann?
Das Entprellen des Drehgebers habe ich mit der Function des digitalen Filters gelöst. Das funktioniert auch sehr gut.
---- Die Störungen müssen irgendwo anders herkommen.
LG Karl
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.01.2021, 11:30
Beitrag #5
RE: Konflikt bei Rotary Encoder
(02.01.2021 11:22)Karl Stanger schrieb:  ---- Die Störungen müssen irgendwo anders herkommen.
LG Karl
Lies nochmal die erste Zeile von #2.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.01.2021, 11:47 (Dieser Beitrag wurde zuletzt bearbeitet: 02.01.2021 11:52 von Bitklopfer.)
Beitrag #6
RE: Konflikt bei Rotary Encoder
Zitat:Lies nochmal die erste Zeile von #2.

Gruß Tommy
Ich habe die Zeile gelesen und auch verstanden. In dem beigefügten Sketch rufe ich aber NeoPixel garnicht auf. Sie sind noch nicht einmal angeschlossen! Und trotzdem habe ich die Störungen, wenn die Module Hardwaremäßig vorhanden sind; und keine Störungen, wenn nur der Drehgeber angeschlossen ist, mit dem gleiche Sketch.
---- Die Störungen müssen irgendwo anders herkommen.

Gruß Karl
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.01.2021, 11:53
Beitrag #7
RE: Konflikt bei Rotary Encoder
(02.01.2021 11:47)Karl Stanger schrieb:  In dem beigefügten Sketch rufe ich aber NeoPixel garnicht auf. Sie sind noch nicht einmal angeschlossen! Und trotzdem habe ich die Störungen, wenn die Module Hardwaremäßig vorhanden sind;
Was ist denn nun angeschlossen und was nicht.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.01.2021, 12:51
Beitrag #8
RE: Konflikt bei Rotary Encoder
[/quote]
Was ist denn nun angeschlossen und was nicht.

Gruß Tommy
[/quote]
Angeschlossen sind
- eine SD-Karte
- Real-Time-Clock (DS3231)
- Rotary-Encoder (KY-040)
- LCD-Display (1602)
- NeoPixel-String (WS2812)
NeoPixel-String kann ich abhängen, ohne irgendwelche Auswirkung, d.h. die Störungen sind immer noch da.
In der Anlage sieht man die Pinbelegung.

Gruß Karl
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Library-Konflikt beim Signalgenerator-Projekt tapsi 6 562 16.05.2021 12:08
Letzter Beitrag: tapsi
  Encoder in Lüftersteuern integrieren Hilbus 8 995 05.02.2021 16:18
Letzter Beitrag: Hilbus
  Konflikt Ultraschallsensor und Infrarotfernbedienung M_E_ 31 2.436 30.01.2021 15:18
Letzter Beitrag: ardu_arne
  KY-040 Rotary Encoder Harry 11 1.510 09.01.2021 01:14
Letzter Beitrag: rev.antun
  Rotary Encoder und I2C Display gleichzeitig verwenden BenGroll 3 1.438 27.07.2020 10:23
Letzter Beitrag: hotsystems
  7 Segment Display mit Rotary Encoder SA154 2 1.204 26.05.2020 13:40
Letzter Beitrag: MicroBahner
  Konfiguration i2c Encoder Igom 4 1.463 01.03.2020 13:23
Letzter Beitrag: bytecook
  Rotary Encoder - gedrückt und gleichzeitig drehen Gerdchen03 6 1.879 29.10.2019 10:49
Letzter Beitrag: Tommy56
  Konflikt NEMA17 und LCD1602 ArnaCronix 1 1.231 25.03.2019 19:54
Letzter Beitrag: Tommy56
  Menue und klick-Encoder bojojo 2 1.994 23.11.2018 13:46
Letzter Beitrag: bojojo

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste