Inkremantalgeber STEC12E08

OP #3178812
Lesenswert?

Hallo,

ich habe ein Programm geschrieben das den Inkremantalgeber STEC12E08 von 
Alps auslesen soll. Es verwendet eine Array als Statemachine.
Der es funktioniert teilweise. Der Zähler "ink_count" wird hochgezählt 
aber er schwankt immer um Plus Minus 1 ohne das ich was mache selbst 
wenn der Geber nicht angeschlossen ist.

Hier ist der Code den ich mir ausgedacht habe:



// Inkremantalgeber Auswertung (Reichelt: ALPS STEC12E08)

#define bit7 7
#define bit6 6
#define bit5 5
#define bit4 4
#define bit3 3
#define bit2 2
#define bit1 1
#define bit0 0

int inkPin50 = 50;
int inkPin51 = 51;

volatile int ink_count = 0;
char state =6 ;
char oldState=6;
// Anfangszustand

// State-Machine Automatentabelle
// der Ist-State (Zustand) steht in der [Klammer] hinter machine
// die Zustände in die vom Ist-State gesprungen werden kann
// stehen hinter der Klammer.

char machine[7][4] = {
                        { 0, 0, 1, 2 },     // Ist-State 0
                        { 0, 1, 1, 3 },     // Ist-State 1
                        { 0, 2, 2, 5 },     // Ist-State 2
                        { 1, 3, 3, 4 },     // Ist-State 3
                        { 2, 2, 2, 2 },     // Ist-State 4
                        { 3, 3, 3, 3 },     // Ist-State 5
                        { 0, 1, 2, 3 },     // Ist-State 6
                      };

void setup(){
  pinMode(inkPin50, INPUT);                 // konfiguriert Pin als 
Input
  pinMode(inkPin51, INPUT);                 // konfiguriert Pin als 
Input
  digitalWrite(inkPin50, HIGH);             // schaltet internen Pull Up 
Widerstand ein
  digitalWrite(inkPin51, HIGH);             // schaltet internen Pull Up 
Widerstand ein
  Serial.begin(9600);                       // Serielle Schnittstelle 
konfigurieren

}

void loop(){
  inkrementalgeber();
  if (state!=oldState)
  {
   // Serial.println("\nInk_Counter =");
    Serial.println(ink_count);
  }
}

int inkrementalgeber(){
   // inkPin51 wird nach links geschoben und mit inkPin50 oder verknüpft
   // so das inkPin51 bit 1 und inkPin50 bit 0 der Variable den nächsten
   // State bestimmen
   int condition = (digitalRead(inkPin51) << bit1) | (digitalRead
   (inkPin50) << bit0);     condition ist

  // Der Aktuelle State und die Condition bestimmen den nächsten State
  state = machine[state][condition];

  // Der ink_counter wird im State 4 um eins erhöht
  if(state == 4) ink_count++;

  // Der ink_counter wird im State 5 um eins erniedrigt
  if(state == 5) ink_count--;
}
OP #3179795
Lesenswert?

Ich hab meinen Fehler gefunden, jetzt funktioniert es.

char machine[7][4] = {
                        { 0, 1, 2, 0 },     // Ist-State 0
                        { 0, 1, 1, 3 },     // Ist-State 1
                        { 0, 2, 2, 5 },     // Ist-State 2
                        { 3, 1, 4, 3 },     // Ist-State 3
                        { 2, 2, 2, 2 },     // Ist-State 4
                        { 3, 3, 3, 3 },     // Ist-State 5
                        { 0, 1, 2, 3 },     // Ist-State 6
                      };

ich hatte bei den neuen States einen Fehler gemacht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren