HILFE Switch Case mit Unterprogramm

Moin Moin,

Die Noobs aus der E-Technik hier.

Folgendes Problem, wenn wir bei unserer Switch Case Funktion zu Case 1 kommen, fängt unser Counter perfekt anzuzählen.

Drücken wir erneut den Taster springt er aber nicht zu Case 2 sondern geht komplett aus.

Ersetzetn wir das ausgabe(); durch ein Bitmuster funktioniert die ganze Switch Case funktion ohne probleme

HILFEEEEE!

int i;
int statustaster =  0 ;
byte einer = 0;
byte zehner = 0;
byte hunderter = 0;
unsigned long previousMicros = 0;
unsigned long currentMicros;
int Seg7[]                                        //Array für 7-Seg Anzeige
{
  0b00111111,  //0
  0b00000110,  //1
  0b01011011,  //2
  0b01001111,  //3
  0b01100110,  //4
  0b01101101,  //5
  0b01111101,  //6
  0b00000111,  //7
  0b01111111,  //8
  0b01101111   //9 
};

void setup() 
{
  for(i=0; i<12; i++)                             //Millisekunden werden an Pin 0-11 über 7-Seg Anzeige ausgegeben
  {
    pinMode(i, OUTPUT);
    digitalWrite(i, OUTPUT);
  }

  for(i=12; i<13; i++)                            //Stoptaster wird an Pin 12 eingelesen
  {
    digitalWrite (i, INPUT_PULLUP);
  }

  digitalWrite(9, INPUT);                         //7-Seg Anzeige Ground wird als Eingang geschaltet
  digitalWrite(10, INPUT);
  digitalWrite(11, INPUT);
}

void loop() 
{
    currentMicros = micros();
  
    if(currentMicros - previousMicros >=999)       //Wartet bis Micros bei 1000 (bzw. 999) ist
    {
    previousMicros = currentMicros;
    einer++;                                     //Wenn Micros 1000 erreicht hat wird 1 hochgezählt
    }
  
    if (einer > 9)                                 //Wenn einer Stelle bei 9 ist, wird zehner 1 hochgezählt -> einer reset
    {
    einer = 0;
    zehner++;
    }
  
    if(zehner > 9)                                 //Wenn zehner Stelle bei 9 ist, wird hunderter 1 hochgezählt -> zehner reset
    {
      zehner = 0;
      hunderter++;
    }
  
    if(hunderter > 9)                             //Wenn hunderter Stelle bei 9 ist, wird hunderter resetet -> alles 0 
    {
      hunderter = 0;
    }
    if (digitalRead(12) == LOW)
    {
      statustaster++;
      delay(500);
    }
   switch (statustaster) 
    {
    case 0:
      PORTD = 0b00111111; 
      break;
    case 1:
     ausgabe(); 
      //PORTD = 0b00000110;
      break;
    case 2:
      PORTD = 0b01011011;
      break;
    default :
      statustaster = 0;
      break;
   
    }
           

}
void ausgabe()
{
  digitalWrite(9,0);                           //Pin 9 aus
    PORTD = Seg7[einer];                       //Setzt "einer Counter" an Pin 9
    //delay(1);
  digitalWrite(9,1);                           //Pin 9 an                                         
  digitalWrite(10,0);
    PORTD = Seg7[zehner];
    //delay(1);
  digitalWrite(10,1);
  digitalWrite(11,0);
    PORTD = Seg7[hunderter];
   // delay(1);
  digitalWrite(11,1);
 
}

Millisekunden_test.ino (2.46 KB)

Wie hast du deinen Taster entprellt ?

delay(500);

das klappt auch Prima, solange da nicht ausgabe(); drin steht.

CLOSED Selber geschafft

Jetzt würde es mich aber interessieren, was an

void ausgabe () {
...
}

falsch war ...

for(i=12; i<13; i++)                            //Stoptaster wird an Pin 12 eingelesen
  {
    digitalWrite (i, INPUT_PULLUP);
  }

Das for ist gänzlich nutzlos darum eliminiere es.

Die Pins 0 und 1 werden von der seriellen Schnittstelle und vom Upload verwendet. Das kann Probleme beim Upload bzw wenn Du die Serielle Schnittstelle verwenden willst.
Grüße Uwe

Bitte verwende für deinen Sketch die Code-Tags, so wie es Uwe für dich schon gemacht hat.
Dann wird dieser besser lesbar.

:slight_smile:

Hi

Darf man fragen, wie?

MfG

postmaster-ino Du wirst keine Antwort mehr bekommen. Ich habe Lattek gebannt.
Grüße Uwe

Hi

Hatte ich im anderen Thread mit bekommen - soll wohl so sein.

MfG