TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: gus40 en 27 de Marzo de 2008, 11:19:52

Título: Problema con MMC
Publicado por: gus40 en 27 de Marzo de 2008, 11:19:52
Saludos a la gente del foro ...estoy trabajando con una MMC conectada a un micro 18F452 , la idea es recibir datos via conexion RS232 y guardarlos en un archivo de texto que pueda ser leido en la PC . Gracias a toda la informacion que fui encontrando aca logre la conexion con la MMC , implementar la FAT16 y generar un archivo de texto escribiendo la respectiva entrada en el directorio raiz ,las FAT y sectores de datos ... donde tengo el problema ? pues bien ...todo funciona de maravilla siempre y cuando encienda la fuente con la MMC colocada en el zocalo . El zocalo que uso tiene una patita que se usa para identificar cuando la MMC esta presente ...tal es asi que dentro de mi programa reviso esa condicion , entonces si se detecta que se inserto la MMC corre el codigo de inicializacion , pero como dije antes la MMC no se pone en estado IDLE.

PRUEBAS REALIZADAS:

1) Simulo la extraccion e insercion de la MMC conectando y desconectando el pin que reconoce la presencia en forma manual (dejando la MMC en el zocalo ) . En este caso se inicializa correctamente ,con lo que aseguro que este segmento de codigo funciona

2) Añadi al circuito un transistor de corte en la alimentacion de la MMC controlado por el micro . Cuando se detecta la precencia el micro corta la alimentacion , espera 500ms , vuelve a alimentar y a partir de ahi corre la inicializacion (esto para evitar que en el momento de energizar aparezca algun ruido que la deje en un estado raro ) sinembargo tampoco se inicializa de esta manera .

3) He agregado retardos , mas pulsos de clock en la inicializacion , he deshabiltado SPI antes de alimentar la memoria dejando en estado bajo todos los pines conectados a ella , he asegurado que la frecuencia de trabajo SPI sea de 312khz en el momento de la inicializacion .....nada a funcionado ...la unica forma en que se inicializa es cortando la fuente


He leido las especificaciones y recomendaciones sobre las MMC y por lo que entiendo el comando CMD0 (reset) que es parte de la inicializacion deberia ser reconocido en cualquier estado si se lo envia con el CRC ...sinembargo la respuesta que obtengo es 0XFF en lugar de la esperada 0x01 ....El corte que hago con el transistor deberia dejar la MMC en el estado inicial ....

El codigo que utilizo en la inicializacion es el mismo que esta posteado en todos lados mmc_init() y funciona bien ya que se ejecuta correctamente al encender la placa ....

Bueno espero que puedan ayudarme o darme alguna idea ...ya que tengo todo funcionando y falta este detalle que parece una pavada pero me esta volviendo loco ....
Título: Re: Problema con MMC
Publicado por: aitopes en 27 de Marzo de 2008, 11:24:04
1) Simulo la extraccion e insercion de la MMC conectando y desconectando el pin que reconoce la presencia en forma manual (dejando la MMC en el zocalo ) . En este caso se inicializa correctamente ,con lo que aseguro que este segmento de codigo funciona.

Hola!
Estas trabajando con una simulacion? No será problema del simulador? Quizas un prototipo del hard corriendo el programa te sea util para solucionar este ultimo problema!

Saludos.
Título: Re: Problema con MMC
Publicado por: gus40 en 27 de Marzo de 2008, 11:44:12
Hola Aitopes ..gracias por responder tan rapido... he leido algunas cosas tuyas para realizar este proyecto....disculpenme si no se entendio ....el prototipo lo tengo hecho ...cuando hablo de simular ..quiero decir que desconecto el pin en lugar de sacar y poner la memoria ..de esa forma funciona ..pero si la saco y vuelvo a poner realmente ...no se inicializa ...pero el codigo que se ejecuta es el mismo en ambos casos  :z)
Título: Re: Problema con MMC
Publicado por: wATAw en 27 de Marzo de 2008, 14:15:21
yo estoy trabajando en algo parecido...pero por lo que veo me llevas ventaja, por que yo no consigo escribir en la tarjeta(en mi caso SD). Solo consigo inicializarla...utilizo diferentes librerias del foro de ccsinfo, pero no consigo hacerlas funcionar correctamente...Te importaría postear algo más sobre las librerias y el circuito que usas??
Muchas gracias de antemano!
Título: Re: Problema con MMC
Publicado por: gus40 en 27 de Marzo de 2008, 15:41:40
Hola Wataw:

Voy a acomodar un poco las rutinas y añadirles algunos comentarios para que las entiendan y las posteo (no soy lo mas prolijo haciendo programas  jajajaj) . Vos decis que conseguis inicializarla ...probaste que se inicie cuando la insertas ? yo no consigo hacerlo 

Título: Re: Problema con MMC
Publicado por: aitopes en 27 de Marzo de 2008, 15:59:41
Hola Wataw:

Voy a acomodar un poco las rutinas y añadirles algunos comentarios para que las entiendan y las posteo (no soy lo mas prolijo haciendo programas  jajajaj) . Vos decis que conseguis inicializarla ...probaste que se inicie cuando la insertas ? yo no consigo hacerlo 



Sospecho que va a ser muy interesante verlas!!!!  :mrgreen:
Título: Re: Problema con MMC
Publicado por: wATAw en 27 de Marzo de 2008, 17:03:33
Hola Wataw:

Voy a acomodar un poco las rutinas y añadirles algunos comentarios para que las entiendan y las posteo (no soy lo mas prolijo haciendo programas  jajajaj) . Vos decis que conseguis inicializarla ...probaste que se inicie cuando la insertas ? yo no consigo hacerlo 



mmmm hombre es que como no tengo un codigo operativo.....vamos que solo tengo pruebas, como poner el init dentro de un while... :D :Dasi si que inicia....jajaja!!hombre, puedes probar a iniciarla en un while siempre que te de algun error de escritura....no es muy elegante pero puede servirte.... :D
Título: Re: Problema con MMC
Publicado por: gus40 en 27 de Marzo de 2008, 20:12:34
Bueno aca les envio el codigo ..todavia necesita ser depurado ...pero con el he conseguido guardar archivos que ocupan varios sectores de la MMC y despues verlo desde la PC. El circuito no lo estoy poniendo pero es muy sencillo ,la MMC conectada a los pines SPI con divisores resistivos para hacer compatibles los 3,3V y los pines RX,TX a un max 232 para la conexion con la PC


Título: Re: Problema con MMC
Publicado por: aitopes en 28 de Marzo de 2008, 08:37:25
Hola Gus!
Acabo de darle un vistazo rapido al código. La rutina que usas para inicializar la memoria, de acuerdo al estado de flagcard es bastante larga (en tiempo, me refiero). Sin embargo, lo primero que haces al entrar en ella es poner flagcard = 0 asumiendo (para las pasadas siguientes) que la MMC esta inicializada (es decir, que todo el bloque de instrucciones que esta debajo se ejecuto bien).

Puede ser una pavada, pero....¿estas seguro que todo ese codigo se ejecuta perfectamente? ¿No pasara que asumes que si y cambias el flag, pero en realidad no se ha inicializado por algun problema?

