Foros de Electrónica

Comunidad de discusión sobre Automatización, Electrónica industrial, Microcontroladores y electrónica digital, Robótica, Domótica, Telemática, Tecnologías móviles, y muchos temas más.




Lecto-grabador de tarjetas MMC, SD, MicroSD con PIC16F877A


       



#41  Archivos .txt en la sd
bluetoothman

Registrado: 18 Ene 2008
Mensajes: 29
Ubicación: Colombia
citar
Hola amigos.

Acerca de la parafernalia que se necesita, la mejor guìa que pude hallar, y que además está en Español, está en el siguiente link:

http://homepages.mty.itesm.mx/al778081/

Espero que les sirva, acerca del código en C o similar para PIC no podría ayudarles, ya que trabajo micros de Motorola.

#42  
willyGG

Registrado: 29 Ene 2008
Mensajes: 6
Ubicación: Bolivia
citar
hola muchachos...aunque soy nuevecito en el foro, estoy interesado en este tema...perdonen que no sea muy avesado en el asunto, pero tengo algunos trucos...como por ejemplo, en vez de fabricar un porta SD, por que no utilizar un cable bus IDE de las antiguas, que se utilizan en la conexion de Hard Disk. Veren que entra cabalito en una de sus interfaces...es mi opinion humilde...chau

#43  no puedo comunicarme con la SD!
serchy

Registrado: 03 Ene 2008
Mensajes: 9
Ubicación: Tucuman, Argentina
citar
Hola amigos, aver si me pueden dar una mano con esto de las SD! hace rato que estoy intentando la comunicación sin éxito, hice un programa simple que grabe el bloque de 512 bytes con datos cualquiera. una cosa mas, cuando se escriba la sd, como puedo hacer para verla en la PC? se genera un archivo sin extension, o que? muchas gracias, ahi va el codigo

Código: Seleccionar todo
;===============================DESCRIPCION===============================================
; Escribe datos en una memoria SD, usando el protocolo de comunicación SPI
; Programador: Sergio
;=========================================================================================

;======================================INICIALIZACION=====================================

__CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
PROCESSOR   16F876         ;Indica el PIC a usar
INCLUDE   "P16F876.INC"      ;Incluye la libreria que trae el MPLAB
RADIX      hex         ;Define sistema de numeración por defecto

ORG      0                  ;Define el comienzo del programa
goto      Inicio

;----------------------------Definicion de variables internas-----------------------------

CBLOCK   0x20
   cont1
ENDC

#DEFINE      RB0   0
#DEFINE      RB1   1
#DEFINE      RB2   2


;-----------------------------------------------------------------------------------------

;====================================PROGRAMA PRINCIPAL===================================

Inicio
   movlw   b'00110010'         ;palabra de configuracion para reg
   movwf   SSPCON
   bsf   STATUS,RP0         ;selecciona banco1
   movlw   b'10000000'         ;palabra de configuracion para reg SSPSTAT
   movwf   SSPSTAT
   clrf   TRISB            ;pone el puerto B como salida
   movlw   b'00111000'
   movwf   TRISA            ;pone el puerto A como entrada
   movlw   b'00010000'
   movwf   TRISC
   bcf   STATUS,RP0         ;selecciona banco0
   
IniciaSD
loopCMD0
   btfsc   PORTA,4   ;espera que se active el pulsador para enviar otro comando
   goto   loopCMD0
   bsf   PORTA,0   ;activa RA0 indicando que se esta escribiendo
   call   Retardo_1s   ;espera, para que se pueda ver el led
   call   CMD0      ;envia el comnado 0 a la SD para setearla en modo idle
   bcf   PORTA,0   ;RA0=0 (termino escritura)
   movwf   PORTB      ;muestra la respuesta en el puerto B
loopCMD1
   btfsc   PORTA,4    ;espera que se active el pulsador para enviar otro comando
   goto   loopCMD1
   bsf   PORTA,0   ;activa RA0 indicando que se esta escribiendo
   call   Retardo_1s   ;espera, para que se pueda ver el led
   call   CMD1      ;envia el comnado 0 a la SD para setearla en modo idle
   bcf   PORTA,0   ;RA0=0 (termino escritura)
   movwf   PORTB      ;muestra la respuesta en el puerto B

