Forum: Mikrocontroller und Digitale Elektronik Inkremantalgeber STEC12E08


von Marcel S. (marcel_s)


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--;
}

von Marcel S. (marcel_s)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.