• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino Due zawiesza się w losowych momentach
#1
Witam,
Napisałem sobie program.
Wszystko teoretycznie działa.
Działa jak arduino się nie zawiesi.
Siedzę nad tym już 3 dzień i nie mogę znaleźć rozwiązania dlaczego raz się wiesza a raz nie.
Może ktoś zerknie i wskaże mi gdzie jest problem?

Pozdrawiam

Kod PHP:
#include <Bounce2.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>


LiquidCrystal_I2C lcd(0x3f204);

// Inicjalizacja obiektu Bounce
Bounce debouncerA Bounce(); 
Bounce debouncerB Bounce(); 
Bounce debouncerC Bounce(); 
Bounce debouncerD Bounce(); 

//przyciski menu
#define BTN_BACK      3
#define BTN_NEXT      4
#define BTN_UP        2
#define BTN_DOWN      5
#define lenght 16.0
#define PinWtr1 6  
#define PinWtr2 7  
#define PinWtr3 8  
#define PinWtr4 9  

typedef enum {
  BACKNEXTUPDOWNNONE
ENUM_BUTTON;

int PinWtr[] = {
 
6789
};


//inne
long MenuA 1;
//podmenu 1
long MenuB 1;
//podmenu wtrysk posredni
long MenuC 1;
//podmenu rodzaj wtrysku
long MenuD 1;

double percent=100.0;
unsigned char b;
unsigned int peace;

//parametry testera
float czas_wtrysku 5;
int czas_wtrysku_us 0;
int czas_dzial_min 0;
int czas_dzial_sek 0;
int czas_dzial 0;
int czas_obrotu 0;
int czas_obrotu_mnozenie czas_obrotu*2;
int Typ 1;
float czas 0;
float czas_start;
int obroty 600;
int zapet_sekwencja;
int zapet_full;
int zapetlenie 0;

//znak strzalki przy wyborze
byte strzalka[] = {
  B11000,
  B11100,
  B11110,
  B11111,
  B11111,
  B11110,
  B11100,
  B11000
};
byte smutnamina[] = {
  B00000,
  B00000,
  B01010,
  B00000,
  B01110,
  B10001,
  B00000,
  B00000
};

byte p1[] = {
B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000
  
};
 
byte p2[] = {
B11000,
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
  B11000
  
};
 
byte p3[] = {
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
  B11100
  
};
 
byte p4[] = {
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
  B11110
  
};
 
byte p5[] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111
  
};



void setup()
{
  pinMode(BTN_NEXTINPUT_PULLUP);
  pinMode(BTN_UPINPUT_PULLUP);
  pinMode(BTN_BACKINPUT_PULLUP);
  pinMode(BTN_DOWNINPUT_PULLUP);
  debouncerA.attach(BTN_NEXT);
  debouncerA.interval(100);
  debouncerB.attach(BTN_UP);
  debouncerB.interval(100);
  debouncerC.attach(BTN_BACK);
  debouncerC.interval(100);
  debouncerD.attach(BTN_DOWN);
  debouncerD.interval(100);

  lcd.init();
  lcd.begin(20,4);   // Inicjalizacja LCD 4x20
  lcd.backlight(); // zalaczenie podwietlenia 
  lcd.setCursor(0,0);
  lcd.print("RDS GARAGE");
  lcd.setCursor(0,1);
  lcd.print("www.RDSgarage.pl");
  lcd.setCursor(0,2);
  lcd.print("Z pasji do");
  lcd.setCursor(0,3);
  lcd.print("motoryzacji!");
  delayMicroseconds(3500);
  lcd.clear();
  lcd.setCursor(0,0); // Ustawienie kursora w pozycji 0,0 (pierwszy wiersz, pierwsza kolumna)
  lcd.print("Tester wtryskiwaczy");
  lcd.setCursor(0,1); //Ustawienie kursora w pozycji 0,0 (drugi wiersz, pierwsza kolumna)
  lcd.print("Wersja v1.02");
  lcd.setCursor(0,2); //Ustawienie kursora w pozycji 0,0 (drugi wiersz, pierwsza kolumna)
  lcd.print("TESTOWA");
  delayMicroseconds(3500);
  lcd.clear();
  
}

