Проблема с funktion в loop

cheshire
cheshire аватар
Offline
Зарегистрирован: 11.07.2014

Работаю над одной программой и все вроде бы хорошо, но вот наткнулся на одну проблему и с места сдвинутся не могу.
В общем, моя проблема в том, что когда я в loop  начинаю функ. она делает не все что должна.

Код функции:

gang_s umschaltfkt( gang_s j[], gang_s n[], gang_s w[], int t, int tol ) //Funktion zum Umschalten zwischen den Gängen
{
  lcd.clear();
  int pwma;          //Wert für Ua Ausgabe
  int pwmw;          //Wert für Uw Ausgabe
  int time;          //Wert für Delay 
  int tabs;          //Wert für Delayberechnung 
  gang_s soll;
  int a;             //Wert für Umschaltung zwischen jetzt.gUa und neutral.gUa
  int d;
  int b;             //Werte zum Erkennen im welchen Uw sich der jetztige und gewünschte Gang befinden
  int c;                          
  int e;
  int f;
  int x;
  int y;
  soll.gUw = (w[20].gUw + ((w[20].gUw * tol)/100));
  soll.gUa = (w[20].gUa + ((w[20].gUa * tol)/100));
  for( b = 0; b < 20; b++ ){        // Es wird erkannt im welchen Uw bereich der jetzige Gang ist
    for(x = 0; x < 20; x++){
      c++;
      if(j[b].gUw == n[x].gUw){
        break;
      } 
    }
  }
  for( d = 0; d < 20; d++ ){         // Es wird erkannt im welchen Uw bereich der gewünschte Gang ist      
    for(y = 0; y <20; y++){
      if(w[d].gUw == n[y].gUw){
        e++;
        break;
      } 
    }
  }
  tabs = c - e;                     // Es wird berechnet wieviele Schritte zwischen Uwjetzt und Uwsoll sind 
  time = ( t/(abs(tabs)+42));       // Es wird berechnet wie lang das Delay sein muss 
  if (j[20].gUa != n[20].gUa){      // Wenn Uajetzt größer als Uaneutral ist:
    for( a = 20; a > 0; a--)
    {
      pwma = (((j[a].gUa)>>4)-(j[a].gUa>>7)-(j[a].gUa>>8));      // PWM Signal für Ua wird berechnet
      pwma = (pwma + ((pwma * tol)/100));                        // Die Toleranz wird dazugerechnet
      pwmw = (((j[a].gUw)>>4)-(j[a].gUw>>7)-(j[a].gUw>>8));      // PWM Signal für Uw wird berechnet
      pwmw = (pwmw + ((pwmw * tol)/100));                        // Die Toleranz wird dazugerechnet
      
      lcd.setCursor(0, 0);
      lcd.print((j[a].gUw + ((j[a].gUw*tol)/100)));              // Uw auf dem Display angezeigt
      lcd.setCursor(0,1);
      lcd.print((j[a].gUa + ((j[a].gUa*tol)/100)));              // Ua auf dem Display angezeigt
      analogWrite(uaPinPWM, pwma);                               // PWM Signal ausgegeben
      analogWrite(uwPinPWM, pwmw);
      delay(time);                                              
    }
  }

  if( c > e){                                                    // Wenn das Uwjetzt > Uwsoll ist
    do{                                                          // Wird
      pwmw = (((n[c].gUw)>>4)-(n[c].gUw>>7)-(n[c].gUw>>8));      // PWM Signal für Uw wird berechnet
      pwmw = (pwmw + ((pwmw * tol)/100));                        // Die Toleranz wird dazugerechnet
      pwma = (((n[c].gUa)>>4)-(n[c].gUa>>7)-(n[c].gUa>>8));      // PWM Signal für Ua wird berechnet
      pwma = (pwma + ((pwma * tol)/100));                        // Die Toleranz wird dazugerechnet
      
      lcd.setCursor(0, 0);
      lcd.print((n[c].gUw + ((n[c].gUw*tol)/100)));              // Uw auf dem Display angezeigt
      lcd.setCursor(0, 1);
      lcd.print((n[c].gUa + ((n[c].gUa*tol)/100)));              // Uw auf dem Display angezeigt
      analogWrite(uwPinPWM, pwmw);                               // PWM Signal ausgegeben
      analogWrite(uaPinPWM, pwma);
      c--;                                                       // Der nächste Wert ausgewählt
    } 
    while(n[c].gUw > n[e].gUw) ;                                 // Solange Uwsoll nicht erreicht wird
  }
  else if (e > c){                                               // Wenn das Uwjetzt < Uwsoll ist
    do{                                                          // Wird
      pwmw = (((n[c].gUw)>>4)-(n[c].gUw>>7)-(n[c].gUw>>8));      // PWM Signal für Uw berechnet
      pwmw = (pwmw + ((pwmw * tol)/100));                        // Die Toleranz wird dazugerechnet
      pwma = (((n[c].gUa)>>4)-(n[c].gUa>>7)-(n[c].gUa>>8));      // PWM Signal für Uw berechnet
      pwma = (pwma + ((pwma * tol)/100));                        // Die Toleranz wird dazugerechnet
      
      lcd.setCursor(0, 0);
      lcd.print((n[c].gUw + ((n[c].gUw*tol)/100)));              // Uw auf dem Display angezeigt
      lcd.setCursor(0,1);
      lcd.print((n[c].gUa + ((n[c].gUa*tol)/100)));              // Ua auf dem Display angezeigt
      analogWrite(uwPinPWM, pwmw);                               // PWM Signal ausgegeben
      analogWrite(uaPinPWM, pwma);
      c++;                                                       // Der nächste Wert ausgewählt
    } 
    while(n[e].gUw > n[c].gUw) ;                                 // Solange Uwsoll nicht erreicht wird
  }  
  for( d = 0; d < 20; d++){
    pwma = (((w[d].gUa)>>4)-(w[d].gUa>>7)-(w[d].gUa>>8));        // Der PWM Signal für Ua wird berechnet
    pwma = (pwma + ((pwma * tol)/100));                          // Die Toleranz wird dazugerechnet
    pwmw = (((w[d].gUw)>>4)-(w[d].gUw>>7)-(w[d].gUw>>8));        // Der PWM Signal für Uw wird berechnet
    pwmw = (pwmw + ((pwmw * tol)/100));                          // Die Toleranz wird dazugerechnet
    
    lcd.setCursor(0, 0);
    lcd.print(w[d].gUw);                                         // Uw auf dem Display anzeigen
    lcd.setCursor(0,1);
    lcd.print(w[d].gUa);                                         // Ua auf dem Display anzeigen
    analogWrite(uaPinPWM, pwma);                                 // PWM Signal wird ausgeben
    analogWrite(uwPinPWM, pwmw);
    delay(time);
  }
  A=0;
  return soll;                                                  // Der gewünschte Wert ist die Rückgabe
}

 

По плану тут на LCD должно было показывать как меняются числа, но в итоге на LCD появляется только последнее число. Знатоки, внимание вопрос: почему это так???
Уже замучился с этой тупостю и не могу никак продвинутся. помогите пожалуйста

Вот полный код:


