Go Down

Topic: Scrivo su SD ma il file è vuoto. (Read 9342 times) previous topic - next topic

lestofante

a questo punto se non ci posti il codice completo dovrai contare solo sulle tue zampette :)
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

zoomx

#31
Jun 05, 2013, 05:15 pm Last Edit: Jun 05, 2013, 05:20 pm by zoomx Reason: 1
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.

lestofante

aspetta, ma senza il DS1307 collegato funziona la scrittura su SD?
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

zoomx

No, purtroppo :( stesso inchiodamento.

lestofante

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....
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

nid69ita

@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().
my name is IGOR, not AIGOR

zoomx

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.

nid69ita

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!  =(
my name is IGOR, not AIGOR

lestofante

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?
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

zoomx

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  :)

alessio31183

...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?

zoomx

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.

alessio31183

...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.....

Go Up