Un abrazo.
Título: Re: Problema con MMC
Publicado por: El_Guitre en 28 de Marzo de 2008, 10:45:30
Código: C
  1. while (TRUE){
  2.                 if (!input(PIN_D1)) { // cuando D1 esta en estado bajo significa que la MMC esta presente
  3.                         if (flagcard){          // flagcard=1 me indica que la MMC no fue inicializada aun
  4.                                 disable_interrupts(global);
  5.                                 flagcard=0; //  <------ esta linea
yo sacaria esta linea de aca.
Código: C
  1. OUTPUT_HIGH(PIN_d2);// esta parte de codigo es parte de las pruebas con d2 manejo
  2.                                 delay_ms(500); // el trabsistor que corta la alimentacion de la MMC
  3.                                 delay_ms(500);
  4.                                 delay_ms(500);
  5.                                 delay_ms(500);
  6.                                 OUTPUT_low(PIN_d2); // aca vuelvo a alimentar la MMC despues de un retardo
  7.                                 SETUP_SPI(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_64 ); // bajo la velocidad de SPI a 312 khz
  8.                                 printf("Se detecto MMC");
  9.                                 while (mmc_init()!=0){ // se queda aca hasta que logre inicializar y me imprime error por cada vez que pasa
  10.                                        
  11.                                                 SETUP_SPI(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_64 );
  12.                                                 printf("error");
  13.                                 }
  14.                                 printf("MMC init OK");
  15.              flagcard=0; //  <------ aca
y la pondria aca
Título: Re: Problema con MMC
Publicado por: aitopes en 28 de Marzo de 2008, 10:55:19
Exacto!
Puede que no sea la causa del problema, pero no estaria de mas asegurarse de que el proceso se realiza antes de cambiar el flag.

Saludos!
Título: Re: Problema con MMC
Publicado por: PalitroqueZ en 29 de Marzo de 2008, 14:15:16
gus40 te recomiendo que en la rutina de inicialización, mires el comando respuesta R1, cuando ocurre un error, este comando es diferente de cero, en la especificaciones aparece la descripción del significado de cada bit


Título: Re: Problema con MMC
Publicado por: gus40 en 30 de Marzo de 2008, 17:51:11
Gracias a todos los que respondieron ...he tomado en cuenta todos los consejos ..sinembargo aun no he conseguido solucionarlo ...hice un programa chico que solo ejecuta la inicializacion e imprime las respuestas como dice PalitroqueZ

El printado es asi respuesta es la respuesta esperada para el comando que se ejecuto , en resp lo que responde la MMC

Cuando enciendo la fuente la respuesta esperada al comando 0 es 0X01 y se obtiene en forma inmediata , despues se envia el comando para ponerla en estado IDLE y la respuesta esperada es 0X00 , en este caso se reenvia hasta que se logra


Se detecto MMCSent go to SPI

respuesta: 01 contador: fffe resp: 01
Got response from MMC

respuesta: 00 contador: fffe resp: 01
respuesta: 00 contador: fffd resp: ff
respuesta: 00 contador: fffc resp: ff
respuesta: 00 contador: fffb resp: ff
respuesta: 00 contador: fffa resp: ff
respuesta: 00 contador: fff9 resp: ff
respuesta: 00 contador: fff8 resp: ff
respuesta: 00 contador: fff7 resp: ff
respuesta: 00 contador: fff6 resp: ff
respuesta: 00 contador: fff5 resp: ff
respuesta: 00 contador: fff4 resp: ff
respuesta: 00 contador: fff3 resp: ff
respuesta: 00 contador: fff2 resp: ff
respuesta: 00 contador: fff1 resp: ff
respuesta: 00 contador: fffe resp: 00
Got out of idle response from MMC

respuesta: 00 contador: fffe resp: 00
Got set block length response from MMC

MMC init OK


Cuando enciendo la fuente ,pero inserto la MMC despues hay una respuesta erronea al comando de reset ,observen que ahora es 0x80 en lugar de 0x01 y esto pasa en todos los intentos ...
Se detecto MMCSent go to SPI

respuesta: 01 contador: fffe resp: 80
respuesta: 01 contador: fffd resp: ff
respuesta: 01 contador: fffc resp: ff
respuesta: 01 contador: fffb resp: ff
respuesta: 01 contador: fffa resp: ff
respuesta: 01 contador: fff9 resp: ff
respuesta: 01 contador: fff8 resp: ff
respuesta: 01 contador: fff7 resp: ff
respuesta: 01 contador: fff6 resp: ff
respuesta: 01 contador: fff5 resp: ff
respuesta: 01 contador: fff4 resp: ff
respuesta: 01 contador: fff3 resp: ff
respuesta: 01 contador: fff2 resp: ff
respuesta: 01 contador: fff1 resp: ff
errorSent go to SPI

respuesta: 01 contador: fffe resp: 80
respuesta: 01 contador: fffd resp: ff
respuesta: 01 contador: fffc resp: ff
respuesta: 01 contador: fffb resp: ff
respuesta: 01 contador: fffa resp: ff
respuesta: 01 contador: fff9 resp: ff
respuesta: 01 contador: fff8 resp: ff
respuesta: 01 contador: fff7 resp: ff
respuesta: 01 contador: fff6 resp: ff
respuesta: 01 contador: fff5 resp: ff
respuesta: 01 contador: fff4 resp: ff
respuesta: 01 contador: fff3 resp: ff
respuesta: 01 contador: fff2 resp: ff
respuesta: 01 contador: fff1 resp: ff
errorSent go to SPI

asi que voy a ver las hojas de datos para ver que error seria 0X80 sinembargo el formato de la respuesta solo indica que este bit deberia ser 0 siempre .

Estoy pensando que el problema debe estar en el hardware aunque es muy simple ..pareceria como que el ruido que provoca la fuente en el encendido favorece la inicializacion .. no es muy logico no? pero no se donde mas buscar





Título: Re: Problema con MMC
Publicado por: aitopes en 30 de Marzo de 2008, 18:01:06
Una pregunta tonta: La memoria es una MMC "original" o es una SD/SDHC, etc ? A veces no son TAN compatibles entre si, y esas pequenas diferencias pueden complicarte la vida.

Saludos!
Título: Re: Problema con MMC
Publicado por: gus40 en 30 de Marzo de 2008, 18:10:01
La MMC que estoy usando es una de 32MB que me vino con el celular
Título: Re: Problema con MMC
Publicado por: aitopes en 30 de Marzo de 2008, 18:36:11
Yo sigo molestandote con preguntas de este tipo, por que asumo que el codigo esta bien....

Usas un adaptador? Si vino en el celular, debe ser una mini...No hay alguna posiilidad de algun falso contacto o algo mal en el adaptador?

(juro que no pregunto mas pavadas! Pero muchas veces mis proyectos no hay funcionado a la primera por cosas como estas...)

Saludos!
Título: Re: Problema con MMC
Publicado por: El_Guitre en 30 de Marzo de 2008, 20:54:53
Ahora no puedo probar con mi placa que tiene un 877 y un conector para momorias SD por que se lo llevo Micro23 para jugar con una memoria pero se la voy a pedir para probar que pasa si coloco la tarjeta con la fuente encendida, ahora estaba pensando... en mi camara de fotos cuando destapo para colocar la tarjeta tiene un switch que hace que se apague la camara antes de colocarla, sera por esto mismo?

(http://img187.imageshack.us/img187/2119/placasdjo9.jpg)
Título: Re: Problema con MMC
Publicado por: wATAw en 31 de Marzo de 2008, 06:33:12
Buenas El_Guitre,
Esa placa la has diseñado tu? y funciona? de ser asi podrías poner los esquemas? :lol: :lol:
Gracias!!
Título: Re: Problema con MMC
Publicado por: El_Guitre en 31 de Marzo de 2008, 07:29:23
Si, la diseñamos hace un par de años ya (como pasa el tiempo  :?) junto a Micro23 (otro miembro de este foro y amigo) como parte del proyecto final de una meteria de la universidad.

Funcionar, funciona, o por lo menos hasta que se la llevo Micro   :D. No tengo problemas de poner los esquemas, silo que tengo que buscarlos y ver si estan bien prolijos y entendibles.

Bueno, esta noche voy a preparar las cosas para ver si les sive. Saludos.
Título: Re: Problema con MMC
Publicado por: gus40 en 31 de Marzo de 2008, 10:27:14
Hola de nuevo ...ninguna pregunta es tonta ...a veces lo que parece obio no lo es tanto..yo asumo que el codigo esta bien porque en ambos casos es la misma secuencia la que se envia ...y les aseguro que cuando lo hago prenediendo la fuente no ha fallado nunca ...en cambio de la otra forma se inicializo una sola vez en las tantas que lo intente ...por eso me inclino a pensar en el hardware ,ruido  ....si tengo la memoria en el zocalo y corto solo la alimentacion de la MMC tampoco consigo la inicializacion ...de hecho coloque un transistor para darle alimentacion despues de un retardo ..tampoco se inicializa ...podria pensarse entonces que los pines dedicados a SPI asumen un estado que dejan a la memoria inactiva ...hice alguna pruebas como deshabilitar el SPI y dejar los pines en estado alto o bajo y en todos los casos ..el mismo resultado ...

Algo mas insolito es que mi fuente tiene un interruptor y la conexion a la plaquita la hago con cocodrilos ..la placa esta debidamente filtrada con capacitores y demas ...cuando enciendo con el interruptor ..todo OK ...pero si la conexion la hago en forma manual desconectando y conectando los cocodrilos ...NO SE INICIALIZA !!

No puedo entender este efecto ...las hojas de datos indican que la MMC puede ser sacada de cualquier estado con el comando de reset ,salvo del modo inactivo del cual la unica manera es cortando la alimentacion ...ahora bien ...si espero un tiempo (retardo inicial) para despues alimentarla ...deberia aceptar el comando de reset , salvo que vuelva a quedar inactiva ...

La diferencia entre encender la fuente y reconectar los cocodrilos pareceria ser un pico de tension que se produce en el momento del encendido y que no esta presente en la reconexion de cocodrilos o en el corte con transistor ya que la fuente esta estabilizada ...podria pensarse entonces que este sobrepico saca a la memoria del estado inactivo y la prepara para recibir comandos en forma normal ?  no me parece logico que la MMC necesite de esto para funcionar ...pero tampoco lo comprendo

La MMC que estoy usando es parecida a la de la foto que mando El_guitre solo que de 32MB sin adaptador