#include <LiquidCrystal.h>
/*
 * LCD RS mit Pin 12 verbinden
 * LCD Enable mit Pin 11 verbinden
 * LCD D4 Pin mit 5 verbinden
 * LCD D5 Pin mit 4 verbinden
 * LCD D6 Pin mit 3 verbinden
 * LCD D7 Pin mit 2 verbinden
 */
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const int buttonPinLeft = 13;         // Up button
const int buttonPinRight = 8;         // Down button
const int buttonPinEsc = 7;           // Esc button
const int buttonPinEnter = 6;         // Enter button
int uwPinPWM = 10;                    // Pin für PWM ausgabe
int uaPinPWM = 9;                     // Pin für PWM ausgabe
int lastButtonPushed = 0;             // Für debounce
int lastButtonEnterState = LOW;       // Für Tastensteuerung
int lastButtonEscState = LOW;         // Für Tastensteuerung
int lastButtonLeftState = LOW;        // Für Tastensteuerung
int lastButtonRightState = LOW;       // Für Tastensteuerung
long lastEnterDebounceTime = 0;       // Für debounce
long lastEscDebounceTime = 0;         // Für debounce
long lastLeftDebounceTime = 0;        // Für debounce
long lastRightDebounceTime = 0;       // Für debounce
long debounceDelay = 150;             // Für debounce
int A = 0;                               // Wert für Menü
int reading;                          // Für debounce
int toleranz = 0;                         // Wert für Toleranz
int schaltzeit = 100;                       // Wert für die Zeit
int gang = 0;                             // Wert für den Gang
int pwmUa;                            // Wert für Ua Signal
int pwmUw;                            // Wert für Uw Signal

#define MAXSIZE 21


typedef struct                        // Struktur von einem Messwert
{                                     // Uw und Ua sind gespeichert
  unsigned int gUw;                   
  unsigned int gUa;
} 
gang_s;

gang_s jetzt = {                //Werte für den Gang am Anfang
  2475,2500    };

gang_s erster[MAXSIZE]=  {        //Messwerte des 1. Gangs
  {
    2125,2500        }
  ,{
    2125,2575        }
  ,{
    2125,2650        }
  ,{
    2125,2725        }
  ,{
    2125,2800        }
  ,{
    2125,2875        }
  ,{
    2125,2950        }
  ,{
    2125,3025        }
  ,{
    2125,3100        }
  ,{
    2125,3175        }
  ,{
    2125,3250        }
  ,{
    2125,3325        }
  ,{
    2125,3400        }
  ,{
    2125,3475        }
  ,{
    2125,3550        }
  ,{
    2125,3625        }
  ,{
    2125,3700        }
  ,{
    2125,3775        }
  ,{
    2125,3850        }
  ,{
    2125,3925        }
  ,{
    2125,4000        }
};
gang_s zweiter[MAXSIZE]= {    //Messwerte des 2. Gangs
  {
    2125,2500        }
  ,{
    2125,2425        }
  ,{
    2125,2350        }
  ,{
    2125,2275        }
  ,{
    2125,2200        }
  ,{
    2125,2125        }
  ,{
    2125,2050        }
  ,{
    2125,1975        }
  ,{
    2125,1900        }
  ,{
    2125,1825        }
  ,{
    2125,1750        }
  ,{
    2125,1675        }
  ,{
    2125,1600        }
  ,{
    2125,1525        }
  ,{
    2125,1450        }
  ,{
    2125,1375        }
  ,{
    2125,1300        }
  ,{
    2125,1225        }
  ,{
    2125,1150        }
  ,{
    2125,1075        }
  ,{
    2125,1000        }
};
gang_s dritter[MAXSIZE]= {    //Messwerte des 3. Gangs
  {
    3250,2500        }
  ,{
    3250,2575        }
  ,{
    3250,2650        }
  ,{
    3250,2725        }
  ,{
    3250,2800        }
  ,{
    3250,2875        }
  ,{
    3250,2950        }
  ,{
    3250,3025        }
  ,{
    3250,3100        }
  ,{
    3250,3175        }
  ,{
    3250,3250        }
  ,{
    3250,3325        }
  ,{
    3250,3400        }
  ,{
    3250,3475        }
  ,{
    3250,3550        }
  ,{
    3250,3625        }
  ,{
    3250,3700        }
  ,{
    3250,3775        }
  ,{
    3250,3850        }
  ,{
    3250,3925        }
  ,{
    3250,4000        }
};
gang_s vierter[MAXSIZE]= {    //Messwerte des 4. Gangs
  {
    3250,2500        }
  ,{
    3250,2425        }
  ,{
    3250,2350        }
  ,{
    3250,2275        }
  ,{
    3250,2200        }
  ,{
    3250,2125        }
  ,{
    3250,2050        }
  ,{
    3250,1975        }
  ,{
    3250,1900        }
  ,{
    3250,1825        }
  ,{
    3250,1750        }
  ,{
    3250,1675        }
  ,{
    3250,1600        }
  ,{
    3250,1525        }
  ,{
    3250,1450        }
  ,{
    3250,1375        }
  ,{
    3250,1300        }
  ,{
    3250,1225        }
  ,{
    3250,1150        }
  ,{
    3250,1075        }
  ,{
    3250,1000        }
};
gang_s fuenfter[MAXSIZE]={    //Messwerte des 5. Gangs
  {
    4125,2500        }
  ,{
    4125,2575        }
  ,{
    4125,2650        }
  ,{
    4125,2725        }
  ,{
    4125,2800        }
  ,{
    4125,2875        }
  ,{
    4125,2950        }
  ,{
    4125,3025        }
  ,{
    4125,3100        }
  ,{
    4125,3175        }
  ,{
    4125,3250        }
  ,{
    4125,3325        }
  ,{
    4125,3400        }
  ,{
    4125,3475        }
  ,{
    4125,3550        }
  ,{
    4125,3625        }
  ,{
    4125,3700        }
  ,{
    4125,3775        }
  ,{
    4125,3850        }
  ,{
    4125,3925        }
  ,{
    4125,4000        }
};
gang_s sechster[MAXSIZE]={    //Messwerte des 6. Gangs
  {
    4125,2500        }
  ,{
    4125,2425        }
  ,{
    4125,2350        }
  ,{
    4125,2275        }
  ,{
    4125,2200        }
  ,{
    4125,2125        }
  ,{
    4125,2050        }
  ,{
    4125,1975        }
  ,{
    4125,1900        }
  ,{
    4125,1825        }
  ,{
    4125,1750        }
  ,{
    4125,1675       }
  ,{
    4125,1600       }
  ,{
    4125,1525        }
  ,{
    4125,1450        }
  ,{
    4125,1375        }
  ,{
    4125,1300        }
  ,{
    4125,1225        }
  ,{
    4125,1150        }
  ,{
    4125,1075        }
  ,{
    4125,1000        }
};
gang_s rueck[MAXSIZE]=   {  //Messwerte des R Gangs
  {
    875,2500        }
  ,{
    875,2575        }
  ,{
    875,2650        }
  ,{
    875,2725        }
  ,{
    875,2800        }
  ,{
    875,2875       }
  ,{
    875,2950        }
  ,{
    875,3025        }
  ,{
    875,3100        }
  ,{
    875,3175        }
  ,{
    875,3250        }
  ,{
    875,3325        }
  ,{
    875,3400        }
  ,{
    875,3475        }
  ,{
    875,3550        }
  ,{
    875,3625        }
  ,{
    875,3700        }
  ,{
    875,3775        }
  ,{
    875,3850        }
  ,{
    875,3925        }
  ,{
    875,4000        }
};
gang_s neutral[MAXSIZE]= {    //Messwerte des N Gangs
  {
    875,2500         }
  ,{
    1025,2500        }
  ,{
    1175,2500        }
  ,{
    1350,2500        }
  ,{
    1500,2500        }
  ,{ 
    1650,2500        }
  ,{
    1825,2500        }
  ,{
    1975,2500        }
  ,{
    2125,2500        }
  ,{
    2300,2500        }
  ,{
    2475,2500        }
  ,{
    2625,2500        }
  ,{
    2775,2500        }
  ,{
    2925,2500        }
  ,{
    3100,2500        }
  ,{
    3250,2500        }
  ,{
    3400,2500        }
  ,{
    3575,2500        }
  ,{
    3725,2500        }
  ,{
    3875,2500        }
  ,{
    4125,2500        }
};
 
