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
Rotary Encoder zählt nicht Rückwerts
19.05.2015, 17:33
Beitrag #1
Rotary Encoder zählt nicht Rückwerts
Hallo,
ich bin in Sachen Arduino blutiger Anfänger.

Folgende Ausgangslage:

Auf einem Display (2.2 SPI von ebay) werden 4 Kreise als Menüpunkte dargestellt, durch drehen des Encoders wechselt man durch die Menüpunkte. Encoder und Display funktionieren mit dem unten angehängtem Code.

Problem:
Die Variable des Encoders kann einen Werte zwischen -5 und 5 haben, das funktioniert aber nur problemlos wenn ich alles nach "void encoder()" auskommentiere. Man kann Problemlos nach links und rechts drehen je nachdem wird die Variable hoch oder runtergezählt.

Führe ich den ganzen Code aus kann ich nur in positive Richtung gehen, sprich von 1 auf 2, von 2 auf 3 usw. - wenn ich in die andere Richtung drehe wird die Variable nicht -1 gesetzt.

Code:
int val;
int encoder0PinA = 2;
int encoder0PinB = 3;
int encoder0Pos = 0;
int encoder0PinALast = LOW;
int n = LOW;

#define sclk 13  // Don't change
#define mosi 11  // Don't change
#define cs   9
#define dc   8
#define rst  7  // you can also connect this to the Arduino reset
#include <Adafruit_GFX_AS.h>    // Core graphics library
#include <Adafruit_ILI9341_AS.h> // Hardware-specific library
#include <SPI.h>
Adafruit_ILI9341_AS tft = Adafruit_ILI9341_AS(cs, dc, rst);       // Invoke custom library


void setup() {
   pinMode (encoder0PinA,INPUT);
   pinMode (encoder0PinB,INPUT);
    
  attachInterrupt(0, encoder, CHANGE);
  attachInterrupt(1, encoder, CHANGE);

    
    tft.init();
    tft.setRotation(2);
    tft.fillScreen(ILI9341_WHITE);
    Serial.begin (9600);
    
}

void loop() {
}

void encoder() {
    n = digitalRead(encoder0PinA);
   if ((encoder0PinALast == LOW) && (n == HIGH)) {
     if (digitalRead(encoder0PinB) == LOW) {
       encoder0Pos--;
        
     } else {
       encoder0Pos++;
      
     }
     Serial.print (encoder0Pos);
     Serial.print ("/");
   }
  
   encoder0PinALast = n;
   if (encoder0Pos>4) {
             encoder0Pos=0;
             }
   if (encoder0Pos<-4) {
             encoder0Pos=0;
             }
            
   if (encoder0Pos == 0)
    {
    case_0();
    }            
   if ((encoder0Pos == 1) || (encoder0Pos == -1))
    {
    case_1();
    }
  if ((encoder0Pos == 2) || (encoder0Pos == -2))
    {
    case_2();
    }
  if ((encoder0Pos == 3) || (encoder0Pos == -3))
    {
     case_3();
    }
     if ((encoder0Pos == 4) || (encoder0Pos == -4))
    {
     case_4();
    }
    if (encoder0Pos == 5)
    {
    case_0();
    }            
}

void case_0() {
    tft.setTextColor(ILI9341_BLACK);
    tft.fillCircle(120, 80, 44, ILI9341_WHITE); // KREIS FÜLLEN
    tft.drawCircle(120, 80, 45, ILI9341_BLACK);    
    tft.fillCircle(60, 160, 44, ILI9341_WHITE); // KREIS FÜLLEN
    tft.drawCircle(60, 160, 45, ILI9341_BLACK);  
    tft.fillCircle(180, 160, 44, ILI9341_WHITE); // KREIS FÜLLEN
    tft.drawCircle(180, 160, 45, ILI9341_BLACK);  
    tft.fillCircle(120, 240, 44, ILI9341_WHITE); // KREIS FÜLLEN
    tft.drawCircle(120, 240, 45, ILI9341_BLACK);    
    tft.drawCentreString("Licht",120,70,4);
    tft.drawCentreString("Temp",60,150,4);
    tft.drawCentreString("?",180,150,4);
    tft.drawCentreString("C",120,230,4);    
  }

