Está en la página 1de 6

Utilizar una SD como unidad de almacenamiento masivo para PIC.

Primeros pasos
Electrnica, PIC, Programacin por David

El espacio disponible para almacenar datos en un PIC es muy limitado, en los modelos ms grandes existe algo de memoria RAM y en casi todos ellos disponemos de una pequea cantidad de memoria EEPROM, pero si queremos almacenar grandes cantidades de datos, como histricos de temperaturas, o guardar imgenes o textos complejos, tenemos que recurrir a algn elemento externo. Nada mejor para almacenar datos que utilizar un elemento robusto, ligero, barato y compatible con otros sistemas como una tarjeta SD. Ademas, la tarjeta de memoria trabaja en rango de tensiones entre 2.7 y 3.6V y se puede manejar utilizando un protocolo SPI, que est bien soportado por los PIC. Si no pretendemos leer los datos con un ordenador, ni respetar ningn estndar, podemos hacer algo tan sencillo como inicializar la tarjeta y escribir bloques de datos en la direccin de memoria que queramos, como si se tratase de una eeprom. Si nos queremos complicar un poquito ms la vida existe mucha informacin en la red para implementar el sistema de ficheros FAT16 que es el que se usa habitualmente en las memorias de menos de 2GB. Veremos que no son muchos los requisitos de hardware que necesitaremos para empezar a trabajar con las memorias SD, aun as es importante tenerlo todo claro antes de empezar. No hay duda de que necesitamos al menos una SD para hacer las pruebas. Vale cualquier cosa que tengamos, ya que para un PIC hasta una de 16MB es una enormidad. Si tenemos un MMC tambin vale (seguramente tendrs que adaptar algo en el programa, ya que yo he usado slo SDs)

Lo siguiente es encontrar un zcalo para conectar la tarjeta. Hay varias opciones:

Buscar SD Card socket en ebay o tiendas de electrnica online por poco ms de 1. Algunos tienen adaptacin de tensin de las seales y la alimentacin de 5v a los 3.3V requeridos por la tarjeta. Utilizar un conector viejo de una disquetera de 5 1/4, que encaja a la perfeccin con las medidas de la tarjeta. Es una buena solucin casera para hacer pruebas cuando no queremos esperar 1 mes por un envo desde china. http://uanr.com/sdfloppy/

o o

Con tiras de pines y soldando un poquito: http://www.instructables.com/id/Cheap-DIY-SD-cardbreadboard-socket/ Soldar directamente la tarjeta SD al circuito (si no la vamos a sacar nunca) o soldar un adaptador de SD a microSD y utilizar una microSD como tarjeta de memoria extrable.

Si trabajamos con 5V, necesitaremos un circuito para adaptar las tensiones del PIC a las de la tarjeta, en el caso de que el socket que tengamos no lo lleve ya integrado. Yo voy a trabajar directamente con 3.3V y de esta manera me ahorro la interface.

Tan importante como lo anterior es elegir adecuadamente el micro para esta aplicacin. Si slo vamos a usar la tarjeta con el PIC como medio de almacenamiento masivo, pero no queremos acceder ni crear un sistema de ficheros, nos sirve cualquier PIC, preferiblemente con SPI hardware. Yo por ejemplo he hecho pruebas con un 16F886 accediendo a bloques de 16 bytes cada vez, que es lo que nos permite la memoria disponible. Por otro lado, si queremos tener un acceso completo al sistema de archivos necesitamos ms memoria RAM, ya que se hace ms sencillo todo si podemos leer bloques completos de datos (de 512 bytes) y conservarlos en memoria. Por esto yo he elegido para hacer la presente gua el procesador ms potente que tena por casa un DSPIC 30F4012, que tiene 2K de RAM, SPI hardware, y sobrada potencia para hacer lo que le pidamos. Siguiendo los pasos descritos en la entrada: Realizar una placa entrenadora para PIC sencilla. He realizado en 15 minutos una placa con lo bsico para las pruebas.

Por ltimo viene bien tener algn tipo de enlace serie para la depuracin, por si nos encontramos problemas durante la programacin. Yo directamente he conectado un mdulo Bluetooth HC-06 a las patas RX y TX del micro y utilizo un emulador de terminal para ver que est pasando durante la ejecucin del programa.

Con esto terminamos el primer captulo de la serie. En la siguiente entrega, veremos como hay que programar el micro para poder inicializar la tarjeta y empezar a leer y escribir nuestros primeros datos.