gang_s umschaltfkt( gang_s j[], gang_s n[], gang_s w[], int t, int tol ); // Funktion zum Umschalten zwischen Gängen
gang_s umschaltN(gang_s j[],int t,int tol); // Funktion zum Umschalten auf N

void setup() {
  pinMode(buttonPinLeft, INPUT);              //Buttons
  pinMode(buttonPinRight, INPUT);             //werden
  pinMode(buttonPinEnter, INPUT);             //als Input
  pinMode(buttonPinEsc, INPUT);               // definiert
  lcd.begin(16, 4);                           //Eigenschaften des LCDs
  lcd.clear();
   

}

void loop() {
  
  pwmUa = (((jetzt.gUa)>>4)-(jetzt.gUa>>7)-(jetzt.gUa>>8));      // Ua wird berechnet
  pwmUw = (((jetzt.gUw)>>4)-(jetzt.gUw>>7)-(jetzt.gUw>>8));      // Ua wird berechnet
  analogWrite(uwPinPWM, pwmUw);         //Der Pin uwPinPWM hat immer eine Ausgabe
  analogWrite(uaPinPWM, pwmUa);         //Der Pin uaPinPWM hat immer eine Ausgabe 
  switch(A){                                                        //Der Wert von A wird zur Steurung des Menüs verwendet
  case 0:                                                           //Wenn A = 0:
   
    lcd.setCursor(0, 0);                                            
    lcd.print(jetzt.gUw);                                           //Der Uw Wert wird in der ersten Zeile angezeigt                                       
    lcd.setCursor(0,1);
    lcd.print(jetzt.gUa);                                           //Der Ua Wert wird in der zweiten Zeile angezeigt
    lcd.setCursor(0,2);
    if ((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa>=3000)) {                      //Je nach dem welchen Wert wir haben Schreibt LCD, im welchen Gang wir sind
      lcd.print("Gang: 1");
    }
    else if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa<=2000)) {
      lcd.print("Gang: 2");
    }
    else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa>=3000)) {
      lcd.print("Gang: 3");
    }
    else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa<=2000)) {
      lcd.print("Gang: 4");
    }
    else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa>=3000)) {
      lcd.print("Gang: 5");
    }
    else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa<=2000)) {
      lcd.print("Gang: 6");
    }
    else if((jetzt.gUw >=831) && (jetzt.gUw <=918) && (jetzt.gUa>=3000)) {
      lcd.print("Gang: R");
    }
    else{
      lcd.print("Gang: N");
    }

    break; 
  case 10:                                          //Wenn A = 10 wird Toleranz: Ideal makiert    
      
    lcd.setCursor(0, 0);
    lcd.print("> T: Ideal");
    lcd.setCursor(0,1);
    lcd.print("  T: +5%");
    lcd.setCursor(0,2);
    lcd.print("  T: -5%");
    lcd.setCursor(0,3);
    lcd.print("  T: +10%");
    break;
  case 20:                                          //Wenn A = 20 wird Toleranz: +5% makiert
    
    lcd.setCursor(0,0);
    lcd.print("  T: Ideal");
    lcd.setCursor(0,1);
    lcd.print("> T: +5%");
    lcd.setCursor(0,2);
    lcd.print("  T: -5%");
    lcd.setCursor(0,3);
    lcd.print("  T: +10%");
    break;
  case 30:                                           //Wenn A = 30 wird Toleranz: -5% makiert
    lcd.setCursor(0,0);
    lcd.print("  T: Ideal");
    lcd.setCursor(0,1);
    lcd.print("  T: +5%");
    lcd.setCursor(0,2);
    lcd.print("> T: -5%");
    lcd.setCursor(0,3);
    lcd.print("  T: +10%");
    break;
  case 40:                                           //Wenn A = 40 wird Toleranz: +10% makiert

    lcd.setCursor(0,0);
    lcd.print("  T: +5%");
    lcd.setCursor(0,1);
    lcd.print("  T: -5%");
    lcd.setCursor(0,2);
    lcd.print("> T: +10%");
    lcd.setCursor(0,3);
    lcd.print("  T: -10%");
    break;  
  case 50:	                                    //Wenn A = 50 wird Toleranz: -10% makiert

    lcd.setCursor(0,0);
    lcd.print("  T: +5%");
    lcd.setCursor(0,1);
    lcd.print("  T: -5%");
    lcd.setCursor(0,2);
    lcd.print("  T: +10%");
    lcd.setCursor(0,3);
    lcd.print("> T: -10%");
    break;
  case 11:                                         //Wenn A = 11 wird 1. Gang makiert

    lcd.setCursor(0, 0);
    lcd.print("> auf 1.Gang");
    lcd.setCursor(0,1);
    lcd.print("  auf 2.Gang");
    lcd.setCursor(0,2);
    lcd.print("  auf 3.Gang");
    lcd.setCursor(0,3);
    lcd.print("  auf 4.Gang");
    break;
  case 12:                                          //Wenn A = 12 wird 2. Gang makiert
  
    lcd.setCursor(0,0);
    lcd.print("  auf 1.Gang");
    lcd.setCursor(0,1);
    lcd.print("> auf 2.Gang");
    lcd.setCursor(0,2);
    lcd.print("  auf 3.Gang");
    lcd.setCursor(0,3);
    lcd.print("  auf 4.Gang");
    break;
  case 13:                                        //Wenn A = 13 wird 3. Gang makiert
 
    lcd.setCursor(0,0);
    lcd.print("  auf 1.Gang");
    lcd.setCursor(0,1);
    lcd.print("  auf 2.Gang");
    lcd.setCursor(0,2);
    lcd.print("> auf 3.Gang");
    lcd.setCursor(0,3);
    lcd.print("  auf 4.Gang");
    break;
  case 14:                                        //Wenn A = 14 wird 4. Gang makiert

    lcd.setCursor(0,0);
    lcd.print("  auf 2.Gang");
    lcd.setCursor(0,1);
    lcd.print("  auf 3.Gang");
    lcd.setCursor(0,2);
    lcd.print("> auf 4.Gang");
    lcd.setCursor(0,3);
    lcd.print("  auf 5.Gang");
    break;
  case 15:	                                 //Wenn A = 15 wird 5. Gang makiert

    lcd.setCursor(0,0);
    lcd.print("  auf 3.Gang");
    lcd.setCursor(0,1);
    lcd.print("  auf 4.Gang");
    lcd.setCursor(0,2);
    lcd.print("> auf 5.Gang");
    lcd.setCursor(0,3);
    lcd.print("  auf 6.Gang");
    break;
  case 16:                                       //Wenn A = 16 wird 6. Gang makiert

    lcd.setCursor(0,0);
    lcd.print("  auf 4.Gang");
    lcd.setCursor(0,1);
    lcd.print("  auf 5.Gang");
    lcd.setCursor(0,2);
    lcd.print("> auf 6.Gang");
    lcd.setCursor(0,3);
    lcd.print("  auf R");
    break;
  case 17:                                       //Wenn A = 17 wird R Gang makiert  

    lcd.setCursor(0,0);
    lcd.print("  auf 5.Gang");
    lcd.setCursor(0,1);
    lcd.print("  auf 6.Gang");
    lcd.setCursor(0,2);
    lcd.print("> auf R");
    lcd.setCursor(0,3);
    lcd.print("  auf N");
    break;     
  case 18:                                       //Wenn A = 18 wird N Gang makiert 

    lcd.setCursor(0,0);
    lcd.print("  auf 5.Gang");
    lcd.setCursor(0,1);
    lcd.print("  auf 6.Gang");
    lcd.setCursor(0,2);
    lcd.print("  auf R");
    lcd.setCursor(0,3);
    lcd.print("> auf N");
    break;
  case 110:                                     //Wenn A = 110 wird die Schaltzeit angezeigt

    lcd.setCursor(0,0);
    lcd.print("  Schaltzeit:");
    lcd.setCursor(0,1);
    lcd.print(schaltzeit);
    lcd.setCursor(0,2);
    break;
  default:

    lcd.setCursor(0,0);
    lcd.print("Glückwunsch!");
    lcd.setCursor(0,1);
    lcd.print("Du hast das Pro-");
    lcd.setCursor(0,2);
    lcd.print("gramm kaputt");
    lcd.setCursor(0,3);
    lcd.print("gemacht! :-D");
    break;
  }


  int buttonEnterState=LOW;                                  // Der Zustand der Buttons 
  int buttonEscState=LOW;            
  int buttonLeftState=LOW;            
  int buttonRightState=LOW; 
  reading = digitalRead(buttonPinEnter);                     // Debounce der Buttons
  if (reading != lastButtonEnterState) {
    lastEnterDebounceTime = millis();
  }
  if ((millis() - lastEnterDebounceTime) > debounceDelay) {
    buttonEnterState=reading;
    lastEnterDebounceTime=millis();
  }
  lastButtonEnterState = reading;
  reading = digitalRead(buttonPinEsc);
  if (reading != lastButtonEscState) {
    lastEscDebounceTime = millis();
  }
  if ((millis() - lastEscDebounceTime) > debounceDelay) {
    buttonEscState = reading;
    lastEscDebounceTime=millis();
  }
  lastButtonEscState = reading;
  reading = digitalRead(buttonPinRight);
  if (reading != lastButtonRightState) {
    lastRightDebounceTime = millis();
  }
  if ((millis() - lastRightDebounceTime) > debounceDelay) {
    buttonRightState = reading;
    lastRightDebounceTime =millis();
  }
  lastButtonRightState = reading;   
  reading = digitalRead(buttonPinLeft);
  if (reading != lastButtonLeftState) {
    lastLeftDebounceTime = millis();
  }
  if ((millis() - lastLeftDebounceTime) > debounceDelay) {
    buttonLeftState = reading;
    lastLeftDebounceTime=millis();
  }
  lastButtonLeftState = reading; 
  if (buttonEnterState==HIGH){
    lastButtonPushed=buttonPinEnter;
  }
  else if(buttonEscState==HIGH){
    lastButtonPushed=buttonPinEsc;
  }
  else if(buttonRightState==HIGH){
    lastButtonPushed=buttonPinRight;
  }
  else if(buttonLeftState==HIGH){
    lastButtonPushed=buttonPinLeft;
  }
  else{
    lastButtonPushed=0;
  }

  //////////////////////////////  Taster  ///////////////////////////////////
  //menu key down 

  if (buttonRightState==HIGH ) {
    if((A == 10) || (A == 20) || (A == 30)|| (A == 40)) {      //Wenn A zwischen 10 und 40 ist und Button wird gedrückt, wird A um 10 größer
      A = A + 10;
    }
    else if((A == 11) || (A == 12) || (A == 13) || (A == 14) || (A == 15) || (A == 16) || (A == 17)) { //Wenn A zwischen 11 und 17 ist und Button wird gedrückt, wird A um 1 größer
      A = A + 1;
    }
    else if(A == 110){                        //Wenn A = 110 und Button wird gedrückt, wird Schaltzeit um 100ms länger
      schaltzeit = schaltzeit + 100;  
    }
  }
  //menu key up
  if (buttonLeftState==HIGH) {
    if((A == 20) || (A == 30) || (A == 40)|| (A == 50)) {    //Wenn A zwischen 20 und 50 ist und Button wird gedrückt, wird A um 10 kleiner
      A = A - 10;
    }
    else if((A == 12) || (A == 13) || (A == 14) || (A == 15) || (A == 16) || (A == 17) || (A == 18)) {    //Wenn A zwischen 12 und 18 ist und Button wird gedrückt, wird A um 1 kleiner
      A = A - 1;
    }
    else if( A == 110 ){                  //Wenn A = 110 und Button wird gedrückt, wird Schaltzeit um 100ms kürzer
      schaltzeit = schaltzeit - 100;
    }
  }

  //menu key ok
  if (buttonEnterState==HIGH) {
    switch(A){
    case 0:
      A = 10;
      break;
    case 10:              //Wenn A=10 und Button wird gedrückt, wird Toleranz 0% und A=11
      toleranz=0;
      A=11;
      break;

    case 20:              //Wenn A=20 und Button wird gedrückt, wird Toleranz +5% und A=11
      toleranz=5;
      A=11;
      break;

    case 30:              //Wenn A=30 und Button wird gedrückt, wird Toleranz -5% und A=11
      toleranz=-5;
      A=11;
      break;

    case 40:              //Wenn A=40 und Button wird gedrückt, wird Toleranz +10% und A=11
      toleranz=10;
      A=11;
      break;

    case 50:              //Wenn A=50 und Button wird gedrückt, wird Toleranz -10% und A=11
      toleranz=-10;
      A=11;
      break;

    case 11:              //Wenn A=11 und Button wird gedrückt, wird gespeichert, dass auf den 1. Gang gewechselt werden soll und A=110
      gang = 1;
      A=110;
      break;

    case 12:              //Wenn A=12 und Button wird gedrückt, wird gespeichert, dass auf den 2. Gang gewechselt werden soll und A=110
      gang = 2;
      A=110;
      break;

    case 13:              //Wenn A=13 und Button wird gedrückt, wird gespeichert, dass auf den 3. Gang gewechselt werden soll und A=110
      gang = 3;
      A=110;
      break;

    case 14:              //Wenn A=14 und Button wird gedrückt, wird gespeichert, dass auf den 4. Gang gewechselt werden soll und A=110
      gang = 4;
      A=110;
      break;

    case 15:              //Wenn A=15 und Button wird gedrückt, wird gespeichert, dass auf den 5. Gang gewechselt werden soll und A=110
      gang = 5;
      A=110;
      break;

    case 16:              //Wenn A=16 und Button wird gedrückt, wird gespeichert, dass auf den 6. Gang gewechselt werden soll und A=110
      gang = 6;
      A=110;
      break;

    case 17:              //Wenn A=17 und Button wird gedrückt, wird gespeichert, dass auf den R Gang gewechselt werden soll und A=110
      gang = 7;
      A=110;
      break;
    case 18:              //Wenn A=18 und Button wird gedrückt, wird gespeichert, dass auf den N Gang gewechselt werden soll und A=110
      gang = 8;
      A=110;
      break;

    case 110:
      switch(gang){
      case 1:
        if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa<=2000)){                                  //Auf den 1. Gang umschalten, wenn man im 2. ist
          jetzt = umschaltfkt( zweiter, neutral, erster, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa>=3000)){                             //Auf den 1. Gang umschalten, wenn man im 3. ist
          jetzt = umschaltfkt( dritter, neutral, erster, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa<=2000)){                             //Auf den 1. Gang umschalten, wenn man im 4. ist
          jetzt = umschaltfkt( vierter, neutral, erster, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa>=3000)){                             //Auf den 1. Gang umschalten, wenn man im 5. ist
          jetzt = umschaltfkt( fuenfter, neutral, erster, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa<=2000)){                             //Auf den 1. Gang umschalten, wenn man im 6. ist
          jetzt = umschaltfkt( sechster, neutral, erster, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >=831) && (jetzt.gUw <=918) && (jetzt.gUa>=3000)){                              //Auf den 1. Gang umschalten, wenn man im R ist
          jetzt = umschaltfkt( rueck, neutral, erster, schaltzeit, toleranz );
          A = 0;
        }
        else{                                                                      //Auf den 1. Gang umschalten, wenn man im N ist
          jetzt = umschaltfkt( neutral, neutral, erster, schaltzeit, toleranz );
          A = 0;
        }
        break;
      case 2:
        if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa>=3000)){                                   //Auf den 2. Gang umschalten, wenn man im 1. ist
          jetzt = umschaltfkt( erster, neutral, zweiter, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa>=3000)){                              //Auf den 2. Gang umschalten, wenn man im 3. ist
          jetzt = umschaltfkt( dritter, neutral, zweiter, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa<=2000)){                              //Auf den 2. Gang umschalten, wenn man im 4. ist
          jetzt = umschaltfkt( vierter, neutral, zweiter, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa>=3000)){                              //Auf den 2. Gang umschalten, wenn man im 5. ist
          jetzt = umschaltfkt( fuenfter, neutral, zweiter, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa<=2000)){                              //Auf den 2. Gang umschalten, wenn man im 6. ist
          jetzt = umschaltfkt( sechster, neutral, zweiter, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >=831) && (jetzt.gUw <=918) && (jetzt.gUa>=3000)){                               //Auf den 2. Gang umschalten, wenn man im R ist 
          jetzt = umschaltfkt( rueck, neutral, zweiter, schaltzeit, toleranz );
          A = 0;
        }
        else{                                                                      //Auf den 2. Gang umschalten, wenn man im N ist
          jetzt = umschaltfkt( neutral, neutral, zweiter, schaltzeit, toleranz );
          A = 0;
        }
        break;
      case 3:
        if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa>=3000)){                                  //Auf den 3. Gang umschalten, wenn man im 1. ist
          jetzt = umschaltfkt( erster, neutral, dritter, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa<=2000)){                             //Auf den 3. Gang umschalten, wenn man im 2. ist
          jetzt = umschaltfkt( zweiter, neutral, dritter, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa<=2000)){                             //Auf den 3. Gang umschalten, wenn man im 4. ist
          jetzt = umschaltfkt( vierter, neutral, dritter, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa>=3000)){                             //Auf den 3. Gang umschalten, wenn man im 5. ist
          jetzt = umschaltfkt( fuenfter, neutral, dritter, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa<=2000)){                             //Auf den 3. Gang umschalten, wenn man im 6. ist 
          jetzt = umschaltfkt( sechster, neutral, dritter, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >=831) && (jetzt.gUw <=918) && (jetzt.gUa>=3000)){                              //Auf den 3. Gang umschalten, wenn man im R ist
          jetzt = umschaltfkt( rueck, neutral, dritter, schaltzeit, toleranz );
          A = 0;
        }
        else{                                                                     //Auf den 3. Gang umschalten, wenn man im N ist
          jetzt = umschaltfkt( neutral, neutral, dritter, schaltzeit, toleranz );
          A = 0;
        }
        break; 
      case 4:
        if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa>=3000)){                                  //Auf den 4. Gang umschalten, wenn man im 1. ist
          jetzt = umschaltfkt( erster, neutral, vierter, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa<=2000)){                             //Auf den 4. Gang umschalten, wenn man im 2. ist
          jetzt = umschaltfkt( zweiter, neutral, vierter, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa>=3000)){                             //Auf den 4. Gang umschalten, wenn man im 3. ist
          jetzt = umschaltfkt( dritter, neutral, vierter, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa>=2000)){                             //Auf den 4. Gang umschalten, wenn man im 5. ist
          jetzt = umschaltfkt( fuenfter, neutral, vierter, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa<=2000)){                             //Auf den 4. Gang umschalten, wenn man im 6. ist
          jetzt = umschaltfkt( sechster, neutral, vierter, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >=831) && (jetzt.gUw <=918) && (jetzt.gUa>=3000)){                              //Auf den 4. Gang umschalten, wenn man im R ist
          jetzt = umschaltfkt( rueck, neutral, vierter, schaltzeit, toleranz );
          A = 0;
        }
        else{                                                                     //Auf den 4. Gang umschalten, wenn man im N ist
          jetzt = umschaltfkt( neutral, neutral, vierter, schaltzeit, toleranz );
          A = 0;
        }
        break; 
      case 5:
        if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa>=3000)){                                  //Auf den 5. Gang umschalten, wenn man im 1. ist
          jetzt = umschaltfkt( erster, neutral, fuenfter, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa<=2000)){                             //Auf den 5. Gang umschalten, wenn man im 2. ist
          jetzt = umschaltfkt( zweiter, neutral, fuenfter, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa>=3000)){                             //Auf den 5. Gang umschalten, wenn man im 3. ist
          jetzt = umschaltfkt( dritter, neutral, fuenfter, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa>=2000)){                             //Auf den 5. Gang umschalten, wenn man im 4. ist
          jetzt = umschaltfkt( vierter, neutral, fuenfter, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa<=2000)){                             //Auf den 5. Gang umschalten, wenn man im 6. ist
          jetzt = umschaltfkt( sechster, neutral, fuenfter, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >=831) && (jetzt.gUw <=918) && (jetzt.gUa>=3000)){                              //Auf den 5. Gang umschalten, wenn man im R ist
          jetzt = umschaltfkt( rueck, neutral, fuenfter, schaltzeit, toleranz );
          A = 0;
        }
        else{                                                                     //Auf den 5. Gang umschalten, wenn man im N ist
          jetzt = umschaltfkt( neutral, neutral, fuenfter, schaltzeit, toleranz );
          A = 0;
        }
        break;
      case 6:
        if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa>=3000)){                                  //Auf den 6. Gang umschalten, wenn man im 1. ist
          jetzt = umschaltfkt( erster, neutral, sechster, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa<=2000)){                             //Auf den 6. Gang umschalten, wenn man im 2. ist
          jetzt = umschaltfkt( zweiter, neutral, sechster, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa>=3000)){                             //Auf den 6. Gang umschalten, wenn man im 3. ist
          jetzt = umschaltfkt( dritter, neutral, sechster, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa<=2000)){                             //Auf den 6. Gang umschalten, wenn man im 4. ist
          jetzt = umschaltfkt( vierter, neutral, sechster, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa>=3000)){                             //Auf den 6. Gang umschalten, wenn man im 5. ist
          jetzt = umschaltfkt( fuenfter, neutral, sechster, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >=831) && (jetzt.gUw <=918) && (jetzt.gUa>=3000)){                              //Auf den 6. Gang umschalten, wenn man im R ist 
          jetzt = umschaltfkt( rueck, neutral, sechster, schaltzeit, toleranz );
          A = 0;
        }
        else{                                                                     //Auf den 6. Gang umschalten, wenn man im N ist
          jetzt = umschaltfkt( neutral, neutral, sechster, schaltzeit, toleranz );
          A = 0;
        }
        break;
      case 7:
        if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa>=3000)){                                  //Auf R umschalten, wenn man im 1. ist
          jetzt = umschaltfkt( erster, neutral, rueck, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa<=2000)){                             //Auf R umschalten, wenn man im 2. ist
          jetzt = umschaltfkt( zweiter, neutral, rueck, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa>=3000)){                             //Auf R umschalten, wenn man im 3. ist
          jetzt = umschaltfkt( dritter, neutral, rueck, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa<=2000)){                             //Auf R umschalten, wenn man im 4. ist
          jetzt = umschaltfkt( vierter, neutral, rueck, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa>=3000)){                             //Auf R umschalten, wenn man im 5. ist
          jetzt = umschaltfkt( fuenfter, neutral, rueck, schaltzeit, toleranz );
          A = 0;
        }
        else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa<=2000)){                             //Auf R umschalten, wenn man im 6. ist
          jetzt = umschaltfkt( sechster, neutral, rueck, schaltzeit, toleranz );
          A = 0;
        }
        else{                                                                     //Auf R umschalten, wenn man im N ist
          jetzt = umschaltfkt( neutral, neutral, rueck, schaltzeit, toleranz );
          A = 0;
        }
        break; 
      case 8:
        if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa>=3000)){                                     //Auf N umschalten, wenn man im 1. ist 
          jetzt = umschaltN( erster, schaltzeit, toleranz);
        }
        else if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa<=2000)){                                 //Auf N umschalten, wenn man im 2. ist
          jetzt = umschaltN(zweiter, schaltzeit, toleranz);
        }
        else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa>=3000)){                                 //Auf N umschalten, wenn man im 3. ist
          jetzt = umschaltN(dritter,schaltzeit,toleranz);
        }
        else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa<=2000)){                                 //Auf N umschalten, wenn man im 4. ist
          jetzt = umschaltN(vierter,schaltzeit,toleranz);
        }
        else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa>=3000)){                                 //Auf N umschalten, wenn man im 5. ist
          jetzt = umschaltN(fuenfter,schaltzeit,toleranz);
        }
        else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa<=2000)){                                 //Auf N umschalten, wenn man im 6. ist
          jetzt = umschaltN(sechster,schaltzeit,toleranz);                        
        }
        else{
          jetzt = umschaltN(rueck,schaltzeit,toleranz);                           //Auf N umschalten, wenn man im R ist
        }
        break;
      default:
        break;
      } 
    }
  }

  //menu key ESC
  if ( buttonEscState==HIGH) { 
    if((A == 11) || (A == 12) || (A == 13) || (A == 14) || (A == 15) || (A == 16) || (A == 17) || (A == 18)) {    //Wenn A zwischen 11 und 18 ist und Button wird gedrückt, wird A = 10
      A = 10;
    } 
    else if(A > 100) {                                           //Wenn A größer 100 ist und Button wird gedrückt, wird A = 11
      A = 11;
    }
    else if((A == 10) ||(A == 20) || (A == 30) || (A == 40) || (A == 50)) {  //Wenn A zwischen 10 und 50 ist und Button wird gedrückt, wird A = 0
      A = 0;
    }
    else if(A == 110) {                                          //Wenn A=110 und Button wird gedrückt, wird A = 11
      A = 11;
    }


  }

}
gang_s umschaltfkt( gang_s j[], gang_s n[], gang_s w[], int t, int tol ) //Funktion zum Umschalten zwischen den Gängen
{
  lcd.clear();
  int pwma;          //Wert für Ua Ausgabe
  int pwmw;          //Wert für Uw Ausgabe
  int time;          //Wert für Delay 
  int tabs;          //Wert für Delayberechnung 
  gang_s soll;
  int a;             //Wert für Umschaltung zwischen jetzt.gUa und neutral.gUa
  int d;
  int b;             //Werte zum Erkennen im welchen Uw sich der jetztige und gewünschte Gang befinden
  int c;                          
  int e;
  int f;
  int x;
  int y;
  soll.gUw = (w[20].gUw + ((w[20].gUw * tol)/100));
  soll.gUa = (w[20].gUa + ((w[20].gUa * tol)/100));
  for( b = 0; b < 20; b++ ){        // Es wird erkannt im welchen Uw bereich der jetzige Gang ist
    for(x = 0; x < 20; x++){
      c++;
      if(j[b].gUw == n[x].gUw){
        break;
      } 
    }
  }
  for( d = 0; d < 20; d++ ){         // Es wird erkannt im welchen Uw bereich der gewünschte Gang ist      
    for(y = 0; y <20; y++){
      if(w[d].gUw == n[y].gUw){
        e++;
        break;
      } 
    }
  }
  tabs = c - e;                     // Es wird berechnet wieviele Schritte zwischen Uwjetzt und Uwsoll sind 
  time = ( t/(abs(tabs)+42));       // Es wird berechnet wie lang das Delay sein muss 
  if (j[20].gUa != n[20].gUa){      // Wenn Uajetzt größer als Uaneutral ist:
    for( a = 20; a > 0; a--)
    {
      pwma = (((j[a].gUa)>>4)-(j[a].gUa>>7)-(j[a].gUa>>8));      // PWM Signal für Ua wird berechnet
      pwma = (pwma + ((pwma * tol)/100));                        // Die Toleranz wird dazugerechnet
      pwmw = (((j[a].gUw)>>4)-(j[a].gUw>>7)-(j[a].gUw>>8));      // PWM Signal für Uw wird berechnet
      pwmw = (pwmw + ((pwmw * tol)/100));                        // Die Toleranz wird dazugerechnet
      
      lcd.setCursor(0, 0);
      lcd.print((j[a].gUw + ((j[a].gUw*tol)/100)));              // Uw auf dem Display angezeigt
      lcd.setCursor(0,1);
      lcd.print((j[a].gUa + ((j[a].gUa*tol)/100)));              // Ua auf dem Display angezeigt
      analogWrite(uaPinPWM, pwma);                               // PWM Signal ausgegeben
      analogWrite(uwPinPWM, pwmw);
      delay(time);                                              
    }
  }

  if( c > e){                                                    // Wenn das Uwjetzt > Uwsoll ist
    do{                                                          // Wird
      pwmw = (((n[c].gUw)>>4)-(n[c].gUw>>7)-(n[c].gUw>>8));      // PWM Signal für Uw wird berechnet
      pwmw = (pwmw + ((pwmw * tol)/100));                        // Die Toleranz wird dazugerechnet
      pwma = (((n[c].gUa)>>4)-(n[c].gUa>>7)-(n[c].gUa>>8));      // PWM Signal für Ua wird berechnet
      pwma = (pwma + ((pwma * tol)/100));                        // Die Toleranz wird dazugerechnet
      
      lcd.setCursor(0, 0);
      lcd.print((n[c].gUw + ((n[c].gUw*tol)/100)));              // Uw auf dem Display angezeigt
      lcd.setCursor(0, 1);
      lcd.print((n[c].gUa + ((n[c].gUa*tol)/100)));              // Uw auf dem Display angezeigt
      analogWrite(uwPinPWM, pwmw);                               // PWM Signal ausgegeben
      analogWrite(uaPinPWM, pwma);
      c--;                                                       // Der nächste Wert ausgewählt
    } 
    while(n[c].gUw > n[e].gUw) ;                                 // Solange Uwsoll nicht erreicht wird
  }
  else if (e > c){                                               // Wenn das Uwjetzt < Uwsoll ist
    do{                                                          // Wird
      pwmw = (((n[c].gUw)>>4)-(n[c].gUw>>7)-(n[c].gUw>>8));      // PWM Signal für Uw berechnet
      pwmw = (pwmw + ((pwmw * tol)/100));                        // Die Toleranz wird dazugerechnet
      pwma = (((n[c].gUa)>>4)-(n[c].gUa>>7)-(n[c].gUa>>8));      // PWM Signal für Uw berechnet
      pwma = (pwma + ((pwma * tol)/100));                        // Die Toleranz wird dazugerechnet
      
      lcd.setCursor(0, 0);
      lcd.print((n[c].gUw + ((n[c].gUw*tol)/100)));              // Uw auf dem Display angezeigt
      lcd.setCursor(0,1);
      lcd.print((n[c].gUa + ((n[c].gUa*tol)/100)));              // Ua auf dem Display angezeigt
      analogWrite(uwPinPWM, pwmw);                               // PWM Signal ausgegeben
      analogWrite(uaPinPWM, pwma);
      c++;                                                       // Der nächste Wert ausgewählt
    } 
    while(n[e].gUw > n[c].gUw) ;                                 // Solange Uwsoll nicht erreicht wird
  }  
  for( d = 0; d < 20; d++){
    pwma = (((w[d].gUa)>>4)-(w[d].gUa>>7)-(w[d].gUa>>8));        // Der PWM Signal für Ua wird berechnet
    pwma = (pwma + ((pwma * tol)/100));                          // Die Toleranz wird dazugerechnet
    pwmw = (((w[d].gUw)>>4)-(w[d].gUw>>7)-(w[d].gUw>>8));        // Der PWM Signal für Uw wird berechnet
    pwmw = (pwmw + ((pwmw * tol)/100));                          // Die Toleranz wird dazugerechnet
    
    lcd.setCursor(0, 0);
    lcd.print(w[d].gUw);                                         // Uw auf dem Display anzeigen
    lcd.setCursor(0,1);
    lcd.print(w[d].gUa);                                         // Ua auf dem Display anzeigen
    analogWrite(uaPinPWM, pwma);                                 // PWM Signal wird ausgeben
    analogWrite(uwPinPWM, pwmw);
    delay(time);
  }
  A=0;
  return soll;                                                  // Der gewünschte Wert ist die Rückgabe
}

