UP DOWN Counter mit Debounce

OP #2685038
Lesenswert?

Hallo Forum
 Mein Promlem ist ein nicht funktionierender Counter, der unkontrolliert 
Rauf oder Runter zählt. Ein normaler code in dem selbstständig alle 
zahlen durchlaufen funktioniert.wenn ich aber mit den taster rauf oder 
runter switche springt er von eins auf drei oder vier, schaltet nicht 
runter oder reagiert überhaupt nicht!!
Fehler im Code oder Defektes board?
Hier mal mein Code:

#define BUTTON_DOWN 10
#define BUTTON_UP 12
#define BUTTON_RE 11

int ledPinA =  2;
int ledPinB =  3;
int ledPinC =  4;
int ledPinD =  5;
int ledPinE =  6;
int ledPinF =  7;
int ledPinG =  8;
int ledPinDP =  9;

int gear_down = 0;
int old_gear_down = 0;
int gear_up = 0;
int old_gear_up = 0;
int state = 0;
int gear = 1;
int RE = 1;
int old_RE = 0;

void setup()   {
  pinMode(BUTTON_DOWN, INPUT);
  pinMode(BUTTON_UP, INPUT);
  pinMode(BUTTON_RE,INPUT);

  pinMode(ledPinA, OUTPUT);
  pinMode(ledPinB, OUTPUT);
  pinMode(ledPinC, OUTPUT);
  pinMode(ledPinD, OUTPUT);
  pinMode(ledPinE, OUTPUT);
  pinMode(ledPinF, OUTPUT);
  pinMode(ledPinG, OUTPUT);
  pinMode(ledPinDP, OUTPUT);


  Serial.begin(9600);
}

void led0()
{
  digitalWrite(ledPinA, LOW);
  digitalWrite(ledPinB, LOW);
  digitalWrite(ledPinC, LOW);
  digitalWrite(ledPinD, LOW);
  digitalWrite(ledPinE, LOW);
  digitalWrite(ledPinF, LOW);
  digitalWrite(ledPinG, HIGH);
  digitalWrite(ledPinDP, HIGH);
}

void led1()
{
  digitalWrite(ledPinA, HIGH);
  digitalWrite(ledPinB, LOW);
  digitalWrite(ledPinC, LOW);
  digitalWrite(ledPinD, HIGH);
  digitalWrite(ledPinE, HIGH);
  digitalWrite(ledPinF, HIGH);
  digitalWrite(ledPinG, HIGH);
  digitalWrite(ledPinDP, LOW);
}

void led2()
{
  digitalWrite(ledPinA, LOW);
  digitalWrite(ledPinB, LOW);
  digitalWrite(ledPinC, HIGH);
  digitalWrite(ledPinD, LOW);
  digitalWrite(ledPinE, LOW);
  digitalWrite(ledPinF, HIGH);
  digitalWrite(ledPinG, LOW);
  digitalWrite(ledPinDP, HIGH);
}

void led3()
{
  digitalWrite(ledPinA, LOW);
  digitalWrite(ledPinB, LOW);
  digitalWrite(ledPinC, LOW);
  digitalWrite(ledPinD, LOW);
  digitalWrite(ledPinE, HIGH);
  digitalWrite(ledPinF, HIGH);
  digitalWrite(ledPinG, LOW);
  digitalWrite(ledPinDP, HIGH);
}

void led4()
{
  digitalWrite(ledPinA, HIGH);
  digitalWrite(ledPinB, LOW);
  digitalWrite(ledPinC, LOW);
  digitalWrite(ledPinD, HIGH);
  digitalWrite(ledPinE, HIGH);
  digitalWrite(ledPinF, LOW);
  digitalWrite(ledPinG, LOW);
  digitalWrite(ledPinDP, HIGH);
}

void led5()
{
  digitalWrite(ledPinA, LOW);
  digitalWrite(ledPinB, HIGH);
  digitalWrite(ledPinC, LOW);
  digitalWrite(ledPinD, LOW);
  digitalWrite(ledPinE, HIGH);
  digitalWrite(ledPinF, LOW);
  digitalWrite(ledPinG, LOW);
  digitalWrite(ledPinDP, HIGH);
}

void led6()
{
  digitalWrite(ledPinA, LOW);
  digitalWrite(ledPinB, HIGH);
  digitalWrite(ledPinC, LOW);
  digitalWrite(ledPinD, LOW);
  digitalWrite(ledPinE, LOW);
  digitalWrite(ledPinF, LOW);
  digitalWrite(ledPinG, LOW);
  digitalWrite(ledPinDP, HIGH);
}

void led7()
{
  digitalWrite(ledPinA, LOW);
  digitalWrite(ledPinB, LOW);
  digitalWrite(ledPinC, LOW);
  digitalWrite(ledPinD, HIGH);
  digitalWrite(ledPinE, HIGH);
  digitalWrite(ledPinF, HIGH);
  digitalWrite(ledPinG, HIGH);
  digitalWrite(ledPinDP, HIGH);
}

