Go Down

Topic: Ardweeny bloccato - programma scrive in loop sulla seriale (Read 525 times) previous topic - next topic

noise0

buonasera.
ho caricato maldestramente un programma che continua a scrivere con Serial.println sulla seriale..
di conseguenza non riesco piu a caricare il programma dall'ide
rimane nello stato "sto caricando" e sotto appare "avrdude: stk500_getsync(): not in sync: resp=0x00"

ho fatto qualche ricerca e per questo problema consigliano di resettare il micro premendo il pulsante di reset un attimo prima che l'ide inizi a trsmettere il programma... ho provato in vari modi ma non riesco piu a farlo funzionare :(

siete la mia unica speranza..   

Code: [Select]


void setup() {
   Serial.begin(9600);
}

void loop() {
  digitalWrite(ledPin,1);  // let led blink
  delay(70);
  digitalWrite(ledPin,0);  // let led blink
 
  int mic=readMic();
  long vcc=readVcc();
 
  Serial.print("vcc="  );
  Serial.print(vcc  );
  Serial.print("    mic="   );
  Serial.println(mic   );
}

Michele Menniti

si chiama "procedura di emergenza" e purtroppo è l'unico modo immediato per risolvere la questione, devi beccare il momento opportuno per premere il reset manualmente e ciò ti permette di caricare un qualsiasi nuovo sketch, risolvendo il problema. Cerca bene sul Forum e trovi la sequenza precisa per risolvere.
L'alternativa è quella di procurare un qualsiasi altro Arduino e ricaricare il bootloader mediante la tecnica ISP.
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

noise0

miracoloo ce l'ho fatta!!!
ho trovato la spiegazione di come usare un altro arduino per programmare il bootloader crcando "arduino isp" come mi hai detto tu..
purtroppo la procedura con il pulsantino di reset l'ho provata per due giorni .. cosi come indicato nel forum ma non sono riuscito mai a farlo funzionare...
grazie mille!!  in 5 minuti ho risolto..  ;)


noise0

ora pero mi viene un dubbio:
perche lo sketch che ho caricato mi piantava l'arduino..??
tra una scrittura e l'altra sulla seriale c'erano alemeno 70ms
e quindi si pone il problema:

Se uso un loop che prevede la scrittura sulla seriale (ad esempo se devo leggere i valori di un sensore) , quanto tempo devo lasciare inattiva la seriale affinche l'ide riesca acaricare i programmi senza problemi?

...

Michele Menniti

È buona norma far partire la seriale dopo un tempo di un paio di secondi così copri il tempo delreset automatico.
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

leo72


ora pero mi viene un dubbio:
perche lo sketch che ho caricato mi piantava l'arduino..??
tra una scrittura e l'altra sulla seriale c'erano alemeno 70ms
e quindi si pone il problema:

Se uso un loop che prevede la scrittura sulla seriale (ad esempo se devo leggere i valori di un sensore) , quanto tempo devo lasciare inattiva la seriale affinche l'ide riesca acaricare i programmi senza problemi?

...

70 ms sono niente.. come ti ha detto Michele, ti serve minimo minimo 1 secondo, meglio 2.

noise0

infatti inserendo delay(2000) all'inizio del programma non ho piu avuto problemi...
la cosa che non capisco ancora bene però è la seguente:

il programma inizia con 2 secondi di attesa e poi parte un ciclo stretto di scrittura sulla seriale...
io mi aspettavo che i due secondi all'inizio servissero per riuscire a caricare il programma in quei due secondi appunto (quindi reset e caricamento).
mentre ora l'arduino accetta la programmazione anche durante il ciclo di scrittura sulla seriale, senza bisogno di doverlo resettare...





leo72

I 2 secondi iniziali vengono trascorsi "girandosi i pollici", ossia introducono un ritardo che possa permettere all'utente di premere materialmente l'icona di upload di un nuovo sketch dopo che si è collegata la scheda al computer.

icio

La seriale della tua applicazione viene condivisa con la porta di comunicazione con il sistema di sviluppo, se la tua applicazione tiene occupata la seriale tutta per lui il sistema di sviluppo viene escluso ,  un delay iniziale fà sì che si possa recuperare  la connessione con il sistema di sviluppo

una cosa simile accade quando si progetta schede in cui il programma rimane più tempo in sleep che attivo, riconnettersi con la scheda mediante ISP durante il debug a volte risulta  faticoso


hiperformance71

A me è capitato qualche volta di bloccare l'IDE (sia 1.0.5 che 1.0.4) per colpa di troppi dati spediti alla seriale, purtroppo, l'unico rimedio era riavviare l'IDE dopo averlo resettato con Task Manager (e ci metteva un bel po ad essere "killed") poi ho rivisto il modo di inviare dati alla seriale e ho risolto, all'inizio pensavo fosse la versione 1.0.5 perché è iniziato da li, ma poi ho visto che era lo sketch che lo faceva intasare...
"The only way to do great work is to love what you do. If you haven't found it yet, keep looking. Don't settle" - Steve Jobs

icio

la cosa più semplice 5 secondi e fatto:  attacchi l'ISP programmer , un bel erase e go!

Michele Menniti

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

lesto

un sistema più veloce è di tenere premuto reset PRIMA di inserire alimentare l'arduino (ovvero PRIMA di collegarlo alla USB), cliccare sull'ide upload, appa compare la scritta "sketck size balablabla"lasciare il pulsante di reset.

il problema sui 70ms:
prendiamo il baudrate "standard" di 9600, equivale a 960 byte al secondo, ovvero 0.96 byte o caratteri al MS.

Quindi se la scrittura è più di 70 caratteri, non ce la fai. un sistema per aspettare l'invio di tutti i caratteri è usando la Serial.flush() (negli ide > 1.0.0 se ricordo bene)

il propblema è che questi byte finiscono poi nel 8u2, nel suo buffer interno, e poi da questo nel buffer del PC, che chissà che giri tortuosi può fare.

nel momento in cui resetti, devi anche attendere che i buffer si puliscano, (in particaolare quello dell'8u2), altrimenti il programmatore vedrà arrivare questi dati enon capisce più nulla. In teoria anche tenere premuto a lungo il reset funziona, ma alle volte anche decine di secondi, finchè il led TX si spegne
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up