gang_s umschaltN(gang_s j[],int t,int tol){                      //Funktion zum Umschalten auf N
  
  int pwmw;                                                      // Wert für PWM Signal für Uw
  int pwma;                                                      // Wert für PWM Signal für Ua
  int a;                                                         // Wert für die Umschaltung
  gang_s soll;
  soll.gUw = (j[0].gUw + ((j[0].gUw * tol)/100));
  soll.gUa = (j[0].gUa + ((j[0].gUa * tol)/100));
  for( a = 20; a > 0; a--)                                      
  {
    pwmw = (((j[a].gUw)>>4)-(j[a].gUw>>7)-(j[a].gUw>>8));        // Der PWM Signal für Uw wird berechnet
    pwmw = (pwmw + ((pwmw * tol)/100));                          // Die Toleranz wird dazugerechnet
    pwma = (((j[a].gUa)>>4)-(j[a].gUa>>7)-(j[a].gUa>>8));        // Der PWM Signal für Ua wird berechnet
    pwma = (pwma + ((pwma * tol)/100));                          // Die Toleranz wird dazugerechnet
    lcd.setCursor(0, 0);
    lcd.print((j[a].gUw + ((j[a].gUw*tol)/100)));                // Uw wird auf dem Display angezeigt
    lcd.setCursor(0,1);
    lcd.print((j[a].gUa + ((j[a].gUa*tol)/100)));                // Ua wird auf dem Display angezeigt
    analogWrite(uwPinPWM, pwmw);                                 // PWM Signal ausgeben
    analogWrite(uaPinPWM, pwma);
    delay(t/21);
  }
  return j[0];                                                   // Ein Punkt von N Gang ist die Rückgabe
}



