# Implementar el protocolo FAT32 en un microcontrolador (PIC,AVR,ARM,Z80, etc)



## Moyano Jonathan (Jun 19, 2009)

Les traigo una página (En inglés), donde se explica detalladamente como implementar el protocolo FAT32 en los microcontroladores de las marcas más conocidas. Todas las funciones que allí explican están implementadas usando ANCI C por lo que le dá al código gran portabilidad. http://elm-chan.org/fsw/ff/00index_e.html


----------



## Chico3001 (Jun 19, 2009)

Ah que excelente aporte...   increiblemente practico...


----------



## cristian_elect (Jun 19, 2009)

minimo un atmega16 por que consume como 8kB de codigo solo en las funciones para sistema de archivos fat.


----------



## Moyano Jonathan (Jun 19, 2009)

Si el microcontrolador es necesario que tenga 8Kb de RAM mínimo para que pueda correr el protocolo FAT. Igual en una de esas se pueda optimizar el código para que corra en micros con menos prestaciones.


----------



## DavidGamba (Ago 30, 2009)

Pues eso de que se necesita 8Kb de RAM no es cierto, yo lo estoy implementando en un PIC18F4550 que tiene solo 2K de RAM.


----------



## Meta (Ago 30, 2009)

Muy buena informaciónramción. Espero que con esto sigas con tu proyecto del USB y elmanual crezca.

Un PIC18F como máximo veo que alcanza 3,968 bytes de RAM. DE 8KBytes nada de nada.

Hay memorias RAM externas que también ha creado Microchip Technology Inc. - a Leading Provider of Microcontroller and Analog Semiconductors de unos 32KB, no se si hay más valores altos que estos, son rápidas, caras y no las he visto en la calle todavía. Se comunican en paralelo y es bueno tener PIC18F de 40 patas como mínimo, ya que usan más de 8 de datos, otras pin para control de no se que, etc...

Hace tiempo leí esta noticia en algún lugar de ELEKTOR.es ? Plataforma para electrónica y microcontroladores


----------



## DavidGamba (Ago 30, 2009)

Ellos dan esta información sobre el uso de memoria del codigo que utilizan. Ten en cuenta el uso adicional del SPI y del RS232 o USB dependiendo de tu selección.

*Memory Usage (R0.07c)
*

These are the memory usage on some target systems with following condition. The memory sizes are in unit of byte, D means number of volumes and F means number of open files. All samples are optimezed in code size.


----------



## Meta (Ago 30, 2009)

Por cierto Moyano, ya que has dejado el manual de lado temporalmente. ¿Vas a incluir el USB con una memoria conel FAT32?


----------



## Moyano Jonathan (Ago 30, 2009)

La verdad que no se, mi tiempo es muy escaso pero mas adelante voy a seguir con mi manual que dentro de poco voy a terminar con la parte teórica que me tiene aburrido pero es esencial para entender de que se trata ese puerto y luego voy a seguir con mis experimentos.


----------



## Meta (Ago 30, 2009)

Eso espero del manual. Por ahora y sólo por ahora tengo tiempo para hacer el proyecto que gracias con la ayuda de algunos del foro estoy trabajando rápido.

Siguiendo este tema. ¿Lo vas hacer con el fAT16 o FAT32?


----------



## Moyano Jonathan (Sep 1, 2009)

FAT16 al principio y después tengo que probar un par de rutinas en FAT32


----------



## DavidGamba (Oct 8, 2009)

Hice el intento de montar el FATFS de chan en un PIC18F4550. 
El problema con este microcontrolador en específico es que no tiene más que un puerto UART y un Puerto SPI y para completar tienen pines compartidos.
Siendo que me estaba comunicando con la tarjeta decidí dejar el SPI de hardware para la SD e implementar un UART por software. 
El requerimiento de trabajo con SPI requiere que tengas una velocidad para la inicialización de la tarjeta y después una mucho mayor para la transferencia de datos. El SPI por hardware hace esto pero no así el de software, de hecho en ninguna documentación de microchip se encuentra el manejo de la velocidad para el SPI por software, incluso al revisar las librerias .h del SPI por hardware encontre los delays con los que trabaja pero no tienen documentación como para saber como modificarlos. En fin, el SPI por software esta mal documentado, no que no funcione, solo que no tienes mucho control sobre el.
Monté entonces el UART por software, funciona bien en sentido de temporización y de que lo que envias lo recibes, sin embargo es la librería más mal hecha que existe!

Para imprimir tienes que crear una variable de memoria
char cadena [] = "Hola Mundo";
printSoftware(cadena);

no puedes simplemente hacer:
printSoftware("Hola mundo"); 
No lo compila!!!!

si no puedes hacer esto último entonces no puedes usar comandos para imprimir enteros, caracteres, cadenas etc. ex print("hola %l %c", numerolong,caracter)
por lo que te toca hacer tus propias rutinas para hacerlo.

En fin, las hice!!!!! pero el consumo de memoria es altisisimo, si ya tenías problemas con la memoria del chip esto lo hace mucho peor aun si implementas esas variables en memoria de programa
rom char cadena [] = "Hola mundo";

todavía así es demasiado el uso de la memoria de programa.

