(SOLUCIONADO) Stack wemos d1 esp8266

Tengo un problema al controlar un motor pap con easydriver desde mi wemos d1.

Uso la siguiente funcion para mover el motor

void rotateDeg(float deg, float speed){ 
  //rotate a specific number of degrees (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  int dir = (deg > 0)? HIGH:LOW;
  digitalWrite(DIR,dir); 

  int steps = abs(deg)*(1/0.225);
  float usDelay = (1/speed) * 70;

 for(int  i=0; i < steps; i++){ 
    
    digitalWrite(STEP, HIGH); 
    delayMicroseconds(usDelay); 
    

    digitalWrite(STEP, LOW); 
    delayMicroseconds(usDelay); 
    
  } 
}

Pensando que delayMicroseconds no active el watchdog he cambiado el codigo llamando a yield y ha quedado asi

void rotateDeg(float deg, float speed){ 
  //rotate a specific number of degrees (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  int dir = (deg > 0)? HIGH:LOW;
  digitalWrite(DIR,dir); 

  int  steps = abs(deg)*(1/0.225);
  float usDelay = (1/speed) * 70;

yield();
  for(int  i=0; i < steps; i++){ 
    yield();
    digitalWrite(STEP, HIGH); 
   // delayMicroseconds(usDelay); 
    

    digitalWrite(STEP, LOW); 
   // delayMicroseconds(usDelay); 
    
  } 
}

El problema es que si paso un valor relativamente pequeño, por ejemplo 1600, el motor funciona perfectamente y el esp no se resetea. Pero necesito que el motor de 40 vueltas completas para hacer un barrido y en ese caso le paso como valor 64000. El motor comienza a moverse, da dos otres vueltas completas y el esp se reinicia.

Pense que con el yield() seria suficiente, pero no.

El error que da es el siguiente

Soft WDT reset

>>>stack>>>

ctx: cont
sp: 3ffefe90 end: 3fff00a0 offset: 01b0
3fff0040:  401001f0 00001ba3 000000af 40100219  
3fff0050:  00000000 000000af 00001ba3 40207620  
3fff0060:  3ffe8693 00000000 3ffeeae0 3ffeebf0  
3fff0070:  3ffee9a8 00000000 3ffeea84 402077b2  
3fff0080:  3fffdad0 00000000 3ffeebc0 4020d7d0  
3fff0090:  feefeffe feefeffe 3ffe855c 40100dcd  
<<<stack<<<
⸮E)⸮?)⸮⸮

Tambien he probado a desactivar el watchdog por software con identico resultado.

Alguna idea de como hacer esta llamada sin que se quede colgado?

Porque en lugar de poner un retardo duro usando

delayMicroseconds(usDelay);

lo haces dentro de una máquina de estados donde el watchdog pueda refrezcarse?

Tu mismo tienes solución delante de tus narices, como has dicho

si paso un valor relativamente pequeño, por ejemplo 1600,

entonces no puedes pasarte de ese tiempo o bien hacerlo de otro modo como el que te propongo.

usar una máquina de estados obliga a cambiar el concepto de como se programan dichos retardos y tmb como funcionan las rutinas.

Pero por ahora es la mejor idea que tengo.

Ve a Documentación => Indice de temas tutoriales => millis() o micros() en tu caso y también lee máquina de estados.

Gracias por la info.

He hecho algo parecido creo.
He metido en una variable global el mayor desplazamiento y en otra, otro menor donde no se cuelga, con un if en el loop voy controlando esta variable y restandole cada vez que sale del loop llamando a la funcion con el valor menor.
Al terminar los ciclos a esa variable le asignaria un 0, con lo que el programa continuaria. Esa era mi teoria.
He avanzado en que consigo la mitad del desplazamiento, unos 10 vueltas completas, pero al final sigue colgandose.

Investigare las maquinas de estados mas en profundidad, a ver si doy con la tecla, aunque nunca pensé que en arduino hacer que un motor pap se moviese "indefinidamente" fuese a darme tanta guerra.

Bueno pero de ese modo estas JUSTO y lo que te propongo da mas libertad.
Necesitaría ver todo el código para entender que esta pasando o me aseguras que solo en esa rutina que muestras hay uso de delayMicroseconds()?

Si, es solo en esa rutina.
Al final con el contador lo he solventado, adicionalmente en las pruebas añadi un Serial.println (variable) y este es el que por ultimas me estaba colgando el esp, supongo que porque se ejecutaba a cada ciclo.
Elimine ese Serial.pritnln y me di cuenta de que no se colgaba y a partir de ahi a afinar.

Lo he hecho pasando siempre 100 como valor, por lo que el watchdog va mas que desahogado, se que hasta 3000-4000 no cuelga.

Tal vez es un poco chapuza pero funciona.

Te cuento surbyte. El programa que hago controla un motor que va unido a un husillo de 30 vueltas, tambien hay otro motor con un husillo de 40 vueltas. Este valor de vueltas puede ser variable según el montaje mecanico que se haga.

En un futuro llevara finales de carrera y el solo se regulara en funcion del husillo que tenga instalado durante el primer reset y ese sera el valor maximo de vueltas que podra dar en un sentido o en otro.

Antes de complicarme con los finales de carrera pretendía hacer que se moviese de extremo a extremo haciendo yo el calculo de las vueltas que necesitaba dar. Me quede parado al ver que se colgaba el esp, pero con la chapuza que os cuento ya se continuar con el proyecto.

Gracias por la ayuda, por cierto, muy interesante lo de la maquina de estados, no lo conocia. Lo investigare mas adelante para algun proyecto mas complejo.

Si te recomiendo no usar nunca delay, y en cambio hacer todo por máquina de estados.
Si revisas este foro, hay numerosos ejemplos que hemos dado cambiando códigos que estaban dando problemas y la máquina de estados CAMBIA todo.
Solo hace falta hacer un salto en programación porque como has visto hay que pensar las cosas de otro modo... pero cuando se comprende el código fluye mejor.