Pages: [1] 2   Go Down
Author Topic: Liberia SdFat  (Read 1043 times)
0 Members and 1 Guest are viewing this topic.
Ivrea
Offline Offline
God Member
*****
Karma: 5
Posts: 680
"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
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Shannon Member
****
Karma: 117
Posts: 10105
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Ivrea
Offline Offline
God Member
*****
Karma: 5
Posts: 680
"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
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

E se volessi fare un datalogger dove devo scrivere continuamente?
Logged

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10105
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21619
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Guardando la libreria per la lettura delle SD mi sono imbattuto nella libreria SdFat
Quale intendi? Questa?
https://code.google.com/p/sdfatlib/
Logged


Ivrea
Offline Offline
God Member
*****
Karma: 5
Posts: 680
"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
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si, esatto. Dovrebbe essere la "madre" della SD.h di Arduino...
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21619
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ogni funzione vedo che restituisce un valore, basta vedere sempre se l'operazione è andata a buon fine oppure no leggendo quel valore.
Logged


Ivrea
Offline Offline
God Member
*****
Karma: 5
Posts: 680
"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
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non è che esiste una funzione (che magari mi è sfuggita) per testare se la SD è ancora presente?
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21619
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Ivrea
Offline Offline
God Member
*****
Karma: 5
Posts: 680
"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
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, grazie mille...  smiley-wink
Logged

Ivrea
Offline Offline
God Member
*****
Karma: 5
Posts: 680
"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
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Unendo questo topic con quanto mi hai detto nella domanda del leOS, non riesco a capire il perché questo codice non vada:

Code:

#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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21619
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Ivrea
Offline Offline
God Member
*****
Karma: 5
Posts: 680
"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
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

EDIT:
Ho visto che non sono includibili insieme...  smiley-cry Mi dice che ONETIME è già stato definito...
« Last Edit: February 26, 2013, 11:08:53 am by Janos » Logged

Dueville (VI)
Offline Offline
Edison Member
*
Karma: 28
Posts: 1723
http://cesarecacitti.wordpress.com/
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

EDIT:
Ho visto che non sono includibili insieme...  smiley-cry 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

Ivrea
Offline Offline
God Member
*****
Karma: 5
Posts: 680
"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
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie per la dritta ma non lo trovo...  smiley-cry
http://arduino.cc/en/uploads/Main/arduino-ethernet-shield-06-schematic.pdf
Logged

Pages: [1] 2   Go Up
Jump to: