Librería FAT:
Con esta librería es posible crear un archivo o directorio, abrir un archivo y agregarle datos, dentro del directorio raíz o en una dirección de carpetas establecidas (por ejemplo "/Logger/temp/data"). Además soporta nombres largos.
Ejemplos de utilización:Buscando una dirección de carpetas. Por ejemplo si en nuestra memoria SD tenemos la siguiente estructura de directorios "/Logger/temp/data", y deseamos crear una carpeta o archivo en ella debemos determinar el cluster donde se encuentra definida para trabajar en ella. Para ello utilizamos la siguiente función:
FAT_FindDirectory(Direccion,DirectorioInicial,UbicacionCarpeta); donde:
Dirección: indica la estructura de directorios a buscar ("/Logger/temp/data").
DirectorioInicial: Indica a partir de que carpeta buscamos estructura. En principio iniciaríamos en la carpeta raíz y este valor seria 0.
UbicacionCarpeta: En esta variable se devuelve el cluster donde trabajar.
NOTA: La búsqueda se realiza a partir de los nombres cortos.-
Crear una carpeta. Para ello primero definimos el nombre corto (Mayúscula) y el nombre largo, que puede ser el mismo.
NombreCorto[12]="CARPETA"
NombreLargo[30]="Carpeta creada con PIC"
Utilizamos la siguiente función:
FAT_CreateDirectory(NombreLargo,NombreCorto,Ubicación)donde:
Ubicación: es la dirección del Cluster en donde la crearemos. Esta dirección puede ser DirectorioRaiz (Definida dentro de la librería como 0) o una que se obtiene a buscar una dirección de carpetas con FAT_FindDirectory(...).
Creación de un archivo. Es idéntico a crear una carpeta pero con el adicional de indicar el string a escribir en dicho archivo. Dadas las capacidades físicas del microcontrolador el tamaño del string siempre será menor a un cluster.
FAT_CreateFile(NombreLargo,NombreCorto,Ubicacion,Texto)Agregar datos a un archivo. Si tenemos ya un archivo creado con datos almacenados y necesitamos agregar más datos con esta función es relativamente sencillo donde posemos ir generando un archivo de cualquier tamaño. La función a utilizar es la siguiente:
FAT_OpenAddFile(NombreArchivo,UbicacionCarpeta,Texto)donde:
NombreArchivo: Nombre corto de archivo en donde agregaremos datos.
UbicacionCarpeta: Dirección de carpeta contenedora del archivo.
Texto: Texto a agregar al archivo.
Abrir un archivo y leer su contenido: En la libreria se lee el archivo y se envia por puerto serial, es aquí donde se debe cambiar a gusto.
FAT_OpenFile(NombreArchivo,UbicacionCarpeta)donde:
NombreArchivo: Nombre corto de archivo en donde agregaremos datos.
UbicacionCarpeta: Dirección de carpeta contenedora del archivo.
Ejemplo:
#include <18F4550.h>
#device adc=8
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_A0,bits=8, force_sw)
#include <SDCard_hard.c>
#include <FAT16_SDCard1.3_.c>
char Texto1[512]={"******Datos iniciales**********\r\n28/10/09 11:10:56 22ºC\r\n28/10/09 11:11:56 22ºC\r\n28/10/09 11:12:56 22ºC\r\n28/10/09 11:13:56 22ºC\r\n28/10/09 11:14:56 22ºC\r\n28/10/09 11:15:56 22ºC\r\n28/10/09 11:16:56 22ºC"};
char Texto2[512]={"\r\n******Datos Agregados**********\r\n28/10/09 11:10:56 22ºC\r\n28/10/09 11:11:56 22ºC\r\n28/10/09 11:12:56 22ºC\r\n28/10/09 11:13:56 22ºC\r\n28/10/09 11:14:56 22ºC\r\n28/10/09 11:15:56 22ºC\r\n28/10/09 11:16:56 22ºC"};
/*******************************************************************************/
void main(){
char NombreArchivo[13]="ARCHIVO.TXT";
char EstructuraCarpetas[20];
char NombreDirectorio[12]="CARPETA";
char NombreLargo[30]="Archivo Datos.txt";
int16 UbicacionFolder;
char i;
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED|T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
output_high(PIN_C0);
output_high(PIN_C1);
output_high(PIN_C2);
delay_ms(1000);
printf("Iniciando SD Card\r\n");
if(SDCard_init()==0){
printf("Error al iniciar, intento %u\r\n",i
); }else{
printf("Se ha iniciado correctamente la memoria!!!\r\n\r\n"); if(FAT_init()==0){
break;
}
Printf("Buscamos direccion de carpeta donde crear archivo:\r\n");
strcpy(EstructuraCarpetas
,"/LOGGER/TEMP/DATA"); if(FAT_FindDirectory(EstructuraCarpetas,DirectorioRaiz,UbicacionFolder)==0){
printf("Error no se encuentra carpetas\r\n"); }
printf("Creando Archivo:\r\n"); if(FAT_CreateFile(NombreLargo,NombreArchivo,UbicacionFolder,Texto1)==0){
printf("Error al crear archivo\r\n"); }
printf(" ->Archivo creado\r\n"); printf("Creando Carpeta:\r\n"); if(FAT_CreateDirectory(NombreDirectorio,NombreDirectorio,UbicacionFolder)==0){
printf("Error al crear carpeta\r\n"); }
printf(" ->Carpeta creada\r\n"); printf("Al archivo creado le agregamos datos:\r\n"); if(FAT_OpenAddFile(NombreArchivo,UbicacionFolder,Texto2)==0){
printf("Error al intentar encontrar archivo\r\n"); }
printf(" ->Datos Agregados\r\n"); }
while(1){}
}
Resultado:
He realizado pocas pruebas como para decir que es 100% funcional, pero un 15% alcanza
Cuando me haga de tiempo iré probando y depurando el código
Edit:
Errores corregidos:
■ Se tiene en cuenta en la definición de archivos o directorios el tamaño de las entradas, para prever si no hay suficiente el espacio del sector.
■ Se corrige problema al crear directorios de nombre largo.
■ Se corrige problema en algoritmo de creación de nombres largos, dado que según el tamaño se hacia erróneamente.
■ La rutina de lectura de archivo lee según tamaño de archivo y no hasta recibir el carácter nulo.
--------------------------------------------------------------------------------
Saludos!