Go Down

Topic: Estrarre e Reinserire SD (Read 9820 times) previous topic - next topic

pablos71

Bene, solo che nel setup manca l'impostazione del pin select della SD, prima o poi ti darà problemi

Code: [Select]
pinMode(4, OUTPUT);     
  digitalWrite(4, HIGH);


Se non lo hai capito non c'è nulla di male, ma ti suggerisco di soffermarti a studiarlo e cercare di capirlo, perchè non riuscirai a trovare un problema software limitandoti a copiare e incollare.

ciao
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

farstar1965

Ma il pin select non è il pin che abilita la periferica a dialogare con il master ?
Nel mio circuito è collegato al pin 16 dell'atmega cioè al digital pin 10 equivalente nell'arduino 1
e difatti dò      pinMode(10, OUTPUT);     e
                           digitalWrite(10, HIGH);

sbaglio ?

leo72


non avendo capito niente nelle varie spiegazioni delle librerie e non avendo trovato una pagina che spiega i vari comandi
per gestire le librerie (tutti i comanti, o funzioni?) :

Ma a quali librerie ti riferisci, scusa?
La SD è documentata in toto sul sito:
Reference, sezione Libraries, voce SD. Lì ci sono tutti i metodi della libreria per poter accedere alle funzioni messe a disposizione dalla SD per operare sulle schede di memoria. O non ho capito io la richiesta?

farstar1965

Ripeto, Nella mia ( e non mi stancherò mai di dirlo ) totale ignoranza in programmazione,
Non ho trovato da nessuna parte, per esempio:
Sd2Card card;
SdVolume volume;
SdFile root;
card, volume,root non sono menzionati nel reference ma sono proprio quelle variabili che grazie alla dritta di Pablos mi hanno
permesso di risolvere il mio problema.

Grazie

leo72

Quelle sono le definizioni per creare le istanze (copie) degli oggetti (classi) della libreria. Questo perché la libreria fornire un oggetto, sei poi tu ad usarlo per crearne di tuoi, è come il tipo dato "byte", non puoi usarlo per memorizzare un valore ma devi dire al compilatore di usarlo per definire una variabile tua a cui dai un nome.
Spero di essermi spiegato.


PS:
un consiglio che do sempre, guardati gli esempi allegati all'IDE, se apri "File/Esempi/SD" ci sono degli sketch pronti da studiare per capire come usare la SD.

Deltoz

Perché non usi semplicemente i 2 piedini dei lettori SD Card che ti indicano se la sd c'e' o non c'e'? magari quelli ad inserzione Clik/Clak.
Lo mandi in ingresso digitale e tramite interrupt oppure semplicemente con un controllo verifichi, prima di scrivere sulla sd, se e' inserita o meno.
Quando invece sfili la SD questo contatto si chiude o apre prima che la sfili, dopo il  clik/clak, e interrompi la scrittura se in quel momento sta scrivendo.

farstar1965

Quel contatto lo usero per vedere se posso andare a scrivere, ma non sono proprio sicuro che se stà scrivendo riesca anche a leggere lo stato dello switch, premo ed estraggo e in un lampo patatrak.

PS gli interrupt li uso gia per leggere l'encoder che uso al posto dei pulsanti per gestire la scheda.

Grazie

leo72

Non credo tu possa interrompere una scrittura. Se stai spedendo dei dati alla SD e l'utente sfila la scheda, son dolori.

lestofante

diciamo che una parte di operazioni è atomica (non interrompibile) e una parte è NON atomica.

dal momento in cui chiudi tutti i file, possiamo dire di essere in NON atomica, il problema è che:
1. arriva interrupt che setta un flag (non puoi chiudere un file da una ISR, causa SPI)
2. il flag interrome il loop di scrittura
3. il file viene chiuso (chiusura file, aggiornamento tabelle FAT, finalizzazione di buffer arduino e SD su memoria)

Ora, attenzione che il punto 2 non può chiudere il file immediatamente, ma deve finire di scrivere in modo che alla prossia riapertura sia interpretabile; se noi scriviamo un dato per riga, ad esempio, dovremo finire di scrivere la riga! Quindi la nostra logica rende un operazione non atomica (scrivere una serie di caratteri) in una operazione atomica, altrimenti il file risulterà corrotto. Salvo implementare un algoritmo che se vede l'ultima riga corrotta la elimina.

Restano da verificare i tempi di stacco con i tempi di esecuzione dei punti cui sopra.
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

Deltoz


diciamo che una parte di operazioni è atomica (non interrompibile) e una parte è NON atomica.

dal momento in cui chiudi tutti i file, possiamo dire di essere in NON atomica, il problema è che:
1. arriva interrupt che setta un flag (non puoi chiudere un file da una ISR, causa SPI)
2. il flag interrome il loop di scrittura
3. il file viene chiuso (chiusura file, aggiornamento tabelle FAT, finalizzazione di buffer arduino e SD su memoria)

Ora, attenzione che il punto 2 non può chiudere il file immediatamente, ma deve finire di scrivere in modo che alla prossia riapertura sia interpretabile; se noi scriviamo un dato per riga, ad esempio, dovremo finire di scrivere la riga! Quindi la nostra logica rende un operazione non atomica (scrivere una serie di caratteri) in una operazione atomica, altrimenti il file risulterà corrotto. Salvo implementare un algoritmo che se vede l'ultima riga corrotta la elimina.

Restano da verificare i tempi di stacco con i tempi di esecuzione dei punti cui sopra.

Ecco, era piu' o meno quello che volevo dire io, ma senza le conoscenze che ha  Lesto!  :D
Grande Lesto!

leo72

Se l'utente estrae brutalmente la schedina durante una scrittura puoi mettere tutti i controlli software del mondo ma il file system di quella schedina lo puoi buttare  ;)

lestofante

dipende, se hai un sistema che siaccorge dell'estrazione prima che i contatti si stacchino, e durante quel tempo riesci a finalizare la scrittura allora non cisono prolemi.
A questo punto resta da capire quanto possa essere complesso costruire un "ritardatore di estrazione meccanico"
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

gpb01


A questo punto resta da capire quanto possa essere complesso costruire un "ritardatore di estrazione meccanico"


Ah beh ... se ti metti a giocare con la meccanica ... allora è più semplice fare (... come si fa per i CD/DVD) un blocco totale dell'estrazione comandato da software (... dovrebbe bastare un minuscolo solenoide che alza una linguetta davanti alla card) ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

lestofante

uhmm, ma se setraggo la card quando "salta"il solenoide... piùttosto pulsantino di richiesta, appena finisce la scriture il solenoide "sputa" la card :)
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

gpb01


uhmm, ma se estraggo la card quando "salta"il solenoide ...


In che senso ???  Non la puoi estrarre ...

... basta una linguetta che, quando il piccolo solenoide è attivato, si mette dietro alla SD e ... NON la puoi più fisicamente estrarre.  Da SW comandi il solenoide (... ripeto, come alcuni SW fanno con i CD/DVD ... il principio è sempre quello) ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up