Зарание спасибо!

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Какое то июльское обострение на почве функций?
Туши свет, они на свет лезут.
А идея что оно рисует, но быстро и глазом не видно, вас не посещала?
Не думаю что кто будет читать вашу 1000 строк фигню с коментами на немецком.

cheshire
cheshire аватар
Offline
Зарегистрирован: 11.07.2014

да, об этом я тоже думал, но проблема в том что даже если сделать так, чтоб функция длилась к примеру 20сек, мы все равно поподаем толко на последнее число.
и да, наверно многие(или скорее всего все) не прочитают, но надежда умирает последней)))

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Да никто не будет это читать и вникать. Код для постепенной перерисовки цыфр не может быть на 1000+ строк. Это бред а не код.

cheshire
cheshire аватар
Offline
Зарегистрирован: 11.07.2014

код не только это делает. проблема появляется толко там где он должен это делать. а так в программе меню и оно занимает так много места.  В общем, программа симулирует сенсор переключения скоростей.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Фраза "когда я в loop  начинаю функ. она делает не все что должна" как бы и дает ответ.

Вот я Вам отвечаю, но Вы как бы не всё понимаете, что я Вам отвечаю.

 

cheshire
cheshire аватар
Offline
Зарегистрирован: 11.07.2014

то что ошибка скорее всего там я вроде как и сам понял, поэтому в первую очередь ее код и отправил, но вопрос: где?
мои предположение указывают на вот это:

  tabs = c - e;                     
  abs(tabs);
  time = ( t/(tabs+42));       

