Sari la conținut
ELFORUM - Forumul electronistilor

arduino problema "if"


Daniel_sv

Postări Recomandate

va salut

pe scut treaba este cam asa:

am facuta o automatizare pt un stung cu crduino. A intrat cineva in garaj si mi=a izbit controlerul de pamant. Aveam in el un arduino uno. Totul functiona perfect. Am decis, ca daca tot fac altul, sal fac cu mega. Totul bun facut carcasa tot modificat in soft pinii etc. La filetare surpriza nu functioneza. M-am chinuit o saptamana in fiecare seara. Dupa multe teste am o sectiune de cod care se comporta ciudat.

    pasiramasi=0; 
      while (lung > pasiparcursi){
  //    Serial.println(pasiramasi); 
           if (pasiramasi>0) {
              digitalWrite(pstep, 0);
              delayMicroseconds(spd);
              digitalWrite(pstep, 255);
              delayMicroseconds(duratapas - spd);
              pasiramasi--;
              pasiparcursi++;
              if (lung == pasiparcursi) noInterrupts();
              Serial.println(lastdurata);

              //Serial.println(pasiramasi);
            };};
      Serial.println("stop");  

 

intra in  while si desi pasiramasi este mai mare ca 0, verificat pe serial nu intra in if nici sa-l spargi cu ciocanul. Nu stiu ce draci are si de ce. Daca elimin mare parte din soft si las doar partea de filetare si ii dau cu valori prestabilite, acelasi functie isi face treaba. Nu gasesc explicatia. Poate are cineva o idee. 

Editat de nico_2010
Link spre comentariu
  • Răspunsuri 8
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Daniel_sv

    4

  • cirip

    1

  • modoran

    1

  • informer

    1

Top autori în acest subiect

Acum 1 minut, modoran a spus:

Chiar asta-i codul real ? Chiar prima linie spune care-i cauza.

Asta-i codul real. Variabila pasiramasi se incrementeaza intro intrerupere. Am si testat mai jos cu // sa vad daca intreruperea are loc. Valoare se incrementeaza dar nu face nimic din if.

Link spre comentariu
1 minute ago, modoran said:

Chiar asta-i codul real ? Chiar prima linie spune care-i cauza.

Asta vroiam sa-i scriu si eu... dar banuiesc ca-n rutina de intrerupere modifica "pasiramasi" ca altfel nu prea are sens... :).

Oricum, chiar daca-i asa, dupa bucata asta de cod nu se poate deduce mai nimic....

Link spre comentariu
1 hour ago, danieltnokia2000 said:

Variabila pasiramasi se incrementeaza intro intrerupere.

Salut,

Incearca sa declari "pasiramasi" ca volatile. E posibil  sa ti-o elimine optimizarea compilatorului si de aia nu mai intra in if.

Link spre comentariu

La initializare nu va intra in IF pentru ca este pasiramasi = 0.

Apoi zici ca variabila pasiramasi se incrementeaza (cu o valoare pas) intr-o intrerupere (e functia void impuls_universal() legata de attachInterrupt(digitalPinToInterrupt(encpin), impuls_universal, RISING)), dar la fiecare ciclu de bucla WHILE tu decrementezi (cu 1) aceeasi variabila pasiramasi.

 

