reset software non affidabile

Buongiorno a tutti, le ho provate tutte (e di piu’)…… e devo dire che ci sono anche tante cose sul web assolutamente contrastanti.
Comunque sia ho provato diverse soluzioni ma, quella che almeno ha la parvenza di resettare e’ quella che vi posto. Ha solo un problema, resetta, oltre a quando premo il pulsante, quando vuole. Non riesco a capire il perché. Qualcuno puo’ darmi qualche dritta su come venirne fuori?
Grazie.

#include <avr/io.h>
#include <avr/wdt.h>
int cicalino=11;
int pbreset = 12; 
#define Reset_AVR() wdt_enable(WDTO_4S); while(1) {} 
 
void setup(){pinMode(LED_BUILTIN, OUTPUT);
                  digitalWrite (LED_BUILTIN,LOW);
                  pinMode (cicalino, OUTPUT);
                  digitalWrite (cicalino, LOW);
                  pinMode(pbreset, INPUT); //pulsante di reset
                 }                                    //fine setup
 
void loop(){digitalWrite(LED_BUILTIN, HIGH);// led acceso
            digitalWrite (cicalino, HIGH); //
            delay(50);                       
            digitalWrite(LED_BUILTIN, LOW);// led spento
            digitalWrite (cicalino, LOW); //
            delay(50);                       
        if  (digitalRead (pbreset)==HIGH)  // pulsante di reset premuto
           {Reset_AVR();                  // reset arduino     
           }
      else {wdt_reset();               //reset timer dogwatch
           }                   // fine reset timer dogwatch
           }                  // fine loop

Una paio di domande, perchè ti serve resettare? Seconda, definisci meglio "quando vuole" perchè detto così si capisce poco. Se non riesci ad essere più specifico metti un po' di messaggi di debug su seriale in modo da tentare di capire che passaggi f il programma prima di "resettarsi".
Hai messo il debounce hardware sul pulsante? Resistenza di pull-down?
Ultima cosa, resettare una MCU con il watch-dog dovrebbe essere l'estrema risorsa per far ripartire il programma in caso di errori/blocchi non causati dalla "mal programmazione" ma da eventi esterni imponderabili a priori, quindi ti chiedo come mai vuoi percorrere questa strada? Qual'è la necessità di resettare la MCU?

Ah e anche, che scheda stai usando?
Poi, infine, per il futuro prima di postare il codice formattalo ed indentalo, rendi il lavoro di chi ti vuol aiutare più semplice, nell'IDE ti basta premere Ctrl+T

fabpolli:
Resistenza di pull-down?

Per me è questo il problema. Non ha messo alcuna resistenza, per cui l'input fluttua.
Per il resto, a parte l'orrenda indentazione, non vedo cose particolari.

docdoc:
Per me è questo il problema. Non ha messo alcuna resistenza, per cui l'input fluttua.
Per il resto, a parte l'orrenda indentazione, non vedo cose particolari.

Concordo in pieno con la tua analisi, ma quello che veramente mi interessa sapere è la motivazione della necessità del reset

fabpolli:
Concordo in pieno con la tua analisi, ma quello che veramente mi interessa sapere è la motivazione della necessità del reset

Mah, di sicuro non con quel codice, che forse è più un test proprio della funzionalitù di reset...

fabpolli:
Una paio di domande, perchè ti serve resettare? Seconda, definisci meglio "quando vuole" perchè detto così si capisce poco. Se non riesci ad essere più specifico metti un po' di messaggi di debug su seriale in modo da tentare di capire che passaggi f il programma prima di "resettarsi".
Hai messo il debounce hardware sul pulsante? Resistenza di pull-down?
Ultima cosa, resettare una MCU con il watch-dog dovrebbe essere l'estrema risorsa per far ripartire il programma in caso di errori/blocchi non causati dalla "mal programmazione" ma da eventi esterni imponderabili a priori, quindi ti chiedo come mai vuoi percorrere questa strada? Qual'è la necessità di resettare la MCU?