а потом когда необходим delay

delay(time);

Но если ошибка тут, то как ее исправить?

cheshire
cheshire аватар
Offline
Зарегистрирован: 11.07.2014

Puhlyaviy пишет:
Какое то июльское обострение на почве функций? Туши свет, они на свет лезут. А идея что оно рисует, но быстро и глазом не видно, вас не посещала? Не думаю что кто будет читать вашу 1000 строк фигню с коментами на немецком.

 

Ладно, давайте сузим наш область поиска ошибки. Ошибка находится именно в функции с вероятностью 99.9%
Проблема у нас иммено с delay и вероятнее всего в числe в скобках. Значит по логике ошибка должна находится где то тут:

  for( b = 0; b < 20; b++ ){        // Es wird erkannt im welchen Uw bereich der jetzige Gang ist
    for(x = 0; x < 20; x++){
      c++;
      if(j[b].gUw == n[x].gUw){
        break;
      } 
    }
  }
  for( d = 0; d < 20; d++ ){         // Es wird erkannt im welchen Uw bereich der gewünschte Gang ist      
    for(y = 0; y <20; y++){
      if(w[d].gUw == n[y].gUw){
        e++;
        break;
      } 
    }
  }
  tabs = c - e;                     // Es wird berechnet wieviele Schritte zwischen Uwjetzt und Uwsoll sind 
  tabs = abs(tabs);
  time = ( t/(tabs+42));       // Es wird berechnet wie lang das Delay sein muss 

