Forum: Mikrocontroller und Digitale Elektronik UP DOWN Counter mit Debounce


von Robert B. (robert3111)


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

von Stefan H. (stefan_h16)


Lesenswert?

Anscheinend verwendest du einen Arduino, aber bitte drücke dich klarer 
aus:
Was hast du den wie an welchem Board angeschlossen und was willst du 
genau erreichen ?

von Robert B. (robert3111)


Lesenswert?

Ich verwende ein Arduino Nano 3.0
Es soll wie eine Ganganzeige funktionieren, einmal Taster betätigen eine 
Zahl rauf und umgekehrt.

von Stefan H. (stefan_h16)


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.

von Robert B. (robert3111)


Angehängte Dateien:

Lesenswert?

neues bild

von Stefan H. (stefan_h16)


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.

von Robert B. (robert3111)


Lesenswert?

OK danke werde ich morgen gleich mal testen,
Hast du sonst im Code einen Fehler gesehen

von Robert B. (robert3111)


Angehängte Dateien:

Lesenswert?

würde es so auch funktionieren?

von Karl H. (kbuchegg)


Lesenswert?

Ja, würde es.
Aber wozu willst 2 Widerstände verbauen, wenn du die im µC schon 
eingebaut hast und nur einschalten musst?

von Stefan H. (stefan_h16)


Lesenswert?

Robert Buchmayer schrieb:
> würde es so auch funktionieren?

Man kann auf den Bildern die Beschriftung kaum erkennen. Wenn beide 
Widerstände an GND und die Taster an 5V hängen sollte es wohl auch 
gehen.

von Robert B. (robert3111)


Lesenswert?

Hat wunderbar funktioniert mit den Pullups.
Danke Leute!!!!!!!!!!

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.