Inkrementalgeber mit Arduino nano

Hallo,

der Code wertet keine Flanken aus sondern den Pegelwechsel (change). Würde mit Flanken jedoch auch nicht funktionieren.

if(digitalRead(2) != digitalRead(3))   // A und B Signal des Inkrementalgebers vergleichen
    zaehler++;                           // wenn A und B ungleich ist, Wert um 1 erhöhen
  else
    zaehler--;

Was soll diese Auswertung anderes machen als das?

Pegel.png

Pegel.png

der Code wertet keine Flanken aus sondern den Pegelwechsel (change). Würde mit Flanken jedoch auch nicht funktionieren.

Siehe:

attachInterrupt(digitalPinToInterrupt(2), encoder_interrupt, CHANGE); //Interruptprogramm erstellen
Bei jeder Flanke werden die Pegel ausgewertet!

combie:
Siehe:

attachInterrupt(digitalPinToInterrupt(2), encoder_interrupt, CHANGE); //Interruptprogramm erstellen
Bei jeder Flanke werden die Pegel ausgewertet!

hab ich doch geschrieben

Edit: Außerdem war die Frage warum der Code etwas anderes machen soll wie gezeigt?

keine Flanken aus sondern den Pegelwechsel (change)

Ein Pegelwechsel hat zwangsläufig eine Flanke zur Folge!
Von daher kann man sagen, dass ein Flankenwechsel ein Pegelwechsel ist.

Ich sehe da keinen Grund für das Wort "sondern"

Es gibt sogar einen Zustand!
Nicht so einen expliziten, der einem/dir ins Auge fällt...
Aber einen impliziten!

Denn, nach einer fallenden Flanke kann immer nur eine steigende kommen.
Und umgekehrt.

Ist das der nötige Merker, welchen du suchst?

Es gibt immer irgendeinen Pegelwechsel. Egal welcher.
Du kannst darauf rumreiten wie lustig bist, es beantwortet nicht meine Frage.
Was soll diese Auswertung anderes machen als das?
Pegel.png

Pegel.png

Pegel.png

Dein Bild ist goldrichtig!
(sonst hätte ich schon längst dran rum gemosert)

Es entspricht genau dem, was passiert!

Wieso siehst du das in deinem eigenen Bild nicht?
:o :o :o

Hi

postmaster-ino:
Hi
...
Drehgeber#Warum_Sparvarianten_nicht_gut_sind, mc.net

Warum spielst Du dieses Beispiel nicht auf Deinen Arduino auf, prömpelst zwei Taster dran und schaust, was passiert?
(Ein Encoder ginge hier natürlich auch)

MfG

Och Scheiße.
Ich nehme alles zurück und behaupte das Gegenteil. :wink:
Ich habe immer nur die Auswertung betrachtet und dabei völlig außer acht gelassen das in die ISR immer beim gleichen Pin gesprungen wird. Aus unbekannten Grund dachte ich er springt immer in die ISR wenn sich einer von beiden ändert.

Entschuldigung! :confused:

Um alles weitere zu klären wäre es hilfreich wenn mich3499 seine Terminalausgabe zeigt bzw. den Sprung von Rastung zu Rastung wenn er eine Rastung hat. Bzw. näher erklärt was ihm am zählen stört.

Bzw. näher erklärt was am zählen falsch ist.

Er triggert nur auf einem Kanal.
Darum verliert er die Flanken des anderen Kanals.

Also zählt der Geber nur die Hälfte.

ungetestet, also ohne jede Gewähr

volatile int zaehler = 0;
void setup()
{
 Serial.begin(9600);                                        
  pinMode(3, INPUT);      //Pin 3 als Eingang
  pinMode(2, INPUT);      //Pin 2 als Eingang
  attachInterrupt(digitalPinToInterrupt(2), encoder_interrupt_A, CHANGE);   //Interruptprogramm erstellen
  attachInterrupt(digitalPinToInterrupt(3), encoder_interrupt_B, CHANGE);   //Interruptprogramm erstellen
}

void loop() 
{
  Serial.println(zaehler, DEC);
  delay(250);
}

void encoder_interrupt_A()
{
  zaehler += (digitalRead(2) != digitalRead(3))?+1:-1;
}
void encoder_interrupt_B()
{
  zaehler += (digitalRead(2) == digitalRead(3))?+1:-1;
}

@combie

Vielen Dank :). Dein letzter Sketch macht genau das, was ich wollte. Jetzt zählt er bei jedem klick des Encoders und nicht bei jedem zweiten wie vorher.

Was genau bedeutet der "?+1:-1" Befehl? Ist das "?" der vorherige Wert? Wenn ja, woher bekommt er den?

mich3499:
@combie

Vielen Dank :). Dein letzter Sketch macht genau das, was ich wollte. Jetzt zählt er bei jedem klick des Encoders und nicht bei jedem zweiten wie vorher.

Was genau bedeutet der "?+1:-1" Befehl? Ist das "?" der vorherige Wert? Wenn ja, woher bekommt er den?

Das ist der "c++ ternary operator" oder auch "c++ conditional operator" genannt

Hi

Oder etwas anfängerfreundlicher: IF
Der Ausdruck vor dem ? ist die Bedingung, wenn Diese wahr ist, wird der Wert hinter dem ? weiter gegeben, sonst der Wert hinter der :.
In der Zuweisung 'zaehler+= '
wird geprüft, ob digitalRead(2)==digitalRead(3) ist, wenn JA, wird +1, sonst -1 zurück gegen.

Und bei zaehler+=-1 wird Minus Eins addiert, oder eben Eins suptrahiert.

MfG

Vielen Dank postmaster-ino,
jetzt habe ich es verstanden. Vorher trotz google war es ein böhmisches Dorf.

Daumen hoch