Если вам поможет, я могу перевести вам коменты, но в общем в них не такая трудная или важная инфо. так как вы почти в каждой теме на этом форуме успели появится, я пологаю что вы хорошо разбираетесь в программах и надеюсь на вашу помощь

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Мне не нужно переводить. Я не собираюсь сидеть вникать в чужой спагети код. Я злой.
Меня злит человеческая тупость. Попробую аналогии, когда разрабатывают нечто большое и сложное, то сначала делают и отлаживают маленькие модули , по отдельности! И когда каждый модуль сам по себе работает, их начигают собирать в кучку, постепенно.
А не валят все запчамти в кучу с целью поиграть в игру "плпробуй отгадай что тут глючит"
Не понятно? Ну тогда ОЙ.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Хорошо, раз мы злые, то вот вам тупой вопрос, что значит "она делает не все что должна.", мы тут все скучающие телепаты, которые сидят, ничего не делают и только ждут, когда маленькие добренькие дети придут и что то спросят, а мы их сожрем!

"она делает не все что должна."

А что именно именно она не делает?

А если не понятен вопрос, то ответьте на мой вопрос, сколько ступенек на лестничной площадке между первым и вторым этажом?

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

А что она должна? Как давно? И каковы проценты? Будем пытать паяльником что вернула че должна.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Ну да, мы тут все полиглоты, немецкий знаем в совершенстве, код по 100 строк читаем с листа, а 1200 строке - вообще влет. У нас же времени дофига, мы же спецы, гуру, Эйнштейны и т.п. Хотя мы тупые, каких то сто строк не нашли время разобрать, зато пишем целыми днями всякие какашки и всем должны.

 

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Меня доктор пытал как то спагети кодом на несколько сотен строк. И до сих пор чуть че соазу угрожать начинает, типа будешь с советами лезть, выдам спагети на пару тысяч строк. Он жесток и страшен.

