Ciao a tutti.
Io ho un progetto che lavorerá h24 sempre, ed utilizza Arduino come controllo generale.
Il problema é che ho letto che millis(), una volta arrivato al massimo conteggio, dá problemi (non so se ricordo bene)
Ho quindi sempre letto che é bene resettare millis() poco prima del limite, o comunque farlo entro il limite
Il problema é che per farlo (sempre leggendo) ho visto che bisogna agire sul pulsante di reset (e non sarebbe un problema, basta un pin digitale collegato al pin reset)
Il problema é che, facendo cosí, se non sbaglio mi cancella tutte le variabili salvate in EEPROM (oppure no?)
In ogni caso, partirebbe da capo dimenticando ció che stava facendo...
Ad esempio, se all'inizio di uno sketch dichiaro una variabile intera e la pongo uguale a zero, e poi nel corso dell'esecuzione tale variabile cambia permettendo di accendere un led, se resetto la variabile torna di nuovo a zero e per accendere il led dovrebbe rifare ció che ha fatto in precedenza
ovviamente finché si tratta di un led, non stiamo neanche a discuterne, ma io non avró solo led...
Ci saranno circuiti importanti che, dopo il reset, necessiteranno di avere la situazione precedente
Insomma, a parte il reset della scheda, c'é un modo per evitare il problema millis()?
Resettare millis non serve, basta usarlo bene, guarda prima QUI, poi QUI vedrai che se rispetti la giusta sintassi e i giusti tipi non hai mai problemi
e poi un pin digitale sul pin di reset è fortemente sconsigliato dal produttore della MCU perchè non può garantire un reset corretto, se bisogna resettare per un problema software è appunto un problema software che va corretto, il reset (e il watch dog) devono essere impiegati solo per risolvere problematiche derivanti da eventi esterni non prevedibili
AleDi2:
Ho quindi sempre letto che é bene resettare millis() poco prima del limite, o comunque farlo entro il limite ....
Purtroppo internet è pieno di idiozie (... oltre il 90% dei tutorial e degli articoli che trovi su Arduino lo sono) e quanto hai letto è una delle tante ... segui i link che ti ha dato fabpolli e DIMENTICA il reset della MCU !
gpb01:
Purtroppo internet è pieno di idiozie (... oltre il 90% dei tutorial e degli articoli che trovi su Arduino lo sono) ...
Quanta verità in questa semplice frase Guglielmo
Se aggiungiamo che tanti, anzi troppi (!) "sono convinti che basti un tutorial per costruire un'astronave" come canta Brunori SAS la frittata è fatta...
"
In alternativa è possibile azzerare la millis() periodicamente con queste righe di codice
// da inserire nell'header del programma prima della Setup()
extern unsigned long timer0_millis;
// riga di codice per azzerare la millis()
timer0_millis = 0;
"
Un messaggio trovato qui sul forum
Com'é come soluzione? Pericolosa? Fattibile? Se sí, con quali accorgimenti? Meglio evitare?
Estrarre una frase da un contesto senza capire a cosa si riferiva NON ha alcun senso ...
... ti sono stati dati dei link da studiare ... STUDIALI e capirai perché NON ti serve alcun reset.
gpb01:
Estrarre una frase da un contesto senza capire a cosa si riferiva NON ha alcun senso ...
... ti sono stati dati dei link da studiare ... STUDIALI e capirai perché NON ti serve alcun reset.
Guglielmo
Ho CHIESTO perché son curioso, non ho detto che MI SERVE quel codice scritto nel mio messaggio
I link li ho giá letti, ho capito come fare (almeno in teoria, poi se nella pratica avró problemi scriveró di nuovo qui)
Anche perché, nel topic in questione, NON é stata spiegata tale soluzione
Quindi, la mia é pura curiositá.
AleDi2:
Anche perché, nel topic in questione, NON é stata spiegata tale soluzione
... perché NON esiste un motivo pratico (... se non forse qualche caso veramente particolare che ora nanche mi viene in mente) per cui uno dovrebbe azzerare il contatore che ... nel momento del overflow si azzera da solo quindi ... sempre zero diventa (unsigned long 0xFFFFFFFF + 0x00000001 = 0x00000000) ... :
Sdoganato il problema (non problema) di millis(), mi vorrei concentrare su questa frase:
AleDi2:
...ovviamente finché si tratta di un led, non stiamo neanche a discuterne, ma io non avró solo led...
Ci saranno circuiti importanti che, dopo il reset, necessiteranno di avere la situazione precedente
Se è così importante che la memoria non si resetti mai, allora devi proteggerti anche da riavvii accidentali, ad es. uno sbalzo di tensione.
Ci hai pensato?
maubarzi:
Se è così importante che la memoria non si resetti mai, allora devi proteggerti anche da riavvii accidentali, ad es. uno sbalzo di tensione.
... e NON solo ... stiamo parlado di "Arduino", una scheda prototipale che, di per sé, NON è immune a qualsiasi disturbo (basta guardare il numero di thread sui problemi con i relé), per cui ... :
gpb01:
... e NON solo ... stiamo parlado di "Arduino", una scheda prototipale che, di per sé, NON è immune a qualsiasi disturbo (basta guardare il numero di thread sui problemi con i relé), per cui ... :
Guglielmo
Tranquillo, i vari circuiti ci sono
Figuratevi che ho anche previsto una batteria tampone
maubarzi:
Sdoganato il problema (non problema) di millis(), mi vorrei concentrare su questa frase:
Se è così importante che la memoria non si resetti mai, allora devi proteggerti anche da riavvii accidentali, ad es. uno sbalzo di tensione.
Ci hai pensato?
Maurizio
Si, nel PCB che sto progettando ci sono tutti i circuiti di protezione, tra quelli di funzionamento
Comunque, io ho sempre utilizzato questa forma:
timeatt - timeprev >= Delay
Se non ho letto male l'articolo, questa é la forma che non reca problemi
Giusto? Quindi non avrei comunque avuto problemi?
AleDi2:
Se non ho letto male l'articolo, questa é la forma che non reca problemi
Giusto? Quindi non avrei comunque avuto problemi?
Esatto.
E sul primo articolo ti spiega anche bene in dettaglio il perchè.
Visto che ci siamo ti faccio anche l'ultima domanda: non è che per caso nel tuo codice usi la classe String?
Maurizio
P.S.
Visto che sei curioso, ti do la mia visione riguardo la funzione per resettare comunque millis().
Sarò limitato io, ma non mi viene in mente nessun caso dove abbia senso farlo, anche se in casi estremi può servire qualunque cosa.
Personalmente lo ritengo un accrocchio e in quanto tale da evitare come la peste a prescindere.
Poi, ammesso che lo si debba usare, sarebbe complicato capire come fare questo reset, specie nel caso in cui si usano più temporizzazioni sfalsate per fare più cose differenti.
Cioè se arrivo a fine capacità e devo resettare e ho due task che vanno eseguiti a distanza di 1s ma sono sfalsati di mezzo secondo tra di loro, siamo sicuri che mettendo 0 sia ancora garantita questa tempistica?
Oppure ne sballerò qualcuno?
Potrebbe funzionare solo con un'unica temporizzazione attiva, resettando il contatore e il riferimento della precedente lettura, ma se sono di più diventa un casino perchè dovrei andare a ricalcolare tutti i riferimenti corretti di tutte le altre temporizzazioni.
Meglio fare il test corretto e sfruttare l'overflow degli unsigned long. ;D
Se vuoi che la tua applicazione resti sempre attiva H24 evita come la peste la classe String
Usa invece le stringhe del C, cioè gli array di char.
La classe String tende a frammentare la memoria che poi ad un certo punto è talmente frammentata che Kaboom!
Puoi metterci tutte le protezioni hardware che vuoi ma il kaboom resta per mancanza di memoria libera per continuare l'esecuzione.
Per il resto, spero che ti sia convinto che il reset di millis() forse non è la strada giusta ma un semplice accrocchio.