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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.