Auto reset con leOS e Arduino mega

salve a tutti
sto realizzando una macchinetta con arduino mega 2560, un display 4d , un lm35 per il controllo della temp
ho la necessità di eseguire due conteggi di tempi T1 e T2 e di variare la frequenza di uscita di 2 LED_1 LED_2 ed accendere fisso il LED_3
alla pressione del tasto parte il primo conteggio T1 ed il LED_2 lampeggia (in funzione della temperatura)
Allo scadere di T1 parte T2, il LED _1 lampeggia (in funzione della temperatura) il LED_3 si accende fisso.
Allo scadere del T2 tutto si spegne.
Per ora ho settato delle frequenze fisse per i test, tutto funziona regolarmente, ma dopo tre esecuzioni del ciclo arduino si resetta,
sempre e solo puntuale dopo tre esecuzioni
ho letto diversi post sul wtd ma non sono sicuro che sia lui
allego la parte del codice dove uso le leos
grazie per i suggerimenti

ALMA_5.ino (8.85 KB)

Eppure QUESTO topic è ben visibile in grassetto e spiega esattamente a cosa è dedicata questa sezione ... :roll_eyes:

Non puoi postare qui in Megatopic ... ed ora subirai le ire del primo Mod di passaggio ... ]:smiley: ]:smiley: ]:smiley:

Guglielmo

risolto,
grazie

Come hai risolto? Qual era il problema che avevi?

il problema era che dopo tre cicli della routine sopra descritta Arduino si auto resetta, in oltre non era possibile cambiare la frequenza dei lampeggi dei led pena il crash del sistema,
Evidentemente arduino riesce a gestire "n" processi leOS se questi processi, io ne ho usati 4 contemporaneamente, vengono messi in pausa e poi fatti ripartire dopo 12 restart il sistema si blocca e si auto resetta, per ovviare al problema ho completamente eliminato il task al suo termine per poi crearne uno nuovo al ciclo successivo, idem per variare la frequenza
considerato che il cambio della frequenza "in corsa" blocca il sistema ho "eliminato il task con la frequenza "a" per caricarne uno nuovo con la frequenza "b".
sono riuscito cosi a porre ben 5 condizioni in cui la frequenza viene variata.
certo considerato che i cambi di frequenza servono a variare il calore generato da alcune lampade infrarosso al quarzo piuttosto che mettere dei paletti fissi quali se temp >=x && <y frequenza = zz mi piacerebbe creare una specie di pid, un' equazione dinamica ma non credo sia possibile con leOS,
resto a disposizione per eventuali chiarimenti sul codice

void pid_temperatura(int temp)
{
  if (temp<30 && acceso_fisso==false)
  {
    myOS.pauseTask(leOS_res);
    statoRESIST=1;
    acceso_fisso=true;
    digitalWrite(Resistenza_pin,HIGH);
    for (int i=0; i<5; i++)
      babu[i]=false;
  }
  else
  {
    if (temp>=30 && temp<40 && spento==false && babu[0]==false)
    {
      acceso_fisso=false;
      myOS.removeTask(leOS_res);
      freq_r=300;
      myOS.addTask(leOS_res, freq_r);
      babu[0]=true;
      babu[1]=false;
      babu[2]=false;
      babu[3]=false;
      babu[4]=false;
    }
    else
      if (temp>=40 && temp<50 && spento==false && babu[1]==false)
      {
        acceso_fisso=false;
        myOS.removeTask(leOS_res);
        freq_r=400;
        myOS.addTask(leOS_res, freq_r);
        babu[0]=false;
        babu[1]=true;
        babu[2]=false;
        babu[3]=false;
        babu[4]=false;
      }
	 else
      if (temp>=50 && temp<90 && spento==false && babu[2]==false)
      {
        acceso_fisso=false;
        myOS.removeTask(leOS_res);
        freq_r=800;
        myOS.addTask(leOS_res, freq_r);
        babu[0]=false;
        babu[1]=false;
        babu[2]=true;
        babu[3]=false;
        babu[4]=false;
      }
	 else
      if (temp>=50 && temp<90 && spento==false && babu[3]==false)
      {
        acceso_fisso=false;
        myOS.removeTask(leOS_res);
        freq_r=1000;
        myOS.addTask(leOS_res, freq_r);
        babu[0]=false;
        babu[1]=false;
        babu[2]=false;
        babu[3]=true;
        babu[4]=false;
      }
	 else
      if (temp>=50 && temp<90 && spento==false && babu[4]==false)
      {
        acceso_fisso=false;
        myOS.removeTask(leOS_res);
        freq_r=1200;
        myOS.addTask(leOS_res, freq_r);
        babu[0]=false;
        babu[1]=false;
        babu[2]=false;
        babu[3]=false;
        babu[4]=true;
      }  
  }
}

