TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: facundo_10 en 07 de Agosto de 2008, 02:50:32

Título: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: facundo_10 en 07 de Agosto de 2008, 02:50:32
Solicito la colaboración de los amigos foreros con alguna experiencia en esto de las MMC card.   :D

Aqui mi Hardware y las cosas de las que poseo :

-Memoria Multimedia Card (MMC) de 128 mb, la memoria pertenece a la marca PQI.
-Conector para la mmc, el conector lo desolde de un lector de tarjetas usb, y le agregue un divisor de tension ya que las memorias trabajan a 3.3 volt y el pic trabaja a 5 volt. El divisor de tension esta formado por 3 resistencias de 3k3 y otras 3 resistencias de 1k8.
Es un circuito que viene  en el datashett y que vi en el post de Redpic.

Aqui el circuito:

(http://picmania.garcia-cuervo.net/images/MMC_Card_Adapter_Schema.GIF)


El hardware lo teste y al parecer esta bien armado. Este va conectado a los pines SPI del pic.

El pic que estoy utilizando para mis primeras pruebas es un 16f873A.

PINES MEMORIA SD/MMC:

(http://publi.garcia-cuervo.net/SDC_MMC_Contact.jpg)

Bueno leyendo y leyendo, pude ver que hay 3 pasos fundamentales que paso a explicar para inicializar la memoria MMC en modo SPI.

La memoria por si sola, inicializa en un modo multimedia card nativo, por lo cual solo acepta ciertos comandos estos son:

CMD0 =    Software reset.
CMD1 =   Initiate initialization process.

Antes de enviar estos comandos hay que inicializar la memoria en modo nativo, para esto segun el datashett es necesario enviar 80 clocks con SDI en alto y CS en alto.

Por lo cual, en lenguaje PSI, me dispuse a primero que nada definir los pines SPI:
Citar
Define SPI_CS_REG = PORTC
Define SPI_CS_BIT = 0
Define SPI_SCK_REG = PORTC
Define SPI_SCK_BIT = 3
Define SPI_SDO_REG = PORTC
Define SPI_SDO_BIT = 5
Define SPI_SDI_REG = PORTC
Define SPI_SDI_BIT = 4
SPIPrepare  'Inicializo el SPI

Una vez definido los pines del SPI, me dispuse a inicializar en modo nativo la memoria mmc. Por lo cual hago lo siguiente:

Citar
dim a as byte 'variable
dim a1 as byte 'variable
Hserout "MMC/SD CARD  V 0.1", CrLf  'envio un texto al ordenador por rs-232
WaitMs 400
Hserout "INICIANDO LECTURA TARJETA DE MEMORIA", CrLf 'inicio lectura tarjeta de memoria
WaitMs 1000
a = 255      'a es igual a 1 byte
SPICSOn    'pongo en alto el pin CS
sdi = 1       'pongo en alto el pin sdi
For a1 = 0 To 9     'envio 80 bytes, es decir genero 90 pulsos '
SPISend dat  'envio el byte
Next a1  'proximo byte
SPICSOff

Para enviar un byte, se tarda 8 pulsos, es decir un pulso por bit. Por lo tanto, enviando 10 bytes estaria enviando los 80 clocks necesarios para inicializar la memoria en modo nativo.

Luego de esto, hay que inmediatamente mandar el CMD0 y aqui viene mi problema.

La secuencia para enviar un comando es la siguiente:

(http://img529.imageshack.us/img529/962/cmdeo6.png)

envio primero un 01, luego el index , el arguento y el CRC seguido un 1.

Por lo tanto para CMD0 debo enviar

0100 0000  'el index del cmd0 es 40h
0000 0000  'en el comando cmd0 no hay argumento por lo tanto todos 0
0000 0000
0000 0000
0000 0000
1001 0101  'el crc es 95h, convertido a binario.

Para enviar este comando, debo poner la señal cs baja, y enviarlo justo despues de haber iniciado la memoria en modo nativo..

Aqui esta mi problema, la respuesta que yo deberia obtener es un 1.

Y estoy obteniendo un 0.. Para obtener la respuesta hay un cierto tiempo, un puede obtener la respuesta en el clock numero 5 despues de terminar de enviar el crc, o obtener la respuesta en el clock numero 8. Nose si me explico..

Para enviar el comando hago lo siguiente:
Citar
SPICSOff ' pongo en bajo CS
'-------------------------------------------
' ENVIO COMANDO CMD0 PARA UN SOFT RESET
SPISendBits 8, %01000000  'Envio 01 + Command
SPISendBits 8, %00000000  'primera cadena
SPISendBits 8, %00000000  'segunda cadena
SPISendBits 8, %00000000  'tercera cadena
SPISendBits 8, %00000000  'cuarta cadena
SPISendBits 8, %10010101  'envio el CRC
For bucle1 = 0 To 20 'Aqui hago un bucle de 0 a 20
SPISend dat 'envio un byte, es decir 8 pulsos
SPIReceive dato1 'recibo el dato y lo guardo en una variable
Hserout #dato1, CrLf 'mando la variable a la pc
Next bucle1
Lo que hago es que envie X cantidad de pulsos y cada cosa que reciba me la mande a la pc, pero la mmc en vez de contestarme 0x01 como deberia me contesta con 255, o 0x00.

La respuesta que la memoria envia esta formada por 8 bits. Cada bit tiene un significado.

(http://img377.imageshack.us/img377/4793/cresplg6.png)

Aqui podemos observar el significado de cada bit, por lo tanto cuando la memoria me manda 255, me esta diciendo todos 1111 1111, todo erroneo.

si la memoria me manda 0000 0001, esta bien ya que quiere decir que entro en estado idle.

Mi intencion era saber si alguien ya habia probado con PSI, tratar de jugar con estos bichos, y si me puede dar una mano.

Aca por las dudas dejo la lista con los comandos mas esenciales:

Citar
Command
Index             Argument              Response   Data   Abbreviation   Description
CMD0              None(0)                           R1   No   GO_IDLE_STATE   Software reset.
CMD1              None(0)                           R1   No   SEND_OP_COND   Initiate initialization process.
ACMD41(*1)        *2                           R1   No   APP_SEND_OP_COND   For only SDC. Initiate initialization process.
CMD8                *3                           R7   No   SEND_IF_COND   For only SDC V2. Check voltage range.
CMD9             None(0)                           R1   Yes   SEND_CSD   Read CSD register.
CMD10             None(0)                           R1   Yes   SEND_CID   Read CID register.
CMD12             None(0)                           R1b   No   STOP_TRANSMISSION   Stop to read data.
CMD16         Blocklength[31:0]                   R1           No   SET_BLOCKLEN   Change R/W block size.
CMD17        Address[31:0]                   R1    Yes   READ_SINGLE_BLOCK   Read a block.
CMD18        Address[31:0]                   R1   Yes   READ_MULTIPLE_BLOCK   Read multiple blocks.
CMD58             None(0)                           R3   No   READ_OCR   Read OCR.
*1:ACMD<n> means a command sequense of CMD55-CMD<n>.
*2: Rsv(0)[31], HCS[30], Rsv(0)[29:0]
*3: Rsv(0)[31:12], Supply Voltage(1)[11:8], Check Pattern(0xAA)[7:0]
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: dogflu66 en 10 de Agosto de 2008, 07:14:57
Estupendo proyecto Facundo, nunca he tocado este tema.
Actualmente llevo unos días fuera de casa y tengo la conexión muy restringida, también estoy con unos temas atrasados pero voy a ver si puedo hacerme de los componentes para ver si le puedo dedicar unos ratos también al proyecto... :-)
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: facundo_10 en 11 de Agosto de 2008, 15:23:02
Que bueno seria si te metieses en el tema dogflu66, asi podriamos ir posteando nuestros avances juntos, te digo que solo utiize algunos componentes no sale muy caro llevar el proyecto a cabo:

Un par de resistencias para divisor de tension
Una MMC de cualquier tamaño.
El slot para la MMC y la fuente de alimentacion para la MMC de 3.3 volt.

Despues calculo que tendras un pic, conexion rs232 y demas, por eso lo exeptuo de la lista de materiales..

Yo utilize para la conexion entre la MMC y el PIC la interfaz SPI que brinda el Pic Simulator Ide, pero me esta dando algunos problemas, con algunos comandos que envio a la memoria.

Espero que juntos podamos llegar a buen puerto.

Un saludo Facundo!!
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: facundo_10 en 14 de Agosto de 2008, 15:27:36
Siguiendo con el proyecto me he informado un poquitin mas  :mrgreen:..

Al parecer para iniciar la memoria hay que seguir algunos paso en basic.
Se deben tener en cuenta las siguientes cosas:

1- Seleccionar el modulo MSSP para que trabaja en modo master.
2- Generar un frecuencia en el clock de unos 312 khz.

Nota: Para inicializar de modo correcto la memoria , el Clock del SPI, debe estar en una frecuencia de entre 100 y 400 khz. Por lo cual con una frecuencia de 312 khz estariamos perfecto.

Para lograr ese frecuencia se debe utilizar el registro SSPCON del pic.

4) Luego debemos setear el tipo de polaridad del clock.

5) Finalmente activar el modulo del micro MSSP poniendo a "1" el bit SSPEN.

Paso a dar una explicacion general del modulo MSSP del pic redactada por mi basandome en el pic que en este momento estoy utilizando para las pruebas , el 16F877A.

El Modulo MSSP tiene 4 registros para el modo de operacion SPI. Estos son:

*MSSP Control del registro : (SSPCON)

*MSSP Control de Stado : (SSPSTAT)

*Registro Buffer de la recepcion y envio por serie : (SSPBUF)

*MSSP Registro Shift. : (SSPSR) . No es directamente accesible.

Los registros SSPCON y SSPSDTAT son registros de contro y estado dentro del modo de operacion SPI.
El registro SSPCON es un registro que puede ser leido y escrito.

Los ultimos 6 bits del registro SSPSTAT son de solo lectura.

Los primeros dos bits pueden ser leidos y escritos.

SSPSR es un registro del tipo SHIFT.. Es utilizado para enviar o recibir datos. He de ahi la famosa instruccion de PBP, SHIFTIN y SHIFTOUT.

SSPBUF es el registro de buffer para aquellos bytes de datos que van a ser leidos o escritos en el dispositivo.

REGISTRO SSPSTAT


(http://img160.imageshack.us/img160/9808/registrosspstatvv7.jpg)

Este tiene 8 bits, cada uno tiene un significado. Y segun el valor del bit cumpliran una u otra accion.

BIT 7 =  SMP: SAMPLE BIT

1 = Input data sampled at end of the data output time.
0 = Input data sampled at the middle of data output time.

BIT 6 = CKE: SPI CLOCK SELECT BIT

1 = Transmit occurs on trasition from active to idle clock state.
0 = Transmit occurs on trasition from idle to active clock state.

Nota : La polaridad del reloj es seteada mediante el registro SSPCON.4.

BIT 0 = BF: Buffer FUll Status Bit (solo en recepciones)

1 = Receive complete, SSPBUF is full.
0 = Receive not complete, SSPBUF is empty.

Del bit 6 al 1 no se utilizan en el modo SPI, Por lo tanto no me dedicare a explicar sus funciones.

REGISTRO SSPCON



(http://img529.imageshack.us/img529/8808/sspconmv3.jpg)

Este registro tambien posee 8 bits de configuracion del bit 7 al bit 0.

Pero solo seran necesarios para las pruebas, utilizar los registros del bit 5 y
los registros del bit 4 y los registros del bit 3 a 0.

BIT 5 = SSPEN: Synchronous Serial Port Enable Bit

1 = Enables serial port and configures SCK, SDO, SDI and SS as serial port pins.
0 = Disables Serial port and configures these pins as I/O port pins.

Nota: Cuando este habilitado esos pines deben estar correctamente configurado como entradas o salidas.

BIT 4 = CKP: Clock Polarity Select Bit

1 = Idle state for clock is a high level.
0 = Idle state for clock is a low level.


Bit 3-0 = SSPM3:SSPM0: Synchronous serial port mode select bits

0101 = SPI Slave mode, clock = SCK pin. SS disable.
0100 = Spi Slave mode, Clock = SCK pin. SS pin control enabled.
0011 = SPI master mode, clock = TMR2 output/2
0010 = SPI master mode, clock = Fosc/64
0001 = SPI master mode, clock = Fosc/16
0000 = SPI master mode, clock = Fosc/4




'------------------------------------------------------------------
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: facundo_10 en 14 de Agosto de 2008, 15:32:42
Resumiendo, para poder iniciar la memoria, hay que tener en claro que registros debemos utilizar.

Recopilando informacion los registros necesarios son:

Debemos primero, obtener una frecuencia entre los 100 y 400 khz. Para eso pensaba utilizar un cristal de 20 mhz y utilizar la funcion FOSC/64 para obtener 312 KHZ.

Luego debemos setear los siguientes puntos utilizando los registros arriba mencionados:

1. Data Simple Middle
2. Clock Idle Low
3. Transmitir los datos desde la posicion idle a activo del flanco del reloj.

Espero alguna opinion o algo, por mi parte voy a poner a prueba mis teorias y ver que tal funciona. Mas tarde me doy una vuelta!  :P :P

Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: facundo_10 en 16 de Agosto de 2008, 00:16:01
Bueno de momento voy a estar esta semanita parado, ya que estoy esperando una placa que sin ella no puedo continuar..

(http://www.evcom.cl/evcom_archivos/imagenes/IC-102%201.jpg)

Asi es, estoy esperando esta placa serie PCMCIA para la portatil, sin ella no puedo utilizar la conexion rs-232, antes utilizaba un ordenador viejo para las pruebas, pero ahora lo tuve que mover a otro lado y pues estoy a la espera de esta plaquita.

Espero comentarios y que alguien se sume, que parece que estoy solo en esto jejje..

Seguire posteando mis avances y nuevos estudios!!  :D
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: dogflu66 en 16 de Agosto de 2008, 06:01:22
No estas solo y estas haciendo un excelente trabajo... :-/
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: pajaro en 16 de Agosto de 2008, 11:48:54
hola amigo Facundo

yo estoy interesado en este proyecto,
 hace unos meses, intente algo parecido,
yo estoy tambien trabajando en un proyecto con el pic16F877A, tengo algo de informacion de diferentes foros, referente a este tema, unos lo hacen con mmc y otros con SD, y angunos poco "frikis" con un modelo que vale para ambos modelos de tarjeta.
Si quieres te la puedo pasar.

voy a intentar montar tu diseño en proteus.

un cordial saludo
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: facundo_10 en 16 de Agosto de 2008, 15:25:38
Hola el hardware funciona bien, aunque tuve que hacerle algunas modificaciones.

Se puede montar de dos formas, utilizar el divisor de tension, o utilizar un 7407 para adaptar los niveles de tension. Este posee 6 buffers, mas que suficiente para el proyecto, ya que solo utilizaremos 4.

Ah y recomiendo algo, si se va a utilizar el divisor de tension, recomiendo a la linea DO, la pongan con una R de 10k a VDD. Ya que de otro modo no funciona, o por lo menos a mi no me funciono muy bien, por lo que tuve que hacer la modificacion que cito un reglon arriba.

Postea la informacion que tengas que seguramente sera de mucha ayuda, en un rato posteare la secuencia para iniciar la Memoria MMC y mi codigo en PSI para dicha secuencia, y algunos de los comandos mas esenciales para adminisitrar leer y escrbir en la memoria.

Un saludo!!!
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: facundo_10 en 16 de Agosto de 2008, 15:58:35
Bueno como prometi, aqui dejo algunos de los comandos mas importante y como inicializar la memoria. Espero ser lo mas explicativo posible.

Secuencia para iniciar la MMC:


Para iniciar la MMC, es necesario enviar al menos 80 clocks.

Despues de encender la memoria, esperar al menos 1 milisegundo y poner CS y D-IN (MMC) en modo ALTO.
Luego enviar los 80 clocks, (en forma de dummy bytes) e inmediatamente despues de enviar los 80 clocks, poner CS en bajo.

De esta forma podemos ya iniciar la memoria, basta decir que la memoria iniciaria en Modo Nativo, es decir en el modo de operacion Multimedia Card, y no en Modo SPI. Por lo cual tendremos que enviar 2 comandos para que se active el modo SPI.

Aqui un ejemplo de la inicializacion en modo SPI:

Citar
Dim dato as byte
dim bucle as byte
dato = 255 ' Dato es igual a 8 bits.
do = 1
cs = 1
for bucle = 0 to 9 'un bucle de 10 veces.
spisend dato
next bucle
cs = 0

Bueno como veran lo que hago es enviar 8 bits, por cada vez que pasa el bucle, por cada bit, es un clock, por lo cual si multiplico 8 bist que envio por 10 veces que se repite en el bucle tengo los 80 clocks necesarios para inicializar le memoria.

Luego de esto hay que enviar dos comandos esenciales para la iniciacion CMD0 y CMD1.

Secuencia de CMD0 =

SEND : 40h, 00h, 00h, 00h, 00h, 95h.  (95 es el CRC)

Esperar un 0x01 como respuesta.

Secuencia CMD1 =

SEND : 41h, 00h, 00h, 00h, 00h, 00h. (aqui ya el CRC no importa, ya que se desactiva por defecto con el comando CMD0 y la memoria lo ignora)

Esperar un 0x00 como respuesta.

Supuestamente hasta aqui la memoria ya inicializo correctamente en modo SPI.

Yo obtengo 0x01 como respuesta, pero no logro para el CMD1.

Esto se debe a que tengo problemas para la configuracion interna del modulo MSSP del pic.
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: pajaro en 18 de Agosto de 2008, 17:20:53
hola amigos

aqui pongo algunos enlaces de mmc y pic.

http://www.todopic.com.ar/foros/index.php?topic=23071.new#new


Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: pajaro en 19 de Agosto de 2008, 22:35:48
hola a todos

amigo Facundo_10 tengo una duda creo que hay una "errata",
en tu post en la sección de definición de pines, creo recordar si no equivoco que trabajabas con el PIC16F873A

El pin CS se encuentra en el puerto "A" pin 5, mire yo en el data del PIC16F873A.
mire el manual de referencia del PSI y alli tambien pone por defecto el puerto "C" pin 0, para el protocolo SPI.
http://www.oshonsoft.com/picbasiccompiler.html#36

para el pic 16F77A el pin CS esta en el puerto "E" pin 2.

las 4 lineas que configuras son :

SDI: SPI Data in
SDO : SPI Data out
SCK : Synchronous serial clock input/output for SPI mode.
SC: SPI slave select input.

algunos llaman al SC (chip selec) --> SS[con una raya  por encima] (sclave selec)No se si es lo mismo.

podrias decirme el chip con el que trabajas?
y sacarme de dudas sobre esa errata?

un saludo amigo.

Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: facundo_10 en 20 de Agosto de 2008, 16:58:24
Como bien dices, el CS o tambien donminado SS, es el CHIP SELECT o tambien conocido como SLAVE SELECT.

Realmente los pines por hardware de los pics, son SCK , SDI y SDO.. (piner por hard spi)

El pin CS puede elegir el puerto que quieras, no es necesario algun puerto en especial. Ya que en algunos perifericos ni siquiera es necesario. Yo le llamo CS, pero tu puedes llamarle SS es lo mismo.

Espero te haya quedado claro.

Un saludo y cualquier duda aqui estoy :D
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: facundo_10 en 30 de Agosto de 2008, 23:17:40
Bueno por fin, me ausente de momento :D  :mrgreen: :mrgreen: :mrgreen:.. Pero estoy aqui de vuelta, lamento haber dejado el hilo por algunos dias, pero los examenes en la escuela me estaban matando el tiempo. Ahora tengo de sobra   : :-) ...

Bueno primero decir que ya tengo la plaquita con conector DB9 funcionando en mi laptop.

Luego contarles que de momento estoy realizando un soft en VB6. El cual hara mas facil el camino a todos.. La intencion principal sera mostrar datos especificos de la MMC, (CID, CSD, Boot Sector, MRB) etc..

Quiza el soft pueda ayudar a muchos..

Aqui les pongo una captura de como va quedando el software.. Pronto le empezare a dar duro a la MMC, ya que con asm y mkbasic pude leer y escribir en ella, pero el PSI no se deja ("POR AHORA")   :D :D.

(http://img413.imageshack.us/img413/7594/rs232in7.jpg)

Es una version podria decir PRE BETA  :lol:.

Espero terminarla.

Pero antes que nada dar las gracias a los usuarios:

Manolo
Gio
Edison
Carlos

Por la gran ayuda que me han brindado esos 4 gran hombres para hacer el programa, creo que les debo mucho por eso agradecerles !!

MUCHAS GRACIAS AMIGOS!!!   :-/ :-/

PD: Pajaro las paginas estan muy buenas muchas gracias por el aporte :D
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: xocas en 31 de Agosto de 2008, 11:14:12
gracias facundo_10 porque además de lo interesante del tema el desarrollo que estás haciendo del mismo es impecable. sin duda le dedicaré tiempo cuando termine otras cosas que tengo pendientes.

un saludo
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: Javicho en 31 de Agosto de 2008, 11:41:58
Hola mister Facundo:

El programa se ve muy bien y va a ayudar mucho, ojalá puedas acabarlo pronto en la medida que tengas tiempo por tus estudios.

Que te vaya bien, saludos.

Javicho.
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: dogflu66 en 31 de Agosto de 2008, 17:55:48
Esta quedando muy bien, y a la espera de nuevas novedades... :-)
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: facundo_10 en 02 de Septiembre de 2008, 00:11:59
Bueno aqui traigo novedades :D:D...

De momento sigo con el programa en VB6.

Aqui una nueva captura de como el programa va avanzando.

(http://img385.imageshack.us/img385/5747/nuevols1.jpg)

Ya pude afinar por fin totalmente lo que es la interfaz rs232, para conexion directa con el PIC, me falta un poco para poder optar por opciones para enviar en ascii, hex o dec. Pero voy avanzando y eso es lo bueno.

Todo va tomando color..   :-/

Un saludo ! Cualquier duda aqui estoy!!
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: pajaro en 02 de Septiembre de 2008, 09:39:12
hola amigo facundo

un excelente trabajo el tuyo, y muy currado, si señor
Felicitaciones

un saludo
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: facundo_10 en 07 de Septiembre de 2008, 12:10:54
Para no perder la costumbre, dejo un pequeño avance jajjaa de como va el programa...

(http://img293.imageshack.us/img293/1752/programarn9.th.jpg) (http://img293.imageshack.us/my.php?image=programarn9.jpg)


Por ahora tengo algunos problemas para ordenar los datos que envia el pic en la flexgrid, de lectura de 512..

Espero poder solucionarlo, mientras tambien voy a ir avanzando con el tema de la mmc por el lado de PSI. Porque con mkbasic y asm ya pude.. Pero como dije anteriormente, el psi no se deja, creo que es por la mala configuracion de los registros internos del pic, con respecto al SPI. Me voy a conseguir un cristal de 20 MHZ, para poder iniciar mis pruebas a esa frecuencia porque creo que ahi esta el problema.

Un saludo amigos!!
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: pajaro en 08 de Septiembre de 2008, 18:16:43
hola facundo
con el PSI como haces para ver si se comunica l
a mmc con el PIC16F877A tienes algun modulo externo?

un saludo

Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: facundo_10 en 10 de Septiembre de 2008, 19:46:37
Hola no entiendo tu pregunta pajaro a que te refieres?
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: pajaro en 10 de Septiembre de 2008, 20:15:15
hola Facundo

me referia, que si has programado el pic16F877A y la mmc con el Pic Simulator Ide mediante el protocolo SPI, como verificas que te funciona, el PSI no tiene un comprobador con en el caso del I2C con la ram o la metes en el proteus.


Por cierto otra cosilla has conseguido leer la mmc y grabarla pero en que formato esta MMC.

un saludo

te veo pronto.
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: facundo_10 en 10 de Septiembre de 2008, 20:20:33
Hola para saber si la MMC funcionar, le debes de enviar el comando CMD0 y te debe contestar con un 1, luego le debes enviar el comando CMD1 y te debe contestar con un 0. Luego puedes enviar un command para leerun bloque de 512 bytes. Con PSI no pude todavia creo que me falla la configuracion interna, no puedo conseguirme un cristal de 20 MHZ, para dividirlo y llegar a una frecuencia estable de unos 300 KHZ, para esto hay que hacer un FOSC/64.

Con Mkbasic y sus librerias he podido leerla, y con un programa en assembler tambien pero el PSI cuesta algo mas, espero poder sacarlo. Si somos dos seguro lo hacemos amigo.

Un saludo!!
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: pajaro en 10 de Septiembre de 2008, 21:18:40
hola facundo
este es el modelo que yo uso para el proteus 7

un saludo
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: facundo_10 en 11 de Septiembre de 2008, 11:54:17
Pajaro podrias pasarme el codigo y el programa en hexadecimal, para probarlo. Un saludo !
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: pajaro en 11 de Septiembre de 2008, 18:51:49
hola facundo
no te puedo pasar el codigo porque estoy probatinando(no se si existe esta expresion en el diccionario de la real academia española),
amigo Facundo tu has logrado leer la mmc.

con el PSI:
defines clcck=20 '20mhz
defines word
defines puertos LCD
inicias lcd (Lcdinit 1)
defines puertos SPI
inicias  SPI (SPIPrepare )
'------------------------
aqui empieza la cosa
activas el spi con sspcon-->sspen =1

le pones el escalera f/64 lo que sera 20Mhz/64 =312khz
entonces el registro de control del MSSP es decir el sspcon1<5:0> 100010
esto significara :
1 por poner enable El SPI
0 la polaridad del clock: estado de reposo  para clock bajo.
0010 nos configura el SPI en modomster con clock a F/64
 
por el momento hemos configurado el SPI como activado como master ,(SCK, SDO, SDI, y SS )como pin del puerto,
 y el estado de reposo el clock en abajo, la frecuencia es configurada a 312Khz.

tambien deberiamos configurar el registro de estado SSPSTAT <7:6>
bit 7 SMP como se muestran los dastos a mitad o al final cual es mejor o cual se debe de usar
bit 6 CKE configurar el clock de trasmision: 1-- trasmite de activo a reposo o 0-- trasmite de reposo a activo
las preguntas las mismas que el anteiror.

das tension, alimentas mmc
en que estado se encuanta la mmc en idle o reposo o no actibada.
o debes de mandarle 80 clock para ponerlo en reposo
si la inicializas se queda en reposo .

estas son algunas dudas y pensaminetos que me invaden.

si alguen me las sabe resolver.

un saludo. 
 




Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: facundo_10 en 11 de Septiembre de 2008, 20:18:06
No yo no he logrado leer la MMC con PSI.

Cuando le mandas tension la mmc no hace nada esta en reposo. Entonces le mandas 80 clocks para hacerla entrar en MODO NATIVO, (mmc native mode) aqui debes enviar CMD0 y CMD1, para que entre en modo SPI y reconozca los comandos SPI.

Un saludo

PD : ¿ Que es eso de probatinando ?   :D :D
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: Sabueso en 20 de Enero de 2009, 04:40:41
Hola Facundo, vi que estás en un foro mas nuevo trabajando en lo de la memoria SD y MMC.
Estoy tratando de ponerme al día para ayudarles un poco y no solo pedir ayuda.
Tan pronto me sienta capaz de por lo menos, hacer preguntas coherentes les digo, mientras tanto, habiendo recuperado el daño en mi PC ya me puedo poner a mirar el hacer una tarjeta lo mejor posible para trabajarla sobre este tema.
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: Sabueso en 20 de Enero de 2009, 12:31:18
Hola,
quisiera saber mas acerca de los comandos.
Cuales son y que condiciones deben aplicar para usarlos, gracias
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: facundo_10 en 21 de Enero de 2009, 23:42:06
Hola Sabueso, los comandos primero se envian para inicializar luego hay varios comandos, algunos relacionados con la FAT, para leer para escribir y/o borrar en la memoria, para leer los datos de la memoria etc.

Ahora estoy de vacaciones pero pronto me pondre a trabajar nuevamente sobre el tema, tengo algunos problemas con los registros internos del PIC para configurarlos, espero solucionarlos.
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: denitos en 26 de Enero de 2009, 07:36:25
Hola amigos, hace meses intenté leer la MMC con pIC y el comando de PBP shiftout y shiftin (si mal no recuerdo) tomando como base el único ejemplo que he encontrado en basic en la red al respecto.
Tras muchísimo pelear, llegué a la conclusion que añadiendo cualquier instrucción en el programa dejaba de funcionar (incluso el solo hecho de añadir una variable sin más).
Supongo que será por que el autor calculó las instrucciones para ajuste críticos de tiempo o simplemente que estas 2 instrucciones no van muy bien.
Probé con 4,6,8,11,12,16 y 20 Mhz, obteniendo miles de fallos y ahora si, ahora no........
Harto de perder el tiempo, decidí hacerme mi propia subrrutina (hablo siempre en PBP y nada de cod. maq.).Ahora leo y grabo perfectamenta la MMC de 32 y 128 que tengo a cualquier velocidad y sin ningún problema, ah he configurado el PIC a 3V y me ahorro los divisores.
En conclusion: Creo que shiftout y shiftin no funcionan demasiado bien bien.
Venga, un saludo.
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: facundo_10 en 27 de Enero de 2009, 18:26:37
Denitos serias tan amable de publicar las rutinas que utilizaste para inicilializar la memoria y al menos leer un bloque por favor.

Un saludo!!
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: denitos en 29 de Enero de 2009, 09:34:11
vamos a ver, voy a sacar las partes fundamentales.Decir que en distintas placas he probado con diversos pines y siempre me ha funcionado (ojo con los colectores abiertos).
ojo tambien con el pin de salida de la mmc, no dejarlo libre de conexión ya que si no inicia, ese pin se queda inestable y con las señales del ambiente recibe 0 y 1 y te indica que los cmd estan bien cuando simplemente son interferencias que coinciden. estaría bien poner 47k o algo asi a positivo.(ahora no recuerdo cuanto le puse)
Faltarán definir quizas algunas variables que ya las ireis viendo.
Jeje ahi queda eso, admito críticas constructivas. Esparando sea de utilidad y si hay alguna duda, intentaré resolverla.
Ah, yo lo he probado con 16F876 y con un 18f258 . si mal no recuerdo funcionó hasta con 4 Mhz. Yo usaré 12 por que creo que es la primra frecuencia para trasmitir a 19200 por serie.
Ahhhhhhhhhhh se me olvidaba, por fin he conseguido poner un bootloader en marcha............. Si es que cuando me pongo ......................




DEFINE OSC 10
DEFINE HSER_BAUD 9600
ADCON1   = 7         ' puerto A  adigital

'SPBRG=71             '9600 baudios con cristal de 110592
'TXSTA.2=1         '9600 baudios con cristal de 110592

TRISA=%010000
TRISB=%11001111
TRISC=%10110000
'TRISB.4 = 0

addr_H  VAR     WORD 
addr_L  VAR     WORD   
dat     VAR     BYTE    ' variable para gosubs de recoger dato MMC

'Conexiones MMC
SS      VAR     PORTA.0   ' pin select (pin 1)
SI      VAR     PORTA.1    ' Dato hacia MMC (pin 2)
SCK     VAR     PORTA.2  ' Clock hacia MMC (pin 5)
SO      VAR     PORTA.4   ' Datos desde la MMC (pin 7)

sck=0
si=1


' ************************ INICIO DE LECTURA MMC ****************

cabecera:
   si=1
   ss=1
   
   For i=1 TO 100
       sck=1:sck=0
   Next i   

Pause 50


'******************************** CMD0 **************************
inicio_cmds:
'HSerout ["inicio cmd0",13,10]
intento=0
ss=0

dat=$40
   GoSub mandar_dat'    manda la variable dat
dat=0
   GoSub mandar_dat'    manda la variable dat
dat=0
   GoSub mandar_dat'    manda la variable dat
dat=0
   GoSub mandar_dat'    manda la variable dat
dat=0
   GoSub mandar_dat'    manda la variable dat
dat=$95
   GoSub mandar_dat'    manda la variable dat
While dat<>1
   GoSub recibir_dat'   recibir dat desde la MMC   
Wend
   GoSub recibir_dat'   resto de clock
ss=1
HSerout ["cmd0  ok",13,10]

'******************* CMD1 **************************

'ss=1
'mamdar 2x $FF
'ss=0
'mandar cmd41
'mandar 4x $00
'mandar 2x $FF
'si no contesta 0 volver a mandar cmd

dat=255
While dat<>0
   dat=$FF   
   ss=1
      GoSub mandar_dat
      GoSub recibir_dat
   ss=0   
   dat=$41
      GoSub mandar_dat'    manda la variable dat
   dat=0
      GoSub mandar_dat'    manda la variable dat
   dat=0
      GoSub mandar_dat'    manda la variable dat
   dat=0
      GoSub mandar_dat'    manda la variable dat
   dat=0
      GoSub mandar_dat'    manda la variable dat
   dat=$ff
      GoSub mandar_dat'    manda la variable dat
      GoSub mandar_dat'    manda la variable dat

      GoSub recibir_dat'   recibir dat desde la MMC   
   ss=1
Wend
   
HSerout ["cmd1  ok",13,10]
LCDOut $FE,1
LCDOut $FE,2," cmd1 ok"

Pause 50

'******************* CMD 16 **************************

cMD16:
   addr_H = $0000
      addr_L = $0200
   
      ss=1
      dat=$FF
         GoSub mandar_dat
         GoSub recibir_dat      
   
      ss=0
      dat=$50
      GoSub mandar_dat'    manda la variable dat
   dat=addr_H.BYTE1
      GoSub mandar_dat'    manda la variable dat
   dat=addr_H.BYTE0
      GoSub mandar_dat'    manda la variable dat
   dat=addr_l.BYTE1
      GoSub mandar_dat'    manda la variable dat
   dat=addr_l.BYTE0
      GoSub mandar_dat'    manda la variable dat
   dat=$ff
      GoSub mandar_dat'    manda la variable dat
      GoSub mandar_dat'    manda la variable dat

      GoSub recibir_dat'   recibir dat desde la MMC   
   While dat<>0   
         GoSub recibir_dat'   recibir dat desde la MMC
   Wend
HSerout ["cmd16 ok",13,10]
LCDOut $FE,1
LCDOut $FE,2," cmd16 ok"


'*************************** subrrutinas ***********************************

'En estas subrrutinas, entre flancos puse retardos tanto al subir como bajar, pero funciana igual sin ellos.


mandar_dat:

   si=dat.bit7:sck=1:sck=0
   si=dat.bit6:sck=1:sck=0
   si=dat.bit5:sck=1:sck=0
   si=dat.bit4:sck=1:sck=0
   si=dat.bit3:sck=1:sck=0
   si=dat.bit2:sck=1:sck=0
   si=dat.bit1:sck=1:sck=0
   si=dat.bit0:sck=1:sck=0

Return

recibir_dat:
   
   sck=1:dat.bit7=so:sck=0
   sck=1:dat.bit6=so:sck=0
   sck=1:dat.bit5=so:sck=0
   sck=1:dat.bit4=so:sck=0
   sck=1:dat.bit3=so:sck=0
   sck=1:dat.bit2=so:sck=0
   sck=1:dat.bit1=so:sck=0
   sck=1:dat.bit0=so:sck=0

Return



el estatus segun la memoria devuelve distinto valor (con las que poseo), con las mmc de 32 lo hace bien, sin embargo con la de 128 no devuelve el mismo nº pero cuando el intento pasa de 222 siguo leyendo y va bien, quizas con menos intentos tambien (esta por probar).

****************************** MS STATUS ************************************
mstatus:
      ss = 1
      dat = $ff
        GoSub mandar_dat
        GoSub recibir_dat
   intento=0
      ss = 0
      dat=$4d
        GoSub mandar_dat
      dat=0
         GoSub mandar_dat
      dat=0
         GoSub mandar_dat
      dat=0
         GoSub mandar_dat
      dat=0
         GoSub mandar_dat
      dat=$FF
         GoSub mandar_dat
       
        While dat=$FF AND intento<222       
           GoSub recibir_dat
           intento=intento+1
        Wend
    ss=1       
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: facundo_10 en 29 de Enero de 2009, 16:46:23
Hola denitos, Si me ha pasado, que el ruido te juega una mala pasada en el pin de salida de la MMC, ya que otorga respuestas que nos hacen creer que la MMC inicializo, cuando en realidad no inicializo.

Por eso hay que poner una resistencia PULL-UP a positivo para que este pin no flote y sea afectado por el ruido.

A mi ya me habia pasado, y lo que hize fue pasar el pin de salida de la MMC, por un adaptador de tension tambien, para que no sufra interferencias, con eso logre leer la MMC, y escribir datos en la FAT, pero con el PSI todo esto se vuelve el doble o triple de complejo, nose porque sera, como ya dije antes creo que es por la mala configuracion de los registros internos.

Le hechare un ojo a las rutinas que dejaste y vere si puedo encontrar alguna solucion, para poder crear de una vez por todas una libreria que si funcione en PSI.

Un saludo!
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: facundo_10 en 31 de Enero de 2009, 11:49:44
Denitos, sabes que no tengo ni idea como puedo en Pic Simulator ide, ubicar los datos como lo hiciste tu en PBP,

mandar_dat:

   si=dat.bit7:sck=1:sck=0
   si=dat.bit6:sck=1:sck=0
   si=dat.bit5:sck=1:sck=0
   si=dat.bit4:sck=1:sck=0
   si=dat.bit3:sck=1:sck=0
   si=dat.bit2:sck=1:sck=0
   si=dat.bit1:sck=1:sck=0
   si=dat.bit0:sck=1:sck=0

En esa rutina de mandar el Dato, veo que fuiste ubicando el dato en bit 7 a bit0, sabes de que manera pueda hacerlo sin tener que usar la instruccion .BIT ?

Espero tu respuesta, Muchas Gracias!
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: denitos en 31 de Enero de 2009, 14:57:28
 :-/ No se que es Pic Simulator ide.

De este modo mio, estás obligado a descomponer los bits, supongo que en el tal pic simulator se podra hacer de algun modo.
Una cosa es que no puedas y otra que no quieras por cualquier razón.
si no sabes como descomponer los bits, puedes hacer lo siguiente:
teniendo dato como byte:

bit7=0
if dato>127 then
 bit7=1 (bit7 puede ser un bit)
 dato=dato-128
endif

bit6=0
if dato>63 then
 bit6=1 (bit6 puede ser un bit)
 dato=dato-64
endif

.............

bit0=0
if dato>1 then
 bit0=1 (bit0 puede ser un bit)
endif

y así sucesivamente hasta obtener los 8 bits individualmente, aunque supongo que habrá modos más fáciles, seguro.
No se........... si .... he ...resuelto tu duda.
venga, un saludo.
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: facundo_10 en 31 de Enero de 2009, 22:39:27
Es que ya en PSI, supuestamente esta la opcion de usar las intrucciones del modulo SPI, para enviar los datos.

Algo como  por ejemplo:

SPISENDBITS 0000 0101

El tema es que no quiero usar el modulo SPI, porque entonces entro en el conflicto de configurar el modulo y aunque lo he configurado bien, el mismo falla nose porque razon.

Pense que el dato tambien se podia enviar asi:

En vez de enviar el DAT 40 todo de una, envio bit a bit ..

algo como enviar

un 0 luego un 1 luego un 0 .. 0 ... 0 ... 0 ... 0 ... 0

Un saludo!

Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: facundo_10 en 02 de Febrero de 2009, 10:02:33
Aca pego el codigo que tengo al momento con un 18F452 a 8 MHZ. Probe y no funciona y parece estar todo correcto, creo que llegare a la conclusion de que PSI no puede hacer trabajar una MMC, y si puede es mas complicado de lo que deberia.

Código: [Seleccionar]
AllDigital
Dim dat As Byte
Dim i As Byte
Dim intento As Byte
'---------CONFIGURACION ENTRADAS Y SALIDAS
Config PORTE.2 = Output
Config PORTC.5 = Input
Config PORTC.4 = Output
Config PORTC.3 = Output
'------------ASIGNACIONES------------------
Symbol cs = PORTE.2  'CHIP SELECT
Symbol sdo = PORTC.5  'Datos desde la MMC
Symbol sdi = PORTC.4  'Datos a La mmc
Symbol sck = PORTC.3  'Clock
'---------CONF. MODULO MSSP---------------- ' Aqui es donde configuro el MODULO MSSP
SSPCON1 = %00100001  'SSP  | FOSC/16
SSPSTAT = %00000000  'muestreo de los datos de entrada en la mitad del reloj  datos se transmiten en el flanco de subida
'__________CONFIGURACION SPI_______________
Define SPI_CS_REG = PORTE
Define SPI_CS_BIT = 2
Define SPI_SCK_REG = PORTC
Define SPI_SCK_BIT = 3
Define SPI_SDI_REG = PORTC  'DATOS QUE VAN A LA MMC
Define SPI_SDI_BIT = 4
Define SPI_SDO_REG = PORTC
Define SPI_SDO_BIT = 5
'PREPARANDO MODULOS SPI Y MODULO USART
SPIPrepare
Hseropen 9600
'_____________________________________
Hserout "Envio 80 Clocks Inicio", CrLf
cs = 1
sdi = 1
For i = 0 To 100
sck = 1
sck = 0
Next i
WaitMs 10
intento = 0
cs = 0
SPISendBits 8, %01000000
SPISendBits 8, %00000000
SPISendBits 8, %00000000
SPISendBits 8, %00000000
SPISendBits 8, %00000000
SPISendBits 8, %10010101
While dat <> 1
Gosub recibir_dat
Wend
cs = 1
Hserout "CMD0 CORRECTO"

End                                               

recibir_dat:
SPIReceive dat
Return       

Ya hize la configuracion del modulo MSSP, segun una pagina, CPOL y CPHA del modulo SPI deben estar en 0 tal como lo estan en los registros que configure, ademas configure un FOSC /16 al igual que lo hacen las librerias de MKBASIC.

La verdad es que ya me estoy quedando sin animos, y es que el compilador pone muchas trabas si alguien podria hecharle un vistazo les agradeceria.

Un saludo  :(
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: MiCrOtRoNiC en 02 de Febrero de 2009, 22:36:06
facundo_10, pidele ayuda al maestro dogflu66...
a lo mejor el tiene la solucion!!!!
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: dogflu66 en 03 de Febrero de 2009, 22:15:33
Hola;

He estado algo perdido porque estaba terminado unas practicas con un modem GSM y también descodificando la trama de datos de algún mandito de IR de los que andan por casa... :mrgreen:
Pero antes de comenzar con la memoria MMC voy a hacer unas practicas con una pequeña memoria EEProm por SPI que tengo por aquí para tomar contacto con el modulo ya que no he trabajado anteriormente con él. Ya contare lo que sale... :shock:

PD. ¡No te desanimes facundo!. Si contara las veces que quede bloqueado con algún modulo o rutina durante semanas.... en fin, animo y para atrás ni siquiera para tomar impulso.
Título: Re: Lectura Memoria MMC con Pic Simulator Ide
Publicado por: facundo_10 en 03 de Febrero de 2009, 22:40:59
Dogflu yo use el MCP41010, el potenciometro digital de interface SPI, para tomar contacto con el modulo, el protocolo SPI que ofrece el programa, para el pote digital anduvo mas que bien, perfecto anduvo pero parece que la memoria no se lleva muy bien con el SPI de PSI.

Yo por mi parte ando con estudios ahora en CCS, para poder correr la memoria aunque sea usando CCS, sin embargo frecuentare el Hilo y lo seguire intentando, aunque creo que es muy poco viable por PSI.

Un saludo!