Arduino uno si resetta da solo

l'arduino si resetta da solo. il programma (nello specifico un "tris CPU vs Utente") funziona bene per un certo periodo di tempo, di solito una trentina di secondi, poi si resetta automaticamente come se premessi il tastino rosso di reset.
Se lascio l'arduino collegato col cavo USB ma senza toccare nulla, si resetta lo stesso!

Ho provato a cercare, sempre qui, se qualcuno avesse avuto lo stesso problema. Alcuni dicevano che la causa era della comunicazione seriale, ma io non la uso.. Alcuni dicono sia un problema di Watchdog e altri ancora dicono che la causa può essere la mancanza di spazio nella RAM.. ma non so davvero dove sbattere la testa :disappointed_relieved:

Qualcuno ha avuto, o sa come risolvere questo problema?

Grazie :slight_smile:

Puoi verificare se la RAM viene "mangiata" dal tuo programma.

Puoi usare questa funzione che dovrai richiamare nel loop() stampando su serial monitor il valore.

int freeRam () {
  extern int __heap_start, *__brkval; 
  int v; 
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
}

Grazie, ma non so come integrarlo..
dove devo inserirlo?
metto int freeram...ecc fuori dai vari "void", poi devo inserire freeram(); nel loop?

Louka95, quella è una "funzione" e, invece di essere di tipo "void" ovvero una funzione che non torna nulla, quella è di tipo "int" ovvero ti ritorna un "int".

Tu la metti nel tuo programma, come ogni altra funzione (loop() è una funzione, setup() è una funzione, ecc. ecc.) e ... quando nel tuo programma ti interessa sapere quanta memoria libera hai la richiami.

Esempio :

Serial.print("Memoria libera: ");
Serial.println( freeRam() );

Guglielmo

Louka95:
l'arduino si resetta da solo. il programma (nello specifico un "tris CPU vs Utente") funziona bene per un certo periodo di tempo, di solito una trentina di secondi, poi si resetta automaticamente come se premessi il tastino rosso di reset.
Se lascio l'arduino collegato col cavo USB ma senza toccare nulla, si resetta lo stesso!

Ho provato a cercare, sempre qui, se qualcuno avesse avuto lo stesso problema. Alcuni dicevano che la causa era della comunicazione seriale, ma io non la uso.. Alcuni dicono sia un problema di Watchdog e altri ancora dicono che la causa può essere la mancanza di spazio nella RAM.. ma non so davvero dove sbattere la testa :disappointed_relieved:

Qualcuno ha avuto, o sa come risolvere questo problema?

Grazie :slight_smile:

Se non metti il programma che stai usando o se non fornisci il link da cui scaricarlo, sarà difficile analizzare il problema e staremo qui a fare le solite 100 congetture su cos'è che può dar noia, tirando a caso... :cold_sweat:

gpb01:
Louka95, quella è una "funzione" e, invece di essere di tipo "void" ovvero una funzione che non torna nulla, quella è di tipo "int" ovvero ti ritorna un "int".

Tu la metti nel tuo programma, come ogni altra funzione (loop() è una funzione, setup() è una funzione, ecc. ecc.) e ... quando nel tuo programma ti interessa sapere quanta memoria libera hai la richiami.

Esempio :

Serial.print("Memoria libera: ");

Serial.println( freeRam() );




Guglielmo

Grazie :grin:
Il monitor seriale mi da un '1497' fisso.

Ribadisco il concetto che ha già espresso Leo :

leo72:
Se non metti il programma che stai usando o se non fornisci il link da cui scaricarlo, sarà difficile analizzare il problema e staremo qui a fare le solite 100 congetture su cos'è che può dar noia, tirando a caso... :cold_sweat:

... copia qui il codice (cortesemente racchiuso entro gli appositi TAG code, bottone # quando sei in edit) e vediamo se c'è qualche cosa di strano ...

Guglielmo

leo72:

Louka95:
l'arduino si resetta da solo. il programma (nello specifico un "tris CPU vs Utente") funziona bene per un certo periodo di tempo, di solito una trentina di secondi, poi si resetta automaticamente come se premessi il tastino rosso di reset.
Se lascio l'arduino collegato col cavo USB ma senza toccare nulla, si resetta lo stesso!

Ho provato a cercare, sempre qui, se qualcuno avesse avuto lo stesso problema. Alcuni dicevano che la causa era della comunicazione seriale, ma io non la uso.. Alcuni dicono sia un problema di Watchdog e altri ancora dicono che la causa può essere la mancanza di spazio nella RAM.. ma non so davvero dove sbattere la testa :disappointed_relieved:

Qualcuno ha avuto, o sa come risolvere questo problema?

Grazie :slight_smile:

Se non metti il programma che stai usando o se non fornisci il link da cui scaricarlo, sarà difficile analizzare il problema e staremo qui a fare le solite 100 congetture su cos'è che può dar noia, tirando a caso... :cold_sweat:

Si hai ragione haha :grin:
E' un codice da oltre 1000 righe, con una serie infinita di 'if'.. vi faccio comunque un "riassuntino" qui di seguito.

void turnoX() {
vari label 'void" nei quali ci sono tutte le possibilità che si potrebbero verificare durante la partita. la CPU cerca tra i vari 'if' quella che si sta verificando, e accende la casella che gli ho detto di accendere in quella precisa situazione.
}
void check() {
controlla tutti i casi di vittoria. controlla righe, colonne e diagonali. se un 'if' si avvera, le caselle vengono resettate per far reiniziare la partita.
}
void checkatt()
controlla se sono possibili dei casi di vittoria. esempio: ('X' = CPU, 'O' = utente, '-' = casella vuota)
se ad esempio c'è questa situazione:
X X -
- O -
-  -  -
La cpu deve sapere che per vincere deve occupare la casella C1, creando così una riga.
}
void checkdif() {
identico al checkatt, però controlla i casi di difesa. mette la X per bloccare una riga, colonna o diagonale dell'utente.
}
void setup() {
*Creazione numeri pseudo-casuali da 0 a 9* // nei primi turni la CPU accende una casella pseudo-random
*vari label (a_1, a_2, ecc)* //servono per funzionare correttamente la matrice
*check();* //controlla se qualcuno ha vinto
*if();* //conteggio di reset nel caso la partita finisse in parità. Azzera tutte le variabili.
*if();* //conteggio di reset nel caso qualcuno vincesse. Azzera tutte le variabili.
*lettura della pressione dei pulsanti*
switch(giocatore) { //se giocatore = 1 sta giocando la CPU, se giocatore = 2 sta giocando l'utente.
  case 1: //La CPU sta giocando
  switch(turno) { //riconosce in che turno siamo
    //vari case (da 0 a 8). alla fine di ogni turno di una casella 'turno++'. ogni turno ha il suoi turnoX_cpu, checkatt e checkdif nei quali sono programmate tutte le possibilità che si potrebbero verificare. Quando trova l'if che gli serve, accende la casella e pone giocatore = 2, in modo che al prossimo ciclo entri nel 'case 2: ' dello 'switch(giocatore)'
   break;
   } // chiude 'Switch(turno)'
  case 2: //L'utente sta giocando
  //riconosce quale pulsante è stato premuto, e fa illuminare la casella scelta
  break;
  } //chiude 'Switch(giocatore)'
} //chiude loop

Metto in download anche lo sketch. Scusate se ci sono 5000 commenti di warning haha.
E' ancora in fase di test.
Oh! ho messo in upload questo video riguardo al reset automatico:

TRIS_SENZA_DEMUX_CPU_PROVA_rispbyte_fin_2.ino (104 KB)