void case_1() {
    tft.setTextColor(ILI9341_BLACK);
    tft.fillCircle(120, 80, 44, ILI9341_LIGHTGREY); // KREIS FÜLLEN
    tft.drawCircle(120, 80, 45, ILI9341_BLACK);
    tft.fillCircle(60, 160, 44, ILI9341_WHITE); // KREIS FÜLLEN
    tft.drawCircle(60, 160, 45, ILI9341_BLACK);
    tft.fillCircle(180, 160, 44, ILI9341_WHITE); // KREIS FÜLLEN  
    tft.drawCircle(180, 160, 45, ILI9341_BLACK);    
    tft.drawCircle(120, 240, 45, ILI9341_BLACK);    
    tft.drawCentreString("Licht",120,70,4);
    tft.drawCentreString("Temp",60,150,4);
    tft.drawCentreString("?",180,150,4);
    tft.drawCentreString("C",120,230,4);    
  }

  
void case_2() {
    tft.setTextColor(ILI9341_BLACK);
    tft.fillCircle(120, 80, 44, ILI9341_WHITE); // KREIS FÜLLEN
    tft.drawCircle(120, 80, 45, ILI9341_BLACK);    
    tft.fillCircle(60, 160, 44, ILI9341_LIGHTGREY); // KREIS FÜLLEN
    tft.drawCircle(60, 160, 45, ILI9341_BLACK);    
    tft.drawCircle(180, 160, 45, ILI9341_BLACK);
    tft.fillCircle(120, 240, 44, ILI9341_WHITE); // KREIS FÜLLEN  
    tft.drawCircle(120, 240, 45, ILI9341_BLACK);    
    tft.drawCentreString("Licht",120,70,4);
    tft.drawCentreString("Temp",60,150,4);
    tft.drawCentreString("?",180,150,4);
    tft.drawCentreString("C",120,230,4);    
  }
  
  void case_3() {
    tft.setTextColor(ILI9341_BLACK);
    tft.drawCircle(120, 80, 45, ILI9341_BLACK);    
    tft.fillCircle(60, 160, 44, ILI9341_WHITE); // KREIS FÜLLEN
    tft.drawCircle(60, 160, 45, ILI9341_BLACK);  
    tft.fillCircle(180, 160, 44, ILI9341_WHITE); // KREIS FÜLLEN
    tft.drawCircle(180, 160, 45, ILI9341_BLACK);    
    tft.fillCircle(120, 240, 44, ILI9341_LIGHTGREY); // KREIS FÜLLEN
    tft.drawCircle(120, 240, 45, ILI9341_BLACK);    
    tft.drawCentreString("Licht",120,70,4);
    tft.drawCentreString("Temp",60,150,4);
    tft.drawCentreString("?",180,150,4);
    tft.drawCentreString("C",120,230,4);    
  }
  
  void case_4() {
    tft.setTextColor(ILI9341_BLACK);
    tft.fillCircle(120, 80, 44, ILI9341_WHITE); // KREIS FÜLLEN
    tft.drawCircle(120, 80, 45, ILI9341_BLACK);        
    tft.drawCircle(60, 160, 45, ILI9341_BLACK);  
    tft.fillCircle(180, 160, 44, ILI9341_LIGHTGREY); // KREIS FÜLLEN
    tft.drawCircle(180, 160, 45, ILI9341_BLACK);    
    tft.fillCircle(120, 240, 44, ILI9341_WHITE); // KREIS FÜLLEN
    tft.drawCircle(120, 240, 45, ILI9341_BLACK);    
    tft.drawCentreString("Licht",120,70,4);
    tft.drawCentreString("Temp",60,150,4);
    tft.drawCentreString("?",180,150,4);
    tft.drawCentreString("C",120,230,4);    
  }

