TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: antrax en 09 de Noviembre de 2007, 11:56:07
-
MMC como herramienta de almacenamiento
Buen dia amigos el foro le tengo una duda y unos avances que he logrado hacen con el funcionamiento de la memoria mmc o sd
Por los avances tenemos he probado el buen funcionamiento de las librerías FAT16 de el compilador MikroC como también el funcionamiento de la escritura por sectores de la memoria es decir sin FAT solo sectores.
Re escribí el código de de manejo de la memoria para ser usado por este compilador (código de microchic)
Por otro lado he descubierto que la escritura de un bloque de memoria tarda más o menos un cuarto de segundo es de 250mS lo que hace inútil el uso de esta memoria como sistema de almacenamiento para señales rápidas.
Sacando unas cuentas a groso modo creo que el muestreo más rápido que se puede hacer con el uso de esta memoria es de 2000 Hz o 2 kHz pero esto tiene el problema que no se puede utilizar el sistema FAT por lo lento de la escritura de bloque. Aunque se puede engañar al sistema FAT con algunos trucos…
La cosa es que les tengo un reto al igual que yo lo tengo intentar almacenar en la memoria una señal periódica o no periódica que tenga como ancho de banda un valor mayor a 300 Hz suena tonto hacer esto pero creo que es un buen reto…
Ya tengo ideas por dónde empezar utilizando el código publicado por Microchipc (http://www.microchipc.com/sourcecode/#mmc) intentar hacer un arreglo de datos de modo que exista un busffer de datos almacenados antes de que se escriba un sector de la memoria es decir en idioma claro adquirir datos de la señal al mismo tiempo de que se escribe en la memoria esto se haría con interrupciones del TIMER o del ADC
no se si luego se pueda llevar esta evolución a un sistema FAT
-
antrax tal vez debas postear el tema en 'proyectos' o solicitar a algún moderador de este foro que lo haga, a mi modo de verlo es el lugar más adecuado.
:)
-
void mmc_comando(char a, char b, char c, char d, char e, char f)
{
Spi_Write(a); // Comando
Spi_Write(b);
Spi_Write(c);
Spi_Write(d);
Spi_Write(e);
Spi_Write(f); // checksum
}
int mmc_arranca()
{
int i;
//SETUP_SPI(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_4 | SPI_SS_DISABLED);
Spi_Init_Advanced(MASTER_OSC_DIV16, DATA_SAMPLE_MIDDLE, CLK_IDLE_LOW, HIGH_2_LOW);
SSPSTAT.F6 = 1;//SSPSTAT | 0x40;
SSPCON1.F4 = 0;//SSPCON & 0xEF;
//*(0x94) |= 0x40; // CKE = 1
//*(0x14) &= 0xEF; // CKP = 0
PORTA.F5 = 1;
for(i=0;i<10;i++)
{
Spi_Write(0xFF);
}
PORTA.F5 = 0;
mmc_comando(0x40,0x00,0x00,0x00,0x00,0x95);
if(mmc_respuesta(0x01)==1) return 1;
i = 0;
while((i < 255) && (mmc_respuesta(0x00)==1))
{
mmc_comando(0x41,0x00,0x00,0x00,0x00,0xff);
i++;
}
if(i >= 254) return 1;
PORTA.F5 = 1; // OUTPUT_HIGH(PIN_C2); // Chip Select = 1 (off)
Spi_Write(0xFF);
PORTA.F5 = 0; // OUTPUT_LOW(PIN_C2); // Chip Select = 0 (on)
mmc_comando(0x50,0x00,0x00,0x02,0x00,0xff);
// configuramos el boque con un tamaño de 512
if((mmc_respuesta(0x00))==1) return 1;
PORTA.F5 = 1; //OUTPUT_HIGH(PIN_C2); // Chip Select = 1 (off)
return 0;
}
int mmc_respuesta(unsigned char respuesta)
{
unsigned long count = 0xFFFF;
while(Spi_Read(0xFF) != respuesta && --count > 0);
if(count==0) return 1;
else return 0;
}
int mmc_escribir(unsigned long numero)
{
int dato;
unsigned long i;
unsigned long varh,varl;
varl=((numero&0x003F)<<9);
varh=((numero&0xFFC0)>>7);
PORTA.F5 = 0; // Chip select = 0 (on)
mmc_comando(0x58,HIGH(varh),LOW(varh),HIGH(varl),0x00,0xFF);
if((mmc_respuesta(0x00))==1) return 1;
Spi_Write(0xFE); // Envio el data token
for(i=0;i<512;i++)
{
//dato=AD();
Spi_Write(0X00); // envio del dato a la miemoria
}
Spi_Write(0xFF);
Spi_Write(0xFF);
if((Spi_Read(0xFF)&0x0F)!=0x05) return 1;
PORTA.F5 = 1; // Chip Select = 1 (off)
return 0;
}
int mmc_leer(unsigned long numero)
{
unsigned long i;
unsigned long varh,varl;
varl=((numero&0x003F)<<9);
varh=((numero&0xFFC0)>>7);
PORTA.F5 = 0; // Chip select = 0 (on)
mmc_comando(0x51,HIGH(varh),LOW(varh),HIGH(varl),0x00,0xff);
// Envio el comando de lectura de bloque
// y direccion del bloque a leer
if((mmc_respuesta(0x00))==1) return 1;
if((mmc_respuesta(0xFE))==1) return 1;
for(i=0;i<512;i++)
{
//putc(Spi_Read(0xFF)); //obteniendo los datos
}
Spi_Read(0xFF);
Spi_Read(0xFF); // fin de lectura
PORTA.F5 = 1;
Spi_Write(0xFF);
return 0;
}
int mmc_estado()
{
PORTA.F5 = 0; // Chip Select = 0 (on)
mmc_comando(0x58,0x00,0x00,0x02,0x00,0xff);
PORTA.F5 = 1; // Chip Select = 1 (off)
return 0;
}
////////////////////////////////////////////////////////////////////////////////
void main(void){
unsigned long direccion = 528;
TRISA = 0;
PORTA = 0;
TRISB = 0;
PORTB = 0;
TRISC = 0;
PORTC = 0;
TRISD = 0;
PORTD = 0;
TRISE = 0;
PORTE = 0;
if (mmc_arranca()== 0){
PORTD.F0 = 1;
mmc_escribir(0);
} else {
PORTD = 0xF0;
}
while(1){
//mmc_escribir(direccion);
//direccion++;
//PORTD.F1 = ~PORTD.F1;
}
}
Este es el código que implemente para la inicialización de la memoria funciona muy bien en un 16f877a pero no anda en un 18f4550 o en un 18f2550 ¿porque será ??? no se pero eso es lo que sucede
La cosa es implementar una cola circular para ver si se pueden almacenar en la memoria señales de ancho de banda mayor