Grazie per le risposte...
Allora.. sto cercando con un taglia, cuci, rattoppa, e inventa , di mettere insieme uno sketch per un focus staker su soffietto nikon pb6. Lo so che voi siete esperti, io mi aggiusto. Dicevo, .... il reset lo vorrei usare come finecorsa di max , collegando un pin ad un reed. Questo perché mi riporterebbe al setup, dove eseguo un homing che mi resetta i contatori di posizione slitta.
Vi confermo che non ho messo nessuna resistenza né un debounce. Il problema però nasce dopo la prima pressione del pulsante di reset su pin 12( in questo caso). Dopo aver premuto una volta, da questo momento in poi il programma si resetta in modo random Se invece carico lo sketch e lo lascio girare non capita nulla, gira bene . Fosse un problema di ingresso flottante, non lo farebbe subito? Intendo non solo dopo la pressione del pulsante su pin 12.
Ma perché è così orrenda la mia indentazione?
A me non sembra poi così.... da imodium.
Ciao grazie.

bossfra:
Vi confermo che non ho messo nessuna resistenza né un debounce.

Ecco, appunto. Metti una 10k tra il pin e GND e vedrai.

Allora parto dalla questione indentazione, prova a premere Ctrl+T nell'IDE e vedi come lo indenta differente da te :slight_smile: detto questo se a te piace di più la tua e ti rende il codice più leggibile continua ad usarla ma se devi postare qualcosa apri un altro ide e premi Ctrl+T e poi posta, te ne seremo grati :slight_smile:
Se come dici tutto fila liscio probabilmente hai fortuna e il pin d'ingresso non fluttua (ma ci credo poco, quindi segui il condiglio di docdoc e metti la resistenza) e dopo il primo Arduino si resetta ogni 4 secondi circa, prova a mettere come prima riga nel setup

wdt_disable();

e vedi se si continua a resettare.
Detto questo, come detto prima, la via che stai percorrendo non è proprio quella corretta da seguire. Quindi ti suggerisco di prendere tutto quello che fai nel setup che ti serve rieseguire, lo metti dentro una funzione e quando ti serve la richiami, provo a farti un esempio per essere più chiaro, la tua situazione attuale è simile a questa:

void setup()
{
  istruzione 1
  istruzione 2
  istruzione 3
  istruzione 4
  istruzione 5
}

ammettiamo che a te serva rieseguire dalla tre alla cinque fai una cosa del genere:

void setup()
{
  istruzione 1
  istruzione 2
  le_mie_istruzioni();
}

void le_mie_istruzioni()
{
  istruzione 3
  istruzione 4
  istruzione 5
}

e poi nel loop:

if(fine_corsa_raggiunto)
{
  le_mie_istruzioni();
}

bossfra:
Lo so che voi siete esperti, io mi aggiusto.

E siamo qui per aiutare :wink: :smiley: chi in un certo argomento ne sa meno per poi chiedere aiuto su altri argomenti dove non siamo esperti :slight_smile:

Ci ho pensato a creare dei blocchi funzione, ma ormai , per le mie capacità, il programma è troppo complesso. Diciamo che ho imparato che programmare a blocchi è sicuramente meglio e ne terrò conto per i prossimi programmi. Quando torno a casa provo i vostri suggerimenti. E alla fine posterò anche il programma , quando almeno funzionante nella sua interezza. P.s. lo mando indentato come da voi suggerito.
Io lo vedo meglio così,
Istruzione
Condizione
Esecuzione
Commenti

bossfra:
Ma perché è così orrenda la mia indentazione?
A me non sembra poi così.... da imodium.

Hehehe, dai, guarda la versione che ti ho postato io e confrontala con la tua. Hai la prima istruzione sempre sulla stessa linea dopo una graffa aperta e le successive le allinei a quella, per cui hai quasi sempre 20 caratteri prima di tutte le altre istruzioni. Poi le graffe associate a caso, la chiusura non allineata con l'apertura, una if() interna ad un blocco allineata 4 caratteri in MENO...

Fidati, non sono dettagli da perfezionisti, ma se impari da subito a programmare con una indentazione decente (vedi sempre il mio esempio) quando farai programmi più complessi di queste venti righe ne trarrai enorme vantaggio e risparmierai anche parecchio in Novalgina. :smiley: Ma la fai anche risparmiare a chi cerca di aiutarti, perché gli eviti di doversi scervellare per capire un codice che tu magari conosci...

bossfra:
Io lo vedo meglio così,
Istruzione
Condizione
Esecuzione
Commenti

Si, ma anche se tutti i gusti son gusti (o, come si dice, "ogni scarrafone è bello a mamma soja", oppure "le opinioni sono come le palle, ognuno ha le sue" :wink: ) capisci che se sei l'unico a leggere il tuo programma, puoi fare sicuramente come ti piace di più, ma se è un codice da condividere con altri, allora inizia ad essere un problema che aumenta le difficoltà in modo esponenziale all'aumentare della complessità/lunghezza del codice!
Normalmente ti consiglio di seguire questo schema:

Funzione(parametri)
{
  // commento
  Istruzione;
  Istruzione;
  Condizione (if) 
  {
    // commento
    Istruzione;
    Istruzione ; // commento
 }
}

ed i commenti come ti pare, più o meno. Le graffe di apertura puoi anche metterle in linea (ma separale sempre con uno spazio:

Funzione(parametri) {
  // commento
  Istruzione;
  Istruzione;
  Condizione (if) {
    // commento
    Istruzione;
    Istruzione ; // commento
 }
}

D'altronde se nell'IDE premendo Ctrl-T (prova...) te lo indenta lui in automatico secondo standard, c'è un motivo no? :wink:

Ok.... mi arrendo alla globalizzazione.
Scherzo, grazie per ora.

Ho seguito i vostri consigli….. UNO SPETTACOLO!
Vi ringrazio, avete reso felice un 52enne..... mi sembra quando alle giostre vincevo il pesciolino!!!!
Adesso passo le righe di programma nel SACRO SKETCH!! :slight_smile: :slight_smile: :slight_smile: :slight_smile: :slight_smile:

:grinning: :grinning: :grinning:

Abbiamo entrambi "una certa età" diciamo, e con quelle spaziature mi ricordi i programmatori COBOL... Sarà mica che...? :wink:

No no... io sono sulla meccanica, vedo però i programmi dei colleghi elettronici , Siemens Simotion, che sono strutturati come il mio ide..... volevo fare il ganassa con arduino mi sa.

Allora visto che non é stato detto esplicitamente:
é sbagliato
usare il reset per far ripartire lo sketch arrivato al finecorsa.

Prova di imparare la programmazione per allontanarti di copiare pezzi e farli funzionare in qualche modo insieme.

Usa una macchina a stati finiti per definire ogni passo del Tuo progetto.
In questo modo puoi facilmente ritornare allo stato di partenza. Automa a stati finiti - Wikipedia

se i vari passi li definisci per esempio:

  1. impostazione dati (Passo, numero di scatti)
  2. start spostamneto carello alla posizione di partenza
  3. spostamento e controllo se hai fatto il numero di scatti predefiniti
  4. scatto
  5. home del carello

la sequenza di chiamata puó essere
2, 3, 3, 4, 3 ...4, 5, 1

Un controllo del finecorsa puó essere impostato indipendentemente e quello chiamare il passo 5.

Ciao Uwe

Ciao Uwe, ti capisco che suggerisci il meglio e condivido.
Io ci provo davvero a capire le cose e non solo "scopiazzare".
probabilmente mi servirà ancora del tempo, delle letture, delle prove e il vostro aiuto.