Go Down

Topic: Liberia SdFat (Read 1 time) previous topic - next topic

Janos

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?

lesto

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 :)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Janos

E se volessi fare un datalogger dove devo scrivere continuamente?

lesto

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
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

leo72


Guardando la libreria per la lettura delle SD mi sono imbattuto nella libreria SdFat

Quale intendi? Questa?
https://code.google.com/p/sdfatlib/

Janos

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

leo72

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

Janos

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

leo72

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.

Janos


Janos

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

Code: [Select]


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

leo72

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.

Janos

#12
Feb 26, 2013, 05:01 pm Last Edit: Feb 26, 2013, 05:08 pm by Janos Reason: 1

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

cece99



... 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...
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

Janos


Go Up
 

Quick Reply

With Quick-Reply you can write a post when viewing a topic without loading a new page. You can still use bulletin board code and smileys as you would in a normal post.

Warning: this topic has not been posted in for at least 120 days.
Unless you're sure you want to reply, please consider starting a new topic.

Note: this post will not display until it's been approved by a moderator.
Name:
Email:

shortcuts: alt+s submit/post or alt+p preview