loopCMD55
   btfsc   PORTA,4   ;espera que se active el pulsador para enviar otro comando
   goto   loopCMD55
   bsf   PORTA,0   ;activa RA0 indicando que se esta escribiendo
   call   Retardo_1s   ;espera, para que se pueda ver el led
   call   CMD55      ;envia el comnado 0 a la SD para setearla en modo idle
   bcf   PORTA,0   ;RA0=0 (termino escritura)
   movwf   PORTB      ;muestra la respuesta en el puerto B
      
loopCMD58
   btfsc   PORTA,4   ;espera que se active el pulsador para enviar otro comando
   goto   loopCMD58
   bsf   PORTA,0   ;activa RA0 indicando que se esta escribiendo
   call   Retardo_1s   ;espera, para que se pueda ver el led
   call   CMD58      ;envia el comnado 0 a la SD para setearla en modo idle
   bcf   PORTA,0   ;RA0=0 (termino escritura)
   movwf   PORTB      ;muestra la respuesta en el puerto B

loopCMD24
   btfsc   PORTA,4   ;espera que se active el pulsador para enviar otro comando
   goto   loopCMD24
   bsf   PORTA,0   ;activa RA0 indicando que se esta escribiendo
   call   Retardo_1s   ;espera, para que se pueda ver el led
   clrf   Byte2
   clrf   Byte3
   clrf   Byte4
   clrf   CRC
   call   CMD24      ;envia el comnado 0 a la SD para setearla en modo idle
   bcf   PORTA,0   ;RA0=0 (termino escritura)
   movwf   PORTB      ;muestra la respuesta en el puerto B
loopDATOS
   btfsc   PORTA,4   ;espera que se active el pulsador para enviar los datos
   goto   loopDATOS
   bsf   PORTA,2   ;activa RA2 indicando que se esta escribiendo datos
   call   Retardo_1s   ;espera, para que se pueda ver el led
   movlw   0xFF
   movwf   cont1
   movlw   0xFE      ;inicio del bloque de datos
   call   SD_dato
loop
   decfsz   cont1
   goto   envia
   movlw   0xFF
   movwf   cont1
loop2
   decfsz   cont1
   goto   envia2
   goto   fin
   
envia
   movlw   0xF0
   call   SD_dato
   goto   loop
envia2
   movlw   0xF1
   call   SD_dato
   goto   loop2
fin
   movlw   0xFF      ;envia los dos bytes de CRC que como esta en modo
   call   SD_dato   ;SPI puede tomar cualquier valor
   call   SD_dato
bcf      PORTA,2   ;RA2=0 (termino escritura)
bcf      PORTA,1   ;RA2=1 fin del programa
INCLUDE   "SD.INC"
INCLUDE "RETARDOS.INC"
END


aqui les paso tambien la libreria que hice yo mismo "SD.INC"

;***********************************Libreria "SD.INC"**********************************
;include los comandos para operar una tarjeta SD en modo SPI con sus respuestas
;
;********************************ZONA DE DATOS Y VARIABLES********************************

CBLOCK
   Byte2
   Byte3
   Byte4
   Byte5
   R1
   R12
   R13
   R21
   R22
   R31
   R32
   R33
   CRC
ENDC


;******************************COMIENZO DE LOS SUB-PROGRAMAS******************************
CMD0   ;por respuesta se obtiene R1
   movlw   b'01000000'
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0x95
   call   SD_dato
   call   SD_respuesta
   movwf   R1   
   return
CMD1   ;por respuesta se obtiene R1
   movlw   b'01000001'
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0xFF
   call   SD_dato
   call   SD_respuesta
   movwf   R1
   return
CMD9   ;por respuesta se obtiene R1
   movlw   b'01001001'
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0x00
   movwf   SSPBUF
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0xFF
   call   SD_dato
   call   SD_respuesta
   movwf   R1
   return
CMD10   ;por respuesta se obtiene R1
   movlw   b'01001010'
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0x00
   movwf   SSPBUF
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0xFF
   call   SD_dato
   call   SD_respuesta
   movwf   R1
   return
CMD13   ;por respuesta se obtiene R2
   movlw   b'01001101'
   call   SD_dato
   movlw   0x00
   movwf   SSPBUF
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0xFF
   call   SD_dato
   call   SD_respuesta
   movwf   R21
   call   SD_respuesta
   movwf   R22
   return
CMD16   ;por respuesta se obtiene R1
   movlw   b'01010000'
   call   SD_dato
   movfw   Byte2
   call   SD_dato
   movfw   Byte3
   call   SD_dato
   movfw   Byte4
   call   SD_dato
   movfw   Byte5
   call   SD_dato
   movfw   CRC
   call   SD_dato
   call   SD_respuesta
   movwf   R1
   return
CMD17   ;por respuesta se obtiene R1
   movlw   b'01010001'
   call   SD_dato
   movfw   Byte2
   call   SD_dato
   movfw   Byte3
   call   SD_dato
   movfw   Byte4
   call   SD_dato
   movfw   Byte5
   call   SD_dato
   movfw   CRC
   call   SD_dato
   call   SD_respuesta
   movwf   R1
   return
CMD24   ;por respuesta se obtiene 3 R1 (R1, R12, R13)
   movlw   b'01011000'
   call   SD_dato
   movfw   Byte2
   call   SD_dato
   movfw   Byte3
   call   SD_dato
   movfw   Byte4
   call   SD_dato
   movfw   Byte5
   call   SD_dato
   movfw   CRC
   call   SD_dato
   call   SD_respuesta
   movwf   R1
   call   SD_respuesta
   movwf   R12
   call   SD_respuesta
   movwf   R13
   return
CMD55   ;por respuesta se obtiene R1
   movlw   b'01110111'
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0xFF
   call   SD_dato
   call   SD_respuesta
   movwf   R1
   return
CMD58   ;por respuesta se obtiene R3
   movlw   b'01111010'
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0x00
   call   SD_dato
   movlw   0xFF
   call   SD_dato
   call   SD_respuesta
   movwf   R31
   call   SD_respuesta
   movwf   R32
   call   SD_respuesta
   movwf   R33
   return

SD_respuesta
   movlw   0x00         ;w=0
SD_dato
   movwf   SSPBUF         ;w->SSPBUF y comienza la lectura/escritura
   bsf      STATUS,RP0      ;selecciona el banco1
loop_SD_dato
   btfss   SSPSTAT,BF      ;¿buffer lleno? ¿termino lectura/escritura?
   goto   loop_SD_dato   ;no, pregunta de nuevo
   bcf      STATUS,RP0      ;selecciona banco0
   movf   SSPBUF,W      ;SSPBUF->w borrando automaticamente SSPSTAT,BF
   return


la verdad que no se donde esta el error, por favor, si me pueden ayudar se los agradeceria! GRACIAS!

#44  
hawpic

Registrado: 15 Oct 2007
Mensajes: 4
Ubicación: Zaragoza
citar
Hola Sergio! como lo llevas?

Yo estoy en lo mismo, debemos ser los unicos que estamos intentandolo en asm. Yo lo hago con un PIC16F690 asi que no tenemos muchas diferencias.

Dices que no te funciona pero tienes escrito semejante tocho de codigo? Ufff.. has comprobado primero que manejas bien el SPI? yo compre una memoria 25LC040 por unos cincuenta centimos y comprobe que funcionaba bien mi codigo SPI para asegurarme

Despues ya sabiendo que eso funciona yo haria la inicializacion paso por paso.. le he estado echando un ojo a tu codigo y he encontrado un par de cosillas, te comento:

cuando mandas un comando, por ejemplo CMD0, envias los bytes correspondientes y luego llamas a sd_respuesta para leer R1, no? pues bien.. R1 esta compuesto por tres bytes: FFxxFF y tu solo haces una lectura asi que lees solamente FF (con hacer dos ya es suficiente). Te recomiendo coger un osciloscopio y ver todas las respuestas de la tarjeta, veras como es asi.

cuando leas el segundo byte (xx en FFxxFF) tienes que comprobar que es lo que esperabas. despues de mandar CMD0 deberias obtener como respuesta FF01FF -tarjeta en idle-, sin embargo tu lees, almacenas en R1 y no compruebas el valor..