Sin embargo solo por que ya había trabajado mucho en eso y quería ver el FAT32 de chan funcionando lo monté. La verdad solo monte las rutinas de inicialización de la SD (me funciono con todo tipo de tarjetas, yo uso tarjetas micro SD y lo use con tarjetas desde 128 MB hasta 8GB), solo tuve que hacer modificaciones de temporización para hacerlas correr.

Finalmente monte el fat32, lo inicialice, después revise el número de sectores, tamaño de sector, etc. Y funcionó...............

Pero eso fue todo, para ese punto ocupe toda la memoria de programa y toda la ram, fue triste solo llegar hasta eso, jejeje. 

Ya lo monte en el PIC24F como está en el ejemplo y funciona de maravillas, tengo que aprender a usar todas las rutinas pero a este momento ya puedo hacer el listado de todos los archivos de mi tarjeta micro de 8GB. 
Solo me falta leerlos pero estoy en esas y no creo que tome mucho tiempo.
Solo estoy usando la mitad de la memoria de programa del Chip y un 60% de la ram!!!

Mi conclusión después de esta odisea es que ya es hora de empezar a trabajar con PIC24s PICds y PIC30, tienen muchisima más memoria, son más baratos, los encuentras en presentación DIP y puedes remapear los puertos por lo que el impreso es más facil de hacer.
El único problema que me he encontrado es una documentación algo deficiente.

Espero esta información sea útil!!!

Por cierto, el 30 de septiembre microchip lanzó su versión del FAT32, antes solo tenían soporte de FAT16. eso puede ser una opción viable para muchos, por mi parte me parece que el FAT32 de chan lleva mucho tiempo funcionando y ya han corregido muchas pulgas que pueden aparecer con microchip.


----------



## eidtech (Oct 8, 2009)

DavidGamba dijo:


> Para imprimir tienes que crear una variable de memoria
> char cadena [] = "Hola Mundo";
> printSoftware(cadena);
> 
> ...



David, el compilador no tiene la funcion sprintf.....?

sprintf te envia un mensaje a variable en memoria.... 

por ejemplo asi,

sprint(buffer, "hola %l %c", numerolong,caracter); 

y ya luego solo mandar imprimir el buffer.

printSoftware(buffer);

Si el compilador la tiene, no hay por que escribirla tu mismo y tal vez ahorres un poco de memoria (pensando en que la implementacion es muy eficiente)


----------



## Meta (Oct 8, 2009)

¿No puedes usar otro sistema de archivo?
Estoy dando sobre el tema de sistemas de archivo en informática y FAT ya no es gran cosa (Excepto para poca memoria). Mejor usar NTFS o ext4. Los PenDrive del futuro a parte de ser USB 3.0 serán de WinFS.

Lo curioso es que ya están hablando de Windows 8 y 9 ya para 128 Bits. ¿A acaso 64 Bits ya no es gran cosa? La verdad que no noto mucho para ser 64 Bits.

Fuente:
http://www.muycomputer.com/Actualid...QPbxsvkzsCfueFLF7l9K830bxfJ_Dre2iY0cZZT9-nYEs


----------



## eidtech (Oct 8, 2009)

Meta dijo:


> ¿No puedes usar otro sistema de archivo?
> Estoy dando sobre el tema de sistemas de archivo en informática y FAT ya no es gran cosa (Excepto para poca memoria). Mejor usar NTFS o ext4. Los PenDrive del futuro a parte de ser USB 3.0 serán de WinFS.
> 
> Lo curioso es que ya están hablando de Windows 8 y 9 ya para 128 Bits. ¿A acaso 64 Bits ya no es gran cosa? La verdad que no noto mucho para ser 64 Bits.
> ...



Meta, creo que te has olvidado que estamos hablando de microcontroladores o microprocesadores de 8 y 16 bits principalmente, y en pocos casos de 32 bits.

Asi que implementar un sistema de archivos así consume muchos recursos, que es precisamente de lo que se esta discutiendo.

Se implementa un sistema de archivos FAT por que este lo puede leer cualquier equipo con Windows o Linux, hay sistemas mucho mas sencillos pero que un sistema de escritorio no puede leer.


----------



## Meta (Oct 8, 2009)

Es verdad, jejejeje. Disculpe usted.


----------



## Moyano Jonathan (Oct 8, 2009)

La librería de mikroC para FAT funciona muy bien....si la pudieramos abrir para ver sus funciones podríamos migrarla a otro compilador.


----------



## DavidGamba (Oct 8, 2009)

eidtech dijo:


> David, el compilador no tiene la funcion sprintf.....?
> 
> sprintf te envia un mensaje a variable en memoria....
> 
> ...



Jejeje, que buena idea, la verdad no la pense al momento, estaba cansado de optimizar para bajar unos cuantos bytes aqui y allá. De esa manera tal vez podría retomar ese proyecto en algún otro momento usando el petit FAT de chan sin embargo ahora estoy muy feliz trabajando con el PIC24, es mucho mejor que el PIC18 aunque como mencione antes no hay mucha documentación.

Con respecto al FAT32 de Chan ya puedo leer y escribir archivos y es muy muy bueno. 

Moyano No creo que haya necesidad de usar la carpeta de fat de microC, yo tengo ese compilador en la versión profesional y la verdad solo tienen soporte de FAT16 según veo en mi documentación.

La versión de Chan esta escrita en ANSI C lo que quiere decir que se puede usar con cualquier compilador que soporte este estandar. el CCS no lo hace por cierto.

