Arduino Forum

International => Italiano => Software => Topic started by: zoomx on May 17, 2013, 10:42 am

Title: Scrivo su SD ma il file è vuoto.
Post by: zoomx on May 17, 2013, 10:42 am
Lo sketch allegato, troppo lungo per essere incluso nel forum, è uno schema di datalogger e ha un problema di scrittura su SD.
Il test di scrittura crea il file ma dentro non c'è nulla. E' vuoto, zero byte.
Ho provato a cambiare SD ma il risultato non cambia.
Se uso il programma di esempio ReadWrite funziona, trovo il file con il testo di esempio.
Uso la libreria SDfat ma anche con la libreria SD standard accade esattamente la stessa cosa. Ma la SDfat dovrebbe essere un aggiornamento della SD, secondo il suo autore.
Se elimino la parte dell'RTC DS1307, funziona.
Uso la libreria DS1307new, se la cambio con RTClib di Adafruit accade esattamente la stessa cosa. Inoltre la libreria Adafruit mi da una serie di 165 invece di data e ora, Ma questo l'ho scritto in un altro post http://forum.arduino.cc/index.php?topic=166715
Come ho scritto in un altro post (http://forum.arduino.cc/index.php?topic=165088.0), se è presente una piccola parte che ha a che fare con il Timer1, il programma va in reset anche se quella parte non viene attivata ancora prima di arrivare ad aprire il file oppure subito dopo averlo aperto.
Sembra un problema di RAM ma i controlli sulla RAM usata danno sempre oltre 700 byte liberi.

Lo sketch gira su Arduino UNO R3 con uno shield per il DS1307 e uno per la SD. Uso le librerie SDfat e DS1307new.
La libreria DS1307new è questa https://code.google.com/p/ds1307new/
La libreria SDfat è questa http://code.google.com/p/sdfatlib/downloads/list
Uso Arduino 1.0.4 dove l'unico cambiamento sta nella libreria java che fa la scansione delle seriali.

Il programma mostra un menù autoesplicativo (più o meno) sulla console seriale. Se premete 9 parte il test di scrittura su SD. Questo stampa su seriale la quantità di RAM subito dopo l'apertura del file e subito dopo la chiusura. Il quantitativo è sempre 897. I test K e k li ho eliminati anche se nel menù appaiono ancora. Qualsiasi comando non riconosciuto, ma anche il semplice invio, fa apparire il menù.

Questo è il codice estratto dallo sketch

Code: [Select]

void SDwriteTest(){
  Serial.println(F("SD write test1"));
  if (!card.init(SPI_HALF_SPEED, CHIPSELECT)) {
    Serial.println(F("SD init failed."));
    return;
  }
  Serial.println(F("opening"));
  if (!MioFile.open("test.txt", O_WRITE | O_CREAT | O_APPEND)) {
    sd.errorHalt("Failed");
  }
  Serial.println(freeRam());
  ciccio=MioFile.println(F("ProvaF"));
  Serial.println(ciccio, DEC);
  MioFile.close();
  Serial.println(freeRam());
  Serial.println(F("done!"));
}



Io credo lo stesso che sia un problema di RAM, se avessi un Mega farei subito la prova.
Credo anche che sto facendo qualche grossolano errore nel codice perché in giro vedo programmi ben più grossi di questo (ad esempio http://forum.arduino.cc/index.php?topic=132746.0) che non hanno affatto problemi di questo genere. Ecco il motivo per cui ho incluso tutto lo sketch.
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: pablos71 on May 17, 2013, 10:58 am
Code: [Select]
//pinMode(4, OUTPUT);
hai fatto male a escluderla nel setup, ci va eccome e ci andrebbero anche
Code: [Select]
digitalWrite(4, 1);
pinMode(10, OUTPUT);
digitalWrite(10, 1);


Title: Re: Scrivo su SD ma il file è vuoto.
Post by: zoomx on May 17, 2013, 11:04 am
Ma io non uso lo shield Ethernet!
Comunque, fra le varie prove, mi ricordo di avere fatto anche questa.

Ricordo che la creazione del file avviene, solo che è vuoto.

Aggiungo le tue linee e  provo.

Edit: niente da fare, sempre zero byte!!!

Grazie lo stesso!
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: pablos71 on May 17, 2013, 11:06 am
un altra cosa....nell'inizializzazione della SD
Code: [Select]
Serial.print(F("\nInit SD card..."));
 if (!card.init(SPI_HALF_SPEED, CHIPSELECT)) {
   Serial.println(F("Init failed."));
   return;
 }
 else {
   Serial.println(F("SD card present"));
 }


CHIPSELECT lo hai dichiarato 10
Code: [Select]
#define CHIPSELECT 10  //4 on ethernet card

è il contrario 10 per la ethernet e 4 per la SD, la riga giusta è
Code: [Select]
if (!card.init(SPI_HALF_SPEED, 4)) {
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: zoomx on May 17, 2013, 11:10 am
Ripeto, uso uno shield dove il chipselect è sul 10. Non uso la Ethernet. Il commento in effetti non è chiarissimo per cui ti ha indotto in errore. Lo cambierò.

Aggiungo che gli shield non sono collegati direttamente alla UNO ma al Sensor Shield V5.

Title: Re: Scrivo su SD ma il file è vuoto.
Post by: pablos71 on May 17, 2013, 11:20 am
Può darsi che mi abbia tratto in inganno, quindi hai un arduino uno, uno shield sensor che credo abbia i pin in parallelo all' UNO, e come SD è uno shield solo sd o una scheda ethernet + sd?
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: zoomx on May 17, 2013, 11:27 am
Lo shield Sendor ha un header per la SD con i pin descritti nello sketch.

La SD sta su uno shield con un convertitore di tensione e alcuni condensatori e resistenze SMD. Lo shield con il programma ReadWrite e i collegamenti attuali funziona. Non penso ci siano problemi elettrici, anche se la storia del DS1307, che da me sta su un altro shield con una eeprom, la batteria e pochi altri componenti SMD, mi da da pensare.

Se dallo sketch elimini tutta la parte del DS1307, funziona.

Il mio sospetto principale sta in un errore grossolano nel codice che consuma memoria. O che ci sia una interferenza tra i due shield. Ho anche provato l'alimentazione a parte, non da USB ma il risultato è sempre stato lo stesso.

Edit:
Usando la libreria tinyFAT
http://henningkarlsen.com/electronics/library.php?id=37
funziona. Freeram mi da sempre 860 in tutte le fasi da apertura a chiusura file, quindi meno della SDfat, eppure funziona, almeno il test.
Edit 2: ho scritto all'autore perché non c'è un modo chiaro per definire il pin per CS o SS. A me funziona perché la combinazione sarà giusta ma questo significa che se uso la Ethernet card non mi funzionerà.
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: PaoloP on May 17, 2013, 12:09 pm
x iscrizione
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: zoomx on May 17, 2013, 12:17 pm
Sebbene cambiando libreria sembri che funzioni a me rimane il dubbio che nel codice ci siano errori grossolani che mi porranno altri problemi di memoria in futuro. La mia esperienza di C su microcontrollori è di pochi mesi, ho usato l'assembler su micro ST (l'ST6 e l'ST9 ma anni fa), basic e assembler su 68HC11 (TFX11, grande scheda!) e poi basic su PC insieme ad un po' di C e Delphi.


Title: Re: Scrivo su SD ma il file è vuoto.
Post by: cyberhs on May 17, 2013, 12:24 pm
Probabilmente lo sai già...

Non è che ti sei dimenticato di formattare la SD con FAT16?
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: zoomx on May 17, 2013, 03:37 pm
Non dovrebbe essere un problema di formattazione visto che, come ho già scritto, l'esempio ReadWrite funziona, il file viene creato ma è vuoto, se tolgo la libreria DS1307 funziona. Però hai fatto bene a ricordarmi della formattazione perché mi hai ricordato che manca una informazione che può essere utile.


Ho dimenticato di scrivere che la SD è da 256Mb. Ho però provato con SD da 2Gb ottenendo lo stesso risultato. E' però vero che non ho provato tutte le combinazioni possibili tra le prove che ho fatto.

Però il mio sospetto è di tipo software.
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: nid69ita on May 17, 2013, 04:07 pm

Edit 2: ho scritto all'autore perché non c'è un modo chiaro per definire il pin per CS o SS. A me funziona perché la combinazione sarà giusta ma questo significa che se uso la Ethernet card non mi funzionerà.

Dal manualetto pdf accluso alla libreria:
file.setSSpin();          da chiamare prima di   file.initFAT()
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: zoomx on May 17, 2013, 04:56 pm
E' vero, è l'ultima istruzione nel manualetto. Grazie nid69ita!!!

Devo riscrivergli e chiedere perdono!
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: zoomx on May 20, 2013, 12:15 pm
Grazie ai chiarimenti di Lesto su Serial.flush() ne ho aggiunti un po' al test di scrittura

Code: [Select]
void SDwriteTest(){
  Serial.println(F("SD write test1"));
  Serial.flush();
  if (!card.init(SPI_HALF_SPEED, CHIPSELECT)) {
    Serial.println(F("SD init failed."));
    return;
  }
  Serial.println(F("opening"));
  Serial.flush();
  if (!MioFile.open("test.txt", O_WRITE | O_CREAT | O_APPEND)) {
    sd.errorHalt("Failed");
  }
  Serial.println(freeRam());
  Serial.flush();
  ciccio=MioFile.println(F("ProvaF"));
  Serial.println(ciccio, DEC);
  Serial.flush();
  MioFile.close();
  Serial.println(freeRam());
  Serial.println(F("done!"));
}


che mi stampa il seguente

Code: [Select]
SD write test1
opening
897
8
897
done!


dove 897 dovrebbe essere la RAM libera e 8 il numero dei byte scritti (http://arduino.cc/en/Reference/FilePrintln). Solo che il file viene creato ma continua ad essere desolatamente vuoto.
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: lestofante on May 20, 2013, 12:28 pm
uhmmm... prova a modificare:
Code: [Select]
ciccio=MioFile.println(F("ProvaF"));
in
Code: [Select]
ciccio=MioFile.println("ProvaF");

comunque se togliendo qeulla libreria funziona, il problema o è la ram o è qualche cozzamento tipo timero o interrupt

edit: giusto per... prova con una
Code: [Select]
MioFile.flush(); prima della close()  :smiley-mr-green:
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: zoomx on May 20, 2013, 12:51 pm
Si, ho fatto quella prova ed il risultato era il medesimo.

L'ho rifatta perché non si sa mai ed il risultato è che va in reset dopo la prima stampa di RAM libera, 891 per la cronaca.

Code: [Select]
SD write test1
opening
891
Setup


Setup viene stampato nella funzione omonima proprio per individuare eventuali reset.

Se uso la libreria tinyFAT invece sembra che il problema scompaia ma non riesco a capire perché la libreria standard mi dia questo problema. Si trattasse di una oscura libreria usata da solo 10 persone in tutto il mondo lo capirei ma questa è molto usata....
Anche il fatto che funzioni a metà è strano, il file viene creato per cui non si dovrebbe trattare di un problema di comunicazione.
La memoria è fortemente sospettata ma quale errore può consumare 891 byte?

L'unica prova che non posso fare è di caricare lo sketch in un altro Arduino, magari questo ha problemi con la RAM, perché ne ho solo uno.

Per adesso andrò avanti cambiando libreria, poi cercherò di provare su un altro Arduino o magari sul Mega che sto aspettando.
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: zoomx on Jun 05, 2013, 12:40 pm
E' arrivata la mega e ho fatto le prove:
Libreria SD originale -> si inchioda subito dopo l'apertura del file, che quindi trovo vuoto ma non ho errore perché l'apertura mi restituisce 1, e mi va in reset. Non è un problema di memoria, stavolta i byte liberi sono oltre 6000.
Libreria TinyFAT -> funziona ma manca delle utili funzioni della libreria originale come il trattamento delle stringhe.
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: lestofante on Jun 05, 2013, 01:53 pm
se si inchioda subito a naso non hai attivato il giusto pin SS
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: zoomx on Jun 05, 2013, 02:27 pm
Purtroppo no

Code: [Select]
#define CHIPSELECT 53  //MEGA!!!!

e nella funzione setup() ho
Code: [Select]
pinMode(CHIPSELECT, OUTPUT);
SD.begin(CHIPSELECT);

Ho ricontrollato perché non si sa mai.
Per me rimane un mistero che però ho voglia di risolvere perché la libreria SD.h usa gli stream come la Serial.print per cui è più comoda.
La TinyFAT curiosamente stampa solo con il Return e LineFeed obbligato per cui ho modificato la libreria per stampare senza il CR+LF.

Se ho novità le riporto qui.
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: lestofante on Jun 05, 2013, 02:34 pm
puoi mettere un pò di Serial.print per capire dove si blocca la SD.h?
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: zoomx on Jun 05, 2013, 02:54 pm
Premetto che l'esempio ReadWrite della libreria SD.h funziona, cambiando il Chipselect a 53, visto che uso una mega.

Uso questa funzione
Code: [Select]
void SDwriteTest(){
  Serial.println(F("SD write test"));
  Serial.flush();
  Serial.println(freeRam());
  Serial.flush();
  if (!card.init(SPI_HALF_SPEED, CHIPSELECT)) {
    Serial.println(F("SD init failed."));
    Serial.flush();
    return;
  }
  Serial.println(F("opening"));
  Serial.flush();
  FileOut=SD.open("PROVA.TXT",FILE_WRITE);
  Serial.println(freeRam());
  Serial.flush();
  if (FileOut) {
    Serial.println(FileOut);                                                          //Questo viene stampato
    Serial.flush();
    ciccio=FileOut.println("Prova non F");
    Serial.println(ciccio, DEC);                                                    //Questo non viene stampato!!!!!
    Serial.flush();
    Serial.println(freeRam());
    Serial.flush();
    ciccio=FileOut.println(F("ProvaF"));
    Serial.println(ciccio, DEC);
    Serial.flush();
    Serial.println(freeRam());
    Serial.flush();
    //SDPrintTime();
    FileOut.close();
    Serial.println(F("Done!"));
  }
  else {
    // if the file didn't open, print an error:
    Serial.println(F("error opening prova.txt"));
  }
}


e quest'altra
Code: [Select]

void SDwriteTest2(){
  Serial.println(F("SD write test2"));
  Serial.flush();
  if (!card.init(SPI_HALF_SPEED, CHIPSELECT)) {
    Serial.println(F("SD init failed."));
    Serial.flush();
    return;
  }
  Serial.println(F("opening"));
  Serial.flush();
  FileOut=SD.open("PROVA.TXT",FILE_WRITE);

  //if (FileOut) {
  Serial.println(FileOut);                                              //Questo viene stampato
  Serial.flush();
  FileOut.println("Prova non F");
  delay(100);
  ciccio=FileOut.println("Prova non F");
  Serial.println(ciccio, DEC);                                         //Questo non viene stampato!!!
  RTC.getTime();
  SDPrintTime();
  FileOut.close();
  Serial.println(F("Done!"));
  //}else {
  // if the file didn't open, print an error:
  //  Serial.println(F("error opening prova.txt"));
  //}
}

In questo in effetti avrei potuto mettere un altro print in maniera opportuna fra i due println ma non credo cambierebbe molto rispetto al primo esempio. Succede qualcosa dopo la creazione del file che poi trovo sulla SD ovviamente vuoto.
Windows non segnala alcun problema sulla SD dovuto al fatto che il MEGA si pianta dopo la creazione del file.
Se credi posso allegare tutto il codice ma ci vuole un MEGA e un DS1307, come ho scritto nel primo post.
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: lestofante on Jun 05, 2013, 03:04 pm
qualcosa non mi torna, vedo che fai

Code: [Select]

card.init(SPI_HALF_SPEED, CHIPSELECT)


invece la SD vorrebbe un semplice begin

Code: [Select]

if (!SD.begin(CHIPSELECT)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");


ATTENTO!!! il CHIPSELECT e il pin SS sono due pin differenti!!! il 53 va messo come output e basta, il CS è il pin a cui hai collegato il CS della SD
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: zoomx on Jun 05, 2013, 03:27 pm
Code: [Select]
card.init(SPI_HALF_SPEED, CHIPSELECT)
Era negli esempi e in ogni caso nello sketch il micro va oltre inchiodandosi dopo. Però ho preso nota del suggerimento.

Chiariamo invece il secondo punto.
La documentazione riporta http://arduino.cc/en/Reference/SD
Quote
Additionally, another pin must be used to select the SD card. This can be the hardware SS pin - pin 10 (on most Arduino boards) or pin 53 (on the Mega) - or another pin specified in the call to SD.begin(). Note that even if you don't use the hardware SS pin, it must be left as an output or the SD library won't work.

Quindi nella parte delle note http://arduino.cc/en/Reference/SDCardNotes recita
Quote
The Ethernet Shield comes with an SD card slot onboard. The shield fits on top of your Arduino. Because the Ethernet module uses pin 10, the CS pin for the SD card has been moved to pin 4. Make sure you use SD.begin(4) to use the SD card functionality.

Da cui ho dedotto che SS e CS sono la stessa cosa. Io ho il pin 53 collegato alla linea CS della schedina con l'SD.
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: lestofante on Jun 05, 2013, 03:38 pm
hai ragione per il pin 53, però qeul pezzo di codice non mi torna dagli esempi sul reference.

Usa la begin al posto di quello
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: nid69ita on Jun 05, 2013, 03:46 pm
Mi sà che @lesto ci ha preso.

Se guardi cosa fa la begin:
Code: [Select]

boolean SDClass::begin(uint8_t csPin) {   // Performs the initialisation required by the sdfatlib library.  Return true if initialization succeeds, false otherwise.
  return card.init(SPI_HALF_SPEED, csPin) &&
         volume.init(card) &&
         root.openRoot(volume);


Esegue anche altre 2 funzioni, mentre tu chiami solo la card.init
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: zoomx on Jun 05, 2013, 04:01 pm
Mi sa che avete trovato il problema.
Difatti, non so perché, SD.begin mi funziona in setup ma non nei due esempi di scrittura dove mi da failed. Quindi immagino che si inchiodi perché la SD non è perfettamente pronta, tra il setup e la successiva prova di scrittura succede qualcosa. Faccio ulteriori indagini!!!!
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: zoomx on Jun 05, 2013, 04:24 pm
Siccome mi è venuto un sospetto ho fatto una ricerca e ho scoperto che sembra che SD.begin può essere richiamato una sola volta all'interno di uno sketch, tutte le altre volte ritorna False.
C'è un issue in proposito del 2011
https://code.google.com/p/arduino/issues/detail?id=465
Dove c'è scritto fra l'altro
Quote
2) you can not re-initialize the SD-object again. This would be
necessary (for some SPI magic I guess) if you remove the SDCard from the socket and put it back later. There is no SD.close() or something and calling SD.begin() a second time will always return FALSE and not initialize the SD again.

Non ho trovato nulla in proposito nella documentazione di riferimento.
A questo punto ho scritto un terzo test eliminando il controllo con SD.begin visto che in ogni caso restituisce falso nei due test precedenti
Code: [Select]
void SDwriteTest3(){
  Serial.println(F("SD write test3"));
  Serial.flush();
  Serial.println(F("opening"));
  Serial.flush();
  FileOut=SD.open("PROVA.TXT",FILE_WRITE);

  //if (FileOut) {
  Serial.println(FileOut);                                      //Questo viene stampato
  Serial.flush();
  FileOut.println("Prova non F");
  Serial.println(FileOut);                                      //Questo non viene stampato e va in reset
  Serial.flush();
  ciccio=FileOut.println("Prova non F");
  Serial.println(ciccio, DEC);
  RTC.getTime();
  SDPrintTime();
  FileOut.close();
  Serial.println(F("Done!"));
  //}else {
  // if the file didn't open, print an error:
  //  Serial.println(F("error opening prova.txt"));
  //}
}

Resetto il MEGA, aspetto che l'SD.begin dia risultato positivo nella setup(), quindi eseguo il test e si pianta come prima.
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: lestofante on Jun 05, 2013, 04:36 pm
rimetti il check su
Code: [Select]
if (FileOut) {

che non centra niente col begin. in oltre NON puoi usare altre periferiche SPI (da quanto ho capito), perchè prima dovresti fare SD.close(), usare l'altra scheda, e poi SD.begin() di nuovo.

In oltre se dici che con gli esempi funziona, il problema è nel tuo codice, quindi cerca di eliminare parti (in partiolare altri sensori) fino ad ottenere una situazione funzionante
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: nid69ita on Jun 05, 2013, 04:57 pm
@zoomx scusa, domanda probabilmente stupida, ma l'istruzione   Serial.println(FileOut);   hai provato lo sketch senza ?
Mi viene il dubbio, FileOut non è un oggetto? Oppure è un puntatore? Ha significato "stamparlo" ?
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: zoomx on Jun 05, 2013, 05:03 pm
Ehmmm... SD.close(); non esiste. Nell'issue scrivono appunto di implementarlo.

Non ho altre periferiche SPI, l'RTC è in I2C.

Ho provato anche SDfat e mi si inchioda nello stesso punto (è derivata proprio da SD.h), trovo sempre che il file è stato creato e poi nulla perché, appunto si inchioda. La TinyFAT è l'unica che non si inchioda a parità di codice, più o meno.

Che il problema sia nel mio codice non ci piove, non ho mai sostenuto il contrario altrimenti avrei aperto un issue. Domani faccio daccapo una prova usando lo Shield Ethernet e una microSD. E farò altrre prove cercando di escludere un conflitto con la libreria per l'RTC, conflitto sempre dovuto al mio codice perché ci sono un sacco di esempi di sketch dove le due librerie convivono tranquillamente.

@nid69ita
Si, restituisce un oggetto ma secondo quanto scritto nella documentazione non dovrebbero esserci problemi a stamparlo, infatti mi stampa un 1. In effetti la seconda stampa nel terzo test non ha senso. PErò manca nei due test precedenti e l'inchiodamento c'è lo stesso. Riporto quanto dice la documentazione.
Quote
Returns
a File object referring to the opened file; if the file couldn't be opened, this object will evaluate to false in a boolean context, i.e. you can test the return value with "if (f)".
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: lestofante on Jun 05, 2013, 05:08 pm
a questo punto se non ci posti il codice completo dovrai contare solo sulle tue zampette :)
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: zoomx on Jun 05, 2013, 05:15 pm
Il codice è simile a quello riportato nel primo post ma lo riallego comunque.
Dovrebbe funzionare anche senza il DS1307 attaccato, io ho provato a disconnetterlo e, a parte la segnalazione che l'RTC non va il programma gira.
9, k e K sono i comandi da dare per i 3 test come descritto nel primo post.
Il codice è per MEGA ma se si cambia il chipselect dovrebbe andare anche sull'UNO (più la parte per il timer,  tutti i 4 dei registri timer presenti vanno cambiati in 1) su cui però avevo dubbi per la RAM occupata nonostante sembra che ci fossero almeno 600 byte.
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: lestofante on Jun 05, 2013, 05:38 pm
aspetta, ma senza il DS1307 collegato funziona la scrittura su SD?
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: zoomx on Jun 05, 2013, 05:50 pm
No, purtroppo :( stesso inchiodamento.
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: lestofante on Jun 05, 2013, 06:10 pm
prova a commentare le funzioni in cui giochi con i registri, in paricolare con il timer......... non sono sicuro (non posso provare, sono a lavoro), ma mi sa tanto che....
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: nid69ita on Jun 05, 2013, 06:16 pm
@lesto forse ha ragione. Manipoli il timer1 che se non sbaglio è quello utilizzato da millis() e delay()
Una delle librerie Sd2Card.cpp  utilizza internamente la millis().
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: zoomx on Jun 05, 2013, 06:43 pm
Il post iniziale ha una versione del codice senza la manipolazione dell'interrupt e si inchioda lo stesso.

Il Timer1 è quello a 16 bit ed è usato solo da Servo.h che io non ho. Millis e Delay usano il Timer0. Nel Mega inoltre uso il Timer4 e si inchioda lo stesso. Domani provo con altro hardware per escludere problemi elettrici.

Ho provato molte combinazioni prima di scrivere qui. Forse anche troppe per cui posso aver perso il filo. Lo sketch non l'ho scritto di botto ma ho provato le componenti separatamente e funzionavano.

Attualmente la versione più avanzata usa la tinyFAT che scrive si ma mi inchioda la partenza dell'acquisizione, quella che do con il comando 1. Si inchioda da qualche parte tra il sei() e il cli().
Se uso invece SD.h l'interrupt funziona, il Led lampeggia ma non scrive niente sulla SD.
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: nid69ita on Jun 05, 2013, 08:17 pm
Hai ragione ho detto una minchi@ta, il timer0 è per millis() e delay().

Certo che hai beccato proprio un bel bug. Con due librerie non ne arrivi ad avere una giusta!  =(
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: lestofante on Jun 05, 2013, 09:16 pm
comunque allora pare essere uqlcosa con gli interrupt... la SPI è molto veloce, quindi molto sensibile. prova a escludere TUTTO il codice con interrupt, e vediamo se va. poi riattiva piano piano. In generale NON usare la seriale senza interrupt, lo sai?
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: zoomx on Jun 06, 2013, 10:18 am
L'errore è sicuramente mio, non credo ci siano bug.

La prova di ciò sta nel fatto che la libreria SDfat ha un esempio che si chiama AnalogLogger che usa il DS1307 (ma con una libreria differente, quella dell'Adafruit) e che funziona senza problemi.

Per adesso gli errori che ho scoperto sono stati:
1) L'uso di card.init invece di sd.begin, come mi hanno fatto notare lesto e nid69ita
2) Ho scoperto che ogni tanto ho scambiato CHIPSELECT con SPI_QUARTER_SPEED (prima viene CHIPSELECT!) ma purtroppo non è cambiato nulla.

Potrebbe essere qualche incompatibilità tra la libreria DS1307 che usavo io ma non riesco ad immaginare quale possa essere visto che uso due dispositivi che fanno uso di comunicazioni diverse in diversi momenti.

A questo punto credo che partirò dall'esempio AnalogLogger modificandolo opportunamente. Non è un esempio facile in quanto fa un uso degli stream che non conosco (non c'è un Serial.print ma una serie di << verso cout invece di Serial.print e << verso bout invece di miofile.print

Se scopro qualcosa di nuovo in proposito ne scriverò qui.

Grazie  :)
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: alessio31183 on Nov 19, 2013, 03:58 pm
...ciao, hai per caso scoperto qual'è il problema che hai con la scrittura in SD?
Perchè anche io sono un po' in alto mare in quanto dopo poco tempo (qualche secondo al massimo) che scrivo su SD il uC si pianta. Io utilizzo anche un interrupt sul timer1 ogni 5 ms per campionare un segnale e salvare il valore in SD. Solo che il problema è che poco dopo il firmware si blocca.
Tu hai risolto?
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: zoomx on Nov 20, 2013, 09:02 am
No perché l'idea originale è che l'interrupt non venga da un timer interno come sto facendo qui ma da un RTC esterno. E mi sto occupando di altro, più semplice e ho gli Arduini opccupati

Avrei l'idea di porre il quesito nella sezione internazionale in inglese ma prima di farlo devo eseguire delle prove ripetibili in modo che anche altri, se vogliono, ci possano studiare sopra. Sicuramente non è un problema di memoria perché ottengo lo stesso su un Mega, non sembra essere un problema di alimentazione ma qui non ho ancora fatto una prova con una misura dei consumi, non è un problema di SD (ho provato diverse SD) e sono convinto che faccio qualche errore nel codice ma non so quale.

In ogni caso il mio problema è diverso dal tuo, quando si presenta non scrivo nulla, trovo solo il file vuoto a zero byte. Non mi è mai successo di trovare il file con dei byte e poi avere un blocco.
Title: Re: Scrivo su SD ma il file è vuoto.
Post by: alessio31183 on Nov 20, 2013, 10:16 am
...il mio problema sembra essere scaturito dal fatto che ho un interrupt da timer1 ogni 5 ms che è troppo rapido anche con la SPI_FULL_SPEED. Ho provato a mettere l'interrupt a 20 ms e  la cosa sembra funzionare.
Purtroppo, misurando i tempi di scrittura di soli 2 byte pare che ci metta quasi 10 ms. Il che dipende anche dalla uSD che si usa. (kingston nel mio caso).
quindi o trovo il modo di scrivere più rapidamente i dati oppure devo allungare i tempi dell'interrupt....
..nel tup caso il fatto che l'interrupt sia esterno poco cambia, se arriva troppo velocemente in uC impazzisce naturalmente......
Per il file vuoto a me è capitato quando chiudeva male il file con la myFile.close()....

Intanto anche io continuo nelle prove e poi vediamo che succede.....