Liebe Grüße
elmo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.05.2015, 19:24
Beitrag #2
RE: Rotary Encoder zählt nicht Rückwerts
Hi,
..ähm ich würde mal die Serielle Ausgabe aus der Interruptroutine in die gezeigte leere Loop schieben weil die Serielle Ausgabe bremst den Interrupt schon deutlich aus.
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.05.2015, 20:09
Beitrag #3
RE: Rotary Encoder zählt nicht Rückwerts
jetzt läuft es etwas schneller aber rückwärts zählt er immer noch nicht Wink
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.05.2015, 20:22 (Dieser Beitrag wurde zuletzt bearbeitet: 19.05.2015 20:24 von HaWe.)
Beitrag #4
RE: Rotary Encoder zählt nicht Rückwerts
du wirst einen Interrupt dafür brauchen, ich persönlich bevorzuge Timer-Interrupts. Kennst du diesen Link...?

http://www.meinduino.de/arduino-grundlag...oder2.html

mein Ansatz war dann dieser hier:

http://www.mindstormsforum.de/viewtopic....086#p65086
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.05.2015, 20:24
Beitrag #5
RE: Rotary Encoder zählt nicht Rückwerts
(19.05.2015 20:09)elmo schrieb:  jetzt läuft es etwas schneller aber rückwärts zählt er immer noch nicht Wink

...ähm wenn ich das richtig sehe dann hast du 5 Positionen zur Auswahl ?...richtig..

Aber warum machst du bei der case Abfrage diese Veroderung ?
if ((encoder0Pos == 1) || (encoder0Pos == -1))
ist doch Luxus an der Ecke....finde ich... es sei denn ich kenne einen wichtigen Hintergrund nicht.

Nun es wäre sinnvoll die die Wertebegrenzung
if (encoder0Pos>4) {
encoder0Pos=0;
}
if (encoder0Pos<-4) {
encoder0Pos=0;
}

hier mit einfliesen lassen solltest:
if (digitalRead(encoder0PinB) == LOW) {
encoder0Pos--;

} else {
encoder0Pos++;

}


Dann ist die Sache etwas homogener.
Und btw. schau mal auf die Werte die du setzen tust wenn die 4 oder die -4 überschritten wird...Big Grin wohin müßte man die Werte dann setzen anstelle der 0 ? Tongue
Außerdem wozu auch bis -4 zählen wenn 0 bis 4 ausreicht ?

lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.05.2015, 21:19
Beitrag #6
RE: Rotary Encoder zählt nicht Rückwerts
@HaWe
Danke, die Links werde ich mir mal anschauen.



@Bitklopfer
Ja, es gibt 5 Positionen, bei 0 wird nichts ausgewählt, bei 1,2,3,4 wird der jeweilige Kreis grau hinterlegt. Ich habe mal eine schnelle Zeichnug angefügt.
Aber ja, du hast recht, die Minuswerte sind eigentlich unnötig - da hatte ich wohl einen Denkfehler. Ich habe den Code mal geändert.

Immer noch das selbe Problem, wenn ich alles nach " encoder0PinALast = n;" auskommentiere kann ich drehen und er zählt richtig durch 1 - 2 - 3 - 4 - 0 und wenn ich in die andere Richtung drehe geht er einen Wert zurück.

Lasse ich den kompletten Code laufen kann ich nur vorwärts gehen, beim drehen in die andere Richtung bleibt der Wert gleich.

Code:
int val;
int encoder0PinA = 2;
int encoder0PinB = 3;
int encoder0Pos = 0;
int encoder0PinALast = LOW;
int n = LOW;

#define sclk 13  // Don't change
#define mosi 11  // Don't change
#define cs   9
#define dc   8
#define rst  7  // you can also connect this to the Arduino reset
#include <Adafruit_GFX_AS.h>    // Core graphics library
#include <Adafruit_ILI9341_AS.h> // Hardware-specific library
#include <SPI.h>
Adafruit_ILI9341_AS tft = Adafruit_ILI9341_AS(cs, dc, rst);       // Invoke custom library


void setup() {
   pinMode (encoder0PinA,INPUT);
   pinMode (encoder0PinB,INPUT);  
   attachInterrupt(0, encoder, CHANGE);
   attachInterrupt(1, encoder, CHANGE);
  
   tft.init();
   tft.setRotation(2);
   tft.fillScreen(ILI9341_WHITE);
   Serial.begin (9600);
    
}

void loop() {
  Serial.print (encoder0Pos);
     Serial.print ("/");
}

void encoder() {
    n = digitalRead(encoder0PinA);
   if ((encoder0PinALast == LOW) && (n == HIGH)) {
     if (digitalRead(encoder0PinB) == LOW) {
       encoder0Pos--;
        
     } else {
       encoder0Pos++;
      
     }
     if (encoder0Pos>4) {
        encoder0Pos=0;
          }
     if (encoder0Pos<0) {
        encoder0Pos=4;
         }
   }
  
encoder0PinALast = n;

            
   if (encoder0Pos == 0)
    {
    case_0();
    }            
   if (encoder0Pos == 1)
    {
    case_1();
    }
  if (encoder0Pos == 2)
    {
    case_2();
    }
  if (encoder0Pos == 3)
    {
     case_3();
    }
     if (encoder0Pos == 4)
    {
     case_4();
    }
    
}

void case_0() {
    tft.setTextColor(ILI9341_BLACK);
    tft.fillCircle(120, 80, 44, ILI9341_WHITE); // KREIS FÜLLEN
    tft.drawCircle(120, 80, 45, ILI9341_BLACK);    
    tft.fillCircle(60, 160, 44, ILI9341_WHITE); // KREIS FÜLLEN
    tft.drawCircle(60, 160, 45, ILI9341_BLACK);  
    tft.fillCircle(180, 160, 44, ILI9341_WHITE); // KREIS FÜLLEN
    tft.drawCircle(180, 160, 45, ILI9341_BLACK);  
    tft.fillCircle(120, 240, 44, ILI9341_WHITE); // KREIS FÜLLEN
    tft.drawCircle(120, 240, 45, ILI9341_BLACK);    
    tft.drawCentreString("Licht",120,70,4);
    tft.drawCentreString("Temp",60,150,4);
    tft.drawCentreString("?",180,150,4);
    tft.drawCentreString("C",120,230,4);    
  }

void case_1() {
    tft.setTextColor(ILI9341_BLACK);
    tft.fillCircle(120, 80, 44, ILI9341_LIGHTGREY); // KREIS FÜLLEN
    tft.drawCircle(120, 80, 45, ILI9341_BLACK);
    tft.fillCircle(60, 160, 44, ILI9341_WHITE); // KREIS FÜLLEN
    tft.drawCircle(60, 160, 45, ILI9341_BLACK);
    tft.fillCircle(180, 160, 44, ILI9341_WHITE); // KREIS FÜLLEN  
    tft.drawCircle(180, 160, 45, ILI9341_BLACK);    
    tft.drawCircle(120, 240, 45, ILI9341_BLACK);    
    tft.drawCentreString("Licht",120,70,4);
    tft.drawCentreString("Temp",60,150,4);
    tft.drawCentreString("?",180,150,4);
    tft.drawCentreString("C",120,230,4);    
  }

  