Evidentemente arduino riesce a gestire "n" processi leOS se questi processi, io ne ho usati 4 contemporaneamente, vengono messi in pausa e poi fatti ripartire dopo 12 restart il sistema si blocca e si auto resetta, per ovviare al problema ho completamente eliminato il task al suo termine per poi crearne uno nuovo al ciclo successivo, idem per variare la frequenza
considerato che il cambio della frequenza "in corsa" blocca il sistema ho "eliminato il task con la frequenza "a" per caricarne uno nuovo con la frequenza "b".

Problema 1:
se tu stoppi e riavvii 12 volte un task, l'Arduino ti va in reset? Ho capito bene?

Problema 2:
se cambi l'intervallo di chiamata di un task, ti si blocca l'Arduino?

Domanda:
che versione del leOS stai usando esttamente (puoi vederla nel file leOS.h, c'è una define ad inizio file).

Problema 1:
Si, ogni volta che premo il pulsante start, avvio, e conseguentemente stoppo 4 task, alla fine del terzo avvio , immancabbilmente si resetta;

Problema 2:
se in "myOS.removeTask(leOS_vel1);"
pauso il task, cambio valore di leOS_vel1 , riavvio il task il tutto va inesorabilmente in crash

la versione del leOS sono :ATTINYx313

l'unica soluzione valida che al momento sembbra funzionare è chiudere i task e ricrearli exnovo con il nuovo valore
avevo pensato di usare leos2 ma confesso di aver paura di mettere mano al firmware e non ho poi capito nemmeno bene come fare

La versione è questa:

//library version
#define leOS_VERSION 113

Tu cosa leggi?

La versione è la 111

Ok.
Grazie dell'info mi sono accorto che sul mio sito non ho aggiornato il leOS all'ultima versione. Per ora non posso cambiarla (non sono a casa), però puoi tirare giù la 1.1.3 da qui:

Nella 1.1.1 c'era un bug proprio nella gestione della modifica ai task, corretta nella 1.1.2 (la 1.1.3 corregge altri piccoli bug).

Grazie,
questo vuol dire che posso mettere in pausa un task e poi riavviarlo?
e posso anche variare il parametro della frequenza al volo o è meglio stoppare e ripartire?

Sulla pausa e ripartenza sei il primo che mi segnala dei problemi. Sul fatto del poter modificare un task liberamente, con la 1.1.3 non dovresti avere problemi.

Magari tutto aveva origine dalla modifica dei task,
questa sera farò dei test e pubblico i risultati
grazie mille intanto

Se ce la faccio (ma non credo) stasera (o al max domani) rifaccio delle prove anch'io per lo start/stop dei task.

ottimo la condizione di auto reset, per il mio sketc è:
avvio task 1 e task 2, task 3
finito task 1 lo pauso,
pauso task 2 e cambio il valore e lo restarto,
avvio task 4
finito task 4
pauso anche 2 e 3

Fantastico,In effetti adesso con la nuova versione non si resetta più e mi sembra che accetti anche la variazione del parameto,
a tuo avviso per il cambio di frequenza ritieni più opportuno pausare e ristartare, od esistono altri metodi più convenienti?
l'obiettivo è un controllo dinamico finalizzato al raggiungimento di una temperatusa prefissata ed il suo mantenimento più costante possibile nel tempo
grazie

La modifica la puoi fare al volo, non hai bisogno di fermare il task. Puoi controllare se il task è già in pausa (esiste il metodo getTaskStatus) e modificarlo secondo necessità.

Grazie questo mi permettera di fare un codice più pulito e snello
sistemo il tutto posterò il codice