Meta la Razón de haber hecho esto es por que necesitaba leer datos de la tarjeta SD. Según la SD card association ellos van a usar el FAT32 por lo menos para tarjetas de hasta 2Teras. ahora van como por 32GB y todavía lo están usando.

Con respecto a otros sistemas de archivo como NTFS la verdad no me parece conveniente usarlos debido a que son unicamente para una plataforma. El FAT32 te funciona independientemente del sistema operativo. Yo tengo un disco duro externo de 1 TB y lo tengo formateado en FAT32 por lo mismo (ya que a veces hay que usarlo en MAC y para LINUX) si es un disco duro interno pues si, sin embargo en mi caso ni aún así lo hago por que tengo montado el LINUX en la misma compu y me daría problemas.

Por cierto yo uso la versión gratuita de MPLAB con el compilador para C18 cuando usaba pic18 y con el compilador para C30 ahora.


----------



## Moyano Jonathan (Oct 8, 2009)

Tendremos que aprender a manejar C18 y C30 entonces...
Ahora usando la minima expresión de la librería para PIC18F4550.. te quedás sin memoria ??


----------



## DavidGamba (Oct 8, 2009)

Moyano Jonathan dijo:


> Tendremos que aprender a manejar C18 y C30 entonces...
> Ahora usando la minima expresión de la librería para PIC18F4550.. te quedás sin memoria ??



Nunca intente con el PetitFat que es la minima expresión, siempre intente con el otro, 
acá mando el uso de memoria que tenía para un buffer de trabajo de 512 bytes.
Con el otro logré inicializar la SD, inicializar el FAT y mostrar el estatus del FAT, 

Tipo de FAT
Bytes por Cluster
Numero de sectores
Numero de archivos
tamaño del disco
espacio libre
después de eso ya la memoria no me alcanzaba para usar el resto, es muy probable que si se pueda usar el petit fat!!!

Yo antes solo usaba el CCS como compilador pero después de encontrar el C18 lo prefiero por mucho, da mucho más control sobre todo, hay mucha documentación al respecto y uno tiene acceso a todos los registros del pic por lo que tiene mucho control sobre todo.


----------



## Meta (Oct 8, 2009)

Si se te queda corta para lo que estás haciendo, toca aprender a depurar mucho. Bueno, tiene la opción si no quieres depurar ahora, elegir PIC de 32 ó 64 KB. Ahí no te quejarás. Para eso lo venden.


----------



## robotecsl (Feb 2, 2010)

Hola David.
Podrias pasarme el ejemplo que tu tienes funcionando para los Pic o otro micro?
Yo lo estoy implementando en un MSP430 y no lo consigo hechar a andar.

Gracias y un saludo


----------



## DavidGamba (Feb 3, 2010)

robotecsl dijo:


> Hola David.
> Podrias pasarme el ejemplo que tu tienes funcionando para los Pic o otro micro?
> Yo lo estoy implementando en un MSP430 y no lo consigo hechar a andar.
> 
> Gracias y un saludo



Hola, yo como les dije saque mi versión del trabajo de CHAN, su página web es: 
http://elm-chan.org/fsw/ff/00index_e.html

el link para bajar el zip con las librerias para diferentes microcontroladores es:
http://elm-chan.org/fsw/ff/ff007e.zip

Esta implementación funciona muy bien, sin embargo microchip ya tiene su propia versión de un fat 32 que podrían revisar. No se si soporta todos los PIC 18 pero ha de soportar alguno, una de las ventajas es la documentación.

Con respecto a mi, yo utilicé las librerias de CHAN que funcionan casi que "out of the box", solo hay que tomarse el tiempo para entenderlas, yo en un principio solo cambié la velocidad del cristal (haciendo los ajustes a los parametros correspondientes en el main) y cambié la velocidad del puerto serie. Con eso lo probé y funcionó. 

Cualquier pregunta con gusto!


----------



## alepusto (Jul 18, 2011)

Este proyecto de FAT32 es muy bueno y completo, genial que soporte varias arquitecturas. Por mi lado las he probado en AVR, cuesta un poco familiarizarse con ellas, pero luego de que las conoces, son supremamente sencillas de manejar... sería bueno dar una serie de pasos sencillos para que la gente aprenda a configurar la librería. Además a mi parecer los archivos de ejemplo no están descritos de tal manera que sean fácilmente adaptables a diferentes microcontroladores dentro de la misma familia... por ahi tengo unas modificaciones que hice para los AVR, si alguien está interesado los puedo montar


----------



## Moyano Jonathan (Jul 18, 2011)

Si tienes ejemplos de como usar las librerías, estaría bueno que los mostraras. Yo estoy desarrollando documentación en español para poder usar AVR...pero me va a llevar tiempo y no cuando terminaré.


----------



## alepusto (Jul 18, 2011)

Hola Moyano Jonathan, nos encontramos en otro foro jajaja... ya hoy está muy tarde, revisaré los archivos mañana y los monto aquí, prometido.


----------



## alepusto (Jul 19, 2011)

Bueno, comienzo  con el tutorial para manejo de FAT en microcontroladores AVR. Vamos a utilizar las librerías recomendadas en este blog, pongo nuevamente el enlace:

http://elm-chan.org/fsw/ff/00index_e.html (Fatfs)
http://elm-chan.org/fsw/ff/00index_p.html (Petit Fatfs)