eso no deberia darte muchos problemas. despues la gente manda el comando CMD1 pero los d e la SD card association en sus documentos recomiendan mandar ACMD41 (precedido del CMD55 por ser un aplication command). En cualquiera de los casos tu envias el comando y recibes otro response R1, pero esta vez tienes que leer FF00FF, asi que tendras que hacerte un loop hasta que te llegue eso y no el FF01FF que te llegara mientras la tarjeta siga en modo idle..

Hala, creo que tienes un poquico de faena, animo! Si no me he explicado bien o no entiendes algo pregunta cuanto quieras! Un saludo Smile

#45  
bluetoothman

Registrado: 18 Ene 2008
Mensajes: 29
Ubicación: Colombia
citar
Alguien sabe como hacerlo en el assembler, pero con micros de Motorola?

#46  una manito...
serchy

Registrado: 03 Ene 2008
Mensajes: 9
Ubicación: Tucuman, Argentina
citar
hawpic, muchas gracias por tu guia! la verdad q estaba un poco perdido.
al funcionamiento del protocolo SPI del pic, yo lo he probado con "proteus" (programa de simulacion que recomiendo) y funciona bien.
La verdad que no sabia que la respuesta de la SD fuese de tal forma, pues en todos lados dicen que es un solo byte de respuesta. por eso no le di importancia a la comprobacion en el codigo Razz

Ahora con tu ayuda, manos a la obra nuevamente..!
dos preguntitas, la configuracion que hice para el puerto SPI es correcta? (CKP=1 CKE=0 SMP=0)
una cosa mas, luego de escribir la tarjeta, hay alguna forma de ver esos datos en la PC?

bluetoothman ni idea de micros motorola, pero sigue intentando que se de personas que lo hicieron funcionar... mas precisamente en mi facultad, un proyecto final se basaba en parte a la comunicacion SD - micro Motorola

Saludos!

#47  
DriX

Registrado: 02 Nov 2007
Mensajes: 232
Ubicación: Buenos Aires, Argentina
citar
Bueno, la verdad que de PICs no tengo mucha idea. Pero hace bastante tiempo ví esto en hackaday.com y me parece que les puede ser útil. Es un sócalo para tarjetas SD/MMC echo con un conector para los floppys de 5 1/4. Mi SD Kingston de 1GB entra Smile



Está en inglés pero les puede ser útil.

Salu2!

#48  
hawpic

Registrado: 15 Oct 2007
Mensajes: 4
Ubicación: Zaragoza
citar
De nada serchy, pa eso estamos aqui Smile

Lo del funcionamiento del SPI simulado con proteus me parece bien, pero supongo que tambien te habrá pasado que alguna vez una simulacion es buenisima pero luego llegas, montas y misteriosamente no funciona. Por eso te recomiendo que lo compruebes primero pa por si acaso.

Lo de la respuesta de la SD.. Sabes que hay diferentes tipos de respuestas segun el comando que envies, no? en los que tu envias recibes un response R1, que es cierto que todos dicen que es un byte de respuesta, pero te animo a que leas tres bytes despues de enviar un comando y lo veas con tu osciloscopio. El primer byte leido sera FF, el segundo R1 y el tercero FF (este ultimo si quieres ni lo leas, pero antes del R1 siempre leeras FF)

Tus preguntas..

La configuración para el puerto SPI.. Pues veras, acabo de probar con tu configuracion (CKP=1 CKE=0 SMP=0) y funciona, pero te recomiendo mejor usar esta: CKP=0 CKE=1 SMP=0, si ves las formas de onda con el osciloscopio veras que se ven mucho mejor. He visto codigo de gente aqui que usa tu configuracion, yo la mia la saque de un codigo de microchip. Asi que eso a tu gusto, parece ser que funciona igual de bien de las dos formas, eso si, si lo miras con un osciloscopio la mia es mucho mas clara Smile

Tu otra pregunta.. si señor, claro que hay forma! Lo de darle formato de texto parece bastante chungo asi en principio (para mi eso aun esta muy lejano.. Razz) asi que tienes dos formas de leer los datos desde el ordenador. Una es mediante RS232, la otra es leyendo la tarjeta en el ordenador mediante algun lector y algun programa que la lea en hexadecimal como el HEXPLORER que ademas es gratuito ;)