void loop() { 
debouncerA.update();
debouncerB.update();
debouncerC.update();
debouncerD.update();
  lcd.createChar(0strzalka);
  lcd.createChar(1smutnamina);
  lcd.createChar(2p1);
  lcd.createChar(3p2);
  lcd.createChar(4p3);
  lcd.createChar(5p4);
  lcd.createChar(6p5);
ENUM_BUTTON pressedButton getButton();
switch (
MenuA) {
 case 
1:
  if(pressedButton == DOWN) {
  if (MenuB 2) {
  MenuB++;
    }
  }
  if(pressedButton == UP) {
  if (MenuB 1) {
  MenuB--;
    }
  }
    lcd.setCursor(0,0);
    lcd.print("Wybierz ukl. wtry.:");
    //start podmenu 1
    switch (MenuB) {
    case 1:
    lcd.setCursor(0,1);
    lcd.write(0);
    lcd.print("Wtrysk posredni");
    lcd.setCursor(0,2);
    lcd.print("Wtrysk bezposredni");
    lcd.setCursor(18,2);
    lcd.print (" ");
    if(pressedButton == NEXT) {
    MenuA 2;
    lcd.clear();
     }
    break;
    case 2:
    lcd.setCursor(0,1);
    lcd.print("Wtrysk posredni");
    lcd.setCursor(15,1);
    lcd.print (" ");
    lcd.setCursor(0,2);
    lcd.write(0);
    lcd.print("Wtrysk bezposredni");
    if(pressedButton == NEXT) {
    MenuA 3;
    lcd.clear();
     }
    break;
    }
    //koniec podmenu 1
    break;

    //WYBOR 2 - MenuA
    case 2:
      if(pressedButton == DOWN) {
      if (MenuC 3) {
        MenuC++;
        lcd.clear();
         }
      }
      if(pressedButton == UP) {
      if (MenuC 1) {
        MenuC--;
        lcd.clear();
        }
       }
            switch (MenuC) {
              case 1:
                lcd.setCursor(0,0);
                lcd.print("Wtrysk posredni:");
                lcd.setCursor(0,1);
                lcd.write(0);
                lcd.print("Test nowy");
                lcd.setCursor(0,2);
                lcd.print("Test zdefiniowany");
                lcd.setCursor(0,3);
                lcd.print("Ustawienia");
                if(pressedButton == NEXT) {
                MenuA 4;
                lcd.clear();
                }
                break;
              case 2:
                lcd.setCursor(0,0);
                lcd.print("Wtrysk posredni:");
                lcd.setCursor(0,1);
                lcd.print("Test nowy");
                lcd.setCursor(0,2);
                lcd.write(0);
                lcd.print("Test zdefiniowany");
                lcd.setCursor(0,3);
                lcd.print("Ustawienia");     
                
break;     
              
case 3:
                lcd.setCursor(0,0);
                lcd.print("Wtrysk posredni:");
                lcd.setCursor(0,1);
                lcd.print("Test nowy");
                lcd.setCursor(0,2);
                lcd.print("Test zdefiniowany");
                lcd.setCursor(0,3);
                lcd.write(0);
                lcd.print("Ustawienia");
                break;

    }
    

    
if(pressedButton == BACK) {
    MenuA 1;
    lcd.clear();
     }
    break;
    
    
//WYBOR 3 - MenuA
    case 3:
    lcd.setCursor(0,0);
    lcd.print("Wybrales wtrysk");
    lcd.setCursor(0,1);
    lcd.print("bezposredni.");
    lcd.setCursor(0,2);
    lcd.print("Funkcja obecnie");
    lcd.setCursor(0,3);
    lcd.print("niedostepna ");
    lcd.write(1);
    lcd.print(" .");
    if(pressedButton == BACK) {
    MenuA 1;
    lcd.clear();
     }
    break;
    
    
//WYBOR 4 - MenuA
    case 4:
    lcd.setCursor(0,0);
    lcd.print("Wprowadz czas");
    lcd.setCursor(0,1);
    lcd.print("wtrysku:");    
    lcd
.setCursor(0,2);
    lcd.print("Czas: ");
    lcd.print(float(czas_wtrysku));
    lcd.print(" ms");
    if(pressedButton == DOWN) {
        czas_wtrysku czas_wtrysku-0.1;
        lcd.clear();
      }
    if(pressedButton == UP) {
        czas_wtrysku czas_wtrysku+0.1;
        lcd.clear();
       }
    if(pressedButton == BACK) {
    MenuA 2;
    lcd.clear();
     }
    if(pressedButton == NEXT) {
    MenuA 5;
    lcd.clear();
     }
    break;

        //WYBOR 5 - MenuA
    case 5:
    lcd.setCursor(0,0);
    lcd.print("Wprowadz czas");
    lcd.setCursor(0,1);
    lcd.print("dzialania:");    
    lcd
.setCursor(0,2);
    lcd.print("Czas: ");
    lcd.print(czas_dzial_min);
    lcd.print("min ");
    lcd.print(czas_dzial_sek);
    lcd.print("sek ");
    lcd.setCursor(0,3);
    lcd.print("WPROWADZ MINUTY ");
    if(pressedButton == DOWN) {
        czas_dzial_min--;
        lcd.clear();
      }
    if(pressedButton == UP) {
        czas_dzial_min++;
        lcd.clear();
       }
    if(pressedButton == BACK) {
    MenuA 4;
    lcd.clear();
     }
    if(pressedButton == NEXT) {
    MenuA 6;
    lcd.clear();
     }
    break;

    //WYBOR 6 - MenuA
    case 6:
    lcd.setCursor(0,0);
    lcd.print("Wprowadz czas");
    lcd.setCursor(0,1);
    lcd.print("dzialania:");    
    lcd
.setCursor(0,2);
    lcd.print("Czas: ");
    lcd.print(czas_dzial_min);
    lcd.print("min ");
    lcd.print(czas_dzial_sek);
    lcd.print("sek ");
    lcd.setCursor(0,3);
    lcd.print("WPROWADZ SEKUNDY");
    if(pressedButton == DOWN) {
      if (czas_dzial_sek != 0) {
        czas_dzial_sek--;
        lcd.clear();
      }
      }
    if(pressedButton == UP) {
      if (czas_dzial_sek != 59) {
        czas_dzial_sek++;
        lcd.clear();
      }
       }
    if(pressedButton == BACK) {
    MenuA 5;
    lcd.clear();
     }
    if(pressedButton == NEXT) {
    MenuA 7;
    lcd.clear();
     }
    break;

    //WYBOR 7 - MenuA
    case 7:
        if(pressedButton == UP) {
       if (obroty 7000) {
        obroty obroty+100;
        lcd.clear();
          }
      }
    if(pressedButton == DOWN) {
      if (obroty 500) {
        obrotyobroty-100;
        lcd.clear();
          }
       }
    lcd.setCursor(0,0);
    lcd.print("Wprowadz obroty:");
    lcd.setCursor(0,1);
    lcd.print(obroty);
    lcd.print("rpm");

    if(pressedButton == BACK) {
    MenuA 6;
    lcd.clear();
     }
    if(pressedButton == NEXT) {
    MenuA 8;
    lcd.clear();
     }
    break;

    //WYBOR 8 - MenuA
    case 8:
     if(pressedButton == DOWN) {
      if (MenuD 2) {
        MenuD++;
        lcd.clear();
         }
      }
      if(pressedButton == UP) {
      if (MenuD 1) {
        MenuD--;
        lcd.clear();
        }
       }
        switch (MenuD) {
    case 1:
        lcd.setCursor(0,0);
    lcd.print("Typ wtrysku:");
    lcd.setCursor(0,1);
    lcd.write(0);
    lcd.print("Sekwencja");
    lcd.setCursor(0,2);
    lcd.print("Full grupa");
    if(pressedButton == NEXT) {
    Typ 1;
    MenuA 9;
    lcd.clear();
     }
    break;
    case 2:
    lcd.setCursor(0,0);
    lcd.print("Typ wtrysku:");
    lcd.setCursor(0,1);
    lcd.print("Sekwencja");
    lcd.setCursor(0,2);
    lcd.write(0);
    lcd.print("Full grupa");
    if(pressedButton == NEXT) {
    Typ 2;
    MenuA 9;
    lcd.clear();
     }
    break;
        }
    if(pressedButton == BACK) {
    MenuA 7;
    lcd.clear();
     }
    break;

    //WYBOR 8 - MenuA
    case 9:
    lcd.setCursor(0,0);
    if (Typ == 1) {
    lcd.print("Praca sekwencja.");  
    
} else {
    lcd.print("Praca full grupa."); 
    }
    lcd.setCursor(0,1);
    lcd.print("Czas:"); 
    if (czas_dzial_min == && czas_dzial_sek == 0) {
    lcd.print("bez limitu");  
    
} else {
    lcd.print(czas_dzial_min);
    lcd.print("min ");
    lcd.print(czas_dzial_sek); 
    lcd.print("sek"); 
    }
    lcd.setCursor(0,2); 
    lcd.print("Obroty:"); 
    lcd.print(obroty); 
    lcd.print(" rpm"); 
    lcd.setCursor(0,3);
    lcd.print("Czas wtrysk: ");  
    lcd
.print(float(czas_wtrysku));
    lcd.print("ms");  
    
if(pressedButton == BACK) {
    MenuA 7;
    lcd.clear();
     }
    if(pressedButton == NEXT) {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("ETAP 1/2");  
    lcd
.setCursor(0,1);
    lcd.print("ZALACZAM");  
    lcd
.setCursor(0,2);
    lcd.print("POMPE");  
    lcd
.setCursor(0,3);
    lcd.print("PALIWA"); 
    //delay(5000);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("ETAP 2/2");  
    lcd
.setCursor(0,1);
    lcd.print("ZALACZAM");  
    lcd
.setCursor(0,2);
    lcd.print("WTRYSKIWACZE");  
    
//delay(1000);
    MenuA 10;
    lcd.clear();
    czas_dzial czas_dzial_sek + (czas_dzial_min 60);
    czas_wtrysku_us round(czas_wtrysku 1000);
    czas_obrotu = (1000/(obroty/60)*1000);

    zapet_sekwencja 120000000/obroty;
    zapet_full 60000000/obroty;
    
//sprawdzenie zapetlen
    if(Typ == 1) {
      
    
if (zapet_sekwencja <= czas_wtrysku_us) {
    lcd.setCursor(0,0);
    lcd.print("PRACA W");   
    lcd
.setCursor(0,1);
    lcd.print("ZAPETLENIU!");   
    zapetlenie 
1;
    delay(1000);
    } else {
    zapetlenie 0;
    }} else {
    if (zapet_full<= czas_wtrysku_us) {
    lcd.setCursor(0,0);
    lcd.print("PRACA W");   
    lcd
.setCursor(0,1);
    lcd.print("ZAPETLENIU!");   
    zapetlenie 
1;
    delay(1000);
    } else {
    zapetlenie 0;
    }}

    
    
    czas 
= (millis()/1000) + czas_dzial_sek + (czas_dzial_min 60);
    czas_start = (millis()/1000);
     }
    break;
     //WYBOR 10 - MenuA
    case 10:
       /* lcd.setCursor(0,0);
    lcd.print(czas - czas_start); 
    lcd.setCursor(0,1);
    lcd.print(millis()/1000 - czas_start); 
    lcd.setCursor(0,2);
    lcd.print(czas_dzial); 
    lcd.setCursor(0,3);
    lcd.print(double((millis()/1000 - czas_start)/(czas - czas_start))*100); 
    lcd.print(" %"); */
    if (czas_dzial_min == && czas_dzial_sek == 0) {
    lcd.setCursor(0,0);
    lcd.print("PRACA BEZ LIMITU");    
    lcd
.setCursor(0,1);
    lcd.print("WCISNIJ COFNIJ");
    lcd.setCursor(0,2);
    lcd.print("ABY PRZERWAC");
    if(Typ == 1) {
    Sekwencja(czas_wtrysku_usczas_obrotu_mnozeniezapetlenie);
    } else {  
    Full
(czas_wtrysku_usczas_obrotu);
    }
    
    
if(pressedButton == BACK) {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("TEST PRZERWANO");
    delay(2000);  
    MenuA 
1;
    lcd.clear();
     }
    } else {
      if(Typ == 1) {
      Sekwencja(czas_wtrysku_usczas_obrotu*2zapetlenie);
      } else {  
      Full
(czas_wtrysku_usczas_obrotu);
      }
      if(percent 100) {
          lcd.clear();
          lcd.setCursor(0,0);
    lcd.print("TEST ZAKONCZONO"); 
    analogWrite(PinWtr10);
    analogWrite(PinWtr20);
    analogWrite(PinWtr30);
    analogWrite(PinWtr40); 
    delay(1000);
    MenuA 1;
    lcd.clear();
     }
    if(pressedButton == BACK) {
      lcd.setCursor(0,3);
    lcd.print("TEST PRZERWANO");
    analogWrite(PinWtr10);
    analogWrite(PinWtr20);
    analogWrite(PinWtr30);
    analogWrite(PinWtr40); 
    delay(2000);  
    MenuA 
1;
    lcd.clear();
     }
     lcd.setCursor(00);
       double value = ((millis()/1000 czas_start)/(czas czas_start)) ;
       percent value*100.0;
      lcd.print("UKONCZONO:");
      lcd.print(" ");
      lcd.print(percent);
      lcd.print(" %   ");
      lcd.setCursor(0,2);
      double a=lenght/100*percent;
     if (a>=1) {
       for (int i=1;i<a;i++) {
        lcd.write(6);
      b=i;
        }
     a=a-b;
    }

 
  peace=a*5;
      switch (peace) {
        case 0:
        break;
        case 1:
         lcd.write(2);
         break;
        case 2:
         lcd.write(3);
         break;
        case 3:
          lcd.write(4);
         break;
        case 4:
          lcd.write(5);
         break;
      }
  for (int i =0;i<(lenght-b);i++) {
    lcd.print(" ");
  }
    
    
break;
    


  
}
}
}