void case_2() {
    tft.setTextColor(ILI9341_BLACK);
    tft.fillCircle(120, 80, 44, ILI9341_WHITE); // KREIS FÜLLEN
    tft.drawCircle(120, 80, 45, ILI9341_BLACK);    
    tft.fillCircle(60, 160, 44, ILI9341_LIGHTGREY); // KREIS FÜLLEN
    tft.drawCircle(60, 160, 45, ILI9341_BLACK);    
    tft.drawCircle(180, 160, 45, ILI9341_BLACK);
    tft.fillCircle(120, 240, 44, ILI9341_WHITE); // KREIS FÜLLEN  
    tft.drawCircle(120, 240, 45, ILI9341_BLACK);    
    tft.drawCentreString("Licht",120,70,4);
    tft.drawCentreString("Temp",60,150,4);
    tft.drawCentreString("?",180,150,4);
    tft.drawCentreString("C",120,230,4);    
  }
  
  void case_3() {
    tft.setTextColor(ILI9341_BLACK);
    tft.drawCircle(120, 80, 45, ILI9341_BLACK);    
    tft.fillCircle(60, 160, 44, ILI9341_WHITE); // KREIS FÜLLEN
    tft.drawCircle(60, 160, 45, ILI9341_BLACK);  
    tft.fillCircle(180, 160, 44, ILI9341_WHITE); // KREIS FÜLLEN
    tft.drawCircle(180, 160, 45, ILI9341_BLACK);    
    tft.fillCircle(120, 240, 44, ILI9341_LIGHTGREY); // KREIS FÜLLEN
    tft.drawCircle(120, 240, 45, ILI9341_BLACK);    
    tft.drawCentreString("Licht",120,70,4);
    tft.drawCentreString("Temp",60,150,4);
    tft.drawCentreString("?",180,150,4);
    tft.drawCentreString("C",120,230,4);    
  }
  
  void case_4() {
    tft.setTextColor(ILI9341_BLACK);
    tft.fillCircle(120, 80, 44, ILI9341_WHITE); // KREIS FÜLLEN
    tft.drawCircle(120, 80, 45, ILI9341_BLACK);        
    tft.drawCircle(60, 160, 45, ILI9341_BLACK);  
    tft.fillCircle(180, 160, 44, ILI9341_LIGHTGREY); // KREIS FÜLLEN
    tft.drawCircle(180, 160, 45, ILI9341_BLACK);    
    tft.fillCircle(120, 240, 44, ILI9341_WHITE); // KREIS FÜLLEN
    tft.drawCircle(120, 240, 45, ILI9341_BLACK);    
    tft.drawCentreString("Licht",120,70,4);
    tft.drawCentreString("Temp",60,150,4);
    tft.drawCentreString("?",180,150,4);
    tft.drawCentreString("C",120,230,4);    
  }


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.05.2015, 06:11 (Dieser Beitrag wurde zuletzt bearbeitet: 20.05.2015 06:27 von Bitklopfer.)
Beitrag #7
RE: Rotary Encoder zählt nicht Rückwerts
(19.05.2015 21:19)elmo schrieb:  @HaWe
Danke, die Links werde ich mir mal anschauen.



@Bitklopfer
Ja, es gibt 5 Positionen, bei 0 wird nichts ausgewählt, bei 1,2,3,4 wird der jeweilige Kreis grau hinterlegt. Ich habe mal eine schnelle Zeichnug angefügt.
Aber ja, du hast recht, die Minuswerte sind eigentlich unnötig - da hatte ich wohl einen Denkfehler. Ich habe den Code mal geändert.

Immer noch das selbe Problem, wenn ich alles nach " encoder0PinALast = n;" auskommentiere kann ich drehen und er zählt richtig durch 1 - 2 - 3 - 4 - 0 und wenn ich in die andere Richtung drehe geht er einen Wert zurück.

Lasse ich den kompletten Code laufen kann ich nur vorwärts gehen, beim drehen in die andere Richtung bleibt der Wert gleich.


Moin,
wie ich sehe hast du da ein Problem mit dem Auswerten des Encoders.
Schieb doch mal die Case Auswahl auch in die Loop...dann wird der Interrupt noch schneller abgearbeitet.....und auf dem Bildschirm merkst das bestimmt nicht.
Ähm btw. warum eine 0 Auswahl mitführen wenn nur 4 Positionen da sind...eine darf da ruhig aktiviert sein....und solange man den Taster vom Encoder nicht betätigt passiert ja auch nichts.

Schau dir mal die einzelnen Seiten durch wo Google hier findet...da findest du viele Lösungen zu dem Thema. Weil ich kenne die Problematik der 2 Kanaligen Encoder zur genüge....deshalb nehme ich die 3 Kanaligen und habe damit auch das Entprellen erschlagen und dann braucht es hier nur noch 6 Zeilen Code und die Sache flutscht.

Daher würde ich dir vorschlagen das du deinen Sketch erst mal auf das auslesen des Encoders und der Anzeige per Seriellem Monitor beschränkst um die Ecke sauber austesten zu können. Hierzu nen Tipp, wenn du schon encoder0PinALast verwendest...wie ist das dann mit dem Kanal B der ja auch die Interruptroutine auslöst...Wink

Wie schon angedeutet...so ein 2 Kanailger Encoder ist ne harte Nuss... weil erstens mal 4 verschiedene Zustände richtig zu interpretieren sind und zudem die Kontakte prellen. Von daher ist deine Lösung mit dem Interrupt mit dem Parameter CHANGE schon richtig...nur muß man das dann auch vollständig richtig auswerten. In dem Fall würde es auch ganz gut funktionieren nur einen Kanal auf den Interrupt zu legen und nur auf fallende oder steigende Flanke zu triggern um dann auf den anderen Kanal zu schauen was der gerade macht was leichter zu programmieren ist und die Sache schneller macht.
Dann müßtest in der Interruptserviceroutine nur noch den Zweiten Kanal abfragen und dann bei LOW eins abziehen und bei HIGH eins dazuzählen...z.B. Weil den Status von dem ersten Kanal hast ja schon durch die Interruptbedingung fallende Flanke schon erkannt.
lg
bk

Hier habe ich noch einen gefunden:
prellende Encodersignale
stammt von dieser Seite.

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.05.2015, 19:14 (Dieser Beitrag wurde zuletzt bearbeitet: 20.05.2015 19:22 von HaWe.)
Beitrag #8
RE: Rotary Encoder zählt nicht Rückwerts
also ICH habe mit meinen Encoder-Motoren ÜBERHAUPT keine Probleme, programmiert über Timer-Interrupts. Link, wie gesagt:

http://www.mindstormsforum.de/viewtopic....667#p67186

Encoder-Timing nachträglich etwas optimiert, um auch 6 (-8) Rotationsencoder zuverlässig in Echtzeit fehlerfrei auslesen zu konnen:

Code:
#define MAXMOTORS   6

volatile int32_t    motenc[MAXMOTORS]    = {0, 0, 0, 0, 0, 0};

//********************************************************************************​****
// Encoder functions courtesy of / entnommen aus: http: //www.meinDUINO.de //
//********************************************************************************​****

// Schritt-Tabellen für 1/1, 1/2 oder 1/4-Auflösung/resolution
// 1/1 Auflösung/resolution
//int8_t schrittTab[16] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};

// 1/2 Auflösung/resolution
int8_t  schrittTab[16] = {0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 1, 0, 0, -1, 0};

// 1/4 Auflösung/resolution
//int8_t schrittTab[16] = {0,0,0,0,0,0,0,-1,0,0,0,0,0,1,0,0};



//------------------------------------------------------------------------------------
inline void Timer1_AVR_Interrupt() {

  // timer interrupt for encoder readings
  noInterrupts(); // Jetzt keine Interrupts / disable

  TIMSK1 |= (1 << OCIE1A); // Timer 1 PIDOutput Compare A Match Interrupt Enable
  TCCR1A = 0;             // "Normaler" Modus
  // WGM12: CTC-Modus einschalten (Clear Timer on Compare match)
  //        Stimmen OCR1A und Timer überein, wird der Interrupt ausgelöst
  // Bit CS12 und CS10 setzen

  // => Prescaler=8:
  TCCR1B = (1 << WGM12) | (1 << CS11); // Frequenz = 16000000 / 1024 / 15 = rd. 1042Hz = 1kHz

  // Prescaler OCR1A  einstellen:
  OCR1A = 511; // also 4kHz = alle 250µs

  interrupts(); // Interrupts wieder erlauben / enable
  //------------------------------------------------------------------------------------

}

//------------------------------------------------------------------------------------
setup() {
   //...
   Timer1_AVR_Interrupt();
   //...
   Serial.begin(115200);
}


//------------------------------------------------------------------------------------
ISR(TIMER1_COMPA_vect) {  // read encoder values

  ISRab [ 0] <<= 2;
  ISRab [ 0] &= B00001100;
  ISRab [ 0] |= (digitalRead(pinenc0A) << 1) | digitalRead(pinenc0B);
  motenc[ 0] += schrittTab[ISRab[0]];           //

  ISRab [ 1] <<= 2;
  ISRab [ 1] &= B00001100;
  ISRab [ 1] |= (digitalRead(pinenc1A) << 1) | digitalRead(pinenc1B);
  motenc[ 1] += schrittTab[ISRab[1]];           //

  ISRab [ 2] <<= 2;
  ISRab [ 2] &= B00001100;
  ISRab [ 2] |= (digitalRead(pinenc2A) << 1) | digitalRead(pinenc2B);
  motenc[ 2] += schrittTab[ISRab[2]];           //

  ISRab [ 3] <<= 2;
  ISRab [ 3] &= B00001100;
  ISRab [ 3] |= (digitalRead(pinenc3A) << 1) | digitalRead(pinenc3B);
  motenc[ 3] += schrittTab[ISRab[3]];           //

  ISRab [ 4] <<= 2;
  ISRab [ 4] &= B00001100;
  ISRab [ 4] |= (digitalRead(pinenc4A) << 1) | digitalRead(pinenc4B);
  motenc[ 4] += schrittTab[ISRab[4]];           //

  ISRab [ 5] <<= 2;
  ISRab [ 5] &= B00001100;
  ISRab [ 5] |= (digitalRead(pinenc5A) << 1) | digitalRead(pinenc5B);
  motenc[ 5] += schrittTab[ISRab[5]];           //


}




//------------------------------------------------------------------------------------
void loop() {

  while(true) {
    for(int i=0; i<MAXMOTORS; ++i) {
        Serial.print(i); Serial.print("="); Serial.print(motenc[i]); Serial.print("   ");
    }
    Serial.println();
    delay(100);
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Arduino lässt sich nicht installieren bergfrei 4 146 20.11.2016 18:34
Letzter Beitrag: bergfrei
  Arduino Mega 2560 läuft nicht Wolfgang50 6 185 13.11.2016 10:50
Letzter Beitrag: Wolfgang50
  encoder clemens5555 17 393 20.10.2016 15:48
Letzter Beitrag: hotsystems
  Ardublock übertragt nicht an IDE oder UNO R3 tobi83 5 342 16.10.2016 14:07
Letzter Beitrag: Pit
  Upload funktioniert nicht Levi 5 244 22.09.2016 20:19
Letzter Beitrag: hotsystems
  ESP8266 tuts nicht sowerum 7 395 19.09.2016 21:01
Letzter Beitrag: sowerum
  If-Bedingung funktioniert nicht bei Serial1.write Datatom 6 226 16.09.2016 20:36
Letzter Beitrag: Datatom
  SD Karte wird nicht erkannt... Maxi290997 2 207 16.08.2016 14:36
Letzter Beitrag: Maxi290997
  Arduino lässt sich nicht mehr beschreiben Maxi290997 15 981 07.08.2016 11:40
Letzter Beitrag: Maxi290997
  Arduino Uno+Motor Shield+Velleman Mustercode funktionieren nicht Dubidu 8 489 20.07.2016 19:05
Letzter Beitrag: Scheams

Gehe zu:


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