Continuemos en esta entrada con las tarjetas de memoria SD. Empezaremos buscando toda la informacin posible sobre las especificaciones para saber por donde empezar. En esta pgina http://mac6.ma.psu.edu/space2008/ bajo el apartado SD memory card,se puede ver un montn de documentacin sobre las tarjetas de memoria. En cualquier caso es fcil de encontrar ms datos por la red. Aqu encontraremos tanto las caractersticas fsicas de la tarjeta, para poder realizar las conexiones con el pic, como la gestin de la comunicacin y los comandos. Para consultar el pinout y la configuracin del mdulo SPI, podemos bajar el datasheet del DSPIC que vamos a usar de la pgina de microchip: http://ww1.microchip.com/downloads/en/devicedoc/70135c.pdf El 30F4012 puede trabajar a 3.3V y tiene SPI por harware. En lugar de un cristal externo, utilizaremos el reloj interno de 7,37 Mhz configurando el PLLx8 para obtener una frecuencia de reloj final de 58.96MHz Conectamos los pines del SPI a los correspondientes de la tarjeta, y el PIN_D0 con el CS de la tarjeta, como se ve en el siguiente esquema.

Conectaremos el mdulo HC-06 a los pines U1ARX y U1ATX, para poder usar el ordenador o el telfono como terminal y alimentamos el conjunto con una fuente de 3.3V Los puntos ms importantes para desarrollar el programa: Configurar correctamente el mdulo SPI. La velocidad del reloj durante la inicializacin debe ser de 100Khz o menos para garantizar la compatibilidad, luego se puede aumentar hasta 25MHz en funcin de la tarjeta. De todas formas la velocidad puede ser tan baja como queramos. El divisor del reloj (SPI_CLK_DIV_XX) actua sobre la frecuencia de 58.96 MHz/4 = 14.74 MHz.

SETUP_SPI(SPI_MASTER|SPI_CLK_DIV_8|SPI_H_TO_L|SPI_XMIT_L_TO_H ); Reseteamos la tarjeta y la ponemos en modo SPI, para ello pasamos la seal de CS a 0 y enviamos el
comando 0. Antes de empezar la especificacin dice que hay que dar al menos 74 pulsos al reloj (lo haremos enviando el cdigo 0xFF(8bits) 10 veces, con lo que damos 80 pulsos) . Repetimos el comando 0 hasta que la tarjeta pasa a estado IDLE.

La tarjeta se mantiene bloqueada hasta que mandamos el comando CMD1 o el ACMD41 que inicia un proceso de reset. Repetimos hasta desbloquear la tarjeta. En este punto podemos comprobar si la tarjeta soporta la tensin utilizada con el CMD58. Lo normal es que soporte cualquier tensin entre 2.7V y 3.6V Por ltimo definimos la longitud del bloque que se va a leer y escribir con el CMD16. Como tenemos memoria suficiente usaremos 512 bytes que es el bloque por defecto, pero si queremos podemos configurar este valor incluso a 1 byte.

La lectura y la escritura corresponden a los comandos CMD17 y CMD24 con un entero de 32bits como parametro indicando la posicin en bytes dentro de la memoria. Despus de recibir la respuesta al

comando, o bien leemos o escribimos un byte (token) y luego los datos deseados terminamos con el CRC de los datos que puede ser ignorado porque est desactivado por defecto. El programa final borra un sector y luego lo reescribe con una cadena de texto. Para comprobar que escribimos bien, usamos el comando de lectura y enviamos el sector ledo al terminal por el puerto serie. Fichero slo visible para usuarios registrados Una nota importante antes de programar el PIC, si utilizamos el conector ICSP hay que retirar antes la tarjeta SD del conector, porque el mdulo SPI y los pines PGC y PGD de programacin comparten los mismos pines. Cuidado tambin si utilizamos una tarjeta SD con datos importantes, porque el programa no comprueba nada y escribe en un sector aleatorio, con lo cual seguramente perdamos los datos que tengamos o incluso volvamos la tarjeta ilegible. Todo se soluciona formateando. Est claro que la tarjeta escrita de esta forma no se puede leer directamente en un PC, salvo que usemos un editor hexadecimal para ello. En el siguiente captulo veremos como implementar el sistema de archivos FAT16, para poder escribir o leer un fichero cualquiera.

Muchas veces querremos utilizar una tarjeta de memoria como medio de intercambio de datos con un ordenador, aparte de como almacenamiento para el microcontrolador. En este caso ya no nos vale escribir y leer un bloque en cualquier direccin de la tarjeta como veamos en la entrada anterior, sino que debemos respetar el formato de ficheros de la misma. El sistema de ficheros ms sencillo de implementar y seguramente el ms extendido es el FAT en cualquiera de sus versiones: FAT12, FAT16 o FAT32. De momento veremos slo el acceso a FAT12 y FAT16, pero la librera que vamos a desarrollar se puede ampliar fcilmente a un sistema FAT32. Hay muchos documentos interesantes sobre el sistema FAT accesibles en la red, uno de los que yo he seguido por su simplicidad es este: http://ww1.microchip.com/downloads/en/AppNotes/01045a.pdf Los datos se estructuran en la memoria de la siguiente manera: En todas las SD el tamao del sector es fijo e igual a 512 bytes.

En el primer sector de la tarjeta se encuentra el MBR, que nos interesa principalmente porque almacena la tabla de particiones del disco

La tabla de particiones tiene cuatro entradas, aunque en el 99% de los casos slo se usa la primera. Esta tabla guarda la direccin de inicio de cada particin, su sistema de archivos y su tamaos. Para simplificar, nosotros leeremos slo la primera y daremos por sentado que slo hay una particin. Obtenemos de aqu un puntero haca el primer sector de la particin con la que trabajaremos

En el primer sector de la particin se encuentra el BSE (Boot sector). Necesitamos acceder a l para obtener todos los datos de configuracin del sistema de archivos. Nos vamos a quedar con:

El nmero de bytes por sector: Siempre es 512 para las tarjetas SD. Pero puede servir de comprobacin.

El nmero de sectores por cluster: A partir de este punto el acceso al disco se hace, ya no por sectores de 512 bytes, sino por clusters que son agrupaciones de sectores de tamao fijo. Este nmero s que vara con la tarjeta.

o o

Posicin de la FAT1 y de la FAT2 y su tamao: En el disco se guardan dos bloques de datos (por seguridad) donde se almacenan los punteros a los datos de los archivos. Tamao y posicin del directorio raz: El directorio raz nos da la lista de ficheros en el primer nivel de directorios de la tarjeta. En FAT12 y FAT16 tiene una posicin fija.

Como hemos visto ahora vienen las tablas FAT1 y FAT2 que deben ser idnticas si no hay problemas en el disco. Son registros de tamao fijo (12 bits para FAT12, 16bits para FAT16 y 32bits para FAT32). Los registros 0 y 1 estn reservados, los dems corresponden a cada cluster del disco. El nmero almacenado en el registro indica si el cluster est libre, si los datos del fichero almacenados en este cluster terminan aqu, o si siguen en otro cluster cuyo valor se indica en el registro.

El directorio raz: Contiene una lista de entradas de 32 bytes cada una que contienen el nombre del fichero, la longitud, atributos y fechas y el primer cluster donde se almacenan los datos. La zona de datos: Donde se almacenan los datos de los ficheros y los subdirectorios en bloques del tamao de un cluster.

Partiremos del punto donde dejamos la entrada anterior. Ya sabemos acceder a un sector de la tarjeta para leer y para escribir. Ahora vamos a introducir unas cuantas funciones ms para acceder a los ficheros. En esta entrada he decidido dejar de usar el SPI por hardware por la versin software que proporciona CCS, eso deja libre los pines del micro del conector ICSP para poder cargar el programa sin tener que sacar la tarjeta SD, facilitando las cosas durante la fase de depuracin, tambin he modificado algo las funciones que dan acceso a la tarjeta SD. En esta entrada nos limitaremos al acceso a ficheros del directorio raiz, con nombres cortos y slo para particiones FAT12 y FAT16. Para hacerlo ms interesante, vamos a incluir un para de sondas DS1820 y aadiremos los datos obtenidos a un fichero CSV que luego podremos abrir en el ordenador como una hoja de clculo. Aqu est el esquema del circuito empleado:

Al empezar el programa leeremos el MBR, para obtener los datos de las particiones, luego con el BSE sacamos las direcciones de los bloques principales de la particin y el tamao del cluster. Las funciones de acceso a ficheros son fopen, fwrite, fread y fclose. La primera busca el fichero en el directorio raz (o lo crea si es necesario) y obtiene el primer cluster y el tamao del fichero, la segunda y tercera, sirven para escribir o leer un bloque de datos en el sitio apuntado por el puntero de fichero fp->pt_rw, la ltima cierra el fichero actualizando los datos del directorio raz. El proyecto en CCS abre el fichero TEMP.CSV para escribir (si no existe lo crea) y aade continuamente los valores de temperatura medidos con las dos sondas.

http://www.monografias.com/trabajos81/sistema-control-inteligente-habitacion/sistema-controlinteligente-habitacion.shtml http://blog.deinventos.com/utilizar-una-sd-como-unidad-de-almacenamiento-masivo-para-picprimeros-pasos/