Programma su nano si blocca

Salve a tutti, ho scritto un programma che servirebbe come inverter per il controllo di un motore asincrono trifase.
Provando a lanciare il programma, non capisco il perché si blocca su dei cicli for.
Ho provato a fare diverse modifiche e prove, ma nulla da fare.
Inserisco il codice, se qualcuno riesce ad aiutarmi.
Cordiali Saluti,
Fausto

byte sector;
byte index;
byte angle;
byte r=5; byte s=6; byte t=7;
unsigned long t1=0;
unsigned long t2=0;
unsigned long t0=0;
float m = 0.8;
unsigned long ts=3000;   //  1/freq Pulse
unsigned long start_=0;
const unsigned long MAX_T= 0-1;
double t1d=0;double t2d=0;

// k1=(2/3) * sqrt(3) * sin(60-fi)
// k2=(2/3) * sqrt(3) * sin fi
double k1[]={ 0.88455, 0.5773, 0.2     };
double k2[]={ 0.2    , 0.5773, 0.88455 };
unsigned long delta_t=0;
//===========================================
void setup() {
Serial.begin (115200);
//Serial.println("start_");
pinMode (8,INPUT_PULLUP); //PORTB 0 direction
pinMode (13,OUTPUT);      //PORTB 5 syncro
bitClear(PORTB,5);
 pinMode (r,OUTPUT); bitClear(PORTD,r);
 pinMode (s,OUTPUT); bitClear(PORTD,s);
 pinMode (t,OUTPUT); bitClear(PORTD,t);
}
//-----------------wait-time----------------
void wait(unsigned long tt){
 do  {t2=micros();
        if (t2 > start_) delta_t = t2-start_;  
        else  delta_t = (MAX_T-start_)+t2+1;
      } while (delta_t < tt); delta_t=0;
}
//===========================================
void loop() {   new_turn:
  for (sector=0;sector<6; ++sector){  
    for (angle=0; angle<3; ++angle) { 

    t1d=(double)k1[angle]* m * ts; t1=(unsigned long)t1d;
    t2d=(double)k2[angle]* m * ts; t2=(unsigned long)t2d;
    t0=ts-t1-t2;   
    Serial.print(sector);Serial.print(" "); Serial.println(angle);
    wait(t0);
    switch (sector){
  case 0: bitSet(PORTB,5);
          bitSet(PORTD,r);  start_=micros();  wait(t1); 
          bitSet(PORTD,s);  start_=micros();  wait(t2); 
          bitSet(PORTD,t);  start_=micros();  wait(t0);
          bitClear(PORTD,t);start_=micros();  wait(t2); 
          bitClear(PORTD,s);start_=micros();  wait(t1); 
          bitClear(PORTD,r);start_=micros();
          break;
  case 1: bitSet(PORTD,s);  start_=micros();  wait(t1); 
          bitSet(PORTD,r);  start_=micros();  wait(t2); 
          bitSet(PORTD,t);  start_=micros();  wait(t0);
          bitClear(PORTD,t);start_=micros();  wait(t2); 
          bitClear(PORTD,r);start_=micros();  wait(t1); 
          bitClear(PORTD,s);start_=micros();
          break;
  case 2: bitSet(PORTD,s);  start_=micros();  wait(t1); 
          bitSet(PORTD,t);  start_=micros();  wait(t2); 
          bitSet(PORTD,r);  start_=micros();  wait(t0);
          bitClear(PORTD,r);start_=micros();  wait(t2); 
          bitClear(PORTD,t);start_=micros();  wait(t1); 
          bitClear(PORTD,s);start_=micros();
          break;
  case 3: bitClear(PORTB,5);
          bitSet(PORTD,t);  start_=micros();  wait(t1); 
          bitSet(PORTD,s);  start_=micros();  wait(t2); 
          bitSet(PORTD,r);  start_=micros();  wait(t0);
          bitClear(PORTD,r);start_=micros();  wait(t2); 
          bitClear(PORTD,s);start_=micros();  wait(t1); 
          bitClear(PORTD,t);start_=micros();
          break;
  case 4: bitSet(PORTD,t);  start_=micros();  wait(t1); 
          bitSet(PORTD,r);  start_=micros();  wait(t2); 
          bitSet(PORTD,s);  start_=micros();  wait(t0);
          bitClear(PORTD,s);start_=micros();  wait(t2); 
          bitClear(PORTD,r);start_=micros();  wait(t1); 
          bitClear(PORTD,t);start_=micros();
          break;
 default: bitSet(PORTD,r);  start_=micros();  wait(t1); 
          bitSet(PORTD,t);  start_=micros();  wait(t2); 
          bitSet(PORTD,s);  start_=micros();  wait(t0);
          bitClear(PORTD,s);start_=micros();  wait(t2); 
          bitClear(PORTD,t);start_=micros();  wait(t1); 
          bitClear(PORTD,r);start_=micros();
          Serial.println("end");
          }  
//======================================================    
    }
  } goto new_turn;
}

Ribadisco quanto ti è stato scritto QUI ...
... stiamo ancora aspettando e ... mi raccomando, leggi attentamente il REGOLAMENTO (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15).

Guglielmo

Riguardo al punto 15, io sto parlando di software, non di circuiti a tensione pericolosa.

Non facciamo differenza, se il software deve comandare qualche cosa che lavora oltre la bassissima tensione ... NON se ne parla, mi spiace.

Guglielmo

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.