Daniel_sv Postat Iulie 14, 2018 Partajează Postat Iulie 14, 2018 (editat) 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 Iulie 16, 2018 de nico_2010 Link spre comentariu
modoran Postat Iulie 14, 2018 Partajează Postat Iulie 14, 2018 Chiar asta-i codul real ? Chiar prima linie spune care-i cauza. Link spre comentariu
Daniel_sv Postat Iulie 14, 2018 Autor Partajează Postat Iulie 14, 2018 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
informer Postat Iulie 14, 2018 Partajează Postat Iulie 14, 2018 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
Daniel_sv Postat Iulie 14, 2018 Autor Partajează Postat Iulie 14, 2018 Daca este nevoie il pun tot numai cai mare. meniu_strung_06_2018.ino Link spre comentariu
cirip Postat Iulie 14, 2018 Partajează Postat Iulie 14, 2018 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
Mircea Postat Iulie 15, 2018 Partajează Postat Iulie 15, 2018 (editat) 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 Iulie 15, 2018 de Thunderer Link spre comentariu
Daniel_sv Postat Iulie 15, 2018 Autor Partajează Postat Iulie 15, 2018 (editat) 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 Iulie 15, 2018 de danieltnokia2000 Link spre comentariu
Vizitator Postat August 2, 2018 Partajează Postat August 2, 2018 La 14.07.2018 la 21:41, danieltnokia2000 a spus: };}; ce inseamna asta ? Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum