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--; }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.