void led8()
{
  digitalWrite(ledPinA, LOW);
  digitalWrite(ledPinB, LOW);
  digitalWrite(ledPinC, LOW);
  digitalWrite(ledPinD, LOW);
  digitalWrite(ledPinE, LOW);
  digitalWrite(ledPinF, LOW);
  digitalWrite(ledPinG, LOW);
  digitalWrite(ledPinDP, HIGH);
}

void led9()
{
  digitalWrite(ledPinA, LOW);
  digitalWrite(ledPinB, LOW);
  digitalWrite(ledPinC, LOW);
  digitalWrite(ledPinD, LOW);
  digitalWrite(ledPinE, HIGH);
  digitalWrite(ledPinF, LOW);
  digitalWrite(ledPinG, LOW);
  digitalWrite(ledPinDP, HIGH);
}

void ledDP()
{
  digitalWrite(ledPinA, HIGH);
  digitalWrite(ledPinB, HIGH);
  digitalWrite(ledPinC, HIGH);
  digitalWrite(ledPinD, HIGH);
  digitalWrite(ledPinE, HIGH);
  digitalWrite(ledPinF, HIGH);
  digitalWrite(ledPinG, HIGH);
  digitalWrite(ledPinDP, LOW);
}

void ledRE()
{
  digitalWrite(ledPinA, HIGH);
  digitalWrite(ledPinB, HIGH);
  digitalWrite(ledPinC, HIGH);
  digitalWrite(ledPinD, HIGH);
  digitalWrite(ledPinE, LOW);
  digitalWrite(ledPinF, HIGH);
  digitalWrite(ledPinG, LOW);
  digitalWrite(ledPinDP, LOW);
}

void setLed(int number)
{
  switch (number) {
    case 0:
      ledDP();
      break;
    case 1:
      led1();
      break;
    case 2:
      led2();
      break;
    case 3:
      led3();
      break;
    case 4:
      led4();
      break;
    case 5:
      led5();
      break;
    case 6:
      led6();
      break;
    case 7:
      led7();
      break;
    case 8:
      led8();
      break;
    case 9:
      led9();
      break;
  }
}


void oldloop()
{
  ledDP();
  delay(1000);
  led0();
  delay(1000);
  led1();
  delay(1000);
  led2();
  delay(1000);
  led3();
  delay(1000);
  led4();
  delay(1000);
  led5();
  delay(1000);
  led6();
  delay(1000);
  led7();
  delay(1000);
  led8();
  delay(1000);
  led9();
  delay(1000);
}

void loop()
{
    gear_up = digitalRead(BUTTON_UP);
    if ((gear_up == HIGH) && (old_gear_up == LOW)) {
      gear += 1;
      Serial.print("gear number:  ");
      Serial.println(gear, DEC);
      delay(100);
    }
    old_gear_up = gear_up;

    gear_down = digitalRead(BUTTON_DOWN);
    if ((gear_down == HIGH) && (old_gear_down == LOW)) {
      gear -= 1;
      Serial.print("gear number:  ");
      Serial.println(gear, DEC);
      delay(100);
    }
    old_gear_down = gear_down;

    if (gear >= 6) {
      gear = 6;
    }
    if (gear <= 1) {
      gear = 1;
    }

   {
    RE = digitalRead(RE);
    if ((RE == HIGH) && (old_RE == LOW)) {
      gear = RE;
      Serial.print("gear number:  ");
      Serial.println(gear, DEC);
      delay(100);
    }
    }
    setLed(gear);
}



Bitte um Hilfe
#2685071
Lesenswert?

Vielleicht zeigst du mal einen Schaltplan ?
Wie sind die Taster angeschlossen ? Active-Low mit externen Pullups ? 
Die internen Pullups werden, soweit ich das sehen, nicht genutzt.

Lass dir nicht alles aus der Nase ziehen.

Edit: Sry habe gerade gesehen, das die Taster auf High geprüft werden. 
Trotzdem bleibt die Frage wie sie angeschlossen sind.
#2685111
Lesenswert?

Robert Buchmayer schrieb:
> das ist der Schaltplan
>
> Die 7 Segment anzeigen ist mit 150ohm Wiederstande angeschlossen
> und die Taster mit 5V and Den Eingängen Pin10 und 12

Da hätten wir zumindest ein Problem. Wenn der Taster nicht gedrückt ist, 
hängt der entsprechende Eingang in der Luft und kann alle möglichen 
Werte annehmen.
Besser ist es den Taster an GND zu legen und mit den internen Pullups 
den Eingang auf einen definierten Wert setzen (=> Siehe Arduino Site). 
Dann überprüft man ob der Taster gedrückt wurde, in dem man auf LOW 
testet.


http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Taster_und_Schalter
http://www.mikrocontroller.net/articles/Entprellung

Insgesamt würde das gesamte AVR bzw AVR-GCC Tutorial dieser Site dir 
sehr helfen.

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