Go Down

Topic: Freeze Arduino Duemilanove (Read 15278 times) previous topic - next topic

leo72

In allegato trovi il file leOS2.cpp da sostituire a quello che hai tu. Imposta il timer del watchdog a 2 secondi invece che a 30 ms com'è ora per cui dovresti avere tutto il tempo per uscire dal bootloader e arrivare al begin() dello scheduler che poi disattiva il wdt prima della reinizializzazione.

leo72

PS.
mi fai sapere se risolvi? se risolvi, aggiorno la lib per tutti.

Antroid

grazie per il supporto leo! :smiley-mr-green:
Ad ogni modo sto notando che il sensore di temperatura ha degli scostamenti di 1-2 gradi Celsius.

Ho deciso di effettuare un campionamento in modo tale da poter crearne una media  8)
Code: [Select]
float readTemp()
{
  float temp = 0.0;       // valore convertito in temperatura (°C)
  int val = 0;            // valore quantizzato dall'ADC [0..1023]
  int nread = 5;          // numero di letture (da 5 a 8)
  float somma = 0.0;      // somma delle letture
  for (int i=0; i<nread; i++)
  {
    val = analogRead( LM35_pin );              // legge il dato della tensione sul pin 'LM35_pin'
    temp = ( 100.0 *  vref * val ) / 1024.0;   // lo converte in °C
    somma += temp;                             // aggiunge alla somma delle temperature lette   
  }   
  return ( somma / nread );                     // ne calcola il valore medio
}

Intanto resto in attesa di tue leo!
Buona giornata! 8)

leo72

Sono io che aspetto tue notizie... lo hai scaricato il file che ti ho messo 2 post fa??  ;)

Antroid


In allegato trovi il file leOS2.cpp da sostituire a quello che hai tu. Imposta il timer del watchdog a 2 secondi invece che a 30 ms com'è ora per cui dovresti avere tutto il tempo per uscire dal bootloader e arrivare al begin() dello scheduler che poi disattiva il wdt prima della reinizializzazione.

Ho appena letto la tua risposta.. sei troppo immediato. non l'avevo notata :P
Quindi hai semplicemente aumentato il tempo del watchdog timer?

Antroid

Buongiorno leo,
questa mattina ho fatto la sostituzione del file come mi hai detto e ho riflashato il firmware..
ha trasmesso un solo dato ma adesso riprende a riavviarsi in continuazione...
Se provo ad uploadare il firmware mi restituisce un'altra volta questo errore
Quote
stk500_recv(): programmer is not responding

Antroid

Ciao pablos, grazie per la risposta.
Provvedo subito nel risponderti:
Quote
Metti un  server.begin(); ogni 2-3-5 minuti nel loop con un millis(), questo comporta un delay di 300 ms, se ti da fastidio vai nella lib w5100.cpp e cambia il delay (io l'ho tolto proprio)
Quel begin svuota i buffer e azzera i socket del wiznet, avendo tu una connessione webserver open-close non comporta nessun difetto, il problema lo avresti se la connessione restasse sempre connected()

per server.begin() intendi il mio " Ethernet.begin(mac);" ? se si posso utilizzare la libreria timer per eseguirlo e non ci sarebbero problemi(spero...)
Quote
la tua ethernet ha uno slot sd?

certo.. è lo shield ufficiale di arduino.. ma all'interno non ho alcuna scheda sd...
Quote
non usare i pin 4-10-11-12-13, ma questo lo saprai già

certo.. ti ringrazio per avermelo ricordato  :)
Quote
Ho dato un occhiata veloce, non posso dire con sicurezza perchè non mi sono messo a leggere tutti i passaggi da un void all'altro, ma sei sicurissimo che alla fine dei salti hai un client.stop sempre?

Vedendo il Serial Monitor vengono chiuse le connessioni ogni volta che ne apro una... quindi non credo che lasci connessioni aperte...  :P
Grazie ancora..

Antroid

Quote
W5100.init();

va bene se uso la libreria timer per non incasinare il codice con i millis()?

Antroid

una domanda stupida per voi ma per me importante... il watchdog che ho configurato attraverso le leOS2 di leo non dovrebbe dare problemi con queste modifiche, vero? :smiley-roll:

leo72

Il mio scheduler funziona usando il watchdog per cui non interferisce con nient'altro che non sia un altro scheduler basato su altri meccanismi trasparenti all'utente, ossia basati sull'uso di timer, oppure su funzioni di interrupt.
La Timer dovrebbe usare i millis per schedulare dei compiti.  Puoi abbinarla al leOS2. Ma con la Timer che di dovresti fare?
Perché il leOS2 è già uno scheduler e se nondevi far eseguire compiti gravosi, puoi usarlo per programmare l'esecuzione di eventi in background.

Antroid

Code: [Select]
void setup(){
Controller.addTask(initW5100, Controller.convertMs(5 * 60 * 1000)); //add a task to be executed after 5 minutes
}

void initW5100(){
W5100.init();
}

Una cosa del genere.... :smiley-red:

leo72

Va visto l'inizializzazione del wiz5100 cosa fa.

leo72

w5100.init pare abbastanza "innocua", ho visto dal codice che fa solo immpostazioni di pin e di registri, quindi dovrebbe andar bene in un task

Antroid

Inizio ad essere un po confuso! =(
questa mattina ho provato da remoto ad apportare la modifica del Controller.reset() all'interno del watchdog(leo mi aveva detto di applicare questa al posto della soluzione di massimo) ma penso che si stia riavviando in continuazione dalle 9.03 di questa mattina.
Alle 13 appena torno in laboratorio lo resetto e vediamo cosa succede.
Nel caso dovessi riscontrare ancora problemi imposto un'altro task per il reset del w5100, in modo tale da avere due task, uno per il reset della board e uno per il reset del chip w5100.
è corretto dichiarare il task in questo modo?
Code: [Select]
Controller.addTask(initW5100, Controller.convertMs(5 * 60 * 1000)); //add a task to be executed after 5 minutes
grazie ancora

leo72

Fai un test, perché quando ci sono dei problemi non dobbiamo aggiungerne di altri  :smiley-yell:

Caricati l'esempio del test del reset sulla tua 2009 senza nessun componente montato sopra, e verifica che il comportamento sia normale Dovresti:
1) vedere 3 lampeggi iniziali del led integrato
2) led che lampeggia con frequenza di 1 Hz
3) blocco del lampeggio
4) reset della scheda e ripartenza dal punto 1)

Se tutto questo non avviene significa che il bootloader della 2009 è incompatibile con il reset provocato dal watchdog.
Prova poi a montare la scheda Ethernet e rifai il test.
Se tutto funziona, integra il reset nel tuo sketch e riprova con un reset fisso a diciamo 10 s e controlla che tutto riparta.

Capito questo vediamo di sistemare l'uso del reset per evitare le collisioni suggerite da pablos.

Go Up