Go Down

Topic: Zähler mit 7 Segment Anzeige, Flankensteuerung funktioniert nicht (Read 1 time) previous topic - next topic

Shaft

Hallo, ich habe ein Programm geschrieben, das auf einer 7Segmentanzeige darstellen soll, wie viele Werkstücke in der Anlage sind. Die Lichtschranken, die ich auf die PINs 5 und 6 gelegt habe zählen die eingegangenen Werkstücke(PIN 5) und die wiederausgegebenen Werkstücke(PIN 6).
Es wird up und down gezählt (Variable I), es können sich maximal 3 Werkstücke in der Anlage befinden. Bei allem was also nicht 0,1,2 oder 3 ist, soll die 7segment anzeige E für error anzeigen.
Bei der 7 segment anzeige ist a oben, b oben rechts, c unten rechts, d unten, e unten links, f oben links, und g in der Mitte.

Das ist mein Code, das Problem ist, dass der immer nur einmal hoch oder runterzählt, meistens kann man einmal hoch und einmal runterzählen. und dann geht nichts mehr.

const int a=7;
const int b=8;
const int c=9;
const int d=10;
const int e=11;
const int f=12;
const int g=13;
const int up=5;
const int down=6;

int i=0; //Variable to count(I=1->7segment shows 1, I=2->7segment shows 2, I=3->7segment shows 3, I>3->7segment shows E
int stateup=0;
int statedown=0;

int flankenmerkerup=0;
int hilfsmerkerup=0;

int flankenmerkerdown=0;
int hilfsmerkerdown=0;

void setup ()
{
pinMode (a,OUTPUT);
pinMode (b,OUTPUT);
pinMode (c,OUTPUT);
pinMode (d,OUTPUT);
pinMode (e,OUTPUT);
pinMode (f,OUTPUT);
pinMode (g,OUTPUT);
pinMode (hoch,INPUT);
pinMode (runter,INPUT);
}

void loop()
{
stateup=digitalRead(up);

flankenmerkerup = stateup && !hilfsmerkerup;
hilfsmerkerup = stateup;

staterdown=digitalRead(down);
flankenmerkerdown = statedown && !hilfsmerkerdown;
hilfsmerkerdown = statedown;

if (flankenmerkerup==HIGH)
{
i++;
}
if (flankenmerkerdown==HIGH)
{
i--;
}
if (i==0)
{
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,HIGH);

}
else
{
if (i==1)
{
digitalWrite(a,HIGH);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);

}
else
{
if (i==2)
{
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,HIGH);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,HIGH);
digitalWrite(g,LOW);

}
else
{
if (i==3)
{
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,LOW);

}
else
{
digitalWrite(a,LOW);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);

}
}
}
}
}

Kann es was mit Entprellung zu tun haben, da ich zurzeit Taster als Simulation der Lichtschranken verwende. Wenn ja wie kann ich das beheben?

volvodani

#1
Mar 02, 2011, 10:28 pm Last Edit: Mar 02, 2011, 10:34 pm by volvodani Reason: 1
Was willst du den mit folgenden Zeilen bewirken eine Zuordnung und dazu noch eine && Verknüpfung passt nicht so ganz.
Man sollte diese Voraussetzungen man in eine If-Condition bringen
Quote

flankenmerkerup = stateup && !hilfsmerkerup;
hilfsmerkerup = stateup;

staterdown=digitalRead(down);
flankenmerkerdown = statedown && !hilfsmerkerdown;
hilfsmerkerdown = statedown;



Wenn es um Erkennung der Flanken beim wechseln der Zustände der Lichtschranken geht würde ich es eher mit den Interrupts arbeiten da diese Souverän die Flanken erkennt.
Genaueres unter:
http://arduino.cc/en/Reference/AttachInterrupt
Damit wirst du auf jeden Fall die Flanken erkennen. Und bei deinem Testaufbau kann es natürlich durch prellen der Taster kommen das du nicht alles gewünscht simulieren kannst.
So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Go Up