Codul are un comportament aleator. Incrementarea variabilei pasiramasi se modifica dupa asteptari (cu pas)? Sau doar se incrementeaza, dar nu neaparat cu ceea ce vrei tu?

 

    while (buton != 21 && buton != 15) keypad();
    if (buton == 15) break;
    contorture = -1;
    pasiramasi = 0; pasiparcursi = 0;
    lcd.setCursor(0, 1);
  //lcd.print("Wait Sync       ");
    lcd.print("  Sincronizare  ");
    attachInterrupt(digitalPinToInterrupt(encpin), impuls_universal, RISING);
    digitalWrite(dstep, 0);
    while (contorture < mm * lung / pas) {
      while (pasiramasi > 0) {
        digitalWrite(pstep, 0);
        delayMicroseconds(spd);
        digitalWrite(pstep, 255);
        delayMicroseconds(duratapas-spd);
        Serial.println(duratapas);
        pasiramasi--;
        pasiparcursi++;
      }

 

De notat ca folosesti un WHILE in alt WHILE. Desigur exista practici mai bune de programare.

 

Codul complet mai jos, ca sa comenteze colegii mai usor.

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR    0x27
#define BACKLIGHT_PIN     3
#define mm 200
LiquidCrystal_I2C  lcd(I2C_ADDR, 2, 1, 0, 4, 5, 6, 7);
long lungime = 0;
#include <EEPROM.h>
#include <TimerOne.h>
//#define TIMER_US 1000000
//#define TICK_COUNTS 20
//Primele
#define r1 48
#define r2 46
#define r3 44
#define r4 42
#define c1 40
#define c2 38
#define c3 36
#define c4 34

#define a 8
#define b 3
#define c 4
#define bleft 5
#define bright 7
#define bstop 6

#define pstep 26
#define dstep 28

#define encpin 2
//volatile long tick_count = TICK_COUNTS;
volatile unsigned long duratatura, lastdurata, duratapas;
long pasi_a, timp_t, n_t, ta, accel = 0;
int sinc_flag = 0, sinc_filet = 0;
int s_m = 255, s_m1 = 255, s_m2 = 255;
int spd = 100;
// initialize the shit
long contorture, pasiramasi, pasiparcursi;
float filet[] = {mm * 0.75, mm * 0.8, mm, mm * 1.25, mm * 1.50, mm * 1.75, mm * 2, mm * 2.25, mm * 2.50, mm * 2.75, mm * 3, mm * 0.90, mm * 1.33, mm * 1.81};
int pas_c = 0; //17 tipuri de filet 0..11
int enc, pas_c1, buton = 255 , pas, lung = 0;
float curent, ps = 0;
int steps, coord, tr = 0;
char* menu[] = {"Avans <- ->", "Avs cu STOP", "Filet Metric"};
float menu2[] = {0.01, 0.02, 0.03, 0.04, 0.06, 0.10, 0.12, 0.15, 0.20, 0.25};
char* menu1[] = {"Pas : 0.75", "Pas : 0.80", "Pas : 1.00", "Pas : 1.25", "Pas : 1.50", "Pas : 1.75", "Pas : 2.00", "Pas : 2.25", "Pas : 2.50", "Pas : 2.75", "Pas : 3.00", "1/8 0.9", "1/4..3/8 1.33", "1/2..3/4 1.81"};
int m1, m2 , m11 = 255;
int enc_flag = 0;
long zero = 0;

void setup() {
  pinMode(encpin, INPUT);
  Serial.begin(115200);
  lcd.begin(16, 2);
  lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
  lcd.setBacklight(100);
  lcd.print("   - Meniu -   ");
  pinMode(a, INPUT_PULLUP);
  pinMode(b, INPUT_PULLUP);
  pinMode(c, INPUT_PULLUP);
  pinMode(bleft, INPUT_PULLUP);
  pinMode(bright, INPUT_PULLUP);
  pinMode(bstop, INPUT_PULLUP);
  
  ///  pinMode(bok, INPUT_PULLUP);
  //  pinMode(bcancel, INPUT_PULLUP);

  pinMode(dstep, OUTPUT);
  pinMode(pstep, OUTPUT);


  digitalWrite(pstep, 0);
  digitalWrite(dstep, 255);



  pinMode(13, OUTPUT);
  lcd.setCursor(0, 1);
  lcd.print(menu1[m1]);
  initializare();
  Serial.println("done");
}


void loop() {
  s_m = meniu(menu, 3);
  if (s_m == 3) {
    s_m1 = meniu(menu1, 14);
    if (s_m1 != 255) {
      pas = filet[s_m1 - 1];
      //  keypadread(12, 1);
      //  lung = lungime;
      filetare();
    }
  }

  if (s_m == 1) avansbut();
  if (s_m == 2) avansstop();

  //  delay(1000);
  s_m2 = 255;
  s_m = 255;
  s_m1 = 255;
//  lcd.begin(16, 2);
  lcd.print("   - Meniu -   ");
  int mat = keypad();
}

int encoderread() {
  int result = 0;
  volatile int j1, j2;
  j1 = digitalRead(a);
  if (j1 == 0) {
    j2 = digitalRead(b);
    if (j2 == 1) {
      result = 1;
    };
    if (j2 == 0) {
      result = -1;
    };
    while (j1 == 0 || j2 == 0)  {
      j1 = digitalRead(a);
      j2 = digitalRead(b);
    };
  }
  if (result != 0) delay(100);
  return result;
}


int meniu(char* meniul[], int numar) {
  int tm1, tm11;

  lcd.setCursor(0, 1);
  lcd.print("                ");
  lcd.setCursor(0, 1);
  lcd.print(meniul[tm1]);
  buton = 255;
  while (buton == 255) {
    keypad();
    enc = encoderread();
    if (enc != 0) {
      tm1 = tm1 + enc;
      if (tm1 == -1) {
        tm1 = 0;
      };
      if (tm1 == numar) {
        tm1 = numar - 1;
      };
      if (tm1 != tm11) {
        lcd.setCursor(0, 1);
        lcd.print("                ");
        lcd.setCursor(0, 1);
        lcd.print(meniul[tm1]);
        tm11 = tm1;
      };
    };
  }
  if (buton != 12) tm1 = 254;
  return tm1 + 1;
}


void avanssd(int mil, word viteza, int dir) {
  if (dir == 0)
    digitalWrite(dstep, 255); else digitalWrite(dstep, 0);
  for (int i = 0; i < mil; i++) {
    digitalWrite(pstep, 0);
    delayMicroseconds(spd);
    digitalWrite(pstep, 255);
    delay(viteza);
 //   Serial.println(viteza);
  }

}
void avansbut() {
  int sp = 3, state = 0;
  lcd.setCursor(0, 0);
  lcd.print("Avans <- ->   ");
  lcd.setCursor(0, 1);
  lcd.print("Viteza:      -|-");
  lcd.setCursor(8, 1);
  lcd.print(menu2[sp]);
  buton = 0;
  duratapas = 10000;
  attachInterrupt(digitalPinToInterrupt(encpin), impuls_feed, RISING);
  while (buton != 15) {
    keypad();
    int i = encoderread();
    if (i == -1) {
      if (sp > 0) sp--;
      lcd.setCursor(8, 1);
      lcd.print("    ");
      lcd.setCursor(8, 1);
      lcd.print(menu2[sp]);
    }

    if (i == 1) {
      if (sp < 9) sp++;
      lcd.setCursor(8, 1);
      lcd.print("     ");
      lcd.setCursor(8, 1);
      lcd.print(menu2[sp]);
    }



    if (buton == 21) {
      state = 1;
      lcd.setCursor(13, 1);
      lcd.print("<--");
    }

    if (buton == 22) {
      state = 2;
      lcd.setCursor(13, 1);
      lcd.print("-->");
    }
    if (buton == 10 || buton == 11) {
      state = 0;
      lcd.setCursor(13, 1);
      lcd.print("-|-");
    }
    Serial.println(duratapas);
    if (state == 1) avanssd(1, duratapas / (mm * menu2[sp]) / 1000 , 1);
    if (state == 2) avanssd(1, duratapas / (mm * menu2[sp]) / 1000 , 0);
  }
  buton = 255;
  detachInterrupt(digitalPinToInterrupt(encpin));
}


void filetare() {
  long x0 = 0, x1 = 0, xc = 0;
  buton = 255;
  lcd.setCursor(0, 1);
  lcd.print("Set   <-   ->   ");
  while (buton != 12) {
    keypad();
    while (digitalRead(bleft) == 0) {
      digitalWrite(dstep, 0);
      digitalWrite(pstep, 0);
      delayMicroseconds(spd);
      digitalWrite(pstep, 255);
      delayMicroseconds(1000);
      xc++;
    }
    while (digitalRead(bright) == 0) {
      digitalWrite(dstep, 255);
      digitalWrite(pstep, 0);
      delayMicroseconds(spd);
      digitalWrite(pstep, 255);
      delayMicroseconds(1000);
      xc--;

    }
    if (buton == 14) {
      Serial.println(xc);
    }
    if (buton == 11) {
      x0 = xc;
      lcd.setCursor(0, 1);
      lcd.print("Set   <-  |->|  ");
      delay(500);
      lcd.setCursor(0, 1);
      lcd.print("Set   <-   ->   ");
      Serial.println((x0 - x1) / mm);
    }


    if (buton == 10) {
      xc = 0;
      x1 = xc;
      lcd.setCursor(0, 1);
      lcd.print("Set  |<-|  ->   ");
      delay(500);
      lcd.setCursor(0, 1);
      lcd.print("Set   <-   ->   ");
  //    Serial.println((x0 - x1) / mm);
    }

  }
  lung = ((x0 - x1) / mm); //Serial.println(lung);
  if (lung < 0) lung = lung * -1;
  while (buton != 15) {
    keypad();

    lcd.setCursor(0, 0);
    lcd.print("Filetare... "); lcd.print(lung);
    lcd.setCursor(0, 1);
    lcd.print("Apasa <-        ");


    while (buton != 21 && buton != 15) keypad();
    if (buton == 15) break;
    contorture = -1;
    pasiramasi = 0; pasiparcursi = 0;
    lcd.setCursor(0, 1);
  //lcd.print("Wait Sync       ");
    lcd.print("  Sincronizare  ");
    attachInterrupt(digitalPinToInterrupt(encpin), impuls_universal, RISING);
    digitalWrite(dstep, 0);
    while (contorture < mm * lung / pas) {
      while (pasiramasi > 0) {
        digitalWrite(pstep, 0);
        delayMicroseconds(spd);
        digitalWrite(pstep, 255);
        delayMicroseconds(duratapas-spd);
        Serial.println(duratapas);
        pasiramasi--;
        pasiparcursi++;
      }
    }

    buton = 0;
    lcd.setCursor(0, 1);
    lcd.print("Apasa ->        ");

    while (buton != 22 && buton != 50) keypad();
    if (buton == 50) break;
    digitalWrite(dstep, 255);
    while (pasiparcursi > 0) {
      digitalWrite(pstep, 0);
      delayMicroseconds(spd);
      digitalWrite(pstep, 255);
      delayMicroseconds(2000);
      pasiparcursi--;
    }
    if (buton == 50) break;
  }
  buton = 255;
  Serial.begin(115200);
}

void impuls_feed() {
  static unsigned long last_interrupt_time = 0;

  volatile unsigned long interrupt_time = millis();

  if (interrupt_time - last_interrupt_time > 50) {
    duratapas = micros() - lastdurata;
    lastdurata = micros();
    //  if (duratapas>2000||duratapas<100) duratapas=500;
    //Serial.println(duratapas);
    last_interrupt_time = interrupt_time;
  }
}





void impuls_universal() {
  static unsigned long last_interrupt_time = 0;

  volatile unsigned long interrupt_time = millis();
 if (interrupt_time - last_interrupt_time > 10) {
    if (contorture > 1) {
      pasiramasi = pasiramasi + pas;
 //     Serial.println(micros() - lastdurata);
      duratapas = (micros() - lastdurata) / pasiramasi;
   //   Serial.println(duratapas);
      lastdurata = micros();
      if (contorture == mm * lung / pas) detachInterrupt(digitalPinToInterrupt(encpin));
    }
    if (contorture == 1) {
      duratapas = (micros() - lastdurata) / pas;
      lastdurata = micros();
    }
    if (contorture == 0) lastdurata = micros();
    last_interrupt_time = interrupt_time;
    contorture++;
  }
}
void avansstop() {
  int mode = 0;
  long feed = 800;
  zero = 0;
  lcd.setCursor(0, 0);
  lcd.print("    Ajustare    ");
  lcd.setCursor(0, 1);
  lcd.print("                ");
  lcd.setCursor(0, 1);
  lcd.print(feed);
  lcd.setCursor(6, 1);
  lcd.print(lungime);
  buton = 255;
  while (buton != 15) {
    if (buton == 13) {
      mode = 1;
      zero = 0;
      lcd.setCursor(0, 0);
      lcd.print(" B Mod lucru.   ");
    }
    if (buton == 12)
    {
      mode = 0;
      lcd.setCursor(0, 0);
      lcd.print(" A  Ajustare.   ");
    }
    //  Serial.println(mode);
    if (mode == 0) {
      int p = encoderread();
      if (buton == 14) {
        keypadread(6, 1);
        lcd.setCursor(6, 1);
        lcd.print("    ");
        lcd.setCursor(6, 1);
        lcd.print(lungime);
      }
      if (p == -1) if (feed > 100) {
          feed = feed - 100; lcd.setCursor(0, 1);
          lcd.print("    ");
          lcd.setCursor(0, 1);
          lcd.print(feed);
        }
      if (p == 1) if (feed < 1600) {
          feed = feed + 100; lcd.setCursor(0, 1);
          lcd.print("    ");
          lcd.setCursor(0, 1);
          lcd.print(feed);
        }
      while (digitalRead(bleft) == 0) {
        digitalWrite(dstep, 0);
        digitalWrite(pstep, 0);
        delayMicroseconds(spd);
        digitalWrite(pstep, 255);
        delayMicroseconds(1000);
      }
      while (digitalRead(bright) == 0) {
        digitalWrite(dstep, 255);
        digitalWrite(pstep, 0);
        delayMicroseconds(spd);
        digitalWrite(pstep, 255);
        delayMicroseconds(1000);
      }
    }
    if (mode == 1) {
      if (buton == 21) while (zero > 0) {
          digitalWrite(dstep, 0);
          digitalWrite(pstep, 255);
          delayMicroseconds(spd);
          digitalWrite(pstep, 0);
          delayMicroseconds(feed * 10);
          zero--;
        }
      if (buton == 22) while (zero <= lungime * mm)
        {
          digitalWrite(dstep, 255);
          digitalWrite(pstep, 0);
          delayMicroseconds(spd);
          digitalWrite(pstep, 255);
          delayMicroseconds(2000);
          zero++;
        }
    }
    keypad();
  }
}

void initializare() {
  pinMode(r1, INPUT_PULLUP);
  pinMode(r2, INPUT_PULLUP);
  pinMode(r3, INPUT_PULLUP);
  pinMode(r4, INPUT_PULLUP);

  pinMode(c1, OUTPUT);
  pinMode(c2, OUTPUT);
  pinMode(c3, OUTPUT);
  pinMode(c4, OUTPUT);

  digitalWrite(c1, 255);
  digitalWrite(c2, 255);
  digitalWrite(c3, 255);
  digitalWrite(c4, 255);
}

int keypad() {
  int rez = 255;

  digitalWrite(c1, 0);
  if (digitalRead(r1) == 0) rez = 1;
  if (digitalRead(r2) == 0) rez = 4;
  if (digitalRead(r3) == 0) rez = 7;
  if (digitalRead(r4) == 0) rez = 10;
  digitalWrite(c1, 255);

  digitalWrite(c2, 0);
  if (digitalRead(r1) == 0) rez = 2;
  if (digitalRead(r2) == 0) rez = 5;
  if (digitalRead(r3) == 0) rez = 8;
  if (digitalRead(r4) == 0) rez = 0;
  digitalWrite(c2, 255);

  digitalWrite(c3, 0);
  if (digitalRead(r1) == 0) rez = 3;
  if (digitalRead(r2) == 0) rez = 6;
  if (digitalRead(r3) == 0) rez = 9;
  if (digitalRead(r4) == 0) rez = 11;
  digitalWrite(c3, 255);

  digitalWrite(c4, 0);
  if (digitalRead(r1) == 0) rez = 12;
  if (digitalRead(r2) == 0) rez = 13;
  if (digitalRead(r3) == 0) rez = 14;
  if (digitalRead(r4) == 0) rez = 15;
  digitalWrite(c4, 255);
  if (digitalRead(bleft) == 0) rez = 21;
  if (digitalRead(bright) == 0) rez = 22;
  if (digitalRead(c) == 0) rez = 25;
 if (digitalRead(bstop) == 0) rez = 50;

  if (rez != 255 && rez != 21 && rez != 22 && rez != 10 && rez != 11 && rez != 13 && rez != 14 && rez != 15 && rez != 50 && rez != 25) delay(200);
  buton = rez;
  return rez;
  // Serial.println(buton);
}

void keypadread(int x, int y) {

  long temp = 0, i = 0;
  int k = 255;
  lcd.setCursor(x, y);
  lcd.print("----");
  while (k != 25) {
    k = keypad();
    if (k >= 0 && k <= 9 && i < 4) {
      temp = temp * 10 + k;
      lcd.setCursor(x + 3 - i, y);
      lcd.print(temp);
      i++;
    }
  }
  lungime = temp;
}

void testing(){
 attachInterrupt(digitalPinToInterrupt(encpin), impuls_feed1, RISING);
  volatile unsigned long timps=0;
  while(0<1){
 Serial.println(micros());
        digitalWrite(pstep, 0);
        delayMicroseconds(spd);
        digitalWrite(pstep, 255);
        delayMicroseconds(1000);
        pasiramasi--;
        pasiparcursi++;
 Serial.println(micros());
 Serial.println("--------------");
 
 delay(1000);
 
  }
  }

void impuls_feed1() {
  static unsigned long last_interrupt_time = 0;

  volatile unsigned long interrupt_time = millis(),timps;

  if (interrupt_time - last_interrupt_time > 50) {
    timps=micros()-timps;
    Serial.println(timps);
    timps = micros();
    //  if (duratapas>2000||duratapas<100) duratapas=500;
    //Serial.println(duratapas);
    last_interrupt_time = interrupt_time;
  }
}

 

Editat de Thunderer
Link spre comentariu

Cred ca era totusi ceva cu variabila pasiramasi pe care am declarato acum cu volatile si a inceput sa mearga. Si am mai modificat cate ceva. Am observat ca daca dezactivez intreruperea cu noInterrupts() dupa vreo cateva instructiuni softul se bloca si ingheta totul. In rest merge. O sa il mai testez. Multumesc pt implicare.

meniu_strung_06_2018_new.ino

 

 

Editat de danieltnokia2000
Link spre comentariu
  • 3 săptămâni mai târziu...

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări