Newsgroup: it.hobby.elettronica.digitale
Titolo: interfacciare una scheda SD

Secondo voi è complicato interfacciare una
schedina SD ad un micro piccolissimo (1k ROM)
per fare una specie di data logger? Non mi servono
file system, semplicemente scrivere sequenzialmente un
centinaio di byte al secondo per almeno un mese.

crow...@gmail.com
 ha scritto:

Io non conosco praticamente nulla di elettronica digitale, quindi sono 
il meno autorevole per darti una risposta ..
Però un po' di tempo fa avevo visto, se non ricordo male, proprio un 
progettino di datalogger su scheda SD, mi pare sulla rivista Fare 
Elettronica ... ma non ne sono sicuro al 100% ..
Quindi direi che è fattibile, e non è complicato ... !
Luca

 ha scritto nel messaggio 
news:10c0ef1d-3103-4384...@33g2000yqm.googlegroups.com...

Anche ammettendo di accedere alla scheda sd in modalità seriale,devi tener 
conto della scrittura a blocchi della memoria.
In una scheda sd, se devi salvare un singolo byte, devi prima leggera il 
contenuto della pagina all'interno della quale risiede in byte da 
modificare, aggiornare il valore, riscrivere tutta la pagina.
Quindi, per fare le cose fatte benino dovresti almeno utilizzare un micro 
con 1k ram.
Per quanto riguarda la rom, dipende da quante istruzioni ci stanno in 1k e 
quanto codice ti serve per 'acquisire' quei 100 bytes di cui parli.
Il termine micro 'piccolissimo' si riferisce alla quantità di memoria o alle 
dimensioni ? ;-)
Imho vista la esigua differenza di costo fra micro con tagli di memoria 
nettamente superiori (devi dirci anche la famiglia che intendi utilizzare),
io ne sceglierei uno con almeno 16k rom 4k ram, poi fai tu...

crow...@gmail.com
:

Io avevo iniziato a lavorarci per lo stesso problema, ed avevo esaminato
http://www.captain.at/electronic-atmega-sd-card.php
 che mi aveva abbastanza
convinto. L'informazione più importante è che comunichi via SPI.
Il problema di gran lunga più complesso è implementare il file system ma,
se fornisci il tuo logger di una seriale, puoi leggere i dati immagazzinati
attraverso di essa.



Hai considerato di usare in alternativa ad una SD una flash su SPI?
Ne esistono con capacità elevate, se devi scrivere 1k all'anno ti bastano per
diversi secoli.
Ad esempio questa, 
http://www.atmel.com/dyn/resources/prod_documents/doc3668.pdf
costa poco, io la preferirei anche per ragioni di affidabilità, e si programma
facilmente con qualunque µC dotato di SPI, da un  AtTiny2313 ad un ARM.
--
ciao
  Stefano

 con 1k ram.
Oppure appoggiarsi ad una memoria eeprom i2c e quando si raggiungono 
512bytes si trasferiscono sulla SD in un colpo solo.
-- 
All new: The software is not compatible with previous versions.
News 2002 [v 2.3] / StopDialer / PopDuster - 
http://www.socket2000.com
Akapulce portal: 
http://www.akapulce.net

 512bytes si trasferiscono sulla SD in un colpo solo.
Al limite una fram i2c...
I cicli di scrittura ed i relativi tempi, porterebbero a vita breve la 
eeprom.
Ma perchè complicarsi la vita con un buffer esterno ed un altro chip da 
pagare ed alimentare, quando ci sono micro con sufficiente ram interna ?

 ha scritto nel messaggio 
news:109qq4dt86t3l5n99...@4ax.com...

E' una 4mbit, ovvero 512kB.
Se deve salvare 100bytes al secondo per un mese intero, fanno circa 
247MB.... 

247MB.... 
AZZ...  mi ero perso " al secondo ".
Ed č solo martedě...    :-(
--
ciao
  Stefano


Non è complicato però, come dice Roberto, forse un micro con più ram e 
rom sarà necessario.
Le SD necessitano di un buffer di scrittura di 512 byte, io direi che il 
micro più piccolo che puoi usare con successo è un ATMega8 (8k rom, 1k 
ram) o equivalente PIC.
-- 
  _|/ Francesco Sacchi - Develer S.r.l., R&D dept.
   |\ 
http://www.develer.com/
 - 
http://www.bertos.org/

 ram) o equivalente PIC.
Intanto grazie a tutti per le risposte da cui ho capito che
la cosa è fattibile. Non ho ancora cercato le specifiche
complete delle SD, però non capisco perchè devo avere
per forza un buffer da 512 bytes nel micro.
Non potrei inviare i miei dati serialmente alla SD man
mano che li acquisisco e quando raggiungo i 512 byte
dare il comando di scrittura? Un buffer eventualmente
sarà necessario per memorizzare i dati mentre la SD
è occupata nell'operazione di scrittura, ma immagino
che sia un'operazione molto veloce e avrò bisogno
solo di pochi bytes di buffer... sbaglio?

per forza un buffer da 512 bytes nel micro.
Avresti lo stesso problema anche con una flash card.
I dati possono essere scritti solo in blocchi di 512 bytes.
Ti faccio un esempio:
supponi di voler scrivere solo il byte 500 del blocco.
Dal momento che puoi inviare solo 512 bytes per volta, 
come prima operazione dovrai leggere tutto il blocco di 512 bytes e
memorizzarli in un buffer.
L'operazione successiva sarà  quella di riscrivere tutto il blocco dei
512 bytes del buffer sulla sd (nel tuo buffer avrai ovviamente
modificato il byte 500).
Questo è l'unico modo di operare per scrivere un solo byte senza
modificare gli altri del blocco che eventualmente sono già stati
scritti.
Ciao
 Marcello
-Catania-

 scritti.
Sono d'accordo con te nell'esempio che hai fatto.
Però non è il mio caso, io voglio scrivere tutto il blocco
intero e non mi interessa che cosa c'era memorizzato
in precedenza.

news:801db774-3ad4-4cbe...@m36g2000vbp.googlegroups.com...


Se vuoi memorizzare blocchi da 100bytes e la carta ha invece blocchi da 
512bytes,
sta da sè che inizialmente scriverai il primo blocco che conterrà i tuoi 
100bytes ma sarà di fatto una pagina di 512bytes.
Dopo un secondo, quando dovrai scrivere il blocco successivo di 100bytes, se 
vuoi partire consecutivamente agli altri e non lasciare spazi 'vuoti', sei 
costretto a rileggerti tutto il blocco di 512bytes, aggiornare solo quelli 
dall'indirizzo 100 al 199 e quindi scrivere di nuovo 512bytes.
Altro discorso se invece puoi/vuoi lasciare spazi vuoti: ad ogni secondo 
inizi da un offset di pagina nuovo e scrivi 100bytes di dati 'validi' + 
412bytes di zeri.
Ti serve una sd di dimensioni molto maggiori (es. 2GB) ma eviti il buffer.
Attenzione però a considerare comunque:
- i tempi di accesso
- che devi ugualmente scrivere tutti i bytes della pagina
- mi sono capitate delle schede sd da 2GB (SanDisk) che alle quali non sono 
riuscito ad accedere in modalità seriale (cosa che mi è stat possibile con 
le Kingston).
Roberto

 ha scritto nel messaggio 
news:801db774-3ad4-4cbe...@m36g2000vbp.googlegroups.com...


E' possibile scrivere (e leggere) in maniera sequenziale senza utilizzare 
buffer. Ovviamente occorre tenere traccia di quanti byte si scrivono. Ma hai 
considerato quanto tempo occorre per leggere tutta la mole di dati che 
intendi memorizzare? Non puoi utilizzare un lettore di SD collegato al PC in 
quanto non hai un file system sulla card ma solamente una sequenza di dati.
Ciao 

 dare il comando di scrittura?
Bell'idea. Mi sembrava strano che tu chiedessi un aiuto, ho fatto ciň che
ho potuto. ;-)

 quanto non hai un file system sulla card ma solamente una sequenza di dati.
Siamo proprio sicuri che non sia possibile accedere ai
blocchi "grezzi" della SD collegata a un PC con qualche funzione
a basso livello di windows?
Molti anni fa, ai tempi ancora di MSDOS, avevo fatto un sistemino
simile con un hard disk montato su un cassetto estraibile.
Un micro era collegato all'HD con interfaccia IDE e scrivevo i
settori in sequenza senza usare un file system.
Raccolti i dati, collegavo il disco al PC dove un mio programma
leggeva i settori e li copiava su un file del disco di sistema.
Per leggere i settori grezzi usavo delle semplici funzioni del bios.
Se oggi fosse possibile fare questo con una schedina SD avrei
enormi vantaggi come velocità e non solo.

 ho potuto. ;-)
L'idea mi è venuta guardando i listati del link che
mi hai dato tu! Anche se non ho capito che differenza
ci sia tra una SD e una MMC... ma questa è mia
ignoranza.

 Anche se non ho capito che differenza ci sia tra una SD e una MMC... 
Io lo sapevo, ma me ne sono dimenticato. ;-)
Non vorrei dire castronerie, ma mi pare avesse a che fare con la necessità
o meno di pull-up sulle linee dati e che la MMC ne avesse bisogno (almeno
se ne potevano mettere più d'una in parallelo), le SD no (almeno vanno più
veloci).
La differenza fonfamentale, nel mio caso, è nelle dimensioni: ho acquistato
da Farnell uno zoccolo per micro SD che misura solo 16x17 mm (cod.
155-8178, se usi Eagle ho anche realizzato il componente di libreria). Dato
che il tutto doveva stare in un tubo d'acciaio con diametro interno 30 mm,
non avevo altra scelta.

 
http://apple.clickandbuild.com/cnb/shop/ftdichip?op=catalogue-products-null&prodCategoryID=47&title=Cables%3A+TTL-232R+and+variants
So (*) che la UART di un ATmega88 a 8 Mhz "tira" a 1 Mbaud e che lavora
correttamente con la versione a 5 volt ed il connettore con 6 pin tipo
jumper del cavo sopracitato. A bastava assai meno (250 Kbaud, su quello ci
metto la mano sul fuoco). Comoda la presenza di RTS e CTS che, se li
cortocircuiti e li leggi con un pin della CPU ti dicono se sei collegato ad
un PC o se sei in modalità di acquisizione.
(*) Ma non ne sono certissimo, ho notato che talvolta il mio emulatore
terminale "bara" e non avevo guardato con l'oscilloscopio. Se serve, faccio
un esperimento, ma è un lavoro da una buona mezz'ora, che farò solo se
Crowned è davvero interessato a questa soluzione.

 a basso livello di windows?
Sì, penso si possa fare.
Io sono più esperto del mondo unix dove nel caso basterebbe leggere dal 
dispositivo grezzo (/dev/qualcosa). Su Windows so che la cosa è simile 
ma non conosco le API.
In ogni caso tieni bene a mente gli enormi svantaggi di questo approccio:
- Puoi usare solo il tuo programma per leggere i log (che quindi dovrai 
sviluppare)
- Non puoi mettere altro sulla SD (non c'è filesystem)
- Non puoi gestire i file di log (niente append, solo un file unico che 
puoi solo cancellare)
- Spreco enorme di spazio (sprechi 412 bytes su 512)
Secondo me se metti anche solo un atmega168 e lavori bene riesci non 
solo a gestire il buffer della SD ma anche a scriverci usando un 
filesystem FAT e quindi avere dei semplici file di testo come log, senza 
necessità di scrivere un'applicazione sul PC.


necessità di scrivere un'applicazione sul PC.
Concordo meglio usare una FAT
Qui il link di una gestione MMC in Fat16:
http://www.ulrichradig.de/index.html
a sinistra su  AVR  >>  MMC-SD.
E' scritto in C con commenti in tedesco, e non so neanche se ha messo a posto la
scrittura (io ci leggevo solo i profili di lavoraziobe), ma ho usato quel
sorgente per interfacciare una MMC.
Un'alternativa può essere Bascom che supporta la scritttura su MMC, puoi usare
la versione demo che compila fino a 4K.
http://www.mcselec.com/index.php?option=com_content&task=view&id=14&Itemid=41
In questo progetto Alberto ha salvato le immagini su una MMc, e questo è stato
fatto in bascom:
http://www.riccibitti.com/witnesscam/entry/witnesscam.htm
--
ciao
  Stefano

 dare il comando di scrittura?
L'unico dubbio è che le SD/MMC potrebbero avere una qualche sorta di
"timeout", che dopo un certo tempo annulla il comando e non lo porta più a
termine. Però se accedi in SPI probabilmente non dovrebbe esserci niente di
simile.
Altrimenti ci sono le flash SPI, che qualcuno ti ha già consigliato. Oltre
ad essere molto più semplici da interfacciare, quasi tutte hanno un buffer
interno di 512 bytes scrivibile (e leggibile!) con comandi separati, per
cui in questo caso ti basterebbe scrivere i tuoi dati nel buffer un po'
alla volta con tanti comandi distinti, poi quando sei pronto inviare il
comando "trasferisci il buffer nella pagina X".
Le flash seriali non arrivano certo alla dimensione delle MMC, ma fino a
128 MBit (16 MB) si trovano abbastanza agevolmente.
-- 
emboliaschizoide.splinder.com