Estrarre e Reinserire SD

però in tutto questo fai attenzione, se estrai la scheda SD mentre in quell'istante il file è open fai un casino danneggiando il file system perdendo quindi tutto il contenuto....(il pc alla lettura troverà errori e ti chiederà di riformattarla) un po' come quando estrai una chiavetta USB dal pc esiste la funzione di "espelli periferica usb" proprio per assicurarsi che il pc non stia scivendo mentre la estrai.
Dovresti prevedere il blocco della scittura e la chiusura file con un pulsantino o qualcosa che ti pare più idoneo, prima di estrarla.

Ciao

Oppure un LED che tieni acceso durante gli accessi alla schedina, un pò come i vecchi floppy disk che avevano la spia luminosa sul frontalino.
Quando hai terminato le operazioni di accesso, fai un flush dei dati e chiudi i file, spengi il led così l'utente sa che eventualmente può rimuovere la schedina.

approvo l'ìidea di leo, con una piccola aggiunta: devi prevedere una zona di memoria in cui salvare i dati nel momento in cui la scheda non è presente.

In oltre questo "buffer" devi usarlo anche se scrivi o leggi spesso dalla SD, in modo da dare tempo all'essere unamo di accorgersi del led spento e di estrarre la carta prima che parta la prossima scrittura/lettura

Calma calma, sto ancora studiando.
Comunque al momento uso la veriabile dell'encoder per dirgli quando puo scrivere sulla sd e quando no.
Mi piace l'idea del led, magari che si accende prima di verificare lo sw della presenza scheda, perche se estraggo la scheda proprio mentre si sta accendendo faccio il patatrac comunque.

certo, la sfiga va prevista, se no si piange dopo :grin:

O.T. ( si dice cosi?) Lo diciamo a qualcuno che l'orario dei post è completamente a capocchia o è saputo?
P.S. Non è completamente a capocchia noto ora è con l'ora di londra.

di solito in questo forum si avvsa quandi si è IN topic :grin:

a me l'orario è ok, controlla il fuso orario del tuo profilo

Il mio cervello è con l'ora di londra.
Grazie

lesto:
controlla il fuso orario del tuo profilo

Quoto. E' lì che va allineato, soprattutto ai cambi di ora legale/solare, che il profilo non aggiorna in automatico.

Nella mia ( e non mi stancherò mai di dirlo ) totale ignoranza in programmazione,
non avendo capito praticamente nulla dal tutorial che mi avete linkato :blush:
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?) :
Questo è quello che sono riuscito a mettere in sieme.
Funziona, se il file non esiste lo crea, quando inserisco la scheda incomincia a scrivere, premendo il pulsante smette di scrivere e posso estrarre la scheda senza problemi.
Mi sembrava bello postare la soluzione ai miei problemi; la mia soluzione.

Spero sarete clementi con i commenti.
Ora continuo con le altre parti del progetto.
Grazie a tutti BYE.

sketch_nov28a.ino (1.13 KB)

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

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

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 ?

farstar1965:
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?

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

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.

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.

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

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

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.

lesto:
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! :smiley:
Grande Lesto!