En la sección *Resources* encuentran los links de descarga, o sigan los siguientes links (pueden desactualizarse conforme vayan saliendo nuevas versiones):

http://elm-chan.org/fsw/ff/ff8b.zip (Fatfs)
http://elm-chan.org/fsw/ff/pff2a.zip (Petit Fatfs)


Existen dos versiones de esta librería: Fatfs y Petit Fatfs. La primera es la más completa, pero consume bastante memoria tanto Flash (fácilmente pueden ser 8KB pero depende de cómo se configure) como RAM (>512 por archivo abierto). La segunda está pensada para microcontroladores con muy escasos recursos (Ejemplo la subfamilia ATtiny): usa alrededor de 2 a 4 K de Flash, y alrededor de 44 bytes de memoria RAM. Si mal no estoy, las restricciones más importantes es la de no poder crear archivos, el archivo ya debe estar en la memoria. En este tutorial me concentraré en explicar la completa, no la Petit.

Lo primero es aclarar qué permite realizar estas librerías: Son una interfaz en ANSI C para gestionar archivos que se encuentren en sistemas tipo FAT, como memorias USB, SD, Discos duros, etc. No incluyen las librerías para la interfaz hardware (también llamada _capa física_) con el dispositivo (como dije, puede ser una memoria SD, un disco duro IDE o ATA, un disco duro SATA, etc). Pero no hay problema, en los ejemplos de la página están incluídas las librerías para manejo de memoria SD que creo resulta ser la más interesante, ya que sólo se necesita una interfaz SPI, incluída en la mayoría de los dispositivos AVR. A continuación el link donde descargan los ejemplos:

http://elm-chan.org/fsw/ff/ffsample.zip

Ahora, comencemos explicando los archivos de los que se compone tanto la librería como los ejemplos. El primer archivo, el de la librería Fatfs, incluye básicamente los siguientes archivos en la carpeta _src_:


diskio.h (Interfaz capa física)
ff.c       (Librería Fatfs)
ff.h       (Librería Fatfs)
ffconf.h  (Configuración)
integer.h

El *primer archivo* es solo uno de cabecera, no incluye código, solo definiciones de funciones utilizadas para acceder al dispositivo (capa física). Como estas funciones son totalmente dependientes del dispositivo a utilizar (memoria USB, tarjeta SD, Disco duro, etc), la librería no las incluye, solo las define. Este archivo no lo tocaremos.
El *segundo y tercer archivo* es la implementación de las funciones de la librería Fatfs. No los tocaremos.
El *quinto archivo* tampoco es interesante, son solamente las definiciones de los tipos de enteros a utilizar. No lo tocaremos.
El *cuarto archivo* es el más importante porque permite configurar la librería, es el único que editaremos.

Ahora descomprimamos el otro archivo, el de los ejemplos. Nos dirigimos a la carpeta _avr_ y ahi encontraremos, fuera de los archivos previamente mencionados, lo siguiente:


ata.c         (driver para medios ATA)
cfc.c         (driver para medios Compact Flash)
cfmm.c     (driver para medios Compact Flash y MMC)
mmc.c      (driver para memorias MMC o SD)
mmcbb.c   (driver para memorias MMC o SD sin usar SPI)

Por lo tanto, vemos que los ejemplos incluyen justamente las definiciones de las funciones en diskio.h, es decir la capa física! El único archivo que tomaremos en cuenta será el _mmc.c_, que utilizaremos para acceder a memorias SD.  Entonces, la lista de archivos que necesitamos para comenzar con un proyecto que implemente FAT en memoria SD es:


diskio.h (Interfaz capa física)
ff.c       (Librería Fatfs)
ff.h       (Librería Fatfs)
ffconf.h  (Configuración)
integer.h
mmc.c      (driver para memorias MMC o SD)

Bueno, por ahora, termino este primer post del tutorial de FAT32 para AVR, más adelante explicaré algunos cambios necesarios a realizar en estos archivos para configurar nuestro proyecto.


----------



## StrySG (Jul 22, 2011)

Es la primera vez que veo este tema y me parece muy util habia escuchado en otras ocasiones que era posible realizar este sistema de archivos con microcontroladores por que hay proyectos que solicitan la creacion de archivos y almacenamiento en memorias me gustaria saber mas acerca de como guardar archivos en una memoria flash USB con un microcontrolador para luego leerlas en una PC, estaré esperando el siguiente post y gracias por toda la info.


----------



## alepusto (Jul 22, 2011)

StrySG dijo:


> Es la primera vez que veo este tema y me parece muy util habia escuchado en otras ocasiones que era posible realizar este sistema de archivos con microcontroladores por que hay proyectos que solicitan la creacion de archivos y almacenamiento en memorias me gustaria saber mas acerca de como guardar archivos en una memoria flash USB con un microcontrolador para luego leerlas en una PC, estaré esperando el siguiente post y gracias por toda la info.



StrySG, toma en cuenta que una cosa es el formato FAT32 y otra cosa es la capa física del dispositivo a través de la cual accedes a los archivos en este formato. Me refiero a que estás pensando en utilizar una memoria USB para acceder a los archivos que están en el sistema FAT, pero primero tienes que contar con la interfaz USB Host que te permita cumplir con el protocolo de comunicación USB antes de pensar en leer los archivos del sistema FAT. Mejor considera tener una memoria SD, ya que la capa física es SPI, la cual está incluida en la mayoría de microcontroladores de bajo costo, al menos en los AVR.


----------



## alepusto (Jul 23, 2011)

Continuando con el tutorial de FAT para AVR usando memoria SD (o microSD), quedamos en cuales eran los archivos necesarios para realizar nuestro primer proyecto. En este post explicaré *la capa física de memorias SD*. 

Lo primero y más importante es definir con cual formato de memoria se trabajará. Incluiré los diagramas de conexión para tanto para memorias SD como microSD (img 3) aunque considero que estas últimas son fáciles de conseguir, así como su puerto de conexión, que o bien pueden extraer de un celular viejo o existen algunas tiendas que ofrecen tarjetas con el conector para conexión a protoboard, como en la img 1 (EJ: http://www.naxuscolombia.com/productos/prototipado/). También es posible conseguir memorias microSD que incluyen un conversor a formato SD (img 2).

*Interfaz física con Tarjetas [micro]SD*
Una memoria SD incluye un controlador interno que se encarga de gestionar los bancos de memoria Flash de la tarjeta, así como la interfaz de comunicación con el exterior (img 4). Para trabajar con memorias SD se tienen dos Modos de comunicación: Modo SD y Modo SPI . El primer modo se utiliza muy poco, al menos para montajes con microcontroladores, por lo que se explicará exclusivamente el modo SPI, el cual es un periférico comúnmente incluído en microcontroladores AVR. Para este bus de comunicación serial es necesario explicar cuales líneas físicas se manejan: 


MISO (Master In Slave Out) 
MOSI (Master Out Slave In)
SCK   (Reloj)
/CS     (Chip select, también llamado SS, activo bajo)
GND    (Tierra)
VCC     (Alimentación = 3,3V)

Por lo tanto es necesario identificar estas líneas en nuestras tarjetas SD o microSD. He dejado las img 5 y 6 para memorias microSD y SD respectivamente. Las equivalencias entre las lineas de tarjetas microSD y SD se pueden observar en la img 7. Los nombres de las líneas explican claramente su funcionamiento: el microcontrolador hace las veces de Maestro y la tarjeta SD de esclavo. Entonces básicamente la línea MISO se utiliza cuando la tarjeta SD se comunica con el microcontrolador, la línea MOSI cuando el microcontrolador desea enviar datos a la tarjeta SD. La línea SCK transmite la señal de reloj para la transmisión serial (SPI es un bus de comunicación síncrono, a diferencia de un bus serial normal implementado con una UART, que es asíncrono, es decir, no transmite señal de reloj). Vemos también la línea CS, que sirve para activar el dispositivo esclavo, la SD. SPI permite el manejo de múltiples periféricos, por lo tanto se comparten las líneas MISO MOSI y SCK. Para diferenciar con qué dispositivo se comunicará el Maestro SPI (nuestro microcontrolador), se usa la activación de la línea CS del periférico de interés.

Como vemos existe un punto muy importante y es la alimentación de la memoria SD, que es de 3.3V. La mayoría de montajes con microcontroladores usa 5V, así que cuidado con la conexión. Lo primero es conseguir un regulador de 3.3V, que puede tomar como entrada los 5V del circuito. Esto soluciona la conexión de la alimentación de la tarjeta SD, pero no la interfaz de las líneas MISO, MOSI, SCK y CS. Por fortuna la topología de los pines de E/S de AVR juega a nuestro favor: Podemos configurar estos pines sin habilitar el pullup interno (registros PORT), y conectaremos pull-ups externos a 3.3V. Esta solución se puede observar en la img 9. Para las resistencias de pullup (R) pueden usarse valores desde 4.7k hasta 10k. Otra posible solución sería habilitar los pull-ups internos de las salidas del microcontrolador, y realizar un sencillo divisor de voltaje para cada línea, de tal manera que pase de 5V a 3.3V el voltaje de cada linea, como se ilustra en la img 8. Para R1 y R2 se puede utilizar 330 y 680 ohms respectivamente. Cuál de los dos montajes es más efectivo? Cualquiera de los dos funciona, aunque podría ser preferible el pull-up externo, ya que en teoría es menos susceptible frente a variaciones en la resistencia (debidos por ejemplo a cambios de temperatura).

Con esto termino el post de hoy, ya especificada la interfaz fisica con la memoria SD, pasare a explicar la configuración de la libreria para el microcontrolador AVR de nuestro interés.


*Otras lecturas del mismo tema*
http://elm-chan.org/docs/mmc/mmc_e.html
http://www.basementcode.com/avr/sd_fatfs/fatfs.php
http://www.dharmanitech.com/2009/01/sd-card-interfacing-with-atmega8-fat32.html


----------



## cristian_elect (Jul 23, 2011)

Hace un tiempo deje ejemplos de Fat32 para Attiny y Atmega32 para SD. No es muy dificil entender las librerias de "chan" lo que resulto un poco dificil el grabar en formato "*.txt" especial para "office excel" para que salga en orden.


----------



## Razuluaga (Jul 28, 2012)

*alepusto* 

Seria bueno que por favor motaras algun ejemplo de manejo de la SDcard con avr comentado, por si no vas a seguir desarrolando el tema, ya que las librerias del "chan" no estan muy bien comentadas. Gracias


----------



## alepusto (Jul 28, 2012)

Hola razuluaga,

No continué el tutorial, lo haré la próxima semana para dejar completa la información!


----------



## matyvico (Oct 5, 2012)

Hola! Este es mi primer post en este foro! 

Quería comenzar agradeciendo por este post y los tutoriales de @alepusto

Voy a seguir de cerca el hilo a medida que se vaya ampliando la información sobre la implementación de la librería en uC. Particularmente tengo un proyecto en mente para la regularización de una cátedra implementando uC PIC, específicamente el 18F4550 (en este pensaba utilizar la librería completa), pero también tengo interés en utilizarlos en sistemas mucho mas simples sobre MSP430 de TI (vi algunas implementaciones sobre estos uC pero con la petit).

Me comprometo en ir subiendo mi avance (a este foro y seguramente al de uControl, y a mi Blog), espero que podamos avanzar entre todos!

Nuevamente muchas gracias y continúen así!


----------



## hamster (Oct 5, 2012)

Hola alepusto exactamente estaba en donde has quedado... he intentado modificar la libreria mmc.c pero no he logrado configurarla para un ATmega328P
En este sitio estaba la info:
http://www.frank-zhao.com/cache/fat_sd.php
Esperare  tu siguiente avance.


----------



## hamster (Oct 19, 2012)

Hola a todos, intenté hacer correr la librería FATFS SD/MMC R0.09a de Elm-chan pero no lo logré, (Sigo Intentando 
	

	
	
		
		

		
			





 ), asi que retrocedí en versión y pues logré hacer funcionar la R0.08a .
Aqui dejo el código en AVR Studio 4 y simulador Proteus 7.7 usando microcontrolador ATmega328P. 

En este ejemplo se leerán tres archivos, la librería soporta multiples archivos (crear mas variables de tipo FIL), pero yo cierro uno para abrir el otro.

Para un adecuado funcionamiento; en la función disk_initialize no comentar las lineas a1 y a2 además borrar las líneas posteriores a estas.. ( enviará 2 warnings en proteus)

Para crear la imagen con extensión .mmc he usado WinImage 8.5.

código fuente en:
http://code.google.com/p/avr-uni/downloads/list


----------



## juankry (Abr 23, 2013)

Hola,

Actualmente me encuentro en la fase final de mi proyecto y he llegado a un punto muerto en el cual no tengo ni idea de como actuar, al no disponer de información.

La cuestión es que necesito crear un fichero txt con los datos leídos por mi datalooger que he desarrollado con stm8l discovery. Dispongo de un módulo sd y micro sd, más concretamente el SD card Shield 3.0, el problema es que para mi MCU no dispongo de bibliotecas ni ejemplos, estoy sin nada y lo peor de todo es que no se como hacerlo.

El SD card se puede conectar tanto por I2C, SPI o UART, pero no me dan información de como hacerlo, en I2C, por ejemplo no se cual es la dirección del dispositivo.

¿Qué debería hacer? ¿Debería intentar conectarlo por SPI? ¿Tiene que ver que el MCU sea de 8 bits para que se pueda realizar lo que yo quiero?

Por favor necesito ayuda de alguien que sepa del tema puesto que ni en los foros ni el servcio técnico de STMicroelectronics me dan respuesta y dispongo solamente de dos meses para acabar mi proyecto.

Muchas Gracias


----------



## aguevara (Abr 23, 2013)

Intenta enviar los datos via SPI es una comunicacion serial que te permite el envio de paquetes de 8 bits es sencilla de implementar checa en este link para que entiendas un poco su protocolo, ahora bien la memoria que usas debe tener ciertos comando con los cuales le indicas si vas a leer o escribir.

Saludos


----------



## Chico3001 (Abr 23, 2013)

https://www.forosdeelectronica.com/...2-microcontrolador-pic-avr-arm-z80-etc-21443/
https://www.forosdeelectronica.com/f24/lecto-grabador-tarjetas-mmc-sd-microsd-pic16f877a-8177/
https://www.forosdeelectronica.com/f24/mmc-sd-pic-6336/


----------



## juankry (Abr 23, 2013)

Chico3001 dijo:


> https://www.forosdeelectronica.com/...2-microcontrolador-pic-avr-arm-z80-etc-21443/
> https://www.forosdeelectronica.com/f24/lecto-grabador-tarjetas-mmc-sd-microsd-pic16f877a-8177/
> https://www.forosdeelectronica.com/f24/mmc-sd-pic-6336/



Ok, lo voy a intentar, un pregunta el MCU que estoy usando es tiene 2KBytes de RAM, ¿crees que funcionará?

Lo que me gustaría saber previamente es si mi MCU está habilitado para llevar a cabo mi propósito, lo pregunto porque, como no se nada del tema no se si las características de mi MCU son las adecuadas.

Este es el enlace de la demo-board:

http://www.st.com/web/catalog/tools/FM116/SC959/SS1673/PF250636

Y este el del MCU que incorpora:

http://www.st.com/web/catalog/mmc/FM141/SC1244/SS1336/LN1570/PF244063?s_searchtype=partnumber

Destacar que lo que estoy desarrollando es un datalooger el cual ya lo tengo funcionando, por lo que cambiar de MCU ahora sería tirar 5 meses de trabajo a la basura.

He leido en el tema al que me has remitido que pude dar problemas también el SPI si comparte terminales con el USART, mi MCU comparte terminales también.

Entonces, ¿Me recomendáis que intente realizar una conexión SPI o USART? y otra pregunta, ¿es posible realizar estas comunicaciones, para probar que me funciona, sin emplear FAT al principio? es decir, conectar el módulo por SPI o USART y mandar unos bytes para comprobar y aprender el funcionamiento de SPI, antes de liarme con la programación del FAT.

Disculpadme si son preguntas tontas, es que no tengo ni idea aún, también es verdad que tengo que leer toda la información que pueda de los protocolos y del FAT.

Muchas gracias por vuestro tiempo


----------



## Chico3001 (Abr 23, 2013)

juankry dijo:


> ... otra pregunta, ¿es posible realizar estas comunicaciones, para probar que me funciona, sin emplear FAT al principio?



Si es posible... solo que no vas a poder leer los archivos en una PC


----------



## juankry (Abr 24, 2013)

Otra cosa, no se si podré usar SPI porque la demo board ocupa las patillas SCK (PC6)  y NSS (PC5) porque son dónde esta el cristal y no lo puedo inutilizar. PA2 y PA3 las tengo libres y puedo conectar MISO y MOSI o TX y RX de USART:

http://imageshack.us/photo/my-images/90/preguntaforo.png/



¿Influye usar el cristal a la vez que SCK y CS (PC5 - PC6)?

También tengo NSS, CSK, MOSI y MISO en PB4, PB5, PB6 y PB7 respectivamente, pero ahí tengo conectados algunos segmentos del LCD el cual uso en mi aplicación.

Por otro lado, después de llevar horas leyendo, no me queda claro como usar las bibliotecas de chan junto con el SPI o USART, ¿como he de empezar?, recuerdo que no tengo ningún ejemplo para mi MCU.

Gracias y perdón por la reiteración en mis preguntas, pero es que estoy algo perdido y no se dónde acudir


----------



## juankry (Abr 26, 2013)

¿El CS lo pudo conectar directamente a masa si uso un solo dispositivo? me ahorraría esa patilla, y el SCK lo podría conectar a PB5 mientras no use el LCD.


----------



## hamster (May 4, 2013)

Hola amigos...

si quieren trabajar FAT16/32 enserio les recomiendo usar las librerías de ELm-chan...

hace poco tiempo termine el reproductor WAV player AVR, me da excelente.. la señal de salida es perfecta, la probé con una canción a 44K, y el MCU es un ATmega644 a 16Mhz, la sd es una kingston de 2GB con FAT32. 

Cualquier cosa puedo subir el código pero son las mismas librerías de ELM.
también las herramientas a usar para este proyecto.


----------



## Chico3001 (May 5, 2013)

Buen tip.. son estas?

http://elm-chan.org/fsw/ff/00index_e.html
http://elm-chan.org/fsw/ff/00index_p.html

Al menos la web se ve muy buena... llena de proyectos interesantes....

http://elm-chan.org/


----------



## LUCASLEON (May 9, 2013)

Buenas señor hamster si porfavor pudiera subir el codigo que mensiona seria de buen aporte al foro de ante mano gracias


----------



## juankry (May 24, 2013)

Hola tras largo tiempo,

Escribía para comentar mis avances; con respecto al esquema con el cual hice la consulta hace tiempo, he liberado el cristal de las patillas PC6 y PC5 (vease mi post anterior), para disponer de las 4 líneas necesarias para SPI. Como mi MCU dispone de dos osciladores internos RC, he podido prescindir del cristal (para usar el RTC he decido usar el famoso DS1307 en lugar del interno).

Bueno, he conseguido comunicación SPI, implementando algunas funciones (inicializar SPI, enviar los comandos necearios para poner la tarjeta sd en modo SPI, escribir un bloque de bits en un sector concrelo de la tarjeta, leer, etc ...).

Bien, consigo escribir y leer en cualquier sector de la tarjeta, el problema que me surge ahora es que los sectores de una tarjeta SD son de 512 bytes, y mi MCU es de 8 bits, no puede enviar bloques de mas de 256 bytes (incluso si intento enviar 256 me da error de memoria), luego, siguiendo la guía de chan, según he entendido, tengo que usar l implementación petit fat para crear archivos de texto.

He hecho algunas pruebas, y me da el error de que no reconoce sistema de ficheros FAT. Esto creo que es porque el petit Fat no usa los sectores de la tarjeta completamente y, seguramente el código que he escrito para leer la SD, no llegue a leer la parte del sector 0 donde se encuentra la versión del FAT , aunque todavía es una suposición.

Lo que me gustaría consultar es que si, efectivamente, con mi MUC de 8 bits es imposible completar los sectores de la SD al enviar y recibir datos y cuales son las consecuencias.

También preguntar a la gente experimentada en estos temas si estoy siguiendo los pasos correctamente implementando el petitFat y si alguien lo ha conseguido echar a andar alguna vez.

Gracias por todo y perdón por el "tocho".

P.D: Por cierto, me gustaría recomendar el software "H" para el que este trabajando con este tema, es un visor de hexadecimal que te permite visualizar por completo todos los sectores de la tarjeta; a mi me está siendo muy muy útil.


----------



## hamster (May 25, 2013)

Hola amigo LUCASLEON acá dejo el proyecto, si tienes dudas no dudes en preguntar. 
https://www.forosdeelectronica.com/showthread.php?p=807601#post807601


----------



## juankry (May 26, 2013)

Hola de nuevo,

Ya tengo el Petitfat funcionando en el "stm8l  discoveryboard", tengo un gran problema, no puedo crear ficheros, el petitfat está limitado solo a abrir archivos existentes y escribir en ellos. Para mi datalooger necesito crear un fichero cada día automáticamente.

No puedo utilizar el módulo fat completo puesto que me da error de memoria (trabajo con un MCU de 8bits y 2Kb de RAM). Por favor necesito consejo, ¿se puede hacer algo para poder crear ficheros sin necesidad de usar todo el módulo fats?

Por favor alguien que me pueda echar una mano, solamente me queda este último escollo y mi datalogeer estará terminado.

Muchas gracias por la ayuda


----------



## gonpa (May 3, 2014)

Buenas, alepusto no continuaste con el tutorial? yo me quede intrigado como seguía ésto. Una duda....el link de la implementacion fat completa no está "erro 404" http://elm-chan.org/fsw/ff/ff8b.zip....podrían subirlo así lo podamos descargar y tratar de implementar?

Planteo mis dudas con respecto a las sdcard, micro sdcard y MMC:

1-el protocolo para leer borrar y escribir por spi de las mmc y sdcard es lo mismo?
2-sin implementar ningún fat puedo solamente usar la sdcard como una memoria? osea escribir leer y borrar por spi bloques de 512? (adjunto mis rutinas probadas en proteus con una mmc por que no hay sd).
3-alquien podría subir un ejemplo más o menos detallado de una implementacion fat32 para usar *.txt?

muchas gracias y espero puedan ayudarme! saludos!


----------



## gonpa (May 4, 2014)

Me contesto solo jeje, ya las hice andar! 
1-inicializo bien la sdcard
2-configuro bloques de 512byte
3-grabo el bloque de 512
4-leo y muestro en un terminal todos los datos.

corregí las rutinas que subí y ahora están andando. Las subiré si es que alguien las pide por que creo que este hilo murió =( nadie comenta creo..

Saludos!!!


----------



## TRILO-BYTE (May 4, 2014)

ando en eso  nunca use la SD 
y ahora ando tratando de grabar y leer por SPI y en CCS "para rapido "
ya logre leer y escribir en ´proteus

pero me paso algo terrible !!

no se por que el modulo SPI del 18f4550 me genera pulsos cuadrados pero de 200mv 

y no tengo idea de por que

he bajado codigos y en proteus funcionan pero en fisico ya no funciona 

no se si puedas hecharme una mano que ando muy verde con las SD


----------



## gonpa (May 4, 2014)

Estas usando pullup?? creo que por ahí puede ser. Otra cosa la MMC de proteus no es tan tan igual que en la realidad. Yo ya la hice andar en una placa pero como contaba recién, inicializarla, configurar bloques de 512bytes, grabar bloques y leer bloques. También use un analizador lógico el cual me ayudo mucho a saber que me contestaba la sd y que hacia mal. Pero ya quedo re bien! . lo que me faltaría es implementar fat32 pero no entiendo lo que comparten. hay poco comentarios con el código.

Subo aquí las rutinas andando con una micro sdcard de 2gb


----------



## TRILO-BYTE (May 4, 2014)

gracias si me quedo claro lo de los bloques de 512 y los comandos

alomejor no se usar bien el CCS pero en fin lo que uno hace por aprender

¿no cres que iniciar en FAT32 es mas enbrollo que el FAT16?

por lo que he visto hay mucha documentancion del FAT16 aunque no me queda claro como se declaran los directorios 

aun ando muy verde con la SD 
en el osciloscopio me sale el Data del micro con valores de los 200mV eso es muy frustrante


----------



## hamster (May 6, 2014)

Herramientas y otras cosas para trabajar en FAT32.
http://nicproject.blogspot.com/
Son buenisimas las librerías de ELM-CHAN, son de lo mejor......

En el código fuente hay una simulación en proteus.


----------



## TRILO-BYTE (May 6, 2014)

yo tengo duda si el proteus me dice que mi codigo funciona y en el proto no funciona
es error mio o de la simulacion de proteus

algo que no me queda claro
¿la SD tiene una frecuencia maxima y minima de trabajo?
es algo que no logro encontrar en el internecio


----------



## Moyano Jonathan (May 8, 2014)

> yo tengo duda si el proteus me dice que mi codigo funciona y en el proto no funciona
> es error mio o de la simulacion de proteus



No te guies de la simulación, proba solo con el hardware y usá un puerto serial para hacer debug. Colocá mensajes en partes estratégicas del programa para ver donde está el fallo.

Saludos !



> ¿la SD tiene una frecuencia maxima y minima de trabajo?



Si, generalmente funcionan todas a la mínima frecuencia...por lo menos con las pruebas que he realizado en mi caso. La frecuencia de trabajo del SPI tiene que rondar los 125Khz. Esto es válido tanto en CCS, como para AVR o ARM.


----------



## TRILO-BYTE (May 9, 2014)

gracias ando en eso en este momento
primero tratare de leer una cadena de un txt y despues tratare de grabar


----------