Supongo que ya habras buscado mucha informacion y tal pero pa por si acaso te recomiendo mirarte esto:
www.cs.ucr.edu/~amitra/sdcard/Additional/sdcard_appnote_foust.pdf
y esto:
http://www.sdcard.org/about/memory_card/pls/Simplified_Physical_Layer_Spec.pdf

Hala, si tienes tiempo libre ya tienes en que ocuparlo Razz Un saludo!

#49  
serchy

Registrado: 03 Ene 2008
Mensajes: 9
Ubicación: Tucuman, Argentina
citar
Hola a todos, muchachos, ya logre inicializar la !·"$%!·$!"·$ tarejta :D no lo hice antes xq en mi cuidad se quedaron sin PIC ni 877 ni 876 y al que yo tenia lo queme insertandolo mal en el programador Sad (no critiquen che q a todos le puede pasar).

Paso a contarles el problema que tengo, cuando intento escribir la tarjeta, mando el comando 24 como es debido, recibo respuesta 0x00 de la tarjeta.. todo ok
mando el byte de comiezo de escritura 0xFE el token de 512 bytes de datos (en escritura el tamaño debe ser ese siempre), los 2 bytes de CRC, y luego ocurre algo extraño, la tarjeta se la pasa mandando 0x00 mande lo que mande... como que se queda tildada ahi... agradeceria su respuesta...
ahora voy a intentar enviar los datos mas rápido, pues creo que se trata de un problema de tiempo... alguna novedad, posteo nuevamente, y GRACIAS a todos sus aportes y a hawpic!

#50  
hawpic

Registrado: 15 Oct 2007
Mensajes: 4
Ubicación: Zaragoza
citar
Que hay de nuevo serchy? me alegra ver que no has desistido Smile
Lo primero.. eso de los 2 bytes de CRC.. me temo que es una vez que hayas enviado ya los 512 que quieres guardar en la tarjeta.
Te digo como lo hice yo:
-CMD24
-leo R1 con 00
-mando el token FE
-mando dos bytes x256 veces =512bytes (mando dos en cada iteracion para usar solo una variable contador)
-mando dos dummy bytes de CRC
-leo el response: xxx00101? => data accepted
-si no espero 1 mseg y vuelvo a leer el response y asi hasta que es correcto o tengo un timeout
-CMD13 para leer el registro status y ver si esta todo en orden

De todas formas antes de esto un briconsejo Razz Antes de escribir un bloque prueba a mandar el comando CMD8 y mira si las tensiones son correctas y si te devuelve bien el patron que le mandas. Esto es valido para las sd version 2, si es anterior te devolvera en R1 un error de comando incorrecto, pero me imagino que tu memoria sera version 2 y asi puedes ver si el problema es de alimentacion o que.

Animo, ya te queda poco!

Si alguien esta interesado en mi codigo no tiene mas que pedirlo! Un saludo a todos

 Responder



Google
 


 Temas de interés 
No hay mensajes nuevos enviar mensajes de texto sin usar el teclado del celular.
No hay mensajes nuevos Enviar video en vivo por internet
No hay mensajes nuevos Enviar comandos por RS232 en visual basic
No hay mensajes nuevos Enviar comunicacion via RS232 a servidor
No hay mensajes nuevos Contador de pulsos unido al microcontrolador DLP-245PB

Foros de Electronica
|| Cuestiones Elementales de Electrónica || Fuentes de alimentacion || Circuitos de radio || Diseño de circuitos en general ||
|| Sistemas de Audio: Preamplificadores, Ecualizadores || Amplificadores || Reparación || Discusión ||
|| Microcontroladores y sistemas embebidos || Circuitos logicos combinacionales y secuenciales || Interfaces y Programacion || Dudas en general || Sistemas de Video || PC Hardware || Telematica y comunicaciones || Tecnologias moviles || Software Electronico || Robotica, Domotica y Mecatronica || Autotrónica || Automatizacion, Electronica industrial y de Potencia || Documentacion, circuitos y esquemas || Donde Las Ideas Convergen... || Tutoriales y Manuales || Proyectos Prácticos ||