ENUM_BUTTON getButton() {
  if(digitalRead(BTN_BACK)) return BACK;
  if(digitalRead(BTN_NEXT)) return NEXT;
  if(digitalRead(BTN_UP)) return UP;
  if(digitalRead(BTN_DOWN)) return DOWN;

  return NONE;
}


//sterowanie full group
void Full(int wtryskint obroty1)
{
  analogWrite(PinWtr1255); //Stan wysoki na mosfet
  analogWrite(PinWtr2255); //Stan wysoki na mosfet
  analogWrite(PinWtr3255); //Stan wysoki na mosfet
  analogWrite(PinWtr4255); //Stan wysoki na mosfet
  delayMicroseconds(wtrysk); //Odczekanie na dawkowanie wtrysku
  analogWrite(PinWtr10); //Stan niski na mosfet
  analogWrite(PinWtr20); //Stan niski na mosfet
  analogWrite(PinWtr30); //Stan niski na mosfet
  analogWrite(PinWtr40); //Stan niski na mosfet
  delayMicroseconds(obroty1-wtrysk); //Odczekanie czasu na obrot walu odjac czas wtrysku benzyny np. 120ms = 1000obr   
}

//sterowanie sekwencyjne
void Sekwencja(int wtryskint obroty2int zapetl)
{
for (
int i=i++) {
analogWrite(PinWtr[i], 255);
delayMicroseconds(wtrysk);  
analogWrite
(PinWtr[i], 0);
}
delayMicroseconds(obroty2-wtrysk);
}
    

Ps. Błagam bo już mnie męczy co zrobiłem nie tak. Zawiesza się w losowych momentach.
 
Odpowiedź
#2
Uruchom WDT i masz spokój ....

Przyczyna raczej w podłączeniach i zasilaniu dał byś schemat... Bo Program nie ma błędów.
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#3
Zasilacz za słaby. Oscyloskop wykazał że w trakcie "klikania" był spadek napięcia. Pewno dlatego że jest dodatkowo pull'up do masy.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości