Autor Tema: MMC como herramienta de amacenamiento  (Leído 1684 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado antrax

  • PIC10
  • *
  • Mensajes: 30
MMC como herramienta de amacenamiento
« 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

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: MMC como herramienta de amacenamiento
« Respuesta #1 en: 09 de Noviembre de 2007, 13:01:16 »
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.

 :)
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado antrax

  • PIC10
  • *
  • Mensajes: 30
Re: MMC como herramienta de amacenamiento
« Respuesta #2 en: 10 de Noviembre de 2007, 18:03:53 »
Código: [Seleccionar]
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