Offline
God Member
Karma: 3
Posts: 589
"La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché." Albert Einstein
|
 |
« on: February 26, 2013, 08:44:55 am » |
Guardando la libreria per la lettura delle SD mi sono imbattuto nella libreria SdFat che i sembra moooooooooooooooooooooooooooooooolto più completa di quella standard, ma al contempo un po' più complicata. La domanda è questa: come posso effettuare inserimenti e disinserimenti della SD a caldo fermo restando i rischi di corrompere il filesystem se estraggo la SD durante la scrittura). Come riesco a capire se la SD è inserita (all'avvio) e se è ancora inserita (dopo averla inserita)?
Inoltre vorrei avere lumi sul funzionamento della libreria perché effettivamente è mooooolto grande e abbastanza complessa.
1°: Montare il volume inizializzando la classe Sd2Card con la funzione Sd2Card::init(xxx) 1bis: Verificare se ci sono stati errori, ad esempio SD non inserita 2: Montare la partizione inizializzando la classe SdVolume con la funzione SdVolume::init(xxx) 3: Navigare nelle directory con la classe SdFile o aprirli/chiuderli rispettivamente con gli fstream
Mi sono perso qualcosa? Durante i punti 2-3 come riesco a capire se la SD mi è stata estratta?
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Tesla Member
Karma: 82
Posts: 8212
:(){:|:&};:
|
 |
« Reply #1 on: February 26, 2013, 08:57:09 am » |
se non hai una SD inserita non hai una comunicazione SPI valida, quindi te ne accorgi perchè ogni comando va in errore. io consiglio di provare ad aprire la SD (con la begin/init), scrivere, chiudere. ovviamente se la init ha avuto successo 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 3
Posts: 589
"La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché." Albert Einstein
|
 |
« Reply #2 on: February 26, 2013, 09:02:28 am » |
E se volessi fare un datalogger dove devo scrivere continuamente?
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Tesla Member
Karma: 82
Posts: 8212
:(){:|:&};:
|
 |
« Reply #3 on: February 26, 2013, 09:04:39 am » |
bufferizzi i dati più possibile in ram.. tanto al massimo se si resetta arduino perdi qualche secondo in più di dati, che al confronto con perdere TUTTI i dati...
magari quando usi la SD accendi pure un led, così sai quando puoi/non puoi estrarre la SD
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16460
Don't know what I do
|
 |
« Reply #4 on: February 26, 2013, 09:14:55 am » |
Guardando la libreria per la lettura delle SD mi sono imbattuto nella libreria SdFat
Quale intendi? Questa? https://code.google.com/p/sdfatlib/
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 3
Posts: 589
"La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché." Albert Einstein
|
 |
« Reply #5 on: February 26, 2013, 09:38:56 am » |
Si, esatto. Dovrebbe essere la "madre" della SD.h di Arduino...
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16460
Don't know what I do
|
 |
« Reply #6 on: February 26, 2013, 10:02:40 am » |
Ogni funzione vedo che restituisce un valore, basta vedere sempre se l'operazione è andata a buon fine oppure no leggendo quel valore.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 3
Posts: 589
"La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché." Albert Einstein
|
 |
« Reply #7 on: February 26, 2013, 10:04:05 am » |
Non è che esiste una funzione (che magari mi è sfuggita) per testare se la SD è ancora presente?
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16460
Don't know what I do
|
 |
« Reply #8 on: February 26, 2013, 10:12:13 am » |
Non mi pare. Però puoi fare un'operazione semplice sulla SD e vedere se la scheda c'è in base al fatto se ricevi un errore o no. Ad esempio cambiare la dir.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 3
Posts: 589
"La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché." Albert Einstein
|
 |
« Reply #9 on: February 26, 2013, 10:13:41 am » |
Ok, grazie mille... 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 3
Posts: 589
"La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché." Albert Einstein
|
 |
« Reply #10 on: February 26, 2013, 10:18:51 am » |
Unendo questo topic con quanto mi hai detto nella domanda del leOS, non riesco a capire il perché questo codice non vada: #include <pins_arduino.h> #include <SPI.h> #include <SdFat.h> #include <leOS.h>
//Classi per la SD Sd2Card card; SdVolume volume; ifstream file;
//Classe per lo scheduler leOS scheduler;
#define CS_SD 4
void initSD() { card.init(SPI_FULL_SPEED, CS_SD); if (!card.errorCode()) scheduler.removeTask(initSD); }
void printErrorCode() { Serial.println(card.errorCode(), HEX); }
void setup() { Serial.begin(57600); scheduler.begin(); scheduler.addTask(printErrorCode, 2000, SCHEDULED); scheduler.addTask(initSD, 2000, SCHEDULED_IMMEDIATESTART); }
void loop() {
}
Fino a che non inserisco la SD non vedo arrivare niente e dopo mi vedo arrivare gli "0", come mi aspetto. Perché prima di inserire la SD non mi vedo arrivare niente? EDIT: Forse perché anche la Serial.println lavora a interrupt?
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16460
Don't know what I do
|
 |
« Reply #11 on: February 26, 2013, 10:23:02 am » |
Anche la gestione della seriale è basata su interrupt. Però si affida ad un buffer dove vengono messi i byte da essere spediti oppure prelevati quelli già letti. Solitamente, un task del leOS deve compiere un lavoro non oneroso in termini di risorse, altrimenti blocca ogni cosa. L'attesa dell'inserimento di una SD è una di quelle cose da NON mettere in un task: blocchi tutto il micro finché non viene inserita la scheda.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 3
Posts: 589
"La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché." Albert Einstein
|
 |
« Reply #12 on: February 26, 2013, 11:01:03 am » |
... L'attesa dell'inserimento di una SD è una di quelle cose da NON mettere in un task: blocchi tutto il micro finché non viene inserita la scheda.
Girando i rete cercavo uno scheduler SW basato su millis giusto per fare quella cosa e guarda cosa mi è venuto fuori: looper... Mi potevi dire che avevi fatto anche quello? Sei troppo modesto...  EDIT: Ho visto che non sono includibili insieme...  Mi dice che ONETIME è già stato definito...
|
|
|
|
« Last Edit: February 26, 2013, 11:08:53 am by Janos »
|
Logged
|
|
|
|
|
Dueville (VI)
Offline
Edison Member
Karma: 15
Posts: 1050
http://cesarecacitti.wordpress.com/
|
 |
« Reply #13 on: February 26, 2013, 11:11:26 am » |
... L'attesa dell'inserimento di una SD è una di quelle cose da NON mettere in un task: blocchi tutto il micro finché non viene inserita la scheda.
Girando i rete cercavo uno scheduler SW basato su millis giusto per fare quella cosa e guarda cosa mi è venuto fuori: looper... Mi potevi dire che avevi fatto anche quello? Sei troppo modesto...  EDIT: Ho visto che non sono includibili insieme...  Mi dice che ONETIME è già stato definito... Che io sappia molti socket x le sd hanno anche un microswitch che dice se sono inserite o no...
|
|
|
|
|
Logged
|
Arduino UNO r3, Arduino MEGA 1280, adafruit motor shield, bluetooth module, enc28j60 shield. Ultimi acquisti: un sacco di componenti elettronici, ATTEN AT 8586
|
|
|
|
Offline
God Member
Karma: 3
Posts: 589
"La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché." Albert Einstein
|
 |
« Reply #14 on: February 26, 2013, 11:17:52 am » |
|
|
|
|
|
Logged
|
|
|
|
|
|