cheshire
cheshire аватар
Offline
Зарегистрирован: 11.07.2014

kisoft пишет:

"она делает не все что должна."

А что именно именно она не делает?

А если не понятен вопрос, то ответьте на мой вопрос, сколько ступенек на лестничной площадке между первым и вторым этажом?

 

 

давайте я попробую еще раз. Программа должна симулировать сенсор переключения скоростей. Она состоит из: меню(работает) и 2 функций(почти работает). В функции произходит следуйшее: Медленно, программа должна симулировать смену скорости что она и делает, но как я успел понять, ошибку я сделал в разсчете delay и досих пор не могу понять где и как. В общем по логике ошибка должна быть тут:

    for( b = 0; b < 20; b++ ){        
      c++;
      if(j.gUw == n[b].gUw){
        break;
      } 
    }
  for( d = 0; d < 20; d++ ){              
      if(w[0].gUw == n[d].gUw){
        e++;
        break;
      } 
    }
  tabs = c - e;                      
  tabs = abs(tabs);
  time = ( t/(tabs+42));  

почему то delay у меня получается 0 и я не понимаю почему, ведь вроде как он должен был его посчитать

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Ну так выводите в терминал значения и найдете свою ошибку в расчетах.

cheshire
cheshire аватар
Offline
Зарегистрирован: 11.07.2014

как я понял вы из германии, может сможете это на немецкий перевести? "терминал значения" в жизни не слышал.. ок, нет все таки слышал. Я не уверен в том что ошибка в array а скорее в самом подсчете. Но за совет спасибо

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Хех :) Это два разных слова: Выводите в терминал полученные программой значения ))))

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Перевожу на русский. Для полных танкистов.
Отладочные строчки вставь и смотри в терминале что там насчитывается

cheshire
cheshire аватар
Offline
Зарегистрирован: 11.07.2014

Ой, простите)) не правильно из контекста понял) почему то  выводит 0.. как такое вообще возможно? В array точно есть одинаковое число, то есть он должен где то сдеалть стоп.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

подружитесь с командами Serial.print("xxx"); и Serial.println("xxxx"); Они Вам сэкономят сотни строк кода, бессонные ночи и "ругательства матом громко и внятно когда вся семья уже спит"

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Пальцем в небо

time = ((double)t) / (tabs + 42);

Второе, у Вас t всегда больше чем 42?

 

cheshire
cheshire аватар
Offline
Зарегистрирован: 11.07.2014

JollyBiber пишет:

подружитесь с командами Serial.print("xxx"); и Serial.println("xxxx"); Они Вам сэкономят сотни строк кода, бессонные ночи и "ругательства матом громко и внятно когда вся семья уже спит"

 именно этим и восползовался чтоб понять что у меня в  0 выходит))

kisoft пишет:

Пальцем в небо

time = ((double)t) / (tabs + 42);

Второе, у Вас t всегда больше чем 42?

 

нет об этом не подумал, но даже когда было больше (к примеру 10000) ничего не изменялось

ну спасибо за советы, за разговоры добрые)) настроение уж tочно поднять смогли ну а дальше я наверно сам как нибудь попробую. если опять в тупике окажусь обязательно вам на нервы подействую))

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Нам на нервы трудно подействовать. Тут скорее что у вас нервов хватило наши советы понимать.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

О це дило, тупиковыми ответами мы завсегда отоварить рады!

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Рекомендую:

1. Имена переменных, функций, параметров использовать нормальные, например:

uint8_t r_d( uint8_t a, uint8_t b )
{
  return a + b;
}

сравните с:

uint8_t CalcSum( uint8_t p_Summand1, uint8_t p_Summand2 )
{
  return p_Summand1 + p_Summand2;
}

2. Комментарии везде писать не нужно, достаточно описания главного и тонких мест

3. Перед выкладыванием скетча в форум, форматируйте его хотя бы нажимая Ctrl-T в ArduinoIDE, так он (текст скетча) более просто читается. Это сократит время тем, кто "заинтересуется" Вашим вопросом и попробует разобраться.

4. Старайтесь прочитать свой вопрос нашими глазами. Т.е. представьте себя на нашем месте. Подумайте, что Вы видите, что Вы делаете, а мы этого не видим.

Хотя бы учтите эти мелочи и Вам будет намного проще общаться на форуме.

Gelingen

Надеюсь не ошибся с пожеланием, немецкого практически не знаю :)