# Lecto-grabador de tarjetas MMC, SD, MicroSD con PIC



## NANO1985 (Jun 12, 2007)

Hola! quiero hacer una aporte a toda la comunidad electronica. y de paso poder complementar con otra información para lograr que este circuito llegue a la plenitud de su desarrollo. el mismo consta de un microcontrolador PIC16F877A con un oscilador de 20Mhz (luego voy a explicar porque el de 20). un par de resistencias para "ajustar" los niveles de tension que manejan las tarjetas SD,MicroSD y MMC (2.7 a 3.3 v) a los niveles de la lógica TTL de la arquitectura del PIC, las diversas memorias que existen en el mercado, desde el punto de vista técnico, pueden trabajar mediante dos protocolos serie distintos: el protocolo MultiMediaCard propiamente dicho, y el protocolo SPI. El primero de los protocolos es el más potente ya que permite más operaciones que el segundo, pero por otro lado, el segundo es más fácil de implementar si se dispone de una interfaz SPI  (en este caso mediante el modulo MSSP interno del pic) y es suficiente para la mayoría de aplicaciones. la tarjeta se comunica mediante Comandos del operador o Controlador, respondiendo en cada caso cada una de las peticiones del mismo. Yo por el momento logré paso a paso lo siguiente:

(1) seleccionar el modulo MSSP del pic para que funcione de modo maestro,. se utilizan para configurarlo solo 2 registros principales el SSPSTAT y el SSPCON1.
(2) mediante el 2 registro se selecciona el clock del modulo SPI, son 4 posibilidades distintas de frecuencias,. 1- Fosc/64 \\\ 2-Fosc/16 \\\ 3-Fosc/4 \\\ 4- Fosc=timer2/2
(3) en este caso tenemos que utilizar indefectiblemente un cristal de 20Mhz para que al seleccionar el divisor de frecuencia de clock a 64 (opcion1 item anterior) logremos obtener una frecuencia de clock de aproximadamente 312Khz. (frecuencia necesaria para inicializar la memoria).
(4) luego debemos setear el tipo de polaridad del clock, momento en quese va a muestrear la entrada y . haciendo CKP=1 CKE=0 SDI(SMP)=0 .(son bits de los registros nombrados anteriormente)
(5) finalmente ya hemos inicializado el modulo del micro activandolo poniendo a "1" el bit SSPEN

ahora sigue la secuencia de pasos inalterables:

los pasos muy precisos y específicos. cada comando entrega una respuesta de parte de la tarjeta.
a continuacion se detalla la cadena de cada comando a enviar y que se debe esperar de parte de la tarjeta.

CMD0--- cadena a enviar: 0x40,0x00,0x00,0x00,0x00,0x95 esperar respuesta: 0x01 (significa tarjeta en modo idle). 
CMD41--- cadena a enviar: 0x41,0x00,0x00,0x00,0x00, 0xXX. Como la tarjeta ya esta en modo SPI el CRC (0xXX) puede tomar cualquier valor. se aconseja cargarle 0xFF. esperar respuesta 0x00 (significa tarjeta lista! )
CMD55--- ESTE COMANDO NO ES UTILIZA PARA TARJETAS KINGSTON. SI TU TARJETA NO ES DE ESTA MARCA DEBERÁS ENVIARLE ESTE COMANDO. cadena a enviar: 0x77,0x00,0x00,0x00,0x00, 0xXX Y ESPERAR UN 0X00 DE RESPUESTA.
CMD58--- este comando es muy importante ya que se le "pregunta" a la tarjeta si está posibilitada a funcionar con una tension de alimentacion de 3.3v. cadena a enviar 0x7A,0x00,0x00,0x00,0x00, 0xXX. esperar respuesta 0x00 (significa que todo va OK!)

luego de haber terminado la inicializacion, la tarjeta ya estla lista para realizar operaciones de lecto-escritura. pero lamentablemente acá se me recomplicó la cuestión. hace una semana que estoy intentando escribirle algo y se vé que algun moco me estoy mandando o saltié algun paso,.porque no me responde nada cuando peticiono la escritura mediante el comando 24. nosé la verdad. voy a seguir intentando,. y si hay progreso voy a seguir publicando más información. 

si alguien está interesado en este proyecto no duden en intentar. por cualquier duda de hard o soft comunicate conmigo 

vamos! vamos! pongansé las pilas e investiguen en este tema! que está muy GROSSOOOO!

(tengo mucha información al respecto como para compartir sin problema)

acá encontré un manual muy bueno de MMC y SD . la verdad que está muy completo e interesante como para que empiecen a meter mano en esto. se los posteo acá .

http://www.cs.ucr.edu/~amitra/sdcard/


----------



## Enochara (Jun 18, 2007)

Qué tal. No sé de estas tarjetas pero ví un artículo en el #218 la revista española Resistor, mencionando al pic16f876 para esta interfaz. ¿Lo has visto?
Salu2


----------



## fitocondria (Jun 18, 2007)

yo lo vi en la revista y me estaba animando a hacerlo pero no encontré los socket para las tarjetas sd, me dan ganas de comprar un lector y desarmarlo para quitarle el socket, pero no he tenido tiempo por la tesis, pero si me interesa mucho ese aspecto ya que quiero almacenar ahí mucha información estadística, presión, humedad, velocidad del viento, temperatura, frecuencia de apertura de válvulas, conteo de litros por día, etc. aparte de que están baratas las memorias sd de 2 gb.


----------



## NANO1985 (Jun 18, 2007)

hola!! muchachos..... vamos anímense!!!!... ya logré leerla y escribirla..... pero tengo una par de problemas menores... que se pueden solucionar.... acá les paso un par de fotos como para que se den una idea de que si no consiguen el socket o para evitarse romper un lector,.... yo compré una memoria Micro SD que viene con su respectivo adaptador,... a el le soldé los cables y me quedé un socket casero bastante bueno,...jaja    asi que pongansé las pilas muchachos y sigan con este tema.


----------



## jjfonsecaz (Jul 26, 2007)

Hola Nano1985.

Me interesa mucho tu proyecto, ya que puedes almacenar una infinidad de cosas en este tipo de memorias, voy a empesar por conseguirme el adaptador que conseguiste y la memoria, con una de 128 megas me basta; pero precisamente a eso va enfocado mi pregunta, cual es el limite de almacenamiento con el que te haz enfrentado, ya que encontre un articulo de una tesis donde mencionaba que solo podia usar hasta la memoria de 128 megas.

Otra situacion, en el articulo que medio revise (no lo lei en su totalidad) menciona que algunos pines de la SD es necesario conectarlos a VCC  por medio de una resistencia en este caso vi que los voltajes que maneja la SD son de aprox. 3.3 volts o menos. como estableciste el valor de estas resistencias de polarizacion.


----------



## Gilbert (Jul 28, 2007)

Hola estoy interesado en realizar el lecto-grabador de la memoria. He logrado inicializar la memoria sd, y he enviado los comandos y la memoria me responde correctamente pero cuando envio los bytes a grabar en la memoria, la misma no me respionde con el byte de respuesta. Aqui te envio mi programa. Les agradeceria su ayuda. El programador que estoy utilizando es el CCS


```
#if defined(__PCM__) 
#include <16F877.h> /* tipo de PIC */ 
#use delay(clock=20000000) /* reloj de 20 MHz */ 


int8 i; 
int8 data_in; 

void main() 
{ 
set_tris_c(0x10); 
output_bit(PIN_C0,1); 
setup_spi(spi_master |spi_l_to_h|spi_clk_div_64); 

for(i=0;i<10;i++) 
{ 
spi_write(0xFF); 
} 

output_bit(PIN_C0, 0); /* Activacion de la SD */ 


/* Envia a la SD el comando 0 */ 

while(data_in!=1) 

{ 
spi_write(0x40) ; 
spi_write(0x00) ; 
spi_write(0x00) ; 
spi_write(0x00) ; 
spi_write(0x00) ; 
spi_write(0x95) ; 

for(i=0;i<64;i++) 
{ 
spi_write(0xFF); 
data_in = spi_read(); 

if(data_in==0x01) 
{ 
break; 
} 
} 
} 
output_bit(PIN_C0,1); /* Desactivacion de la SD */ 
spi_write(0xFF); 
output_d(0x01); 
delay_ms(1000); 



output_bit(PIN_C0, 0); /* Activacion de la SD */ 


/* Envia a la SD el comando 1 */ 

while(data_in!=0) 

{ 
spi_write(0x41) ; 
spi_write(0x00) ; 
spi_write(0x00) ; 
spi_write(0x00) ; 
spi_write(0x00) ; 
spi_write(0xFF) ; 

for(i=0;i<64;i++) 
{ 
spi_write(0xFF); 
data_in = spi_read(); 

if(data_in==0x00) 
{ 
break; 
} 
} 
} 
output_bit(PIN_C0,1); /* Desactivacion de la SD */ 
spi_write(0xFF); 
output_d(0x02); 
delay_ms(1000); 




output_bit(PIN_C0, 0); /* Activacion de la SD */ 


/* Envia a la SD el comando 16 */ 

while(data_in!=0) 

{ 
spi_write(0x50) ; 
spi_write(0x00) ; 
spi_write(0x00) ; 
spi_write(0x02) ; 
spi_write(0x00) ; 
spi_write(0xFF) ; 

for(i=0;i<64;i++) 
{ 
spi_write(0xFF); 
data_in = spi_read(); 

if(data_in==0x00) 
{ 
break; 
} 
} 
} 
output_bit(PIN_C0,1); /* Desactivacion de la SD */ 
spi_write(0xFF); 
output_d(0x04); 
delay_ms(1000); 


/* Envia a la SD el comando 24 para escribirla */ 


output_bit(PIN_C0, 0); /* Activacion de la SD */ 


while(data_in!=0x05) 

{ 

while(data_in!=0x00) 

{ 

spi_write(0x58) ; 
spi_write(0x00) ; 
spi_write(0x00) ; 
spi_write(0x00) ; 
spi_write(0x00) ; 
spi_write(0xFF) ; 

for(i=0;i<64;i++) 
{ 
spi_write(0xFF); 
data_in = spi_read(); 

if(data_in==0x00) 
{ 
break; 
} 
} 
} 

output_d(0x08); 

spi_write(0xFF) ; 
spi_write(0xFF) ; 
spi_write(0xFE) ; 

for(i=0;i<512;i++) 
{ 
spi_write(0xAA); 
} 

spi_write(0xFF) ; 
spi_write(0xFF) ; 
spi_write(0xFF) ; 

data_in = spi_read(); 

data_in = (data_in && 0x0F); 


if(data_in==0x05) 
{ 
break; 
} 

} 

while(data_in!=0xFF) 
{ 
spi_write(0xFF) ; 
data_in = spi_read(); 
} 

output_bit(PIN_C0,1); /* Desactivacion de la SD */ 
spi_write(0xFF); 
output_d(0x10); 
delay_ms(1000); 

}
```


----------



## angel1984 (Ago 3, 2007)

Hola Gilbert revise tu programa y creo que el problema que tienes, es cuando envias el comando de escritura tienes que esperar 3 bytes de repuesta de la memoria, en tu caso solo es una , y por eso no hay respuesta de confirmacion. 
http://www.tolaemon.com/otros/mmcard.htm


----------



## marcosbrusa (Ago 21, 2007)

Hola. Tengo serios problemas para escribir una tarjeta SD. Me podrias guiar con los pasos a seguir.
Aca muestro parte del codigo
//*******************************
int SD_Escribir_Bloque(){                              //Escribe en la memoria un bloque de datos de 512 Bytes

    long i;  
    CS=0;
    Command(0x58,0,0,0X02,0X00,0xFF);                     // 200H = 512
//    Command(0x58,0,0,0X02,0X00,0x01);  // SEGUN UTN 
	if((SD_response(0x00))==1) return 1; 
	if((SD_response(0x00))==1) return 2;
	if((SD_response(0x00))==1) return 2;
	for (i=0;i<10;i++);
    SPI(0xFE);                                          // Envio el data token 

    for(i=0;i<512;i++)  SPI(dato_);                   // Envio los datos 
    SPI(0xFF);  
    SPI(0xFF); 

    if((SPI(0xFF)&0x0F)!=0x05) return 2; 
    CS = 1;

    return 0; 
}_


----------



## marcosbrusa (Sep 5, 2007)

Ahi lo hice andar. Ahora estoy viendo lo de fat 16 pero la leí con comunicacion serie y la grabe bien. CUALQUIER  AYUDA QUE NECESITEN AVISEN. Aca mando los pasitos pero despues deescribir hay que esperar una sola respuesta.
Bloques de datos MODO SPI
Los bloques de datos comienzan siempre con el byte 0xFE, a este le siguen los bytes de datos y por último los 2 bytes de CRC. El número de bytes de datos depende de la longitud de bloque definida mediante el comando 16, y esta puede ir de 1 hasta 512 bytes (por defecto 512). Por tanto sumando a los bytes de datos el byte de incio y los dos bytes de CRC la longitud total del bloque de datos puede variar entre 4 y 512 bytes. Como por defecto en el protocolo de acceso SPI no se consideran los bytes de CRC, estos pueden tomar cualquier valor. 

Reset de la tarjeta MODO SPI
Por defecto, al arrancar la tarjeta, esta se encuentra en modo MultiMediaCard. Para que entre en modo SPI, hay que enviarle el comando 0 mientras se mantiene activa la señal ¡CS (¡CS=0), pero antes de todo, para poder iniciar la comunicación por el bus hay que enviar como mínimo 74 ciclos de clock a la tarjeta. Así para hacer el reset de la tarjeta y prepararla para trabajar en modo SPI hay que seguir la siguiente secuencia: 

-Dar como mínimo 74 ciclos de clock, es decir enviar unos 10 bytes a través de la SPI. 
-Activar la señal ¡CS (¡CS=0). 
-Enviar el comando 0 con el CRC bien calculado, ya que todavía no estamos en modo SPI, por lo que sí se considera el CRC. De hecho la secuencia del comando 0 siempre es la misma: 0x40,0x00,0x00,0x00,0x00,0x95 
-Esperar el byte de respuesta que ha de ser 00000001 (tarjeta en modo idle). 

Activar la inicialización de la tarjeta MODO SPI
Una vez reseteada y en modo SPI, hay que hacer la inicialización de la tarjeta, para ello hay que enviar el comando 1. La secuencia general es esta:

- Activar el pinl ¡CS (¡CS=0). 
- Enviar el comando 1: 0x41,0x00,0x00,0x00,0x00, 0xXX. Como la tarjeta ya esta en modo SPI el CRC puede tomar cualquier valor. 
- Esperar el byte de respuesta que ha de ser 00000000 (tarjeta lista). 

Escritura de un bloque en la tarjeta MODO SPI
Una vez inicializada la tarjeta, para escribir un bloque en esta, hay que enviar el comando 24 con la dirección de inicio a partir de la cual se desean guardar los datos. Si todo va bien la tarjeta enviará tres respuestas R1 repetidas informaciónrmando al controlador que ya puede enviar el bloque de datos, que ha de tener una longitud de 512 bytes (en la escritura solo se permiten 512 bytes) más el byte de inicio de bloque de datos y los dos bytes de CRC. La secuencia a seguir es: 

-Activar el PIN¡CS (¡CS=0). 
-Enviar el comando 24 0x58, 0xXX,0xXX,0xXX,0xXX,0xYY. Los 4 bytes XX corresponden a la dirección a partir de la cual se quieren guardar los datos. 0xYY corresponde al byte de CRC y como la tarjeta esta en modo SPI pueden tomar cualquier valor ya que no se consideran. 
-Si todo va bien la tarjeta responde con el byte de respuesta R1 tres veces consecutivas. 
-Enviar a la tarjeta el bloque de datos que consiste en: 
    - 1 byte de inicio de bloque de datos 0xFE 
    - 512 bytes con los datos a guardar. 
    - 2 bytes de CRC 

-Mientras la tarjeta esta ocupada guardando el valor, irá enviando bytes indicando que está ocupada, y cuando finalice la escritura enviará un byte de confirmación. 

Lectura de un bloque en la tarjeta MODO SPI
Para leer un bloque de la tarjeta hay que enviar a esta el comando 17 con la dirección de inicio de lectura en los bytes de argumento. La dirección puede tomar cualquier valor comprendido dentro del rango de direcciones válidas de la tarjeta pero todo el bloque leído debe estar dentro de un mismo sector físico. A continuación la tarjeta envía un byte de respuesta R1 seguido del bloque de datos, que comienza por 0xFE, continua con los bytes de datos y finaliza con los 2 bytes de CRC que no se usan. El número de bytes de datos depende del tamaño de bloque que se haya programado mediante el comando 16, y en la lectura puede ir de 1 a 512. La secuencia a seguir es la siguiente: 

-Activar el PIN ¡CS (¡CS=0).
-Enviar el comando 17 0x51,0xXX,0xXX,0xXX,0xXX,0xYY. Los 4 bytes XX corresponden a la dirección a partir de la cual se quieren leer los datos. 0xYY corresponde al byte de CRC y como la tarjeta esta en modo SPI puede tomar cualquier valor ya que no se considera.
-Si todo va bien, la tarjeta responde con un byte de respuesta R1, seguido del bloque de datos con la información solicitada y que el controlador tendrá que ir capturando. Esta tiene la misma estructura que los bloques de datos utilizados en la escritura:
    -1 byte de inicio de bloque de datos 0xFE 
    -n bytes con los datos a guardar. 
    -2 bytes de CRC. 
    -Si se produce un error durante la comunicación, la tarjeta no transmitirá ningún dato y en lugar de estos enviará un byte indicador de error.


----------



## Paloky (Sep 6, 2007)

Hola Marcosbrusa.

He probado todo lo que dices, pero no consigo que funcione.

La parte de Inicialización si que me funciona, pero a la que intento leer o escribir, no lo consiguo.

He leido en algun sitio que la comunicacion es distinta entre las tarjetas SD y las MMC.

Me puedes mandar el codigo fuente para ver que es lo que hago mal.

Gracias.


----------



## marcosbrusa (Sep 6, 2007)

Fijate que hace un tiempo escribi la funcion de escritura en c, el unico error de ese codigo es que espera 3 respuestas cero despues del comando de escritura Y SE DEBE ESPERAR UNA SOLA. 
Por supuesto que no es lo mismo SPI y CMD. Lo que mande explica como elegir SPI. No conozco nada de CMD.

Ahora estoy tratando de darle formato texto y NECESITO AYUDA


----------



## Paloky (Sep 7, 2007)

Hola. Por fin he consiguido hacer lecturas y escrituras en una SD.

Después de ver que mas o menos funcionaba, utilizando el programa "Hexprorer", que me sirve para ver los datos de los sectores de la tarjeta, se me ha planteado una pregunta. Según he visto, con mi tarjeta de 64MB, dispongo de 112,240 sectores. Utilizando las rutinas que mostrais, la dirección del sector màxima que puedo poner con 16 bits es dee 65535. !!!

Como puedo acceder a los demás sectores de la tarjeta. ??

He visto también que me parece que no leo los sectores en el orden correcto. Alguna solución? 

Por fin he conseguido que funcione todo correctamente.

Ahora ya puedo leer y escribir en cualquier sector de la tarjeta.

No lo habria conseguido sin vuestras preguntas y respuestas. Por eso, os adjunto mi programa de prueba para que lo utilizeis vosotros. (Está todo comentado linea a linea)

Todo y que está echo con un PIC16F877A, al no tener suficiente RAM, solo puedo utilizar los primeros 192 byte de cada sector, pero se soluciona en un plis-plas con un 18F o con un dsPic.

Si teneis alguna duda, ya sabeis. 

Saludos.


----------



## marcosbrusa (Sep 7, 2007)

Hola. En realidad si tu tarjeta es de64Mbytes y podes direccionar65535 sectores entonces del cociente sacas la cantidad de sectores. ESO ENTIENDO??? pero recien arranco con esto del FAT16 y en verdad esta groso el tema. AGRADECER"IA CUALQUIER AYUDA QUE ME PUEDAN DAR.


----------



## Paloky (Sep 14, 2007)

Hola.

Alguien sabe algo sobre las nuevas especificaciones de las tarjetas SD HC (version 2.0).

Tengo entendido que no hay compatibilidad con las actuales SD Standard y por tanto, con el bus SPI, solo podremos trabajar con tarjetas de hasta 2Gb.

Teneis información sobre como funciona el nuevo host ?
Se puede programar las nuevas especificacione con los PIC?

Gracias.


----------



## enriquito8 (Oct 5, 2007)

Hola, Estoy trabajando para lograr la comunicacion de la tarjeta SD con un PIC18F2550 pero hasta ahora me estoy iniciando en la programacion en C, Aunno logro que la tarjeta me de respuesta alguna.aca dejo mi codigo no se que pueda ser el problema.
void main (void)
{


	TRISA = 0X20;
	TRISB = 0X01;
	TRISC=  0X00;
	SSPSTAT = 0X00;
	SSPCON1 = 0X32;


	PORTC=0X00;	
	PORTB=0X00;	

 //  	TRISBbits.TRISB1 = 0; //SE CONF. PIN7 PORTB COMO SALIDA	.
//	TRISAbits.TRISA5 = 1;
//	TRISCbits.TRISC7 = 0;


//Enviando ciclos de reloj para sincronismo
	for(i=0;i<10;i++)                  
	{ 
	SPI_WRITE(0xFF); 
	} 

	PORTAbits.RA4 = 0;

//CMD0

	while(RATO!=1){ 
	SPI_WRITE(0x40); 
	SPI_WRITE(0x00); 
	SPI_WRITE(0x00); 
	SPI_WRITE(0x00); 
	SPI_WRITE(0x00); 
	SPI_WRITE(0x95); 

		for(i=0;i<64;i++) 
		{ 
		SPI_WRITE(0xFF); 

			if(SSPSTATbits.BF==1){
			RATO=SSPBUF;

				if(RATO==0x01) 
				{ 
				PORTBbits.RB7=1;
				Delay10KTCYx (250);
				PORTBbits.RB7=0;
				Delay10KTCYx (250);
				PORTBbits.RB7=1;
				Delay10KTCYx (250);
				PORTBbits.RB7=0;
				Delay10KTCYx (250);
				RATO=1;
				break; 
				} 
			} 

		} 

	}



	PORTAbits.RA4 = 1;
	SPI_WRITE(0XFF);
	Delay10KTCYx (250);

//CMD1
	PORTAbits.RA4 = 0;
	while(RATO!=0x02){ 
	SPI_WRITE(0x41); 
	SPI_WRITE(0x00); 
	SPI_WRITE(0x00);                                         
	SPI_WRITE(0x00); 
	SPI_WRITE(0x00); 
	SPI_WRITE(0xFF); 

		for(i=0;i<64;i++) 
		{ 
 		SPI_WRITE(0xFF); 
 			if(SSPSTATbits.BF==1){
			RATO=SSPBUF;

				if(RATO==0x00) 
				{ 
				PORTBbits.RB7=1;
				Delay10KTCYx (250);
				PORTBbits.RB7=0;
				Delay10KTCYx (250);
				PORTBbits.RB7=1;
				Delay10KTCYx (250);
				PORTBbits.RB7=0;
				Delay10KTCYx (250);
				RATO=0x02;
				break;
				} 
			} 
		} 
	}		


	PORTAbits.RA4 = 1;
	SPI_WRITE(0XFF);
	Delay10KTCYx (250);


----------



## Kim_of_the_river (Oct 5, 2007)

Que compilador usas?


----------



## enriquito8 (Oct 8, 2007)

La version Estudiantil del C18 de Microchip junto al Mplab, porque lo dices?.En el momento de compilar no tengo problemas, tengo sospechas en el manejo de los voltajes de las señales que salen y entran al micro.con respecto a las señales que salen del micro hacia la tarjeta(SCK,SDO,CS), usando  divisores de voltajes hecho con resistencias bajo de 5v a 3v (el voltaje de trabajo de la tarjeta).pero no se si la señal que viene de la tarjeta al Micro(al SDI)debo aumentarla de 3V a 5V, para que el PIC la reconozca.Muchachos Muchas Gracias por  Su Atensión


----------



## marcosbrusa (Oct 17, 2007)

Hola a todos. Es la primera vez que voy a programar pics 16c711. Tengo el ic prog en el cual esta este pic como opcion de programacion. Pero no se cuales pines se usan en la grabacion, ya que mi idea es hacerlo en circuito. 

Se que se usan los pines vdd, vss, pgc, pgd y vpp. Pero cuando lo conecto en el zocalo para el pic 18f876, respetando la disposicion de los pines no me funciona.
Alguien sabe en que fallo?


----------



## enriquito8 (Oct 19, 2007)

Hola Muchachos he conseguido comunicarme con la tarjeta pero aun no logro escribirla y pasa algo bastante particular, cuando termino de enviar el bloque no me llega un byte de confirmacion si no nuevamente un byte en cero (0x00), miro en el hexplorer y efectivamente no aparece mi escritura.aqui parte del codigo.Gracias Por La Atensión
//CMD 16

//PORTAbits.RA4 = 0;
//	while(RATO!=0x00){ 
//	SPI_WRITE(0x50); 
//	SPI_WRITE(0x00); 
	SPI_WRITE(0x00);                                         
	SPI_WRITE(0x02); 
	SPI_WRITE(0x00); 
	SPI_WRITE(0xFF); 

		for(i=0;i<64;i++) 
		{ 

			if(SSPSTATbits.BF==1){
			RATO=SSPBUF;
			                if(RATO==0x00) 
				{ 
				break;
				} 
			} 
		SPI_WRITE(0xFF); 
		} 
	}		


	PORTAbits.RA4 = 1;
	SPI_WRITE(0XFF);
	Delay10KTCYx (250);


//CMD24
	PORTAbits.RA4 = 0;

	while(RATO!=0x05){ 

		while(RATO!=0X03){ 
		SPI_WRITE(0x58); 
		SPI_WRITE(0x00); 
		SPI_WRITE(0x00);                                         
		SPI_WRITE(0x00); 
		SPI_WRITE(0x01); 
		SPI_WRITE(0xFF); 

			for(i=0;i<64;i++) 
			{ 
				if(SSPSTATbits.BF==1){
				RATO=SSPBUF;
			//	RATO=0x00;	
					if(RATO==0x00) 
					{ 

					break;
					} 
				}	 
			SPI_WRITE(0xFF); 
			}

			for(i=0;i<64;i++) 
			{ 

				if(SSPSTATbits.BF==1){
				RATO=SSPBUF;
			//	RATO=0x00;	
					if(RATO==0x00) 
					{ 
					break;	
					} 
				}
			SPI_WRITE(0xFF);
			}	


			for(i=0;i<64;i++) 
			{ 
 				if(SSPSTATbits.BF==1){
				RATO=SSPBUF;
			//	RATO=0x00;
					if(RATO==0x00) 
					{ 
					break;
					} 
				}
			SPI_WRITE(0xFF);
			}		 

		} 

	SPI_WRITE(0xFF); 
	SPI_WRITE(0xFF); 
	SPI_WRITE(0xFE); 

		for(i=0;i<512;i++) 
		{ 
 		SPI_WRITE(0x68); //Datos a Escribir
		}	
		SPI_WRITE(0xFF); 
		SPI_WRITE(0xFF); 


		for(i=0;i<64;i++) 
		{ 

 			if(SSPSTATbits.BF==1){
			RATO=SSPBUF;
			RATO=RATO&0X0F;	

				if(RATO==0x05) 
				{ 
				PORTBbits.RB4=1;
				Delay10KTCYx (250);
				PORTBbits.RB4=0;
				Delay10KTCYx (250);
				PORTBbits.RB4=1;
				Delay10KTCYx (250);
				PORTBbits.RB4=0;
				Delay10KTCYx (250);
				break;
				} 
			} 
		SPI_WRITE(0xFF); 
		} 

	}		

	while(RATO!=0xFF) 
	{ 
		if(SSPSTATbits.BF==1){
		RATO=SSPBUF;	
		} 
		SPI_WRITE(0xFF); 
	} 


	PORTAbits.RA4 = 1;
	SPI_WRITE(0XFF);
	Delay10KTCYx (250);


----------



## nacho7577 (Oct 22, 2007)

Hola a todos.  Yo también estuve dandole vueltas al asunto y me encontré el compilador Mikrobasic de Mikroelectronica que ya implementan un montón de rutinas para las mmc o sd.  tanto formateo, inicialización, creación de archivos e inclusión de datos en los archivos.

Yo quería hacer un grabador en plan log de puerto serie, como sniffer el mismo para no tener que poner un pc capturando, pero ahora viendo que hay mucha gente por aquí lo mismo me animo y vuelvo a las andadas.

Muy bueno el adaptador de sd,  usando el adaptador. muy bueno.

Os sigo leyendo.

Un saludo.


----------



## Kim_of_the_river (Oct 24, 2007)

Yo dispongo del mismo compilador y de la placa easypic4 de mikroelectronica tambien con el modulo de grabacion/lectura en sd card.

Yo quiero hacer un log de sensores de temperatura y humedad , es decir, como una estacion meteorologica que guarde los datos en la sd.

El problema q tengo es q una vez grabados los datos en un sector de la sd no se como crear un archivo .txt o similar para hacerlo inteligible. 

¿A alguien se le ocurre algo?

Muchas gracias


----------



## Paloky (Oct 24, 2007)

Hola Kim_of_the_river.

Tienes que guardar los datos en formato FAT, para poder creear un *.txt.

Microchip, tiene unas notas de aplicacion que explica como hacerlo.

Un Saludo.


----------



## cerinalf (Oct 29, 2007)

Hola muchachos. Ya tengo comunicacion (al fin lo consegui) entre ambos dispositivos garcias a ustedes y sus valiosos aportes.
Ahora tengo otra pregunta: Kim of the river, ya conseguiste guardar los archivos en un .txt?
He buscado en microchip como lo recomendo Paloky y aun no he vista nada de como hacerlo.   
Si conseguis algo les recomiendo, estoy varado en ese punto.
Como siempre gracias totales


----------



## Paloky (Oct 30, 2007)

Miren a ver que les parece esto sobre el sistema FAT .

http://elm-chan.org/fsw/ff/00index_e.html


En quando pueda, lo probaré.

Saludos.


----------



## Kim_of_the_river (Nov 5, 2007)

Adjunto:

Implementing File I/O Functions Using Microchips Memory Disk Drive File System Library


----------



## serchy (Feb 4, 2008)

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


```
;===============================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!


----------



## hawpic (Feb 5, 2008)

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


----------



## serchy (Feb 5, 2008)

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 

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!


----------



## Tomasito (Feb 5, 2008)

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 





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

Salu2!


----------



## hawpic (Feb 6, 2008)

De nada serchy, pa eso estamos aqui 

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 

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.. ) 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 información 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  Un saludo!


----------



## serchy (Feb 27, 2008)

Hola a todos, muchachos, ya logre inicializar la  tajejta  no lo hice antes porque en mi cuidad se quedaron sin PIC ni 877 ni 876 y al que yo tenia lo queme insertandolo mal en el programador  (no critiquen che que 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!


----------



## hawpic (Feb 28, 2008)

Que hay de nuevo serchy? me alegra ver que no has desistido 
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  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


----------



## serchy (Mar 5, 2008)

Hola hawpic, muchas gracias por tus consejos.
Despues de probar una serie de pasos, el CMD8 me tira error en CRC.. no se a que se deberá quizá mi tarjeta es version 1.1 y no 2.0 como supones. Me gustaría mucho que me pases tu codigo para darle una mirada, y de paso probar si funciona en mi circuito... como para descartar problemas de hardware   desde ya muchas gracias!
Después de esto, voy a hacer una super guia paso a paso para que nadie mas tenga inconvenientes con una tarjeta de memoria... Saludos a la comunidad.


----------



## Poxa (Mar 14, 2008)

Hola , que tal 
Leyendo este foro he encontrado que muchos han tenido problemas con la inicializacion de una targeta SD, bueno pues yo no soy la escepcion. Hace unas semanas estoy intentando inicializar una targeta SD de la marca kingston de 512 Mb, unicamente he logrado que se ponga en Idle_State, estoy trabajando con un microcontrolador Pic 16F877 con un Cristal de 4Mhz. Estoy utilizando la comunicacion en SPI modo Master con un divisor de frecuencia de 16 lo cual me da una frecuencia de 250khz lo cual entra dentro del rango permitido por las targetas SD, segun he leido en las especificaciones. 
Las secuencias de comandos que he enviado es la siguiente:
CMD0 seguido de CMD1 y la tarjeta me responde  b00000101
tambien he enviado la secuencia CMD0 seguido de CMD55 y ACMD41, la respuesta es la misma
otra secuencia ha sido CMD0 seguido de ACMD41 y en este caso no responde.
No se cual sea el problema en si, no se si, segun lo que he leido en el foro posiblemente sea un error en la frecuencia a la cual trabajo.
Si alguno a tenido un problema similar y lo a solucionado, espero pueda ayudarme

Este foro me ha ayudado bastante, muchas gracias a los colaboradores
Saludos desde Yucatan


----------



## serchy (Mar 14, 2008)

Hola Poxa.
Yo una vez tuve un problema similar...
mando CMD0 y me responde 00000001 o 00000101 no recuerdo bien, y luego cuando mando
mando CMD1 y me responde 00000101
probando muchas veces distintas configuraciones obtenia el mismo resultado...
resolví el problema, cambiando de memoria, a una Kingston de 2GB y funciono correctamente.
la primera era una tarjeta marca "DANE-ELEC", q x lo visto no soporta este tipo de inicializacion... o algo asi... quiza es el mismo inconveniente que vos tienes, intenta probar con otra tarjeta.

Este seria el funcionamiento correcto
mando CMD0 y me responde 00000001
mando CMD1 y me responde 00000001
mando CMD1 y me responde 00000000

En cuanto a la escritura, no he probado mucho aún, pues estoy en época de examenes en mi facu, pero prometo que cuando logre hacer funcionar todo escribo una super guia


----------



## monly (May 6, 2008)

Hola, es la primera vez que escribo pero llevo bastante tiempo visitando el foro.

Os pido ayuda haber si me podeis echar un cable.

Estoy como la mayoria de vosotros haciedo un proyecto con un pic y una tarjeta sd.

Estoy usando un 16f876 y la parte del spi me funciona sin problemas porque la he probado con un rtc ds 1305 y puedo leer y escribir la hora por el hiperterminal sin problemas.

Estoy programando en ensamblador, el pic esta a 5 voltios y la tarjeta la conecto con un regulador de tension a 3.3 v, las lineas que van del pic a la sd estan con resistencias de 2k2 y 1k8 para que no haya problemas con las tensiones y la linea de salida de la tarjeta DO va directa al pic porque se supone que un 3.3 sera un alto para el pic con una resistencia de pull-up a 3.3.

Me he leido no se cuantos pdf de como funcionan las tarjetas y de los comandos y no se que me falla.

el proceso que hago es el que explicais aqui, CS en alto le envio 80 ciclos de reloj, pongo cs en bajo envio el cmd0 y espero la respuesta R1 y aqui esta el problema siempre leo FF , da igual que lea 3 bytes que 8 bytes  la tarjeta no pasa a estado idle.

He probado con varias tarjetas y nada.

No se si es que el proceso de inicializacion hay que empezarlo en algun momento en concreto, 
en la documentacion habla de esperar a que el bus de la tarjeta este a 2,2 voltios porque si no no admite comandos o algo asi,contra mas leo la documentacion mas me lio.

Algun consejo de que puedo hacer.

Un saludo y gracias.


----------



## serchy (May 6, 2008)

Hola, la inicializacion se hace en cualquier momento, intenta probar con dos transistores a la salida de la tarjeta (de modo de que no invierta la señal proveniente de la misma), para elevar la tension que llega al micro, pues con 3.3v estas casi en el limite de nivel alto admitido por el pic. Suerte desde ARGENTINA!


----------



## monly (May 7, 2008)

Hola Serchy, gracias por contestar.

Ayer hice pruebas con el osciloscopio y lo que me pasa es lo siguiente: sin insertar la tarjeta en el zocalo veo los pulsos de reloj y como se envia el comando, pero con la tarjeta puesta no sale nada por el reloj ni por la linea de datos, se queda como muerto.

Un saludo.


----------



## serchy (May 7, 2008)

Monly, la verdad que lo que dices, me suena bastante raro...  pués no recibir respuesta de la SD, es posible, pero que de repente no tengas la señal de CK del micro, es raro... probaste que cuando colocas la tarjeta no cae la tension en el micro provocando un BOR posiblemente... el consumo de la tarjeta es pequeño, pero quiza tiene algun problema de cortocircuito interno, o el adaptador que usas puede ponerse en corto cuando colocas la tarjeta, la verdad ueq no se me ocurren muchas alternativas


----------



## monly (May 8, 2008)

Hola parece que ya inicializa bien, la verdad no se si es por lo que he hecho o es que he tocado algo en la placa de pruebas y ahora hace buen contacto y antes no, por si le interesa a alguien lo que vi es que por la pata 1 de la sd habia tension y segun he leido en la documentacion se puede usar para detectar la insercion de la tarjeta y parece que el conflicto era este, al declarar en el pic la pata cs como salida y ponerla a 1 se ve que se producia un conflicto al tener las dos tension, no se, el caso es que la he declarado al inicio como entrada dandole tiempo a la tarjeta que coja tension y despues la declaro como salida y ya envio los 80 ciclos de reloj y ya no me hace lo de antes.

Ahora el problema que tengo es que para que me conteste que esta lista tengo que resetar el pic nunca lo hace a la primera, y quiero empezar a ver si puedo leer y escribir un sector.

Un saludo.


----------



## h22 (May 9, 2008)

Hola a todos. Estuve leyendo cuidadosamente todos los post, y note que no todos coinciden en cuanto al tamaño de la respuesta R1 que se tiene que esperar por parte de la SD en el proceso de inicializacion y demas.
Algunos dicen que es UN SOLO BYTE; mientras que otros dicen que son TRES BYTES. donde el segundo son los 8 bits del formato R1 y los otros son FFH.
Asi:                              FF01FFH
Esto dependerá de la marca de la tarjeta?... no creo poque SD es un estandar no?
Por favor quisiera que alguien me saque de esa duda.
Muchas gracias!


----------



## monly (May 9, 2008)

Hola h22, es un poco lioso segun la documentacion la respuesta es un byte,pero si miras los diagramas de tiempos puede tardar hasta 8 bytes en darte la respuesta y como la salida DO de la tarjeta esta en alto pues cada vez que les un byte lees FF hasta que te llega el 01 y despues de un comando/respuesta hay que enviar un byte extra con lo que lees otro FF, esto se traduce en la practica a que lees FF01FF, pero la verdad es que no hace falta leerlos con que hagas un bucle hasta que te llegue el 01 te da igual que mande 1 que 5 y cuando salgas de el mandas el byte extra pero ya no te hace falta leerlo.espero haberme explicado bien.

Y lo del standar no se, yo estoy haciendo pruebas de lectura y escritura, y con las rutinas que tengo puedo leer y escribir en una kingston pero en una sandisk no.

La diferencia que he notado por ahora es que la kingston en la respuesta a la lectura manda 
FF 00 FF FE y la sandisk FF FF 00 FF FE.

Alguna idea de porque puedo escribir en la kingston y en la sandisk no.

Gracias


----------



## serchy (May 10, 2008)

hola
Monly, seguramente debes resetear el pic, por que tu haces la inicializacion directamente desde el pic, y como puedes ver un poco mas arriba, (no se a que se debe) debes mandar dos veces el CMD1, pues la primera vez, la tarjeta envia que se encuentra en IDLE. Intenta enviar el comando 1 una vez, esperar la respuesta, y enviarlo otra vez, seguramente ahi va a funcionar bien.

h22, tal como dicen en todos lados, en realidad la respuesta es una sola R1, los 3 Bytes de los que todos hablan, es por que R1 viene despues de un byte o dos, ya no recuerdo bien. De todos modos se soluciona con un lazo que lea la respuesta de la tarjeta y salte, cuando obtenga la respuesta correcta.

Espero que les haya servido...

Si alguien me puede ayudar con el tema de escritura de la tarjeta estaré agradecido.


----------



## monly (May 11, 2008)

Hola serchy, ya me inicia sin problemas.

no se que problema tienes escribiendo,te digo lo que hago yo:

activo chip select
mando el comando, por ahora las direccion del sector la pongo directamente
espero en un bucle que me conteste 00, una vez solo, he leido en algun sitio que esperan 3
mando FF
mando FF
mando FE
mando 512 bytes
mando 2 bytes de crc por ejemplo FF
espero en un bucle la respuesta 05, al byte recibido le hago un and con 1f y lo comparo que sea 05
desactivo cs

Como comente en un post anterior con esta funcion escribo en una microsd de kingston,pero no me va en una sandisk.


----------



## monly (May 11, 2008)

Bueno sigo investigando haber que me pasa con la escritura de la sandisk, he añadido el comando 13 para leer el status de la tarjeta y leo la respuesta r2 y me da dos bytes de 00 00 como que no hay error pero en la tarjeta no escribe nada a alguien le pasa.

He revisado las respuestas de la kingston y es la misma que la sandisk pero no me escribe.

Un saludo.


----------



## Ettneciv (May 13, 2008)

Bueno, al parecer este tema se ha complicado mas de lo debido (sobre todo para los que queremos hacerlo en Assembler), les cuento que despues de leer MUCHO, decidi simular con el Proteus 7.2, aparentemento todo esta bien, el gran detalle es cuando lo pongo en practica.
Lamentablemente no cuento con osciloscopio que seria lo ideal para seguir las señales..Sin embargo AL PARECER inicializa bien mi SD
Pero nunca logro leer datos de la tarjeta

Aqui les dejo mi codigo, espero que sirva de algo para poder asi llegar al resultado deseado...

Nota: disculpenme los comentarios en el programa pero la verdad no soy muy bueno en eso, ademas me parece que es muy sencillo de comprender


----------



## monly (May 13, 2008)

Hola Ettneciv, yo tambien lo estoy haciendo en ensamblador te ayudare en lo que pueda.

He mirado tu codigo asi por encima y he visto algunas cosas, cs lo tienes en bajo antes de mandar los 80 ciclos de reloj y debe estar en alto, las patas de la tarjeta DO y DI deben estar en alto yo tengo DO con una resistencia de pull-pup a 3,3 y DI la pongo en alto por software junto con CS antes de mandar los ciclos de reloj.

Me ha parecido que cuando mandas el comando cmd1 esperas una respuesta 01 y debe ser 00,
la respuesta de cmd0 si que es 01.

de lo que te voy a decir ahora no estoy seguro no se si usas un pic, pero si es asi mira haber las instrucciones de tu pic porque el mio no tiene movfw, es movf  nombre,w.

Yo los comandos que uso y me funcionan siempre para inicializar son el cmd0 y cmd1 y luego le envio cmd16 para pone la longitud de bloque en 512, lo intente con los comandos 55 y 41 y no me funcionaban bien.

Hotra cosa que he visto es que no se si estas poniendo el crc en los comandos pero el unico que lo necesita es es el cmd0 , en spi esta desactivado por defecto, con lo que el ultimo byte puedes enviar FF.

el cmd 16 es para poner la longitud del bloque y debe ser por lo  menos para escritura 512 bytes tu envias 50 00 00 00 03 FF y eso no es valido tienes que enviar para ponerlo en 512 
50 00 00 02 00 FF ,luego cuando envies los comandos de lectura y escritura el ultimo byte de la direccion siempre sera 00, por ejemplo para leer el sector 2 seria 51 00 00 02 00 FF.

Bueno si tienes alguna duda me lo dices e intentare ayudarte.


----------



## serchy (May 13, 2008)

Hola a todos muchachos!
monly, la verdad que no se bien que le pasa a la tarjeta, te comento, la tengo conectada a la pc mediante el puerto serie, de donde envio los comandos y el micro internamente tiene los 512+2CRC bytes a enviar cuando presiono un pulsador (que seria el "dato" a enviar)
Bien. inicializo la tarjeta todo ok , envio comando 24 de escritura, con la direccion 00 00 80 00 indicando el lugar donde empezará la escritura, la tarjeta me responde despues (creo que de dos bytes FF) con 00 indicando que esta todo ok. entonces ahi, envio los datos mas los 2 crc (FF). una vez esto... la tarjeta queda como muerta... no responde, mande lo que le mande, en algunos lados leí que se debe a que en el proceso de escritura no debe detenerse el clock en ningun momento...
Si me podrias mandar tu codigo para que le de un vistazo, me vendria de lujo... MUCHAS GRACIAS.

Ettneciv. tremendo codigo q t escribiste, la verdad es un poco engorroso. no te conviene al menos hasta q pruebes bien el funcionamiento, enviar los codigos uno a uno desde la pc? es solo una sugerencia


----------



## monly (May 13, 2008)

Hola serchy, antes de mandar los 512 bytes de datos tienes que mandar un token de inicio FE

yo envio FF FF FE despues de recibir el 00.

una vez enviados los datos y los bytes de crc  tienes que esperar a recibir un 05 (al dato que recibas tienes que hacerle un and con 1f es la mascara, porque en el token de respuesta los tres primeros bits no nos interesan y reultado sera 05), que son datos aceptados y despues de recibirlo puedes esperar a que termine de escribir mandano ciclos de reloj y te ira contestando 00 ( bus ocupado ) hasta que recibas un ff ahi ya puedes deseleccionarla.  

La secuencia completa seria:
CS en bajo
enviar comando
esperar en un bucle hasta recibir 00
mandar FF FF FE
mandar 512 bytes de datos
mandar 2 bytes de CRC (FF FF)
en un bucle esperar hasta recibir 05 (datos aceptados) ,antes de compararlo hazle un and con 1f
mandar ciclos de reloj en un bucle y esperar aque recibas datos distintos de 00
CS en alto
yo despues envio el comando 13 que es el status de la tarjeta y contesta R2 que son dos bytes y deben ser 00 00 indicando que no ha bido error, sino te indicara el error cad bit es un error diferente.

Ahora no te puedo enviar el codigo pero pruebalo y sino te funciona otro dia te lo pongo.

Un saludo.


----------



## jmi48 (Ago 21, 2008)

Holas gentes....El tema es el siguiente:
Hace un tiempo tome un codigo de este foro para el pic16f876(si mal no recuerdo). lo modifique para el pic18f452 que tiene memoria ram suficiente para leer un sector de 512 bytes. lo simule en el proteus y todo mil maravillas, hasta coloque una imagen de una tarjeta con formato FAT16 y hasta hice un pequeño equivalente del comando DIR.
Pero ahora que tengo el pic"REAL"tengo problemas para leer y escribir la memoria no asi para inicializarla lo cual anda perfecto.
este el codigo que estoy usando para leer:

Read_SD(Sector)
{
int estat;
SD_Adress=Sector*512;

   output_high(CS);      // Deshabilitamos la SD


   // Enviamos un mínimo de 80 clocks para inicializar la SD
   for (i=0; i<10; i++)  SPI_write(0xFF);

   // Habilitamos la Tarjeta SD      
   output_low(CS); 


   SPI_write(0x51);
   SPI_write(MAKE8(SD_Adress,3));      
   SPI_write(MAKE8(SD_Adress,2));      
   SPI_write(MAKE8(SD_Adress,1));
   SPI_write(MAKE8(SD_Adress,0));      
   SPI_write(0xff);
  SPI_WRITE(0xFF);
 estat=SPI_read(0xFF);
 if(estat==1)printf(lcd_putc,"\fHa ocurrido un error al leer");



   while (SPI_Read(0xFF) != 0xFE);      // Espera aquí hasta que recibimos 0xFE
printf( lcd_putc,"\nRecivi 0xFE");

   for (i=0; i<=511; i++)
      {

      buf_ = spi_read(0xFF);      // Leo 512 bytes

      }

      printf(buf);


   SPI_write(0xFF);   
   SPI_write(0xFF);

} 


__


La memoria me responde 0XFE y de ahi en adelante nada. Con el oscilocopio puedo que no hay clock despues de recibir 0XFE.
Tengo dos memorias con la SD  TOSHIBA 2 GB logro recibir el 0xFE y con MicroSD SanDisk 128MB se inicializa perfecto y de ahi en adelante nada. 
POR FAVOR CUALQUEIR AYUDA ME SERIA SUMAMENTE NECESARIA...
SI ALGUIEN LE INTEREZA TENGO INFO DE FAT oficial de Microsoft y otras concluciones que sacado yo.
SALUDOS

  _


----------



## jmi48 (Sep 3, 2008)

hola el codigo de comunicacion con la sd es el que esta publicado en el foro proba_mmc.c aunque para mi sd lo tuve que modificar y aun un sd sandisk no me anda no se bien cual es el tema con eso de las marcas.

Para trabajar con FAT use:

http://homepages.mty.itesm.mx/al778081/ es muy resumida pero da ideas
http://www.ucontrol.com.ar/wiki/index.php?title=FAT_al_desnudo esta esta muy buena en realidad es una traducción de un texto de microsoft con algunos ejemplos buenos.

y luego use el programa Hexplorer para sacar mis conclusiones... tengo pensado hacer una mini guía cunado finalice.

Yo trabaje con fat16 pues la única limitación es la capacidad y para "aparato" que solo almacene datos en txt sobra aunque para hacerlo con Fat32 es minima la diferencia.

Saludos.


----------



## jaiser (Oct 14, 2008)

Ya he resuelto parte del problema con la simulacion en proteus. Hace falta un archivo en la carpeta del simulador que se llama "disk.bin2 para poder simular la memoria, el cual viene en la version de proteus 7.2 sp6. Es importante comentar que la version 7.1 sp2 no la trae.

Si tengo avances los publico. Por favor a los web master del foro, hagan lo posible para que el sistema admita subir los archivos de proteus y asi poder compartir las simulaciones tambien. Gracias.


----------



## nutriax (Oct 14, 2008)

hola, si efectivamente el archivo que te solicita es para emular el contenido de la tarjeta y versiones anteriores no las traia, yo con la 7.2 sp6 me anda al pelo, y en estos dias estoy haciendo la plaquita para probar la memoria.
para compartir los archivos del proteus podes crearte una cuenta en www.4shared.com, ahi te dejan subir hasta 4 gigas si no me equiboco, zipeas toda la carpeta de la simulacion del proteus y despues la subis, ese sitio esta bien piola porque no te hace esperar una banda como rapid o megaupload...
me gustaria que comentes como tenes pensado implementar y para que proyecto...


----------



## Meta (Oct 15, 2008)

Quizás esta información sirva de algo.

http://ww1.microchip.com/downloads/en/AppNotes/01045b.pdf


----------



## nutriax (Oct 15, 2008)

hola, veo que tomo vida de nuevo este hilo del foro...     
bueno, primero alguien sabe si la nota de aplicacion que posteo meta es para implementar el sistema de archivo fat32 con alguna libreria incluida dentro del compilador c18 de microchip? (porque eso es lo que entendi pegandole una ojeada por arriba, despues me pongo a leerlo bien). si es asi habra que traducirlo a ccs asi hablamos en el mismo lenguaje...   
para el jhonatan que pedia la conexion entre la tarjeta y el pic:
pata de la tarjeta                                     pata del pic
clk-------------------------------------------------sck\scl
DO------------------------------------------------sdi\sda
di--------------------------------------------------sdo
cs--------------------------------------------------int
para el programa que esta en este foro l apata int es la rb0, no puse los numeros de las patas porque varia respecto a cada micro, y cabe aclarar que tiene que ser un micro con isp por hardware, aunque tambien se puede hacer por soft pero a la larga te trae bastante complicacion si queres hacer aplicaciones de mucho volumen de información. tambien a cada pata tenes que agregar el divisor resistivo para adaptar el voltaje.
tambien te aconsejo usar un micro de la serie 18f ya que tiene suficiente ram para poder manejar bien los bloques de memorias y poder implementar fat.
cualquier duda consulta y anda posteando resultados... 
yo estoy haciendo las placas para probar y lo quiero implementar con un 18f2550 que es un canio ese micro.


----------



## Meta (Oct 15, 2008)

Hola a todos y a todas:

Me gustaría ver a alguien de aquí, hacer y/o controlar una memoria de tarjeta con un PIC, sea en C o en ensamblador (ASM).

Más información en http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1469

Pulsa abajo donde dice Storage.

AN1045
AN1189
AN1210
AN914

Parece que *NANO1985* se cansó, el creador del tema.

Un cordial saludo.


----------



## Moyano Jonathan (Oct 15, 2008)

Muchas gracias , voy a ver si empiezo a hacer algo con las targetas sd que me tienen tan intrigado , a nutriax ¿ que pic , me decis que tiene  isp por hardware? no es i2c o spi?
igual gracias por la respuesta tan rápida .


----------



## nutriax (Oct 15, 2008)

jajaja si parece que se canso y tiro todo al carajo....         
bueno jonathan, primero antes que nada i2c no es igual que spi, por mas que microchip utilise internamente componentes en comun, pero no son iguales.
estaria bueno que busques como es el protocolo i2c y el spi para que entiendas mejor la diferencia pero del vamos ya tienen capacidad de transferencias totalmente distintas el i2c llega a 20k mientras que el spi puede llegar mas de 20 megas...
segundo, los pic que implementan spi por hardware son muchos, pueden ser 18f2550 (el que yo voy a usar), el 16f877 que usa el creador de este hilo, el 18f4550, etc. como te dije antes, yo personalmente me tiraria por la serie 18f ya que tienen mas memoria ram, y hasi despues poder implementar el sistema de archivos fat.
cualquier cosa posteen...


----------



## Meta (Oct 15, 2008)

Hola:

La comunicación del I2C en ASM lo explica muy bien en este libro www.pic16f84a.org mientras que el SPI no tengo idea pero dicen que es mejor.

Los 18F más bien utilizarlo si utiliza C, los 16F si utiliza ASM, si se te ocurre usar el 18F en ASM, más prestaciones tiene ya que puedes ahorrar más códigos dentro del mismo programa, y de memoria RAM, hay de sobra.
Aún así, los 16F se usan más y venden más, con los años veo que cada vez se utilizan más los 18F.

Habrá que enviarle un privado al creador del tema para que se entere que ya hemos hablados unas buenas páginas. Esto es lo que pasa en un proyecto ambicioso.

Un cordial saludo.


----------



## nutriax (Oct 15, 2008)

tiene razon meta, pero tambien tenemos que ser realistas, hoy en dia el que programe el protocolo spi, la comunicacion con la mmc o sd e implemente un sistema de fichero en asm, realmente tiene huevos de oro....
yo ni en pedo me pongo a perder tiempo para este tipo de aplicacion, unicamente utilizo asm en cituaciones criticas y cuando necesito control total de tiempos y de hardware, pero en este tipo de aplicaciones ya tenes todos los protocolos programados en c, simplemente los tenes que usar...
si lo hiciera en asm tardaria muchisimo tiempo (calculo que mas de 100000 lineas de codigo fasil) y obtendria practicamente el mismo resultado. y por lo que salen los 18f... ni lo pienso...


----------



## Meta (Oct 15, 2008)

nutriax dijo:
			
		

> tiene razon meta, pero tambien tenemos que ser realistas, hoy en dia el que programe el protocolo spi, la comunicacion con la mmc o sd e implemente un sistema de fichero en asm, realmente tiene huevos de oro....
> yo ni en pedo me pongo a perder tiempo para este tipo de aplicacion, unicamente utilizo asm en cituaciones criticas y cuando necesito control total de tiempos y de hardware, pero en este tipo de aplicaciones ya tenes todos los protocolos programados en c, simplemente los tenes que usar...
> si lo hiciera en asm tardaria muchisimo tiempo (calculo que mas de 100000 lineas de codigo fasil) y obtendria practicamente el mismo resultado.
> 
> ...


----------



## nutriax (Oct 15, 2008)

con mas razon si el 16f877 esta al mismo precio que el 18f4550, que este ultimo tiene mas memoria RAM y eeprom y mas funcionalidades y usb 2.0 (que creo que el 16f877 no trae usb o si trae es 1.1).
yo al 16f877 lo vi en 18-20 $ y el 18f4550 en 40$.


----------



## Meta (Oct 15, 2008)

Hola:

Vamos a ver si alguien de aquí en España ha visto el 16F877A y el 18F4550 entorno al mismo precio o yo sueño.

por eso me preguntaba, si hay un 18F4550 con los mismos patillajes y más memoria, ¿para qué quiero un 16F877A o el sustituto 16F887?

Saludos.


----------



## nutriax (Oct 15, 2008)

hola nuevamente.
aver vamos a investigar un poco, pero principalmente la diferencia esta en que vos estas en españa y yo en argentina.
aca en argentina sale:
16f877 -> 6.99 dolares.
18f4550 -> 9.42 dolares.
el 16f877 tiene:
368 byte de ram
256 byte de eeprom
memoria flash 8k
33 i/o
8 adc de 10 bit
20mhz.
-------------------------
el 18f4550 tiene:
2048 byte de ram
256 byte de eeprom
memoria flash 16k
34 i/o
adc (no se cuantos tiene)
48mhz.
usb 2.0
-------------------------
y todo eso por la diferencia de 2 y pico de dolares. (estos los compre a los dos junto con el 18f2550 la semana pasada)
segun lo que entendi vos dijiste que alla esta al mismo precio... eso es lo que no me cierra, si esta al mismo precio, yo compraria el 16f4550.
aunque esto es simplemente detalles, pero yo le aconseje a jonathan que compre la serie 18f porque si despues lo quiere usar para otra cosa se le puede sacar mucho el jugo y tambien se puede probar comunicacion usb 2.0.
y tambien para que no le pase lo mismo que el que creo este hilo que no podia leer los 512 byte del bloque de la mmc, sino que podia leer unicamente los 16 primeros bytes (si no mal recuerdo) (para ver bien el tema leer los primeros post de este hilo).
por lo menos yo probaria intentar hacer andar las cosas y despues reducir codigo y demas para migrarlo a un micro mas chico (si es que no se quiere desperdiciar recursos en el proyecto o es para produccion masiba).


----------



## Meta (Oct 15, 2008)

Hola:

Aquí hay precios diferentes.
http://www.msebilbao.com/tienda/advanced_search_result.php?keywords=pic&sort=3a&page=2



Saludos.


----------



## nutriax (Oct 15, 2008)

si, eso puede ser por el peso que tiene la moneda de ustedes, nosotros tenemos una tremenda devaluacion y por eso capaz que bajen los precios aca, porque si no microchip no vende ni un micro...
tambien ustedes tienen mucha ventaja, porque pueden ordenar los samples, microchip no manda samples a argentina porque son tan vivos que los pedian y despues los vendian... (digo vivos para no decir manga de cornudos...  :evil: )  
por cierto, vos probaste hacer andar la mmc con un pic?


----------



## Meta (Oct 15, 2008)

A mi no me los dan, eso si estás un instituto.

http://sample.microchip.com/Default.aspx?testCookies=true


----------



## nutriax (Oct 15, 2008)

haaaa pense que eras estudiante...
bueno igual 10 euros no es mucho, por todo lo que hace le micro se lo merece   
bueno avisa si lleas a implementar la comunicacion con la tarjetita...
esto mas que un foro parece un chat...     
vamos por mas hoy casi llevamos 2 hojas... Que pasa con el creador de este hilo que no aparece?


----------



## Meta (Oct 15, 2008)

Dejé ser estudiante desde Junio de este año.


----------



## Moyano Jonathan (Oct 15, 2008)

Gracias por los comentarios , lo de spi e i2c te pregunte por que habias puesto :

para el programa que esta en este foro l apata int es la rb0, no puse los numeros de las patas porque varia respecto a cada micro, y cabe aclarar que tiene que ser un micro con *isp* por hardware, 

esto fue en la pag 7 respuesta #83 y vos escribiste isp en vez de spi por eso me equivoque
 

Igual muchas gracias por las respuestas , 

pd: Aca en mendoza los PIC18F2550, salen ...............nada mas ni nada menos que $43 c/u muyyy caros
igual como mi fanatismo por la electronica llega más alla me compre 5 para proyectos y un clon del pickit2 que publicare mas adelante.


----------



## nutriax (Oct 15, 2008)

jajaja si tenes razon, me confundi yo...
muy bien, te digo que yo lo pague al 18f2550 unos 9 dolares, pero los mande a pedir a bs as...
bueno espero que posetees para ver como ta va con la tarjetita y avisame cuando postees lo del pickit2 (nunca lo escuche nombrar y mucho menos tengo idea de que lo que es).
bueno cualquier cosa ya sabes donde postear   
espero que este hilo no se frene mas como sucedio antes...


----------



## Meta (Oct 15, 2008)

10 € cuesta el 18F2550 en España.

http://www.msebilbao.com/tienda/product_información.php?products_id=337

¿Cuántos $43 son en €uros? porque si son cerca de 40€ o 8.000 de las antiguas pesetas, es muy caro. Mejor comprarla en www.ebay.es o en www.amidata.es


----------



## Moyano Jonathan (Oct 15, 2008)

A nutriax: 1° dooooooonde lo compraste jaja q te salió tan barato?
              2° el pickit2 , es un programador/depurador de pics por puerto USB 2.0

a meta:    No me vas a creer me dá exactamente 10 euros jajajaj, o sea mas o menos aca 

1 euro ---> $ 4.30 o sea muy devaluado el $ ajajja


----------



## nutriax (Oct 15, 2008)

y mira el 1 euro es 4.373 $ (pesos argentinos) osea que alla si sale 10 euro equivale a 43 pesos argentinos.
yo lo pague al 18f4550 9.42 dolares o sea 29.76 pesos argentinos o sea 6.8 euros. (por lo que ami no me parece caro) ya que este es el precio mas barato que encontre, igual me parece que por aquellos pagos lo podes conseguir mas baratos, busca en otra pagina de electronica de alla que tiene que estar mas barato.


----------



## Moyano Jonathan (Oct 16, 2008)

claro mirá , yo lo compro a un distribuidor de Cika electrónica, que se encuentra en bs as , al mismo precio que vos pero tengo el problema que me cobran el envio o sea para darte un ejemplo:

PIC18F4550 --> u$ 15 + envio $ 10 se me hace mas o menos $55 cada integrado lo cual para mi es un poco caro , igual te hacen descuento por cantidad pero es minimo


----------



## nutriax (Oct 16, 2008)

si logicamente, yo lo compre en elemon, pero tenes que pagar el envio mas un plus de preparacion de pedido mas un plus del cadete que te lo lleva al correo o a la terminal segun el tipo de envio que quieras (correo o encomienda) mas el seguro y todo eso, pero yo me arme un paquete de unos 30 o 40 componentes con lo cual si divido todos esos gastos entre los 30 0 40 componentes el precio de los componentes no aumenta mucho, aca porque yo soy de villa maria y no consigo los componentes osea que si o si los tengo que mandar a pedir a bs as o a cba, pero en cba estan mas caros (aunque me salga mas varato el envio igual compensa con el precio).
yo el precio que pase es el que me facturaron, (sin agregarle los costos extras que son muchos).
pudiste hacer alguna prueba jonathan? contanos para que proyecto queres hacer andar la tarjetita?


----------



## nutriax (Oct 16, 2008)

Paloky dijo:
			
		

> Hola.  Por fin he conseguido que funcione todo correctamente.
> 
> Ahora ja puedo leer y escribir en cualquier sector de la tarjeta.
> 
> ...



para meta, aca esta el mensaje que te dicia que no podia lee los 512 byte del bloque de la tarjeta...
es el mensaje 20 pagina 2 de este hilo.


----------



## Moyano Jonathan (Oct 16, 2008)

Y mi proyecto consiste en un datalogger USB que guarda los datos en la SD, tambíen quiero que los datos los muestre por una pantalla lcd el microcontrolador que pienso utilizar es el PIC18F2550


----------



## nutriax (Oct 16, 2008)

pero que te logee que tipo de datos? temperatura, velocidades, volumen, que tipo de dato es el que guardas?


----------



## Meta (Oct 16, 2008)

nutriax dijo:
			
		

> Paloky dijo:
> 
> 
> 
> ...



Ya veo, por algo será.

Si metes tarjetas de hasta más de 4GB ya tienes de sobra hasta para hacer un Webserver que quieras.







http://www.msebilbao.com/tienda/pro...d=451&osCsid=0ac6d0674314c2e7d437a7cae832665d


----------



## nutriax (Oct 16, 2008)

si justamente es por lo que te dije (por memoria ram) por lo que no puede leer mas de los 192 bytes principales, lee el codigo fuente y compilalo y despues recien ahi te vas a dar cuenta por que es esto...
con respecto al servidor web tambien esta en mi mente hacer uno pero primero quiero hacer este proyecto de la tejetita...
y he visto muchos modulos como el que mostras pero el que mas me gusto es el de tibbo que esta todo dentro de un solo encapsulado y tiene 4 led de indicacion tx, rx, link y conexion.
y a que no saben como se comunica el pic con este componente? siiiiiiiiiiii por spi jajaja      asique mejor apronder a usar el spi para las tarjetas y despues encaramos el otro proyecto...
repito este esta muy bueno porque no tiene placa extra ni nada por el estilo...
aca tienen una imagen para que lo vean





y la pagina del fabricante (tiene muchos modulos parecidos)
este es el link http://www.tibbo.com/em202.php


----------



## Meta (Oct 16, 2008)

Hola:

Hay que ver el motivo de no guardar bien los datos. Para estas cosas es mejor usar PIC18F.

Lo del *WebServer*, parece muy bueno el que indicas, de hecho lo es hasta la comunicación. Tengo el libro www.pic16f84a.org donde te explica muy bien el protocolo de comunicación I2C. En cuanto al SPI que cada vez veo que se usa más y que tiene 20MHz de velocidad de datos, está muy bien porque funciona más rápido que el I2C sobre todo si usas imágenes.

Saludos.


----------



## Moyano Jonathan (Oct 16, 2008)

Tengo que guardar datos de temperatura , cantidad de luz, humedad 
tengo que guardar un informe de lo sucedido con esos parámetros durante 1 dia y luego enviar esos datos a la máquina por puerto usb


----------



## nutriax (Oct 16, 2008)

y porque no juntamente con esos datos guardas la fecha y la hora en que fue tomado el dato? eso lo haces facilmente con un ds1307 (aparte de la memoria sd para guardar los datos) y conexion i2c o tambien creo que el ds1304 o el ds1302 era por spi, este es un reloj calendario y esta muy bueno, te da el dia de la semana fecha y hora, y ademas tien memoria (chiquita pero para guardar algun datito sirve).


----------



## Moyano Jonathan (Oct 17, 2008)

voy a utilizar el ds1307 para el rtc , como vos decis y el SHT71, para la humedad y temperatura. Para la luz tendría que usar un ldr conectado al adc del micro luego esos datos guardarlos  de a tres (luz,temperatura,humedad), junto con la fecha y guardarlos en la sd para que al pasar un día me los envíe por usb a la pc


----------



## Moyano Jonathan (Oct 17, 2008)

El tema es que esos datos me los tendría que guardar en archivo del tipo .txt y veo que se me va a complicar bastante, pero voy a tratar igual


----------



## nutriax (Oct 17, 2008)

no te creas que se te va a complicar... igual yo quiero guardar en un archivo txt y eso lo podemos desarrollar en conjunto a traves de este foro, primero yo me voy a centrar en leer y grabar en la sd, pero despues voy a implementar fat para eso, si te prendes podemos desarrollarlo juntos y por este foro.
una pregunta, cuanto pagaste el sensor de temperatura y humedad?


----------



## Moyano Jonathan (Oct 17, 2008)

Gracias nutriax por el apoyo, mirá el SHT71 me sale u$15 y el ds1307 u$ 7 pero todavía no los compro los voy a pedir a fin de mes , por que ando corto de plata con los 3 pic18f2550 me gaste $133.50 y no me queda mucha guita asi que estoy ahorrando , pero mientras tanto voy a ir desarrollando el código para ir escribiendo la SD con el ejemplo de proba_mmc aunque todavía lo estoy tratando de entender , lo del USB ya lo tengo un poco más claro. Como vos decís me adiero para desarrollar el código en CCS   

PD: Tambíen pienso adquirir un PICKIT2, con lo cúal voy a poder programar más cómodo con la laptop ya que la pc y el jmd o el clon de propic2 que tengo hay veces que no funciona del todo bien.


----------



## Meta (Oct 17, 2008)

Si hacen grabar algo en una tarjeta de esas nos lo hacen saber. Por cierto. ¿De cuántas megas o gigas son?


----------



## Moyano Jonathan (Oct 17, 2008)

128 mb hasta ahora he visto , pero se puede llegar a memorias más grandes con un pic que tenga mas memoria ram para guardar los datos


----------



## nutriax (Oct 18, 2008)

bueno me alegro que te adieras para desarrollar el codigo en ccs...
con respecto a la capacidad de la memoria no esta dado por la memoria del pic, esto es un eror que se comete y es muy comun cometer este tipo de errores, paso a explicar, y de paso aca se van a dar cuenta de porque este muchacho puede leer hasta los primeros 192 byte y tambien se van a dar cuenta de porque se necesita mas memoria o pic mas grande...:
si se ponen a leer información de las tarjetitas, ya sea de 8mb 16mb, 32mb,64mb.... asi hasta 8gb, 16gb,32gb, etc etc etc... dicha información dice que en cualquiera de estas tarjetas se lee y se escribe por bloque (de 512 byte), es decir que las transacciones son atomicas y que cuando uno graba o lee si o si se hace de 512 byte.
entonces que pasa... supongamos que todos estamos trabajando en el proyecto de jonathan.
definimos cuantos byte se usan para reprecentar las muestras que va a guardar
datos utilizados para fecha y hora ocupan 8byte (esto es una suposicion y puede ocupar menos o mas byte)
datos utilizados para temperatura ocupan 2byte
datos utilizados para humedad ocupa 2byte
datos utilizados para algun checksum o algo asi ocupan 1byte
con lo que tenemos 13byte.
ahora como lo guardamos en la memora?      
tenemos comunmente 2 formas(pueden existir mas alternativas pero voy a explicar las 2 mas comunes), ir grabando en tiempo real, o buffereando
grabando en tiempo real es:
1- inicializar tarjeta y todo lo demas... (para mas explicacion veer los primeros post)
2- indicar a la tarjeta en que direccion lo voy a grabar.
3- tomar fecha y hora.
4- grabar fecha y hora.
5- tomar humedad.
6- grabar humedad.
7- tomar temperatura.
8- grabar temperatura.
9- esperar x tiempo (que es el tiempo entre muestra y muestra eso lo estima el amigo jonathan segun como lo quiera hacer el y que frecuencia de muestreo se adapte mejor a su proyecto)
10- repetir desde paso 3.
cabe aclarar que a medida que uno va grabando se ingrementa sola la posicion (eso creo, ahora entre un poco en duda pero es cuestion de verlo a eso).
pero en esencia lo que hace es ir grabando nomas.
la otra forma es, mantener un puntero a la ultima direccion que se grabo para saber cual es la siguiente libre, y hacer lo siguiente.
1- inicializar tarjeta y todo lo demas... (para mas explicacion veer los primeros post)
2- indicar a la tarjeta en que direccion lo voy a grabar (la direccion del ultimo bloque que se grabo, es decir del ultimo bloque de 512 byte que se grabo).
3- leer el bloque (digo leer todo el bloque porque si o si se tiene que leer todo, eso es por protocolo de la tarjetita y a este bloque lo tengo que mantener en memoria del micro para poder modificarlo)
4- buscar dentro del bloque cual es la direccion del primer byte libre.
5- tomar fecha y hora.
6- grabar fecha y hora dentro del vector que tiene el micro con los 512 byte.
7- tomar humedad.
8- grabar humedad  dentro del vector que tiene el micro con los 512 byte.
9- tomar temperatura.
10- grabar temperatura  dentro del vector que tiene el micro con los 512 byte.
11- si se lleno el bloque (los 512 byte) grabar bloque de 512 byte pisando el bloque viejo (el que leimos en el paso 3), sino seguir en el paso tres hasta que se llene el vector de 512byte.
12- esperar x tiempo.
10- repetir desde paso 3.
esta forma ustedes diran que es mas complicada y que es muy tediosa al vicio, pero asi es como se deberia hacer, y de hecho asi es como lo hace el sistema fat, esto es porque es mas rapido trabajar con los bloques levantados en memoria y mas eficas y no produce un bloqueo de la tarjetita.
tambien ronda un monton de teoria que tratan a dicho tema y ni porsupuesto tambien tenes que manejar toda la paginacion de esos bloques, todo eso es otro monton de teoria que ya me lo tuve que comer en la facultad y me gusta  , pero es muy tedioso programar eso   pero de eso ya se encarga el sistema de archivo fat.
por eso es importante que definas como vas a grabarlo.
lo que le pasa al amigo que hizo el prueba_mmc es de la segunda forma, por eso el 16f877 no tiene lugar para leer los 512byte, sino que lee los primeros 192 byte y los manda a un vector para procesarlo (como explique anteriormente), esto lo hace leyendo y almacenando, y va preguntando si se va a leer el byte numero mayor a 192 entonce dar los clock para leerlo peor no almacenar el resultado, esto es simplemente porque uno cuando hace el programa utiliza variables y un par de cosas mas como las funciones que te chupan la memoria ram del micro, y por ende le quedan unicamente libre 192 byte que lo usa para este vector.
ahora imaginensen usando sistema fat para el 16f877, directamente no nos compila el css porque nos dice que no tenemos la memoria ram suficiente en el micro para correr el programa.
espero que les guste mi explicacion y que me entiendas, sino pregunten.


----------



## nutriax (Oct 18, 2008)

para que quede claro el porque no esta bien lo que dice jonathan en su ultimo mensaje:
es que no importa el tamanio de la tarjeta, sino que importa tener la suficiente ram para el bloque y para tener un puntero por ejemplo de 32byte para poder direccionar los 2 a la 32 bloques (bloques de 512byte), es decir que con un puntero de 32 byte podemos direccionar 4294967296 bloques, es decir 2199023255552 bytes, lo que es igual a 2048 gb (si es que no saque mal la cuenta).
lo que si se complica un poquito es apartir de las memorias de 4gb en adelante, ya que usa un protocolo modificado, ya que es para mayor velocidad y para mayor capacidad (HD).
espero que quede todo claro... sino pregunten.


----------



## Meta (Oct 18, 2008)

Hay que programar mucho y en ASM te pegas años.


----------



## Moyano Jonathan (Oct 18, 2008)

Muchas gracias por corregirme nutriax, mirá ya me he facilitado la vida consiguiendo un proyecto completo como lo que yo quiero, es más con código fuente y todo + librerías 
lo único que me hace falta ahora es lo de  la SD y el tema de FAT16    

PD: 

Me compré los benditos PIC18F2550......haa cuanto me costó conseguirlos   

haa también me salieron bastante saladitos 44$ c/u con iva incluido


----------



## Moyano Jonathan (Oct 18, 2008)

Les posteo lo que he conseguido en una de esas le sirve a otro.

Aca está lo del proyecto que les comente + lo de transmisión de datos por usb

Algo importante para aclarar es que lo baje todo de la pagina de J1M (Foro todopic) , con lo cúal la mayor parte
de las cosas son de su autoría (freeware)

www.hobbypic.com/


----------



## Moyano Jonathan (Oct 19, 2008)

Nutriax , conseguí algo muy importante , si no me equivoco creo que son las rutinas para implementar el protocolo fat16 con un pic 
está en C de CCS, en inglés de la pag de CCS espero que me ayudes a entender un poco ya que el código es bastante complejo y largooooo


----------



## nutriax (Oct 19, 2008)

Bueno Jonathan, probaste el prueba_mmc? primero te aconsejo que hagas eso antes de meterte con lo otro...
no hay drama para ver el codigo del fat16, pero en estos dias no voy a poder mucho porque la facultad me tiene mal  pero calculo que el sabado que viene lo veo sin problemas, y para ese entonces tambien espero tener las placas echas para grabar y leer el "Hola mundo..."    
una vez echo eso ahi me voy a meter de lleno en la fat, pero mientras hago andar el hola mundo te ayudo con el fat16, eso si haceme caso y trata de leer y escribir con el prueba_mmc, asi te aseguras de que este bien el circuito, codigo spi y todo eso.
me gusta que avance cada ves mas este tema... 
probalo y postea que resultados obtuviste.


----------



## Moyano Jonathan (Oct 19, 2008)

ok nutriax me voy a tener que hacer de algunas monedas para comprar el pic16f877 y una memoria sd de 1gb para ver el hacer las pruebas , cuando tengas tiempo y algo definido de la fat16 me contas


----------



## nutriax (Oct 19, 2008)

no hace falta que compres el 16f877 ni ninguna memoria. probalo con lo que tenes (18f2550 y la memoria de 32megas si no mal recuerdo).
sabes como convertir el probar_mmc para el 18f2550? sino avisame yo te lo comvierto para que lo pruebes...


----------



## Moyano Jonathan (Oct 19, 2008)

El tema nutriax es que no he podido programar el pic18f2550 , me he matado la cabeza haciendo placas inservibles y no lo he logrado, mañana inmaginate voy a armar el te - 20se
haber como me va , con lo de convertir el programa para el pic te lo agradesco

pd: no tengo ninguna sd solamente la del celular pero no voy a arriesgarme a quemarla , mejor me consigo una barata con el adaptador y listo 

desde ya muchas garcias por ofrecerte a ayudarme con lo de fat16


----------



## nutriax (Oct 19, 2008)

pero cual es el problema con el 18f2550? que es lo que no anda o no te sale? o no lo podes programar?


----------



## Moyano Jonathan (Oct 19, 2008)

y el problema que tengo es que no me han andado los circuitos programadores:

el propic2, el gtp_lite , hice algunas pruebas no muy concretas con el art2003, el programador serial de pocos componentes que postee etc

por eso no puedo trabajar con ese pic, pero no me voy a dar por vencido.

menos mal acá la sd de 1gb + adaptador $21 por lo que no sale tan caro así que voy a ver si durante la semana me hago de un poco de tiempo y hago algunas pruebas igual todavía no consigo el ds1307 y el sth11 para comenzar con el proyecto en si pero a fin de mes me llegan junto con algunos $$$ para comprarlos


----------



## nutriax (Oct 20, 2008)

oye, el pickit no es programador? yo tambien estoy interesado en comprar el sth11, y podriamos de ver de pedirlo juntos asi nos sale un poco mas barato, tendriamos que ver cuanto te sale por aquellos pagos y ver cuanto sale se lo pedimos juntos.
y de ultima porque no te compras un programador usb que abarca toda las gamas de pic? yo tengo uno que anda un caniaso....


----------



## Moyano Jonathan (Oct 20, 2008)

Conseguí el pic16f877 a $28 todavía tengo que conseguir el sht71 y el ds13o7

nutriax , estan son las conexiones para el pic y el sd?


----------



## nutriax (Oct 20, 2008)

en donde compraste el pic?
si la conexion esta bien, pero para el programa prueba_mmc que esta este foro le tenes que poner la pata del cs de la tarjeta al rb0 y vos la tenes el el rc2, a mi entender podes usar cualquiera siempre y cuando la redefinas en el programa, digo que podes usar cualquiera en el sentido de que esa pata no esta implementada por hardware con el protocolo spi.
una cosa mas que observe es que tenes los pin (de la tarjeta) al reves, depende de como mires la tarjeta...
mas vale subi una foto de la tarjeta y escribile con el paint a que pata corresponde cada una y yo te digo si es asi (no es que yo sepa como van, pero es de la forma que vi que todo el mundo hace y que yo voy a implementar en estos dias)


----------



## nutriax (Oct 20, 2008)

haa me olvidava las resistensias que voy a usar son igual que la tuya pero en ves de usar las de 2k2 como vos voy a usar las de 1k8...
de donde sacaste ese circuito?
el regulador de 3.3v lo conseguis facil? en donde?


----------



## Moyano Jonathan (Oct 20, 2008)

yo también pensaba usar las de 1.8k pero como los voltajes no son muy críticos voy a utilizar las de 2k2. El circuito lo saqué del manual de microbasik en donde además tienen rutinas para fat16 y usb. El regulador de 3.3v no lo he buscado pero me parece que voy a utilizar otro por que lo veo poco encontrable al que aparece en el esquema


----------



## nutriax (Oct 21, 2008)

sisi, definitivamente no se encuentra ese regulador, y no conozco ninguno de 3.3v, va mejor dicho no conozco ninguno que aca se consiga...
de donde lo bajaste a ese manual?


----------



## jaiser (Oct 27, 2008)

Saludos, yo tambien estoy trabajando con las memorias mmc y he logrado inicializarla un poco diferente y tambien escribe los datos aunque no todavia en fat.

Este archivo contiene la simulacion y el programa en ccs asi como el .hex. Esta libreria usa pines diferentes a los predeterminados para protocolo spi pero funcionan y tambien brinda mayor flexibilidad porque se puede escoger que pines del pic usar


----------



## jaiser (Oct 28, 2008)

si tienen dudas del regulador aun, deben usar un zener que se consigue de 3.3v, porque ningun regulador integrado es tan preciso, a menos que trabajen con un regulador variable lm317 o el lm350 (el que viene en encapsulado TO-220), aunque estos manejan mucha corriente y eso aqui no es necesario. Recomiendo usen el zener.


----------



## nutriax (Oct 28, 2008)

Hola, lo pudiste probar fisicamente?
yo voy a usar un lm317 con un par de resistensias para los 3.3 (con las resistencias que tengo llego a 3.37v)
bueno espero que no se duerma este foro, yo estoy probando las placas experimentoras que realize, asi despues me puedo tirar de cabeza con esto...


----------



## jaiser (Nov 2, 2008)

Aun no lo he probado porque estoy con el reloj de tiempo real DS1307, que ya resolvi el error que tenia, apenas lo pruebe les aviso, aunque ahora tengo que cambiar el pic por un 18F porque necesito mas memoria para el programa, ademas estoy haciendo el socket para la memoria mmc.

Seguro lo pruebo primero en proto y luego les aviso.


----------



## Moyano Jonathan (Nov 2, 2008)

Yo tengo librerías de control en CCS para el DS1307, que funcionan , acá están


----------



## Meta (Nov 2, 2008)

¿Ya hicieron algo?


----------



## Moyano Jonathan (Nov 3, 2008)

Yo por mi parte me gaste la considerable suma de $300 en el programador / debugger pickit2, para que el tema de la programación ya no me dé problemas , así que puedo experimentar a gusto programando desde la laptop sin problemas.

Por el tema de la memoria SD, retomo el fin de semana que viene osea este sabado con el tema de la memoria
por que el finde anterior estuve experimentando un poco con el tema del usb y me fue muy bien , pero he gastado tanta plata en el programador que me quede sin un mango para la sd, además valga la redundancia los estudios me tienen jodido de tiempo. Pero este fin si me junto un par de monedas compro los componentes que me hagan falta y comienzo de una vez por todas a trabaja.

pd: También tengo el proyecto del pickit2 clon que publicaré en cuanto esté funcionando.


----------



## Moyano Jonathan (Nov 3, 2008)

Nutriax, que regulador de voltaje usaste para la memoria?

A la memoria la voy a probar con la targeta pic_dem4 demo board


----------



## nutriax (Nov 3, 2008)

sisi meta, ya empece, va lo que se puede decir empese porque estoy con la tesis a full y parciales y trabajos practicos... y armar las placas me llevo muchisimo mas tiempo del que esperaba, porque ya que arme me arme hasta un modulito para el rtc, ahora queda conectarlo y listo... pero como comente anteriormente pude hacerla inicializar a la tarjeta, (si leen en los datasheet de las tarjetas antes de hacerla andar hay que inicializarla y pasarla a modo spi).
jonathan... que bueno que apareciste... mejor asi que te ande el usb, yo lo tengo pendiente porque me intriga mas la sd      (pero tambien junto con las placas me hice una placa para conectar un usb), tambien hice una placa para 2 rs232, la placa de la mmc y la placa experimental para acoplarle cada uno de estos modulitos... por eso levo mucho tiempo... pero bueno a esta todo echo... ahora a jugar con los juguetes nuevos...     
tambien en post anteriores te mensione que lo alimento con un lm317 y sus respectivas resistensias para que me de el voltaje justo...
el picdem ese que mostras en la foto es original? que es debugger? mucho no los conozco a esos modulos...
yo compre un programador usb a un tipo que me lo vandio 150 pesos y lo fabrica el mismo y anda al palo... y el debugger (supuestamente compatible con el de microchip) sale 250 pesos...
ha... me olvidaba queria preguntarte que estudias jonathan...


----------



## Moyano Jonathan (Nov 4, 2008)

Hola a todos

el año que viene me recibo de técnico electromecánica con especialidad en electrónica y automatización industrial. Ya entendí lo del lm317 no me fije en los post anteriores jejej. El picdem es el original de microchip que me vino junto con el pickit2.

yo también me estoy fabricando un entrenador con el pic16f877a , con sus respectivos módulos igual a lo que estás haciendo vos pero mi tiempo en esta semana como la anterior es muy reducido    

ya me hice el adaptador para la sd. Despúes posteo la foto para que veas si está bien

Nutriax, mirá ya termine con el adaptador y quería saber si estaba bien.

Ahora quería saber como hago para escribir un string de datos por ejemplo: 0x01,0x02,0x03,0x04...etc en la memoria sd y despues volcar esos datos en un display de 7 segmentos.

luego PALOKY, dice que con más ram puedo acceder a los 512 bytes de cualquier sector de la targeta, pero no entiendo como inplementar los registros faltantes en un pic18f2550 

Otra cosa es como se que la targeta ha sido bien iniciada , leida o escrita 

Acá posteo la foto del cableado de la memoria

pd: si tenes fotos y pcb de las placas que hiciste estaría bueno verlas , si se puede por supuesto  

desde ya muchas gracias


----------



## nutriax (Nov 4, 2008)

Hola jonathan, primero te comento que pude inicializarla, pero todavia no lee ni graba en la memoria, pero si anda el inicializado es porque el protocolo, alimentacion y demas estan de fabula, por lo que seria una pabada implementar lo que queda...
pero para inicializar hay que mandarle in par de comandos a la tarjeta.
inicializar se le llama (como he dicho un par de post atras) a pasarla a formato spi.
para lo cual tenemos que mandar minimo 80 clocks sin habilitar la tarjeta y luego habilitar la tarjeta y mandarle el comando 0x40,0,0x95 (no recuerdo que era ese comando pero creo que es para decirle que se pase a modo spi.
si nos devuelve distinto de 1, estamos al horno, porque hay algo mal.
si nos devuelve 1 le mandamos el comando 0x41,0,0xff y ahi tenemos que esperar que nos devuelva distinto de cero, y si nos devuelve distinto de cero... ya esta inicialisada y listo el pollo...
por eso uno sabe cuando esta inicializada o cuando no...
y por eso digo que si la inicializas lo otro es enviar y recibir....
para implementar los 512 byte no te apresures, primero hacela inicializar... despues yo te ayudo porque tambien estoy interesado...
respecto a las fotos, no tengo camara cerca pero ni vien tenga las levanto...
y otra cosa soldaste 2 o 3 cables demas en la tarjetita       porque para spi no se usan todos los pines...


----------



## Moyano Jonathan (Nov 4, 2008)

Ok , nutriax gracias , pero cuales son los cables que solde de más   

así el jueves que tengo más o menos libre me pongo a hacer algo con la targeta    

pd: Ya solucione el problema del regulador con el lm317 como hiciste vos


----------



## nutriax (Nov 4, 2008)

te enumero las patas viendo los contactos apartir del lado que tiene el chaflan a 45 grados (la mas cerca al chaflan la llamamos pata 1)
pata 1 = dat2 esta esta de mas
pata 2 = cs
pata 3 = di
pata 4 = vss1
pata 5 = vcc
pata 6 = clk
pata 7 = vss2
pata 8 = do
pata 9 = dat1 esta tampoco va
esto seria lo que pude ver, despues tene cuidado al conectarla a la corriente por el voltaje...


----------



## jaiser (Nov 7, 2008)

Saludos muchachos, tambien estoy en esto de la memoria SD y he avanzado bastante, pero quiero que todos estemos al mismo nivel porque asi avanzamos mas entre todos. Voy a comenzar por mostrar los pines de la memoria SD que tambien pueden reemplazar por una MMC como se llama la libreria en ccs, esto se ve en la imagen adjunta.

Jhonatan tienes mucha habilidad para soldar, pero como dice nutriax no son todos los pines. Fijate en la imagen son solo los pines 1, 2, 5 y 7, tal cual esta numerado en la figura.

Aclarado el punto de los pines y la conexion es importante la forma de comunicacion con la memoria. El protocolo es SPI, el cual puedes simular en el proteus sacando el modulo correspondiente que te muestra la información que estas enviando a la memoria mediante una consola que sale cuando arranca la simulacion, con ella ves tambien los datos cuando logras escribirla.

En cuanto a los comandos hay que explicar bien eso porque cuando uno esta empezando no entiende muy bien eso porque no hay ningun modulo de donde tomarlos.

Los comandos son cadenas de datos que deben enviarse en una secuencia y valores exactos para que logres comunicarte con la SD en su lenguaje. No es tan dificil si usas la libreria de CCS llamada mmc_spi, ella ya trae implementados los comandos en funciones que solo tienes que llamar desde tu programa para que se ejecuten.

Para ver como iniciar la SD descarguen el archivo SD iniciada.rar 

Ahora yo ya logre enviar datos a la SD con exito, pero solo datos de 8 bits y necesito enviar datos de 10 bits, lo cual no he logrado aun. Al tratar de enviar los datos de 10 bits los guarda bien pero solo los 8 bits menos significativos, obviamente cuando intento recuperar los datos solo devuelve 8 bits, en un principio pense que era por la consola spi del simulador que solo muestra 8 bits asi que la modifique para 10 bits pero asi cambia completamente la forma de comunicacion y ya no inicializa la SD.


----------



## Moyano Jonathan (Nov 7, 2008)

Tu información me es de mucha ayuda gracias jaiser y también gracias por el comentario de saber soldar , aunque me falte mucho para llegar a ser "bueno soldando".


----------



## jaiser (Nov 7, 2008)

nutriax tengo la duda de si en realidad debo preocuparme por la longitud de los datos o cuando implemente el sistema de archivos fat podre resolver esto. Al final lo que espero es poder guardar las cadenas de datos que obtengo con un sistema de control y monitoreo de temperatura de donde obtengo la temperatura asociada una fecha y hora, por lo que los datos son bastante largos, que opinas? Sera que empezamos con el sistema de archivos fat?

Yo tengo una libreria para ccs que estoy comenzando a estudiar, si tienen información sobre eso o experiencia publiquenla.


----------



## jaiser (Nov 7, 2008)

Una cosa mas en cuanto a la alimentacion de la SD los veo muy preocupados por encontrar un regulador adicional para la memoria, creo que con unas resistencias desde el pic podemos bajar la tension a 3.3v y aunque en la simulacion que publique no aparecen en la conexion real si van. Voy a probar y les aviso.


----------



## nutriax (Nov 7, 2008)

hola jaiser, todo lo que publicaste excepto la foto ya esta y lo volvi a publicar yo en este foro.
el tema de los comandos esta muy bien explicado tambien en este foro.
y por ultimo el tema de que quieres escribir 10 bit o mas... eso no te preocupes que se soluciona con el fat, y aparte yo explique como maneja la memoria cadenas largas y es el mismo motivo por el cual con el 16f877 se pueden leer unicamente a los 192 byte primeros de cada direccion de memoria... como dije eso ya lo explique yo en unos mensajes anteriores.
ahora mi duda es, podes leer bien la memoria? porque yo puedo inicializarla pero no puedo leerla, me da siempre 00 sea cual sea la direccion que lea, esto no se por que es...
jaiser, aguarda un momento y ayudanos a correguir nuestros problemas asi es como decis vos, vamos a poder avanzar mas rapido todos juntos...


----------



## Moyano Jonathan (Nov 9, 2008)

yo probé la memoría y al parecer la inicializa bien pero quiero que me indique con un led que lo ha hecho, ahora también me gustaría por ejemplo escribir todo una trama o estring de datos y luego que los lea cada 1 seg y me los mande al puerto d de un pic 16f887.

ya voy a hacer mi propio firmware de control de la sd por que he estado probando con ejemplos del foro pero quiero hacer algo concreto mio cuando tenga más tiempo.

también sigo experimentando con el tema del usb y el protocolo cdc


----------



## nutriax (Nov 9, 2008)

primero te aconsejo que trates de leer antes de escribir... ami me inicializa pero no me lee ni escribe...


----------



## Moyano Jonathan (Nov 9, 2008)

No tenés una idea de por que te puede llegar a dar ese problema la sd de no ecribir / leer ?

yo voy a probar el ejemplo de jaiser a ver como me va con la escritura y después veo como me va con la lectura.

cualquier cosa después te comento.


----------



## nutriax (Nov 9, 2008)

El tema es que jaiser subio la inicializacion unicamente, pero ahi estoy viendo que el usa el el mmc_spi, voy a probar con eso y veo como me va...


----------



## Moyano Jonathan (Nov 9, 2008)

OK, despúes contame como te fue así vemos que avanze con respecto al tema tenemos cada uno


----------



## jaiser (Nov 10, 2008)

Saludos, me alegra ver que el tema esta bien animado como dice meta.

La simulacion que publique no solo inicia la memoria SD sino que tambien envia una secuencia de 100 datos que se almacenan en la memoria. Esto puede verse en el modulo SPI_Debug, si observan bien los datos de esa consola veran lo siguiente:

Comando 0:
40 00 00 00 95    Que se envia 50 veces para iniciar la SD
comando 1:
41 00 00 00 00
Comando 16:
50 00 00 00 00
Comando 17:
51 00 00 00 00
Comando 24:
58 00 00 00 00

Cada comando tiene su funcion especifica.

luego se envian una serie de datos del 1 al 100 que son grabados en hexadecimal, fijense en el ultimo valor de la consola es 64h que es igual a 100d.

Creo que con eso estamos listos para el sistema FAT. Que dices nutriax?


----------



## jaiser (Nov 10, 2008)

Tambien he probado la simulacion cambiando la cadena de datos de 100 a 200 y he comprobado que funciona correctamente. Es importante comentar que solo pueden enviarse datos validos hasta 8 bits, es decir hasta 255 en decimal.


----------



## nutriax (Nov 10, 2008)

jajaja si eso lo vi despues de que publique mi respuesta... me habia puesto a ver el codigo...     
y jaiser.... no te preocupes por los 8 bit.... ya te dije que eso el sistema fat lo soluciona porque maneja bloques de 512byte y si no te alcanza el largo te lo enlaza con una lista enlazada (mas o menos asi funciona el sistema fat, es una burda explicacion porque en realidad es muchisimo mas complejo...).
para ver mira mi post que pongo a continuacion (post 191)
https://www.forosdeelectronica.com/about13868.html
ahora jaiser, esta es mi duda, vos lo probaste con alguna tarjeta para ver si anda?
se puede probar con una tarjeta y despues analizar los datos grabados con el winhex... eso es lo que yo uso...


----------



## jaiser (Nov 10, 2008)

Ok nutriax yo lo he probado con la tarjeta, no al menos para recuperar los datos, no conocia el programa, explicame un poco como funciona el programa. Como obtengo los datos de la memoria luego de grabarla? Que tipo de interfaz puedo usar?

Acabo de descargar el programa y un tutorial, pero si me das algo de información seguro lo hago mas rapido.


----------



## Moyano Jonathan (Nov 10, 2008)

lo que no entiendo del todo es que si tenemos un sector de 512 bytes/8 bits (por cada dato), esto querrá decir que podemos guardar 512 datos de 8 bits cada uno en cada sector? si me equivoco diganmen porfavor. Lo que pasa es que he podido inicializarla, pero no se como verificar la escritura y la lectura de la targeta


----------



## nutriax (Nov 10, 2008)

ok aguanta 2 segundos que ahora en el proximo post te explico,  (espera el tiempo que tarde en armar el post aprox 2 minutos) asi te explico bien y de paso le queda a jonathan...


----------



## nutriax (Nov 10, 2008)

jonathan, si es asi pero el fat utiliza un protocolo muchisimo mas complejo que lo que decis... pero lo que vos decis es valido si no implementas fat y te creas tu propio protocolo como explique en el mensaje 119.
despues podes probar la grabacion como ehora explico...
JAISER y JONATHAN asi se usa el winhex...
primero pueden leer la memoria para saber que datos tiene y despues compararla con los datos que tendra despues de grabarla...
por lo que tendrian algo asi...
primero abrimos el programa y luego vamos a la opcion "tools" -> "open disk"
imagen1 (winhex1.jpg)
con lo que obtenemos la pantalla de imagen 2 (en donde seleccionamos la memoria en mi caso es el disco f
y le damos al boton ok.
y ahora procesa y obtenemos todos los datos de la memoria en hexa y ascii con las direcciones... imagen 3
por lo que por ejemplo en el programa del pic grabamos datos en la direccion desde la 0 a la 100 con el valor de 0 a 100 por lo que tendria que aparecer la secuencia de datos en la direccion de 0 a 100... como en la imagen 4.
logicamente yo en la imagen no lo tengo grabado los datos del 0 al 100 porque no probe el codigo de jaiser, en estos dias veo si lo puedo probar...
espero que se entienda...


----------



## nutriax (Nov 11, 2008)

me ha durado poco esto... jajajajajajaj     yo puedo grabar y leer perfecto...    
tengo que pegar unas rebiciones para el tema de la comversion de las divisiones pero es lo de menos...
el problema que tengo es que grabo datos en el sector 300 pero me aparece en el offset 5a00....
segun mi cuenta:
sector 300 *512 Bytes que tiene cada bloque son 153600 bytes.
el winhex me muestra el dato en el offset 5a00 en hexa (en decimal es 23040) y por cada offset tiene 16 byte, lo que seria 368640 bytes. por lo que no me cierran los numeros...
alguien ve el calculo mal hecho?


----------



## nutriax (Nov 11, 2008)

hoy estoy con todas las pilas.... Empese regularizando la tesis y ahora en dos patadas saque para que lea y escriba...
y ahora recien me doy cuenta cual es el problema de las direcciones... jajajja
el calculo esta mal porque el offset no es una matriz sino una enumeracion es decir que es el dato 5a00
pero eso no queda ahi porque realize el calculo nuevamente y tampoco da...  
pero me puse a analizarlo y el tema es que el ccs cuando le paso la direccion me toma 45 en lugar de 300 esto es por el tipo de dato que ocupa 2 byte la direccion (300-255=45).
asi que ya esta solucionado...
ahora me gua a dormir porque estoy fusilado y tuve un dia muy pesado...
asique otro dia sigo con fat...
posteen los resultados que tuvieron ustedes...


----------



## catjosep (Nov 11, 2008)

Hola estoy diseñando un data logger con un PIC 18F4550. Este tiene un modulo Xbee RF de transferencia radiofrequencia y una targeta SD, y comunicacion via USB. Me encuentro con el problema que la targeta usa el protocolo SPI y el modulo RF el protocolo serie, hasta aqui bien. El problema esta en que el pin 1 del PIC es el Tx y SPIout a la vez con lo que tengo un conflicto entre le Xbee y la SD. He visto que hay otros protocolos para la SD, modo un bit, modo cuatro bits, etc... Alguien me puede dar información al respecto?
Saludos y gracias


----------



## nutriax (Nov 11, 2008)

Catjosep por eso no te preocupes es lo de menos...
lo que yo haria en tu caso dejo el pin ese para la salidad spi e implementaria el protocolo rs232 por software que anda muy bien... y seria menos complejo que ponerme a investicar como funcionan las tarjetas en otros protocolos...
fijate que te combiene pero me parece que de la forma que digo yo vas a ganar tiempo y mucho...


----------



## jaiser (Nov 11, 2008)

hola nutriax, acuerdate de probar la memoria con el winhex y prueba que el  programa funciona bien.
voy a traer de conseguir el adaptador para la memoria sd, pero si tu puedes hazme el favor de probar el programa.


----------



## Moyano Jonathan (Nov 21, 2008)

yo estoy igual que nutriax , a mi me ha iniciado pero me falta lo de escritura / lectura para diciembre ya voy a estar desocupado para empezar a trabajar enserio


----------



## mahatmajg (Ene 21, 2009)

Estimados amigos,

Hace 2 años realice un proyecto de lectura y escritura de memorias SD teniendo buenos resultados. Lo probe con memorias kingston.
Sin embargo ahora resulta que ese proyecto no me esta funcionando con un tipo de memoria SD en especial. 
Me funcionan con las SD kingston de lock blanco (el que permite bloquear la escritura) pero con ninguna de las que tienen lock amarillo, tampoco con las microSD de la misma marca Kingoston.

Y no puedo decir que estén falladas esas memorias ya que la PC si las reconoce y puedo leerlas y escribirlas desde ahi.

Quisiera que me puedan orientar a solucionar este problema que tengo con la comunicación con estas memorias SD. Detallaré el problema que tengo con estas memorias.
Específicamente el problema es con el comando de inicialización. El comando de reset si me funciona, la SD me devuelve un $01 (modo spi en idle) pero luego cuando envío el comando $41 de inicialización me responde $01 es decir como si no saliese del modo idle. Cuando reintento este comando mas de 6 veces deja de responder, obteniendo puras $ff.

He probado poniendo mas retardos, mandando otros comandos $77 (error en idle) , $55 (error comando ilegal), reintentando muchas veces pero no obtengo la respuesta deseada ($00)

Probe el comando $58 y me responde que si soporta todos los voltajes desde 2.5V hasta 3.6V, yo estoy trabajando con 3.3V.

Espero que me puedan brindar su ayuda, muchas gracias.

Mahatma.


----------



## nutriax (Ene 21, 2009)

hola primero, no tiene nada que ver un modelo de otro (y mucho mas siendo de la misma marca), yo he probado con un monton de memorias y anda perfecto (incluyendo distintas marcas)...
para jorgealexvilla ponete a leer este hilo y fijate que ya se hablo mucho del tema y no hay mas para hablar en todo caso para fat32 tendria que haber otro hilo...
nuevamente para mahatmajg:
probaste un ciruito fisico armado con una memoria que ande y el mismo circuito lo probaste con otra memoria y no anda? porque si no lo probaste asi y armaste otro circuito me juego la cabeza que tenes problemas de hardware...
es mas fijate si no tenes invertido el sdo con el sdi. y comentame como es el tema y postea el ciruito y si tenes fotos porque eso me suena problema de circuito


----------



## mahatmajg (Ene 21, 2009)

Si estoy hablando del mismo circuito. Con ese mismo circuito me funciona para unas memorias SD (hasta leo y escribo) y para otras memorias SD no paso del comando de inicializacion. Mi circuito consiste de un diodo zener para bajar la tension de 5V a 3.3V y dar asi el power. los pines de señal los manejo con divisor de tension con resistencias (de 5V del uc a 3.3V). Cabe señalar que para estas memorias que no me funcionan con el comando de inicializacion, si me funciona el comando de reset $40 y el comando de soporte de voltaje $58.

Creeme que he probado muchas cosas que se indican en este foro pero hasta ahorita ningun resultado, gracias por tu ayuda.


----------



## nutriax (Ene 22, 2009)

yo otra cosa que probaria es revisar el codigo porque cuando la inicialisas muchos esperan 2 byte de respuestas y en realidad tenes que esperar como maximo 20 porque dentro de esos te responde con el byte de ok, no se si me explico...


----------



## mahatmajg (Ene 26, 2009)

Si he probado mandando varios $FF despues del comando de inicializacion, mas de 100, pero no me retorna el valor esperado que es $00. Quiero aprovechar para preguntar si es que es necesaria que la frecuencia de clock del spi sea de 400KHz o 312KHz como he visto en algunas contribuciones?, yo estoy usando un uc con crystal de 16MHz y he probado con prescaler de 64 (250Khz) y con prescaler de 32 (500KHz) y sigo con el problema, quiero saber si es que eso podria estar ocasionando mi problema. Recuerdo que mi hardware y firmware estan funcionando para unas memorias SD y para otras no.

Gracias por vuestra atensión.

Mahatma.


----------



## platanit087 (Feb 22, 2009)

Hola tengo un problema he estado en el proyecto del lector gravador de SD, pero tengo un problema, por ahora lo que nos dejaron es inicalizar la memoria SD con SPI, bueno hemos estado leyendo un poco de esto y los comandos para realizar esto son el comando 0 y el comando 1, en terminos de pic debe ser 40 y 41, cuando intento inicializar la sd, segun si la inicializar pero ahora cuando no tiene SD hace exactamente lo mismo, es por eso que no se si esta respondiendo bien aqui esta mi codigo, espero que me ayuden por favor, es que como probamos y si enviaban los comando bien pensamos que ya estaba bien pero se me ocurrio comprobarlo quitandole la memoria al adaptador y respodnia de la misma forma saludos


----------



## javichu20385 (Mar 10, 2009)

jaiser dijo:
			
		

> Saludos, yo tambien estoy trabajando con las memorias mmc y he logrado inicializarla un poco diferente y tambien escribe los datos aunque no todavia en fat.
> 
> Este archivo contiene la simulacion y el programa en ccs asi como el .hex. Esta libreria usa pines diferentes a los predeterminados para protocolo spi pero funcionan y tambien brinda mayor flexibilidad porque se puede escoger que pines del pic usar




Hola Jaiser,

he intentado probar el programa que colgaste, pero al intentar compilar me da un error en el archivo mmc_spi.c, "expecting an identifier". Sabes porque puede ser? Estoy intentando crear un programa que me permita leer y escribir una tarjeta SD, con un PIC18F4620 y no logro hacerlo  . Agradecería que alguien pudiera ayudarme.

Muchas gracias.   
Saludos

Gracias. Un saludo!


----------



## kike81 (Mar 17, 2009)

Pues ya logre comunicar el PIC con la SD, inicializo y escribo perfectemante gracias a algunas modificaciones del programa de Paloky, pero estoy tratando de mandarle datos al PIC via RS232 y cuando le complemento esto a mi programa con esta interface ya no funciona, si alguien sabe que puede ser le agradeceria su apoyo. 

Pues aqui les mando mi programa que es una modificacion del de paloky:

Saludos!


----------



## Moyano Jonathan (Mar 17, 2009)

Ahora kike81 , una pregunta pongamosle que tenga un pic con más Ram como el pic18f2550 como  hago para poder leer el sector completo , es decir los 512 bytes en ves de 192?


----------



## kike81 (Mar 19, 2009)

eso no lo he hecho pero creo que con mas RAM vas a poder agregar mas sectores(del 1 hasta el 8).
Eso lo voy a probar la proxima semana, checalo y me dices que tal te fue.


----------



## Gabyota (Abr 8, 2009)

Holas a todos he estado leyendo bastante sobre este tema, en mi caso tengo una duda para la escritura y lectura de la trajeta, por lo he visto que para el tamañp  del bloque se usa esto:

varl=((block_number&0x003F)<<9);
varh=((block_number&0xFFC0)>>7);

puts("Write block\n\r");                

OUTPUT_LOW(PIN_C2);                     

        SPI_WRITE(0x58);               
        SPI_WRITE(HIGH(varh));
        SPI_WRITE(LOW(varh));
        SPI_WRITE(HIGH(varl));
        SPI_WRITE(0x00);                
        SPI_WRITE(0xFF);                

no entinedo bien que hace este pedazo de codigo creo k esta usando CCS y yo uso el C18.

Agradeceria mucho me ayuden
 El codigo que llevo es el que adjunto.


----------



## Paulolr (Abr 14, 2009)

Con respecto al programa de platanit087 una de las soluciones se podria usar un pin para detectar si la tarjeta esta insertada en el zocalo el mismo trae un pin.

Los zocalos que vienen y que yo he comprado viene con 10 pines dentro de la cual esta el pin que se usa para detectar la tarjeta cuando se inserta y los zocalos de 12 pines tiene un pin la cual te indica si esta bloqueada o no

Aca les dejo las conexiones del zocalo de la tarjeta y un integrado para la interfase


----------



## arcadi (Abr 16, 2009)

Buenas;

estoy probando de inicializar una SD, pero no funciona...
pido si alguien me puede repasar el codigo, ya que hace cosas muy extrañas.

He tenido que meter unos delay_ms porque se me quedaba colgada en un bucle
cuando enviaba un valor por SPI.

Muchas gracias


----------



## kike81 (Abr 16, 2009)

te mando lo que yo hice, es una modificacion del codigo de Paloki, espero te sirva.

Usa el programa  Hexplorer para revisar que este escribiendo en la SD.

saludos y suerte


----------



## kike81 (Abr 20, 2009)

aqui  mando la conexion de la SD con el PIC 

Suerte!


----------



## platanit087 (Abr 25, 2009)

Hola

Bueno, casi no he aportado en foros, pero ahora veo que es de mucha utilidad esto, mi proyecto es de la facultad, y se trata de la SD, se supone que lo que debe hacer es leer datos de un archivo y escribirlo a la SD, ese archivo sera de audio para luego reproducrilo, hasta ahortia solo llevo la inicializacion de la SD, asi como lectura y escritura y como veo en este foro nadie ha posteado bien como es este proceso o puesto algo que funcione al 100% o si les ha funcionado no lo han puesto, pero recopilando toda la información que han puesto ha sido de gran utilidad para poder llegar a lo que he llegado, bueno como este foro practicamente lo ven muchas personas aun no puedo poner todo el codigo por que la verdad es que tengo la teoria que alguno de mis compañeros del grupo se chacalearon el codigo que habia puesto, bueno pero no hay que ser envidios, si alguien esta interesado en el desarrollo aqui posteare cuando sean vacaciones o sea como en junio, todo el proceso de esto de la SD, y si alguien tiene problemas pues les dejo mi correo de hotmail para que se contacte con migo, como les digo no es por ser envidiodo pero pues es por cuidar el proyecto.

Uso el PIC16F877A con un critsal de 4 MHZ, a mi me funciono, al principio del post el gran creador de este tema muy interesante puso que afuerzas era con uno de 20Mhz, no se a que se debe, ademas uso la SD de ScanDisk de 1 GB, esto no se que tanto varie conforme a otras marcas, me recomendaron hacerlo con esa marca y ese tamaño, otra cosa que pude apreciar es que muchas veces los algoritmos o el proceso de escritura y lectura es un poco tediosa, en realidad lo es, pero los algoritmos que viene en algunas paginas sirven mucho solo el pequeño detalle es que varian en pocas cosas o practicamente en nada, esto lleva a hacer algo asi de prueba y error y cambiarle pequeñas cosas que aun que no se vea el cambio puede funcionar.

Mi correo de hotmail es reymar_44@hotmail

Bueno aprovechando este choro que les puse , necesito preguntarle a los experto de este tema, una duda hacerca de la lectura escritura  leei que para acceder al sector 2, necesitamos poner algo asi.

   spi_write(0x58) ; 
   spi_write(0x00) ; 
   spi_write(0x00) ; 
   spi_write(0x02) ; 
   spi_write(0x00) ; 
   spi_write(0xFF) ;

esto si funciona pero para acceder a otro sector he intentado hacer esto para acceder al sector 3


   spi_write(0x58) ; 
   spi_write(0x00) ; 
   spi_write(0x00) ; 
   spi_write(0x03) ; 
   spi_write(0x00) ; 
   spi_write(0xFF) ;

peron no funciona, alguien me explicar paso a paso sobre los agrumentos de este

saludos


----------



## DavidGamba (Jun 25, 2009)

Para los que no han podido hacer la migración del pic 16f al 18f una razón puede ser por que las direcciones de registro son distintas además de que el pic 18f tiene dos registros SSPCON a diferencia del 16F.

// Se configura el puerto SPI
//Dir registro SSPCON1 = 0x0FC6
//Dir registro SSPCON2 = 0x0FC5


----------



## stuardo (Jul 7, 2009)

Saludos Soy Stuardo Profesor del CETI, en Guadalajara, México. Ya he estado probando algo de la memoria sd con capacidad de 1G y hasta el momento la inicializacion a funcionado correctamente, lo estoy haciendo con el 16f876 y un cristal de 4MHZ, el modulo SPI lo estoy emulando, o sea que no utilizo el SPI y todo bien =). Mi pregunta es que de acuerdo a lo comentado ya por todos, es que cuando mando el comando 0x58,0x00,0x00,0x02,0x00,0xff; la memoria no me contesta tres 0x00 de respuesta solo me manda un solo 0x00, los demas supuestos ceros son 0xff. Probe la teoria de mandar un codigo incorreto ejemplo 0x56,0x00,0x00,0x02,0x00,0xffy la memoria me responde codigo ilegal, o sea que no esta perdia la secuencia, y no he podido salir de esa fase.



Nuevamente yo, Stuardo. Y pues ya funciono despues de un rato de analizar lo de este foro y un docuemnto del TEC de monterrey ya puedo leer y grabar en la memoria de 1G con un PIC 16f876A con 4MHZ, emulando el puerto SPI.

Se que muchos ya lo lograron, desde hace años! jejejejeje pero bueno! ahora a darle muchos aplicaciones! ah! y eso de los bytes de respuesta que creo que es lo que mucho confunde, la forma que lo solucione, es solo bucles de respusta del famoso R1 y listo a la primera funciono asi que si jala!


----------



## george.manson.69 (Jul 13, 2009)

una pregunta...este ciruito que han presentado antes como las primeras paginas, el sel SD y el pic16f877a,  es para guardar información...osea tengo una matriz de led, y en la memoria SD puedo guardar información por ejemplo letras y que el pic lea la memoria para poyectar las letras guardadas a la matriz de led?


----------



## Moyano Jonathan (Jul 13, 2009)

Si si se puede , el tema es la velocidad con que realiza la lectura. Tendrías que ver cuanto tarda en leer una trama completa y representarla en la matriz.


----------



## george.manson.69 (Jul 13, 2009)

voy a iniciarme con esos pic18, y voy a empezar por lo dificil, la comunicacion SD y pic16 y compu....se programar los pic16 , pero 18 son distintos? ya tengo un pedido para un 18f2450 y otras cosas..voy a compara el adaptador de SD y la memoria por ahora de 256Mbytes...tengo mcuhas ideas con esta comunicaciones..jjejej ami me gusta los robots...tengo ideas para que un robot me morise pasos, y otras cosas...y que los guarde en la memoria SD...ya que tienes mucha capacidad.
por ahhora para empezar quiero saber las instrucciones basicas para la comunicacion.

cuales son las instrucciones de inicializacion para el SD.?
los comandos para escribir y leer?
unos cuantos ejemplos necesito para parender..y listo


se programar en Ccs c.
ya he buscado manuales y aqui empeze a buscarle tmb..pero parece que ya van muy adelante jaja

(se que algunos ya estan entrados en este tema y se atrasaran retrasando por mi...pero devoalda aprendo jejej...a ver si no es mucha molestia para ayudarme...)


----------



## Moyano Jonathan (Jul 13, 2009)

Por supuesto que podemos ayudarte para eso estamos. El protocolo para manejar una SD es bastante complejo de más está decirte. 
CCS tiene librerías funcionales para el manejo de la MMC_SD por SPI pero para FAT , las librerías de CCS aún no están totalmente probadas y presentan muchos errores.

En cambio MikroC tiene librerías tanto para manejar directamente MMM_SD como así también para trabajar con el sistemas de archivos FAT (En pic18).


----------



## george.manson.69 (Jul 14, 2009)

Moyano Jonathan dijo:
			
		

> Por supuesto que podemos ayudarte para eso estamos. El protocolo para manejar una SD es bastante complejo de más está decirte.
> CCS tiene librerías funcionales para el manejo de la MMC_SD por SPI pero para FAT , las librerías de CCS aún no están totalmente probadas y presentan muchos errores.
> 
> En cambio MikroC tiene librerías tanto para manejar directamente MMM_SD como así también para trabajar con el sistemas de archivos FAT (En pic18).



ya bajae el miKroC y estaba probandolo est basatnte bueno, en casi pero casi = ccs c, cual es la diferencia entre los dos?
bueno ahora quiero hacer primero que nada, la inicializacion del SD, con el pic, que lo detecte..como empiezo a programar...?
gracoas por la respuestas rapidas


----------



## Moyano Jonathan (Jul 14, 2009)

Y la verdad MikroC tiene bastantes diferencias con respecto al C de CCS. Una de las más notables es que a MikroC le faltan muchas funciones para el control de bit´s y registros. Así también como soporte para migración de código utilizando pragma. Te paso una página donde vas a encontrar mucho código y proyectos utilizando este compilador:

http://74.125.47.132/translate_c?hl...le.com&usg=ALkJrhiuZ_dkojRcT3lvC56qk_z2wuMvQA


----------



## george.manson.69 (Jul 14, 2009)

gracias...voy a chekarlo...primero tengo que familiarizarme con este programa..pero  pues es se parece al ccs c no creo batallar mucho....cuando ya tenga el material, voy a intentar armar elc circuito de la comunicacion SD y pic18...si tengo una duda ...devolada devolada pregunto por aqui..gracias


----------



## Moyano Jonathan (Jul 14, 2009)

Yo estoy batallando con el control de un registro desplazamiento 74HC165 que por alguna razón no me funciona el código en MikroC.


----------



## george.manson.69 (Jul 14, 2009)

oye estaba viendo la pg..que tienes ahi...esta muy buena..tiene mcuhos proyectos....y estaba chekando este codigo


```
#define		LED			PORTB.F7

#define		SW_START	PORTA.F4
#define		SW_STOP		PORTA.F5

#define		ON		1
#define		OFF		0

#define		CR		0x0d
#define		LF		0x0a

//********************************************************************** 

void	main()
{
	//•Ï￾”‚Ì’è‹` 
	static	char	buf[50];
	short			cnt, channel, pnt;
	unsigned		ad;
	long			dataCnt;
	//‚`￾^‚c•ÏŠ·‚Ì￾Ý’è 
	ADCON1.PCFG3 = 1;
	ADCON1.PCFG2 = 0;
	ADCON1.PCFG1 = 1;
	ADCON1.PCFG0 = 1;
	//ƒ|￾[ƒg‚Ì￾Ý’è 
	TRISA = 0b11111111;
	TRISB = 0b00000000;
	TRISC = 0b00000000;
	//‚k‚b‚c‚Ì￾‰Šú‰» 
	Lcd_Custom_Config(&PORTB,5,4,3,2,&PORTC,0,1,6);
	Lcd_Custom_Cmd(LCD_CURSOR_OFF);
	Lcd_Custom_Cmd(LCD_CLEAR);
	for (cnt = 1; cnt <= 16; cnt++) {
		Lcd_Custom_Chr(1, cnt, 0xFF);
		LED = ON;
		Delay_ms(50);
		LED = OFF;
		Delay_ms(50);
	}
	for (cnt = 1; cnt <= 16; cnt++) {
		Lcd_Custom_Chr(2, cnt, 0xFF);
		LED = ON;
		Delay_ms(50);
		LED = OFF;
		Delay_ms(50);
	}
	Lcd_Custom_Cmd(LCD_CLEAR);
	//
	while (1) {
		//ŠJŽnƒXƒCƒbƒ`‚ª‰Ÿ‚³‚ê‚é‚Ì‚ðƒ`ƒFƒbƒN‚·‚é￾B 
		while (SW_START == 1) {
			Delay_ms(10);
		}
		dataCnt = 0;
		//‚l‚l‚b‚Ì￾‰Šú‰» 
		Spi_Init_Advanced(MASTER_OSC_DIV64, DATA_SAMPLE_MIDDLE, CLK_IDLE_LOW, LOW_2_HIGH);
		if (!Mmc_Fat_Init(&PORTC, 2)) {
			Spi_Init_Advanced(MASTER_OSC_DIV16, DATA_SAMPLE_MIDDLE, CLK_IDLE_LOW, LOW_2_HIGH);
			Mmc_Fat_Assign("log.csv", 0xA0);
			Mmc_Fat_Rewrite();
			Mmc_Fat_Write("$START\r\n", 8);
			//’âŽ~ƒXƒCƒbƒ`‚ª‰Ÿ‚³‚ê‚é‚Ü‚Å￾ˆ—￾‚ðŒJ‚è•Ô‚·￾B 
			while (SW_STOP == 1) {
				pnt = 0;
				//‚Sƒ`ƒƒƒ“ƒlƒ‹•ª‚Ì‚`￾^‚c•ÏŠ·‚ð￾s‚¢￾A‚k‚b‚c‚É•\Ž¦‚·‚é￾B 
				for (channel = 0; channel < 4; channel++) {
					ad = Adc_Read(channel);
					ad = (double)ad * 4.8828125;
					WordToStr(ad, &buf[pnt]);
					switch (channel) {
					case 0:
						Lcd_Custom_Out(1, 1, "1:");
						Lcd_Custom_Out(1, 3, &buf[pnt + 1]);
						break;
					case 1:
						Lcd_Custom_Out(1, 9, "2:");
						Lcd_Custom_Out(1, 11, &buf[pnt + 1]);
						break;
					case 2:
						Lcd_Custom_Out(2, 1, "3:");
						Lcd_Custom_Out(2, 3, &buf[pnt + 1]);
						break;
					case 3:
						Lcd_Custom_Out(2, 9, "4:");
						Lcd_Custom_Out(2, 11, &buf[pnt + 1]);
						break;
					}
					pnt += 6;
				}
				buf[5]  = ',';
				buf[11] = ',';
				buf[17] = ',';
				buf[23] = CR;
				buf[24] = LF;
				//‚Sƒ`ƒƒƒ“ƒlƒ‹•ª‚Ü‚Æ‚ß‚Ä‚l‚l‚b‚É￾‘‚«￾ž‚Þ￾B 
				Mmc_Fat_Write(buf, 25);
				//
				LED = ON;
				Delay_ms(100);
				LED = OFF;
				//
				dataCnt++;
			}
			Mmc_Fat_Write("$STOP\r\n", 7);
			//￾‘‚«￾ž‚ñ‚¾Œ￾￾”‚ð‚k‚b‚c‚É•\Ž¦‚·‚é￾B 
			LongToStr(dataCnt, buf);
			Lcd_Custom_Cmd(LCD_CLEAR);
			Lcd_Custom_Out(1, 1, buf);
			//
			for (cnt = 0; cnt < 10; cnt++) {
				LED = ON;
				Delay_ms(50);
				LED = OFF;
				Delay_ms(50);
			}
		}
	}
}//~!
```

este es la instruccion para inicializar el SD?


```
Spi_Init_Advanced(MASTER_OSC_DIV64, DATA_SAMPLE_MIDDLE, CLK_IDLE_LOW, LOW_2_HIGH);
```


----------



## Moyano Jonathan (Jul 14, 2009)

No esa instrucción inicializa el SPI en modo master y configura sus parámetros


----------



## Denpaut (Jul 21, 2009)

Hace una semana que empiezo con lo de las memorias mmc y sd. luego de varios dolores de cabeza, finalmente pude leer y escribir en las dichosas memorias.

Aqui mi pequeño aporte:
- Usé divisores de voltaje para adaptar las señales entre el pic y las memorias
- Usar regulador de voltaje para alimentar la memoria (ahi fallé por q use un regulador con zener, la tarjeta responde pero no como debe.)

Consejo: probar con alguna rutina que muestre que responde la memoria cuando se encuentra en standby, si vota 0xFF entones estamos bien, a mi me votaba cualquier valor asi logré descrubir mi error.


----------



## george.manson.69 (Ago 5, 2009)

hola volviendo a este tema ya pude la inicializar la targeta en modo spi...
ya puedo grabar y leer..
jeje pura felicidad....!
pero mi duda es por ejemplo...tengo un sensor de temperatura ..puedo grabar en la targeta los datos del sensor...? y como se haria?


----------



## Moyano Jonathan (Ago 5, 2009)

Y sería muy facil, solo tendrías que guardar los datos del sensor en alguna variable y la variables guardarla en un archivo de texto.

En la página que te puse la otra vez tenés ese ejemplo.


----------



## Ducky (Ago 10, 2009)

Hola 
estoy grabando los datos que transmite una bascula, ahora la pregunta es como le puedeo hacer para que los bloques avancen solos, intente usar un contador pero llega al puntoque ya no respeta la funcion de escritura, se queda ciclado asta que retiro la MMC, nose porque suceda eso alguien podria darme una opcion, la idea es que no intervenga la computadora.

saludos!


----------



## DavidGamba (Ago 10, 2009)

Depronto no estas usando una maquina de estados, puede ser que estes usando "blocking functions" es decir que estas haciendo una llamada despues de la otra sin darle tiempo al sistema de hacer la escritura:

ej de "blocking function"

for (contador.....){
   escribir tarjeta();
}

ej de funcion con maquina de estados: lo puedes hacer con switch pero por facilidad lo explico con if

if (contador==1){
  escribir tarjeta();
  contador ++;
}
if(contador ==2){
 escribir tarjeta();
  contador ++;
}

de esta manera le das la oportunidad a la maquina de estados de servir la escritura de la tarjeta, de liberar el buffer etc. en general todas las aplicaciones de microchip se deben hacer de esta manera y no con el uso de "blocking functions"


----------



## arcadi (Ago 11, 2009)

Buenas;

he creado un archivo en la SD, pero necesitaba mas velocidad y lo quiero hacer por bloques de 512. Pero resulta que mi SD no accepta la comanda CMD0. Pido si alguien me puede repasar el codigo porfavor, no veo lo que hago mal:


```
#include <p18f452.h>

#pragma config OSC = HS, OSCS = OFF			//Cristall HS
#pragma config PWRT = OFF					//No PWRT
#pragma config BOR = OFF					//No BOR
#pragma config WDT = OFF					//No WatchDog
#pragma config LVP = OFF					//NO LVP


#define led_vermell     PORTDbits.RD7  		//Definim on es troben els leds
#define led_verd        PORTDbits.RD6
#define led_groc        PORTDbits.RD5
#define CS              PORTCbits.RC2 		//Chip Select de la targeta SD


//--------------------------VARIABLES--------------------------------//

int valor;
int i;
int error;



//----------------------------RUTINES--------------------------------//


void SPI_min () {		//Iniciar el SPI al mínim						

	SSPSTATbits.SMP=0;	//Input data sampled at middle of data output
	SSPSTATbits.CKE=1;	//Data transmitted on rising edge of SCK
	SSPCON1=0b00100010;	//No collision, No overflow, Enable serial port, IDLE state for clock in a low level
						//SPI Master mode, clock=Fosc/64
}


void SPI_escr (int dada) {		//Escriure SPI
	SSPBUF = dada;				//Escrivim el valor al buffer
	while(!PIR1bits.SSPIF);		//Esperem que s'hagi acabat la transferència
	PIR1bits.SSPIF = 0;			//Eliminem la bandera d'enviament
}


void SPI_lleg (void) {			//Llegir SPI

	SSPBUF = 0x00;				//Escrivim el 0xFF al buffer
	while(!PIR1bits.SSPIF);		//Esperem que s'hagi acabat la transferència
	PIR1bits.SSPIF = 0;			//Eliminem la bandera d'enviament
	valor=SSPBUF;				//Retornem el valor que hem rebut
}


void Init_SD (void) {

	CS=1;						//Desactivem la targeta

	for (i=0;i<10;i++) {		//Crear els 74 clocks mínims que es necessiten
		SPI_escr (0xFF);
	}
	
	CS=0;						//Activem la targeta SD
	i=0;

	//---Enviament de CMD0--\\

	SPI_escr (0x40);
	SPI_escr (0x00);
	SPI_escr (0x00);
	SPI_escr (0x00);
	SPI_escr (0x00);
	SPI_escr (0x95);

	if((valor==0x01)||(i==64)) {
		SPI_lleg ();				//Llegim la resposta de la targeta
		i++;
	}

	
	if (valor==0x01) {
		error=0;
		led_vermell=0;
		led_groc=0;
	}
	else {
		error=1;
		led_verd=0;
		led_groc=0;
	}
}


void main (void) {				//Programa principal

	TRISD=0x00;					//Definim els ports
	TRISC=0x10;

	CS=1;						//Donem valor als ports
	led_vermell=1;
	led_verd=1;
	led_groc=1;

	i=0;						//Donem valor a les variables
	error=0;
	valor=14;

	SPI_min ();					//Iniciem el SPI al mínim
	Init_SD ();					//Iniciem la SD

	while (1) {}

}
```


Muchas gracias a todos


----------



## DavidGamba (Ago 16, 2009)

Hola, pues la verdad no he hecho la lectura de la SD sin embargo si noto que en primer lugar tu pic es el p18f452 y según creo se necesita algo más de RAM para hacer el proyecto, los proyectos de microchip que incluyen la tarjeta SD los hacen con PIC18F46J50 y con PIC18F87J50 y por supuesto con algunos pic24 y pic30.


----------



## arcadi (Ago 17, 2009)

Muchas gracias.

Hestoy probando el nuevo compilador de MikroC, el MikroC Pro 2009, y rula muy bien. He creado archivos en la FAT .txt .etc, he escrito en su interior; tambien se puede hacer de la manera tradicional, iniciando la SD con los comandos y tal...

Lo que pasaba es que el compilador tenia un bug al final, no se que pasaba en el puerto SPI....

El pic 18f452 soporta la SD, uso dos buffers de 512 para leer y escribir.

Muchas gracias


----------



## Ducky (Ago 17, 2009)

Hola arcadi!

oye que bien una pregunta como le puedo hacer para poder grabar en FAT dentro de un archivo .txt, es muy dificil o que recomiendas que lea o algun tip para que lo pueda hacer?, la vdd yo solo eh logrado escribir y leer en modo SPI y bueno en los bloques de 512, yo uso el PIC16f876A, ojala puedas mostrar alguna pauta de como se hace.

Saludos! Gracias


----------



## Moyano Jonathan (Ago 18, 2009)

MikroC ya tiene rutinas implementadas para esa tarea. Te recomiendo que leas el manual de usuario.


----------



## Ducky (Ago 18, 2009)

Ok muchas gracias buscare dare un vistaso al manual de mikroC, espero poder contar con ustedes por cualquier duda, gracias.

saludos!


----------



## Meta (Ago 18, 2009)

Hola:

¿Cuál es más fácil de manejar, I2C o SPI tanto en ASM o C?

Saludo.


----------



## Moyano Jonathan (Ago 18, 2009)

SPI en ambos lenguajes pero por cada esclavo que manejes necesitas un pin más del micro, además de ser bastante más rapido que I2C. Aunque I2C podés concatenar hasta 127 dispositivos (teoria) con solo 2 pines. Este ultimo tipo de comunicación yo lo estoy usando para controlar varios motores PAP en paralelo por USB.


----------



## Meta (Ago 19, 2009)

Vaya.

No sabía que se puede conectar 127 dispositivos en I2C, pensaba que era hasta 8 como máximo. SPI es muy rápido pero que muy rápido eso es lo bueno. Lo que no sabía que SPI necesita un pin extra desde el PIC, hay que usar PIC de 100 pines para muchos dispositivos. Para tarjetas mmc mejor SPI.

Lo de controlar motores paso a paso me encanta. Espero que de aquí hasta el 2010 hagas un poquito del manual si tienes tiempo del USB.


----------



## SIMONF (Ago 19, 2009)

Aqui envio las rutinas de manipulación de la SD.
Todo ese bloque ha funcionado bien, pero antes de entrarle al tema de escritura y lectura de bloques en FAT16, me gustaría saber por dónde puedo empezar?  (Yo necesito que lo que grabe en la SD, lo pueda recuperar desde un PC cualquiera).

Gracias,


```
;
;****************************************************
;RUTINAS MEMORIA SD
;****************************************************
;
;RUTINA DE INICIALIZACION DEL MODULO SPI
INISPI	BCF	STATUS,RP1
	BSF	STATUS,RP0	;BANCO 1
;
	BCF	TRISC,1		;SALIDA PARA CONTROLAR CS
	BCF	TRISC,3		;RELOJ SALIDA
	BSF	TRISC,4		;PARA CONTROLAR SDO
	BCF	TRISC,5		;PARA CONTROLAR SDI
;
	BSF	SSPSTAT,7	;BIT SMP
	BCF	SSPSTAT,6	;BIT CKE
	BCF	STATUS,RP0	;BANCO 0
;
	BSF	SSPCON,4	;BIT CKP
;
	BSF	SSPCON,0	;FOSC/16
	BSF	SSPCON,5	;BIT SSPEN : HAB. MOD. SPI
;
	RETURN
;
;***********************************************************
;RUTINA PARA ENVIAR/RECIBIR UN BYTE A LA SD
;
SPIO	MOVWF	SSPBUF		;PONE DATO EN BUFFER
SPIO0	BTFSS	SSPCON,7	;DATA SENT?
	GOTO	SPIO1		;SI.  PROCEDA
	BCF	SSPCON,7	;NO. RESET WCOL Y DE NUEVO		
	GOTO	SPIO
	CALL	LDEL
SPIO1	BSF	STATUS,RP0	;BANCO 1
SPIO2	BTFSS	SSPSTAT,0	;BUFFER FULL?
	GOTO	SPIO2		;NO.  OTRA VEZ
	BCF	STATUS,RP0	;BANCO 0
	MOVF	SSPBUF,0	;ALMACENA DATO EN REG W
	RETURN
;*****************************************************
;RUTINA DE INICIALIZACION DE LA SD
INISD	BSF	PTOC,1		;INHABILITA SD
	BSF	PTOC,5
	MOVLW	10H
	MOVWF	VAR6
INISD1	MOVLW	0FFH
	CALL	SPIO		;ENVIA +74 PULSOS DE CLK
	DECFSZ	VAR6,1
	GOTO	INISD1
	BCF	PTOC,1		;HABILITA SD
;
;ENVIO DE COMANDOS DE INICIALIZACION DE LA SD
;
	CALL	CMD0		;COMANDO 0
INISD2	MOVLW	0FFH
	CALL	SPIO
	MOVF	SSPBUF,0
	MOVWF	VAR5
	MOVLW	1		;ESPERA "01" COMO RESPUESTA
	XORWF	VAR5,1
	BTFSS	STATUS,2
	GOTO	INISD2
	MOVF	SSPBUF,0
	ADDLW	30H
	CALL	LCDATA
;
INISD3	CALL	CMD1		;COMANDO 1
INISD13	MOVLW	0FFH
	CALL	SPIO
	MOVLW	0FFH
	CALL	SPIO
	MOVF	SSPBUF,0
	MOVWF	VAR5
	MOVLW	0		;ESPERA "00" COMO RESPUESTA
	XORWF	VAR5,1
	BTFSS	STATUS,2
	GOTO	INISD3
;
	MOVF	SSPBUF,0
	ADDLW	30H
	CALL	LCDATA
	CALL	LDEL
;
INISD4	CALL	CMD55
	MOVLW	0FFH
	CALL	SPIO
	MOVLW	0FFH
	CALL	SPIO
	MOVF	SSPBUF,0
	MOVWF	VAR5
	MOVLW	0		;ESPERA "00" COMO RESPUESTA
	XORWF	VAR5,1
	BTFSS	STATUS,2
	GOTO	INISD4
;
INISD5	CALL	CMD10
INISD51	MOVLW	0FFH
	CALL	SPIO
	MOVF	SSPBUF,0
	MOVWF	VAR5
	MOVLW	0		;ESPERA "00" COMO RESPUESTA
	XORWF	VAR5,1
	BTFSS	STATUS,2
	GOTO	INISD51
;
INISD6	MOVLW	0FFH
	CALL	SPIO
	MOVF	SSPBUF,0
	MOVWF	VAR5
	MOVLW	0FEH		;ESPERA "0FEH" COMO RESPUESTA
	XORWF	VAR5,1
	BTFSS	STATUS,2
	GOTO	INISD6
;
	MOVLW	3EH
	MOVWF	VAR7
INISD7	MOVLW	0FFH
	CALL	SPIO
INISD8	MOVF	SSPBUF,0
	CALL	LCDATA		;ESCRIBE EN LCD LO QUE LEE DE MASTER BOOT SECTOR
	DECFSZ	VAR7,1
	GOTO	INISD7
;
	CALL	SEG1
	RETURN
;
;  hasta aqui, todo bien.  Aun no he enviado comandos de direccionamiento ni de escritua
;
;*************************************************************
;COMANDOS DE LA TARJETA SD
;
CMD0	MOVLW	0FFH
	CALL	SPIO
	MOVLW	40H
	CALL	SPIO
	MOVLW	0
	CALL	SPIO
	MOVLW	0
	CALL	SPIO
	MOVLW	0
	CALL	SPIO
	MOVLW	0
	CALL	SPIO
	MOVLW	95H
	CALL	SPIO
	MOVLW	0FFH
	CALL	SPIO
	RETURN
;
CMD1	MOVLW	0FFH
	CALL	SPIO
	MOVLW	41H
	CALL	SPIO
	MOVLW	0
	CALL	SPIO
	MOVLW	0
	CALL	SPIO
	MOVLW	0
	CALL	SPIO
	MOVLW	0
	CALL	SPIO
	MOVLW	0FFH
	CALL	SPIO
	RETURN
;
CMD9	MOVLW	0FFH
	CALL	SPIO
	MOVLW	49H
	CALL	SPIO
	MOVLW	0
	CALL	SPIO
	MOVLW	0
	MOVWF	SSPBUF
	CALL	SPIO
	MOVLW	0
	CALL	SPIO
	MOVLW	0
	CALL	SPIO
	MOVLW	0FFH
	CALL	SPIO
	RETURN
;
CMD10	MOVLW	0FFH
	CALL	SPIO
	MOVLW	4AH
	CALL	SPIO
	MOVLW	0
	CALL	SPIO
	MOVLW	0
;	MOVWF	SSPBUF
	CALL	SPIO
	MOVLW	0
	CALL	SPIO
	MOVLW	0
	CALL	SPIO
	MOVLW	0FFH
	CALL	SPIO
	RETURN
;
```


----------



## Meta (Ago 19, 2009)

*SIMONF*

MEnudo curro amigo.



```
;
    ;****************************************************
    ;RUTINAS MEMORIA SD
    ;****************************************************
    ;
    ;RUTINA DE INICIALIZACION DEL MODULO SPI
    INISPI   BCF   STATUS,RP1
       BSF   STATUS,RP0   ;BANCO 1
    ;
       BCF   TRISC,1      ;SALIDA PARA CONTROLAR CS
       BCF   TRISC,3      ;RELOJ SALIDA
       BSF   TRISC,4      ;PARA CONTROLAR SDO
       BCF   TRISC,5      ;PARA CONTROLAR SDI
    ;
       BSF   SSPSTAT,7   ;BIT SMP
       BCF   SSPSTAT,6   ;BIT CKE
       BCF   STATUS,RP0   ;BANCO 0
    ;
       BSF   SSPCON,4   ;BIT CKP
    ;
       BSF   SSPCON,0   ;FOSC/16
       BSF   SSPCON,5   ;BIT SSPEN : HAB. MOD. SPI
    ;
       RETURN
    ;
    ;***********************************************************
    ;RUTINA PARA ENVIAR/RECIBIR UN BYTE A LA SD
    ;
    SPIO   MOVWF   SSPBUF      ;PONE DATO EN BUFFER
    SPIO0   BTFSS   SSPCON,7   ;DATA SENT?
       GOTO   SPIO1      ;SI.  PROCEDA
       BCF   SSPCON,7   ;NO. RESET WCOL Y DE NUEVO      
       GOTO   SPIO
       CALL   LDEL
    SPIO1   BSF   STATUS,RP0   ;BANCO 1
    SPIO2   BTFSS   SSPSTAT,0   ;BUFFER FULL?
       GOTO   SPIO2      ;NO.  OTRA VEZ
       BCF   STATUS,RP0   ;BANCO 0
       MOVF   SSPBUF,0   ;ALMACENA DATO EN REG W
       RETURN
    ;*****************************************************
    ;RUTINA DE INICIALIZACION DE LA SD
    INISD   BSF   PTOC,1      ;INHABILITA SD
       BSF   PTOC,5
       MOVLW   10H
       MOVWF   VAR6
    INISD1   MOVLW   0FFH
       CALL   SPIO      ;ENVIA +74 PULSOS DE CLK
       DECFSZ   VAR6,1
       GOTO   INISD1
       BCF   PTOC,1      ;HABILITA SD
    ;
    ;ENVIO DE COMANDOS DE INICIALIZACION DE LA SD
    ;
       CALL   CMD0      ;COMANDO 0
    INISD2   MOVLW   0FFH
       CALL   SPIO
       MOVF   SSPBUF,0
       MOVWF   VAR5
       MOVLW   1      ;ESPERA "01" COMO RESPUESTA
       XORWF   VAR5,1
       BTFSS   STATUS,2
       GOTO   INISD2
       MOVF   SSPBUF,0
       ADDLW   30H
       CALL   LCDATA
    ;
    INISD3   CALL   CMD1      ;COMANDO 1
    INISD13   MOVLW   0FFH
       CALL   SPIO
       MOVLW   0FFH
       CALL   SPIO
       MOVF   SSPBUF,0
       MOVWF   VAR5
       MOVLW   0      ;ESPERA "00" COMO RESPUESTA
       XORWF   VAR5,1
       BTFSS   STATUS,2
       GOTO   INISD3
    ;
       MOVF   SSPBUF,0
       ADDLW   30H
       CALL   LCDATA
       CALL   LDEL
    ;
    INISD4   CALL   CMD55
       MOVLW   0FFH
       CALL   SPIO
       MOVLW   0FFH
       CALL   SPIO
       MOVF   SSPBUF,0
       MOVWF   VAR5
       MOVLW   0      ;ESPERA "00" COMO RESPUESTA
       XORWF   VAR5,1
       BTFSS   STATUS,2
       GOTO   INISD4
    ;
    INISD5   CALL   CMD10
    INISD51   MOVLW   0FFH
       CALL   SPIO
       MOVF   SSPBUF,0
       MOVWF   VAR5
       MOVLW   0      ;ESPERA "00" COMO RESPUESTA
       XORWF   VAR5,1
       BTFSS   STATUS,2
       GOTO   INISD51
    ;
    INISD6   MOVLW   0FFH
       CALL   SPIO
       MOVF   SSPBUF,0
       MOVWF   VAR5
       MOVLW   0FEH      ;ESPERA "0FEH" COMO RESPUESTA
       XORWF   VAR5,1
       BTFSS   STATUS,2
       GOTO   INISD6
    ;
       MOVLW   3EH
       MOVWF   VAR7
    INISD7   MOVLW   0FFH
       CALL   SPIO
    INISD8   MOVF   SSPBUF,0
       CALL   LCDATA      ;ESCRIBE EN LCD LO QUE LEE DE MASTER BOOT SECTOR
       DECFSZ   VAR7,1
       GOTO   INISD7
    ;
       CALL   SEG1
       RETURN
    ;
    ;  hasta aqui, todo bien.  Aun no he enviado comandos de direccionamiento ni de escritua
    ;
    ;*************************************************************
    ;COMANDOS DE LA TARJETA SD
    ;
    CMD0   MOVLW   0FFH
       CALL   SPIO
       MOVLW   40H
       CALL   SPIO
       MOVLW   0
       CALL   SPIO
       MOVLW   0
       CALL   SPIO
       MOVLW   0
       CALL   SPIO
       MOVLW   0
       CALL   SPIO
       MOVLW   95H
       CALL   SPIO
       MOVLW   0FFH
       CALL   SPIO
       RETURN
    ;
    CMD1   MOVLW   0FFH
       CALL   SPIO
       MOVLW   41H
       CALL   SPIO
       MOVLW   0
       CALL   SPIO
       MOVLW   0
       CALL   SPIO
       MOVLW   0
       CALL   SPIO
       MOVLW   0
       CALL   SPIO
       MOVLW   0FFH
       CALL   SPIO
       RETURN
    ;
    CMD9   MOVLW   0FFH
       CALL   SPIO
       MOVLW   49H
       CALL   SPIO
       MOVLW   0
       CALL   SPIO
       MOVLW   0
       MOVWF   SSPBUF
       CALL   SPIO
       MOVLW   0
       CALL   SPIO
       MOVLW   0
       CALL   SPIO
       MOVLW   0FFH
       CALL   SPIO
       RETURN
    ;
    CMD10   MOVLW   0FFH
       CALL   SPIO
       MOVLW   4AH
       CALL   SPIO
       MOVLW   0
       CALL   SPIO
       MOVLW   0
    ;   MOVWF   SSPBUF
       CALL   SPIO
       MOVLW   0
       CALL   SPIO
       MOVLW   0
       CALL   SPIO
       MOVLW   0FFH
       CALL   SPIO
       RETURN
    ;
```

DavidGamba

Muy buen aporte.


----------



## tecnogirl (Oct 30, 2009)

... y tambien:
www.dharmanitech.com/2009/01/sd-card-interfacing-with-atmega8-fat32.html
Salu2.


----------



## Ducky (Nov 9, 2009)

Hola que tal yo ya consegui escribir en un txt creado en la SD apartir del PIC18FXX2 y el compilador mikroC 2009, el problema es que solo escribo lo que yo programe previamente, ahora nose si alguien me pueda ayudar con esto, me gustaria que guarde lo que yo mande por el puerto RS232 y se guarde. la instrucion que utilizo es esto:

unsigned char txt[] = "Esto es lo que guardo en el TXT";
Mmc_Fat_Write(txt,sizeof(txt));

como le hago para que esto me guarde lo quellegue por elpuerto serial, me imagino que deberia de llenar una array o algo por el estilo pero no se como hacerlo en mikroC.
agradeceria mucho su ayuda.

Hola que tal solo paso a comentar he conseguido solucionar mi problema y si efectivamente tenia que hacer un llenado de buffer o bien de un array, de esta manera eh conseguido trabajar perfectamente con la MMC/SD y su FAT sin nungun problema

Saludos!!!


----------



## Moyano Jonathan (Nov 17, 2009)

Cuanto te consume de RAM - ROM el proyecto compilado ??


----------



## Ducky (Nov 24, 2009)

ROM (29%) & RAM (67%) esto puede variar deacuerdo al tamaño del buffer


----------



## Cinti (Feb 15, 2010)

Buenos días.
Me encuentro programando en asm, la SD inicializa bien, responde a escritura y lectura como si lo hubiese hecho correctamente, pero cuando veo la tarjeta con el WinHex, resulta que no grabó nada. Nosé si el problema tendrá que ver con algún offset de direccionamiento, pero me estoy volviendo loca. Gracias por cualquier aporte.
Saludos


----------



## Ducky (Feb 16, 2010)

Hola Cinti, si estas haciendo la inicializacion paralectura y escritura correctamente, debes asignar en que bloque deseas escribir cada SD contiene "X" bloques de 512 bytes, el No. de bloques correscondera al tamaño de la SD, pero antes de escribir te recomiendo verificar si ya asignaste el bloque deescritura y en tu winhex verifica ese bloque asignado k tenga tus datos guardados 

Saludos!!!


----------



## Cinti (Feb 16, 2010)

Gracias Ducky! Igualmente ya solucioné el problema, resultó ser que para alimentar la tarjeta tenía un divisor de 5V a 3V que con la impedancia de entrada de la SD bajaba hasta 2V, y me trajo unos grandes dolores de cabeza ya que la SD respondía a todos los comandos como si anduviese perfecto.

Al que le interese el tema y sea un loco renegado como yo que quiera sacar andando el proyecto en assembler, no tengo problema en ayudarlos. Voy a intentar de crear un FAT16 con assembler, espero no morir en el intento.

Saludos


----------



## Cinti (Feb 17, 2010)

quizas a alguien le sirva:

para visualizar los datos grabados en la SD (en el comando 24 se envia la posición de memoria a grabar, no el número de sector, por eso como sólo se puede grabar cuando comienza cada sector, es que el último byte debe ser siempre 00: 0x58 0xYY 0xYY 0xYY 0x*00* 0xCRC) en el WinHex hay que abrir la tarjeta como soporte físico, y no como unidad lógica ya que ésta última opción visualiza los archivos que windows puede interpretar (FAT) y no el texto plano que estamos escribiendo en la tarjeta. 
A su vez cuando vamos a Mi PC a ver el espacio de memoria ocupada en la SD, antes y después de grabar la memoria, es siempre el mismo, porque windows no "ve" lo que grabamos.
Una manera muy sencilla de "crear" un archivo de texto es crear desde windows un .txt lleno de espacios en blanco (por lo menos 512) y guardarlo en la SD, luego ver con el WinHex en que posición de la memoria se encuentran los _datos_ del .txt (para buscarlo abrir la SD como unidad lógica y clickear sobre el archivo y nos direccionará al sector de la SD donde están los datos). Por último enviar el comando 24 con la posición de memoria donde comienzan los datos (los espacios en blanco) del .txt. Cuando abramos el archivo de texto desde Mi PC veremos que los datos (los espacios) fueron sobreescribidos y en su lugar está el texto plano que enviamos nosotros desde el micro. (Ahora sí podremos ver el texto que grabamos desde la unidad lógica y desde el soporte físico).
bueno, ojalá a alguien le sirva. Saludos!!


----------



## Moyano Jonathan (Feb 26, 2010)

si quieren utilizar FAT16 en sus proyectos lean el hilo completo del foto UCONTROL: 
http://www.ucontrol.com.ar/forosmf/...e-memoria-sd-con-ccs-libreria-nivel-hardware/ ahi está todo lo que necesitan muy bien explicado ...eso si la librería consume bastantes recursos de memoria del micro ..asi que si la utilizan es mejor que organizen bien su programa... lo más recomendado PIC18F o PIC24F


----------



## steppenwolf0 (Mar 3, 2010)

Me desespere de usar el MikroC porque se trababa , no se porque. Por lo que desarrolle el codigo en ensamblador, apenas es nivel hardware. Este codigo es para el pic 18f452 con Xtal 12 MHz y enviar por USART a 19200. Por si a alguien le sirve. Da el CID de la tarjeta. 
	
	



```
;******************************************************************************
;                                                                             *
;    Filename:  Trasmisión de Datos						                      *
;    Date:         25/07/07                                                   *
;    File Version:                                                            *
;                                                                             *
;    Author:     Alejandro López Rincón                                       *
;    Company:                                                                 *
;                                                                             * 
;******************************************************************************
;                                                                             *
;    Files required:         P18F4550.INC                                     *
;                                                                             *
	;LIST P=18F4550, F=INHX32	;directive to define processor and file format
LIST P=18F452, F=INHX32
	#include <P18F452.INC>	;processor specific variable definitions

;*******************************************************************************
;Configuration bits

	__CONFIG	_CONFIG4L,_LVP_OFF_4L & _STVR_OFF_4L & _DEBUG_OFF_4L 

;ICPORT disabled
;Stack full/underflow will not cause Reset
;Single-Supply ICSP disabled
;Instruction set extension and Indexed Addressing mode ENABLED
;Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins

	__CONFIG	_CONFIG2H,_WDT_OFF_2H   
; HW Disabled - SW Controlled
;******************************************************************************
;12 MHz Reales

	__CONFIG	_CONFIG1H,_HSPLL_OSC_1H ; & _OSCS_ON_1H
; Oscillator Switchover mode disabled
; Fail-Safe Clock Monitor disabled
; HS oscillator, PLL enabled, HS used by USB
	;__CONFIG	_CONFIG1L,_CPUDIV_OSC1_PLL2_1L& _PLLDIV_3_1L 
;12 MHz REALES
; [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
; Divide by 3 (12 MHz oscillator input)
	
;Variable definitions
; These variables are only needed if low priority interrupts are used. 
; More variables may be needed to store other special function registers used
; in the interrupt routines.


;FORMA EN QUE ESTAN CONECTADOS LOS PINES
	#define		CHS		LATC,2

		CBLOCK	0x080
		WREG_TEMP	;variable used for context saving 
		STATUS_TEMP	;variable used for context saving
		BSR_TEMP	;variable used for context saving
		ENDC

		CBLOCK	0x000
		DATA_OUT
		DATA_IN
		cont1
		cont2	
		VALOR
		DELAY_0
		VAL

;		
		INICIO	;VARIABLE PARA INICIALIZACION
		CORRECTO	;VARIBALE PARA DECIR QUE FUE CORRECTO EL ENVIO
		ENDC

;******************************************************************************
;EEPROM data
; Data to be programmed into the Data EEPROM is defined here

		ORG	0xf00000

		DE	"Test Data",0,1,2,3,4,5

;******************************************************************************
;Reset vector
; This code will start executing when a reset occurs.

		ORG	0x0000

		goto	Main		;go to start of main code

;******************************************************************************
;High priority interrupt vector
; This code will start executing when a high priority interrupt occurs or
; when any interrupt occurs if interrupt priorities are not enabled.

		ORG	0x0008

		bra	HighInt		;go to high priority interrupt routine

;******************************************************************************
;Low priority interrupt vector and routine
; This code will start executing when a low priority interrupt occurs.
; This code can be removed if low priority interrupts are not used.

		ORG	0x0018

		movff	STATUS,STATUS_TEMP	;save STATUS register
		movff	WREG,WREG_TEMP		;save working register
		movff	BSR,BSR_TEMP		;save BSR register

;	*** low priority interrupt code goes here ***
	

		movff	BSR_TEMP,BSR		;restore BSR register
		movff	WREG_TEMP,WREG		;restore working register
		movff	STATUS_TEMP,STATUS	;restore STATUS register
		retfie

;******************************************************************************
;High priority interrupt routine
; The high priority interrupt code is placed here to avoid conflicting with
; the low priority interrupt vector.

HighInt:
		;prioridad alta recepcion de datos
		btfsc	PIR1,RCIF		  
		call	RC_ISR ;** high priority interrupt code goes here ***


		retfie	FAST

;******************************************************************************
;Start of main program
; The main program code is placed here.

Main:
	CALL CONFIG_USART
	bsf	PORTB,0
	clrf	cont1
	clrf	cont2
delay_init
	decfsz	cont1,f
	goto	delay_init
	decfsz	cont2,f
	goto	delay_init
	bcf	PORTB,0

;****************************************************INICIALIZAR******************************************
;****************************************************INICIALIZAR******************************************
;****************************************************INICIALIZAR******************************************
;CARGAR VALOR DE INICIO Y CORRECTO
	MOVLW	0X01
	MOVWF	INICIO
	CLRF	CORRECTO
;ENVIAR 10 INSTRUCCIONES PARA INICIALIZAR LA TARJETA
	BSF		CHS
	MOVLW	0XFF
	CALL	TRANSMIT
	MOVLW	0XFF
	CALL	TRANSMIT
	MOVLW	0XFF
	CALL	TRANSMIT
	MOVLW	0XFF
	CALL	TRANSMIT
	MOVLW	0XFF
	CALL	TRANSMIT
	MOVLW	0XFF
	CALL	TRANSMIT
	MOVLW	0XFF
	CALL	TRANSMIT
	MOVLW	0XFF
	CALL	TRANSMIT
	MOVLW	0XFF
	CALL	TRANSMIT
	MOVLW	0XFF
	CALL	TRANSMIT
	BCF		CHS
;ENCENDER LA TARJETA
	BCF		CHS
;COMMAND 0 : 0X40,0X00,0X00,0X00,0X00,0X95
	MOVLW	0X40
	CALL	TRANSMIT
	MOVLW	0X00
	CALL	TRANSMIT
	MOVLW	0X00
	CALL	TRANSMIT
	MOVLW	0X00
	CALL	TRANSMIT
	MOVLW	0X00
	CALL	TRANSMIT
	MOVLW	0X95
	CALL	TRANSMIT
;CHECO SI SE ENVIO CORRECTAMENTE	
	CPFSEQ	INICIO
	GOTO	NO
	GOTO	OK
NO
	MOVLW	0XFF
	CALL	TRANSMIT
	CPFSEQ	INICIO
	GOTO	NO
	GOTO	OK
;SE ENVIO CORRECTAMENTE ENVIO EL DATO POR EL UART 0X01	
OK
	MOVLW	0X65
	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...
;COMMAND 1 : 0X41,0X00,0X00,0X00,0X00,0XFF
NO_CMD_1
	MOVLW	0X41
	CALL	TRANSMIT
	MOVLW	0X00
	CALL	TRANSMIT
	MOVLW	0X00
	CALL	TRANSMIT
	MOVLW	0X00
	CALL	TRANSMIT
	MOVLW	0X00
	CALL	TRANSMIT
	MOVLW	0XFF
	CALL	TRANSMIT

	MOVLW	0XFF
	CALL	TRANSMIT

	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...

	MOVLW	0XFF
	CALL	TRANSMIT

	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...


	CPFSEQ	CORRECTO
	GOTO	NO_CMD_1
	GOTO	OK_CMD_1


OK_CMD_1
	MOVLW	0X66
	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...	



NO_CMD_4A
	MOVLW	0X4A
	CALL	TRANSMIT
	MOVLW	0X00
	CALL	TRANSMIT
	MOVLW	0X00
	CALL	TRANSMIT
	MOVLW	0X00
	CALL	TRANSMIT
	MOVLW	0X00
	CALL	TRANSMIT
	MOVLW	0XFF
	CALL	TRANSMIT

	MOVLW	0XFF
	CALL	TRANSMIT

	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...

	MOVLW	0XFF
	CALL	TRANSMIT

	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...


	CPFSEQ	CORRECTO
	GOTO	NO_CMD_4A
	GOTO	OK_CMD_4A


OK_CMD_4A
	MOVLW	0X67
	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...





;****************************************************INICIALIZAR******************************************
;****************************************************INICIALIZAR******************************************
;****************************************************INICIALIZAR******************************************

MAINLOOP

	MOVLW	0XFF
	CALL	TRANSMIT
	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...


	GOTO MAINLOOP

;******************************************************************************
;++++++++++
CONFIG_USART
;+++++++++++INICIALIZAR EL PUERTO B COMO SALIDA DIGITAL Y EL PUERTO A (AN0 Y AN1 COMO ENTRADAS ANALOGICAS)
	CLRF	PORTB
	CLRF	LATB
	CLRF	TRISB
	MOVLW	0X0F
	MOVWF	ADCON1
;++++++++++++ CONFIGURACION DEL ADC PARA USAR EL AN0 A 12 MHZ
	;MOVLW	B'00000000' freq./64, 16 tad,left justified 
	MOVLW	B'10000000'
	MOVWF	ADCON0
	;MOVLW	B'00110110'
	MOVLW	B'01000000'
	MOVWF	ADCON1
	BSF		TRISA,0
;++++++++++++++++++++ EUSART 
	movlw	.155	; inicializo con 155 SPBRG (19200 bauds)
	movwf	SPBRG	
	MOVLW	B'00100100' 
	MOVWF	TXSTA
	MOVLW	B'10010000'
	MOVWF	RCSTA
	;MOVLW	B'00000000'
	;MOVWF	BAUDCON
	CLRF	PORTC
	CLRF	LATC
	CLRF	TRISC

;inicializacion de interrupciones y entrada y salida del puerto c
	BSF		TRISC,7
	BCF		TRISC,6
	CLRF	PIE1
	BSF		IPR1,7
	BSF		PIE1,RCIE
	BSF		INTCON,7
	BSF		INTCON,6
	BSF		RCON,7
	BSF		IPR1,5

;CONFIGURAR SPI
	MOVLW	B'00110010'
	MOVWF	SSPCON1
	BCF		SSPSTAT,7
	BCF		SSPSTAT,6
	
	BCF		TRISC,5
	BCF		TRISC,3
	BSF		TRISC,4
	BCF		TRISC,2

	RETURN



;+++++
RC_ISR


	bcf	PIR1,RCIF	; apago el flag de la interrupcion
	
	movff	RCREG,	DATA_IN			; Guardo el dato recibido en
	; data_in
	bcf	RCSTA,CREN	; Limpio por si hubo errores en la
	bsf	RCSTA,CREN	; recepcion

	movlw	"p"		;
	xorWF	DATA_IN,w	;
	BTFSS	STATUS,Z
	goto	OFF
	CALL	ADC
	MOVFF	VALOR,TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...
	RETURN

OFF

	movlw	"a"		; 
	xorWF	DATA_IN,w	;
	btfss	STATUS,Z	;
	GOTO	off2
	BsF		PORTB,0
	RETURN

off2
	movlw	"x"		; 
	xorWF	DATA_IN,w	;
	btfss	STATUS,Z	;
	GOTO	OFF3
	MOVLW	"Y"
	movwf	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...
	MOVLW	"E"
	movwf	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...
	MOVLW	"S"
	movwf	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...
	RETURN

OFF3
	movlw	"o"		; 
	xorWF	DATA_IN,w	;
	btfss	STATUS,Z	;
	GOTO	no_send
	BCF		PORTB,0
	RETURN

no_send
	
	return
;*********************ADC
ADC
	BSF		ADCON0,ADON
	MOVLW	.76
	MOVWF	DELAY_0
DELAY	
	DECFSZ	DELAY_0
	BRA DELAY
	BSF		ADCON0,GO
LOOP2
	BTFSC	ADCON0,GO
	GOTO	LOOP2
	MOVFF	ADRESH,VALOR
	BCF		ADCON0,ADON
	MOVFF	VALOR,PORTB
	RETURN

;*********************TRANSMIT
TRANSMIT
	MOVWF	SSPBUF
LOOP_T
	BTFSS	SSPSTAT,BF
	GOTO 	LOOP_T
	MOVF	SSPBUF,W
	RETURN


END
```


----------



## george.manson.69 (Mar 8, 2010)

Hola a todos, tengo una targeta microSD de 512 MB si puede funcionar con las rutinas enconbtradas en este tema?, ya que lo desarrolle, pero no logro que funcione fisciamente, pero en proteus funciona al 100.para alimentar la targeta uso dos resistencias en serie (divisor de tension) para que me de 3.3v que es necesario para aliemntar al microSD. Y por supuesto las entradas o salidas del PIC18 tienen resistencias de 10Kohm para que no caiga todo el voltaje de 5V al microSD. 

Poruqe no funcionara? 

aclaro que uso un PIC18F2550 corriendo a 20Mhz, uso el primero ejemplo que se encontro aqui.


----------



## steppenwolf0 (Mar 8, 2010)

Pues el circuito lo subi a esta pagina.

http://www.ral-tek.com/index_archivos/Page371.htm

Ahora tengo ya una segunda version del codigo, este escribe la tarjeta en RAW, pueden checarlo con el WinHEX. Lee datos del ADC y los envia a la tarjeta. (Data logger) ademas envia informacion al Serial para que vean como se va desarrollando el proceso.


```
;******************************************************************************
;                                                                             *
;    Filename:  Trasmisión de Datos						                      *
;    Date:         25/07/07                                                   *
;    File Version:                                                            *
;                                                                             *
;    Author:     Alejandro López Rincón                                       *
;    Company:                                                                 *
;                                                                             * 
;******************************************************************************
;                                                                             *
;    Files required:         P18F4550.INC                                     *
;                                                                             *
	;LIST P=18F4550, F=INHX32	;directive to define processor and file format
LIST P=18F452, F=INHX32
	#include <P18F452.INC>	;processor specific variable definitions

;*******************************************************************************
;Configuration bits

	__CONFIG	_CONFIG4L,_LVP_OFF_4L & _STVR_OFF_4L & _DEBUG_OFF_4L 

;ICPORT disabled
;Stack full/underflow will not cause Reset
;Single-Supply ICSP disabled
;Instruction set extension and Indexed Addressing mode ENABLED
;Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins

	__CONFIG	_CONFIG2H,_WDT_OFF_2H   
; HW Disabled - SW Controlled
;******************************************************************************
;12 MHz Reales

	__CONFIG	_CONFIG1H,_HSPLL_OSC_1H ; & _OSCS_ON_1H
; Oscillator Switchover mode disabled
; Fail-Safe Clock Monitor disabled
; HS oscillator, PLL enabled, HS used by USB
	;__CONFIG	_CONFIG1L,_CPUDIV_OSC1_PLL2_1L& _PLLDIV_3_1L 
;12 MHz REALES
; [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
; Divide by 3 (12 MHz oscillator input)
	
;Variable definitions
; These variables are only needed if low priority interrupts are used. 
; More variables may be needed to store other special function registers used
; in the interrupt routines.


;FORMA EN QUE ESTAN CONECTADOS LOS PINES
	#define		CHS		LATC,2

		CBLOCK	0x080
		WREG_TEMP	;variable used for context saving 
		STATUS_TEMP	;variable used for context saving
		BSR_TEMP	;variable used for context saving
		ENDC

		CBLOCK	0x000
		DATA_OUT
		DATA_IN
		cont1
		cont2	
		VALOR
		DELAY_0
		VAL

;		
		INICIO	;VARIABLE PARA INICIALIZACION DEBE DE SER 01
		CORRECTO	;VARIBALE PARA DECIR QUE FUE CORRECTO EL ENVIO DEBE DE SER 00
		CONTADOR_RESPUESTA ;VARIABLE PARA LA CANTIDAD DE INFORMACION QUE SE VA A LEER
		INICIO_DATA		;0XFE DATO DE EMPEZAR A LEER O ESCRIBIR
		VAL_MAYOR		;PARA EL CONTADOR DE 512 BYTE SUPERIOR
		VAL_MENOR		;PARA EL CONTADOR DE 512 BYTE INFERIOR
		ADC_MAYOR		;PARA EL CONTADOR DEL ADC BYTE SUPERIOR
		ADC_MENOR		;PARA EL CONTADOR DEL ADC BYTE INFERIOR

		DIR0_SD			;HIGHEST BYTE SD DIR
		DIR1_SD
		DIR2_SD
		DIR3_SD

		ENDC

;******************************************************************************
;EEPROM data
; Data to be programmed into the Data EEPROM is defined here

		ORG	0xf00000

		DE	"Test Data",0,1,2,3,4,5

;******************************************************************************
;Reset vector
; This code will start executing when a reset occurs.

		ORG	0x0000

		goto	Main		;go to start of main code

;******************************************************************************
;High priority interrupt vector
; This code will start executing when a high priority interrupt occurs or
; when any interrupt occurs if interrupt priorities are not enabled.

		ORG	0x0008

		bra	HighInt		;go to high priority interrupt routine

;******************************************************************************
;Low priority interrupt vector and routine
; This code will start executing when a low priority interrupt occurs.
; This code can be removed if low priority interrupts are not used.

		ORG	0x0018

		movff	STATUS,STATUS_TEMP	;save STATUS register
		movff	WREG,WREG_TEMP		;save working register
		movff	BSR,BSR_TEMP		;save BSR register

;	*** low priority interrupt code goes here ***
	

		movff	BSR_TEMP,BSR		;restore BSR register
		movff	WREG_TEMP,WREG		;restore working register
		movff	STATUS_TEMP,STATUS	;restore STATUS register
		retfie

;******************************************************************************
;High priority interrupt routine
; The high priority interrupt code is placed here to avoid conflicting with
; the low priority interrupt vector.

HighInt:
		;prioridad alta recepcion de datos
		btfsc	PIR1,RCIF		  
		call	RC_ISR ;** high priority interrupt code goes here ***


		retfie	FAST

;******************************************************************************
;Start of main program
; The main program code is placed here.

Main:
	CALL CONFIG_USART
	bsf	PORTB,0
	clrf	cont1
	clrf	cont2
delay_init
	decfsz	cont1,f
	goto	delay_init
	decfsz	cont2,f
	goto	delay_init
	bcf	PORTB,0

;****************************************************INICIALIZAR******************************************
;****************************************************INICIALIZAR******************************************
;****************************************************INICIALIZAR******************************************
;CARGAR VALOR DE INICIO Y CORRECTO
	MOVLW	0X01
	MOVWF	INICIO
	CLRF	CORRECTO
	MOVLW	.18
	MOVWF	CONTADOR_RESPUESTA
	MOVLW	0XFE
	MOVWF	INICIO_DATA
;ENVIAR 10 INSTRUCCIONES PARA INICIALIZAR LA TARJETA
	BSF		CHS
	MOVLW	0XFF
	CALL	TRANSMIT
	MOVLW	0XFF
	CALL	TRANSMIT
	MOVLW	0XFF
	CALL	TRANSMIT
	MOVLW	0XFF
	CALL	TRANSMIT
	MOVLW	0XFF
	CALL	TRANSMIT
	MOVLW	0XFF
	CALL	TRANSMIT
	MOVLW	0XFF
	CALL	TRANSMIT
	MOVLW	0XFF
	CALL	TRANSMIT
	MOVLW	0XFF
	CALL	TRANSMIT
	MOVLW	0XFF
	CALL	TRANSMIT
	BCF		CHS
;ENCENDER LA TARJETA
	BCF		CHS
;COMMAND 0 : 0X40,0X00,0X00,0X00,0X00,0X95
	MOVLW	0X40
	CALL	TRANSMIT
	MOVLW	0X00
	CALL	TRANSMIT
	MOVLW	0X00
	CALL	TRANSMIT
	MOVLW	0X00
	CALL	TRANSMIT
	MOVLW	0X00
	CALL	TRANSMIT
	MOVLW	0X95
	CALL	TRANSMIT
;CHECO SI SE ENVIO CORRECTAMENTE	
	CPFSEQ	INICIO
	GOTO	NO
	GOTO	OK
NO
	MOVLW	0XFF
	CALL	TRANSMIT
	CPFSEQ	INICIO
	GOTO	NO
	GOTO	OK
;SE ENVIO CORRECTAMENTE ENVIO EL DATO POR EL UART 0X01	
OK	
	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando..
	MOVLW	0X65
	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...
;COMMAND 1 : 0X41,0X00,0X00,0X00,0X00,0XFF
NO_CMD_1
	MOVLW	0X41
	CALL	TRANSMIT
	MOVLW	0X00
	CALL	TRANSMIT
	MOVLW	0X00
	CALL	TRANSMIT
	MOVLW	0X00
	CALL	TRANSMIT
	MOVLW	0X00
	CALL	TRANSMIT
	MOVLW	0XFF
	CALL	TRANSMIT

	MOVLW	0XFF
	CALL	TRANSMIT

	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...

	MOVLW	0XFF
	CALL	TRANSMIT

	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...


	CPFSEQ	CORRECTO
	GOTO	NO_CMD_1
	GOTO	OK_CMD_1


OK_CMD_1
	MOVLW	0X66
	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...	



NO_CMD_4A
	MOVLW	0X4A
	CALL	TRANSMIT
	MOVLW	0X00
	CALL	TRANSMIT
	MOVLW	0X00
	CALL	TRANSMIT
	MOVLW	0X00
	CALL	TRANSMIT
	MOVLW	0X00
	CALL	TRANSMIT
	MOVLW	0XFF
	CALL	TRANSMIT

	MOVLW	0XFF
	CALL	TRANSMIT

	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...

	MOVLW	0XFF
	CALL	TRANSMIT

	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...


	CPFSEQ	CORRECTO
	GOTO	NO_CMD_4A
	GOTO	OK_CMD_4A


OK_CMD_4A
	MOVLW	0X67
	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...

RES_CMD_4A
	MOVLW	0XFF
	CALL	TRANSMIT

	CPFSEQ	INICIO_DATA
	GOTO	RES_CMD_4A


	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...	

DATA_CMD_4A
	MOVLW	0XFF
	CALL	TRANSMIT
	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando..
	DECFSZ	CONTADOR_RESPUESTA
	GOTO	DATA_CMD_4A
	

;****************************************************INICIALIZAR******************************************
;****************************************************INICIALIZAR******************************************
;****************************************************INICIALIZAR******************************************
	CLRF	DIR0_SD
	CLRF	DIR1_SD
	CLRF	DIR2_SD
	CLRF	DIR3_SD

;	MOVLW	0X02
;	MOVWF	DIR2_SD

MAINLOOP

	MOVLW	0X02
	MOVWF	ADC_MAYOR
	CLRF	ADC_MENOR


	
CAPTURA_DATOS

	CALL	ADC
	
	
	MOVFF	ADC_MAYOR,FSR0H
	MOVFF	ADC_MENOR,FSR0L

	MOVFF	VALOR,INDF0


	INCFSZ	ADC_MENOR
	GOTO	CAPTURA_DATOS
	INCF	ADC_MAYOR
	MOVLW	0X04
	CPFSEQ	ADC_MAYOR
	GOTO	CAPTURA_DATOS

	MOVLW	0X02
	MOVWF	ADC_MAYOR
	CLRF	ADC_MENOR

	CALL	ESCRIBIR_SD

	INCF	DIR2_SD
	INCFSZ	DIR2_SD
	GOTO	MAINLOOP
	INCFSZ	DIR1_SD
	GOTO	MAINLOOP
	MOVLW	0X07
	CPFSEQ	DIR0_SD
	GOTO	MAINLOOP
	CLRF	DIR0_SD
	GOTO	MAINLOOP

;******************************************************************************
;++++++++++
CONFIG_USART
;+++++++++++INICIALIZAR EL PUERTO B COMO SALIDA DIGITAL Y EL PUERTO A (AN0 Y AN1 COMO ENTRADAS ANALOGICAS)
	CLRF	PORTB
	CLRF	LATB
	CLRF	TRISB
	MOVLW	0X0F
	MOVWF	ADCON1
;++++++++++++ CONFIGURACION DEL ADC PARA USAR EL AN0 A 12 MHZ
	;MOVLW	B'00000000' freq./64, 16 tad,left justified 
	MOVLW	B'10000000'
	MOVWF	ADCON0
	;MOVLW	B'00110110'
	MOVLW	B'01000000'
	MOVWF	ADCON1
	BSF		TRISA,0
;++++++++++++++++++++ EUSART 
	movlw	.155	; inicializo con 155 SPBRG (19200 bauds)
	movwf	SPBRG	
	MOVLW	B'00100100' 
	MOVWF	TXSTA
	MOVLW	B'10010000'
	MOVWF	RCSTA
	;MOVLW	B'00000000'
	;MOVWF	BAUDCON
	CLRF	PORTC
	CLRF	LATC
	CLRF	TRISC

;inicializacion de interrupciones y entrada y salida del puerto c
	BSF		TRISC,7
	BCF		TRISC,6
	CLRF	PIE1
	BSF		IPR1,7
	BSF		PIE1,RCIE
	BSF		INTCON,7
	BSF		INTCON,6
	BSF		RCON,7
	BSF		IPR1,5

;CONFIGURAR SPI
	MOVLW	B'00110010'
	MOVWF	SSPCON1
	BCF		SSPSTAT,7
	BCF		SSPSTAT,6
	
	BCF		TRISC,5
	BCF		TRISC,3
	BSF		TRISC,4
	BCF		TRISC,2

	RETURN



;+++++
RC_ISR


	bcf	PIR1,RCIF	; apago el flag de la interrupcion
	
	movff	RCREG,	DATA_IN			; Guardo el dato recibido en
	; data_in
	bcf	RCSTA,CREN	; Limpio por si hubo errores en la
	bsf	RCSTA,CREN	; recepcion

	movlw	"p"		;
	xorWF	DATA_IN,w	;
	BTFSS	STATUS,Z
	goto	OFF
	CALL	ADC
	MOVFF	VALOR,TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...
	RETURN

OFF

	movlw	"a"		; 
	xorWF	DATA_IN,w	;
	btfss	STATUS,Z	;
	GOTO	off2
	BsF		PORTB,0
	RETURN

off2
	movlw	"x"		; 
	xorWF	DATA_IN,w	;
	btfss	STATUS,Z	;
	GOTO	OFF3
	MOVLW	"Y"
	movwf	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...
	MOVLW	"E"
	movwf	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...
	MOVLW	"S"
	movwf	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...
	RETURN

OFF3
	movlw	"o"		; 
	xorWF	DATA_IN,w	;
	btfss	STATUS,Z	;
	GOTO	no_send
	BCF		PORTB,0
	RETURN

no_send
	
	return
;*********************ADC
ADC
	BSF		ADCON0,ADON
	MOVLW	.76
	MOVWF	DELAY_0
DELAY	
	DECFSZ	DELAY_0
	BRA DELAY
	BSF		ADCON0,GO
LOOP2
	BTFSC	ADCON0,GO
	GOTO	LOOP2
	MOVFF	ADRESH,VALOR
	BCF		ADCON0,ADON
;	MOVFF	VALOR,PORTB
	RETURN

;*********************TRANSMIT
TRANSMIT
	MOVWF	SSPBUF
LOOP_T
	BTFSS	SSPSTAT,BF
	GOTO 	LOOP_T
	MOVF	SSPBUF,W
	RETURN
;****************************************************ESCRIBIR*************************************************
;****************************************************ESCRIBIR*************************************************
;****************************************************ESCRIBIR*************************************************
ESCRIBIR_SD

NO_CMD_51
	MOVLW	0X58
	CALL	TRANSMIT
;	MOVLW	0X00
	MOVF	DIR0_SD,W
	CALL	TRANSMIT
;	MOVLW	0X00
	MOVF	DIR1_SD,W
	CALL	TRANSMIT
;	MOVLW	0X00
	MOVF	DIR2_SD,W
	CALL	TRANSMIT
;	MOVLW	0X00
	MOVF	DIR3_SD,W
	CALL	TRANSMIT
	MOVLW	0XFF
	CALL	TRANSMIT	

	MOVLW	0XFF
	CALL	TRANSMIT

	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...

	MOVLW	0XFF
	CALL	TRANSMIT

	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...


	CPFSEQ	CORRECTO
	GOTO	NO_CMD_51
	GOTO	OK_CMD_51


OK_CMD_51
	MOVLW	0X70
	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando...


	MOVLW	0XFF
	CALL	TRANSMIT

	MOVLW	0XFF
	CALL	TRANSMIT

	MOVLW	0XFE
	CALL	TRANSMIT

	MOVLW	0X02
	MOVWF	VAL_MAYOR
	CLRF	VAL_MENOR

DATOS
	;MOVLW	0XFF
;	MOVLW	'M'
;	CALL	TRANSMIT


	MOVFF	VAL_MAYOR,FSR0H
	MOVFF	VAL_MENOR,FSR0L
	MOVF	INDF0,W
	CALL	TRANSMIT

	INCFSZ	VAL_MENOR
	GOTO	DATOS
	INCF	VAL_MAYOR
	MOVLW	0X04
	CPFSEQ	VAL_MAYOR
	GOTO	DATOS

	MOVLW	0X02
	MOVWF	VAL_MAYOR
	CLRF	VAL_MENOR


;	INCFSZ	VAL_MENOR
;	GOTO	DATOS
;	INCF	VAL_MAYOR
;	MOVLW	0X02
;	CPFSEQ	VAL_MAYOR
;	GOTO	DATOS

	MOVLW	0XFF
	CALL	TRANSMIT
	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando..

	MOVLW	0XFF
	CALL	TRANSMIT
	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando..

	MOVLW	0XFF
	CALL	TRANSMIT
	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando..

	MOVLW	0XFF
	CALL	TRANSMIT
	MOVWF	TXREG
	btfss	TXSTA, TRMT	; poleo hasta que el dato se haya enviado
	GOTO	$-2		; no se ha enviado el dato, esperando..	
	
	RETURN

;****************************************************ESCRIBIR*************************************************
;****************************************************ESCRIBIR*************************************************
;****************************************************ESCRIBIR*************************************************

END
```

Pretendo hacer la fat desde ensamblador, pero necesitare mas tiempo si alguien lo logra antes, por favor aviseme, que voy a andar ocupado algun tiempo antes de sentarme a ver lo de la fat. 

Dudas alejandro.lopezrn@hotmail.com


----------



## Javilondo (Mar 12, 2010)

Buenas!
He seguido todo el hilo y me parece bastante interesante, yo pienso implementar este conocimiento para ponerle un módulo de lectura de memoria aun CNC y que a su vez haga todos los cálculos necesarios para así sustituir la PC que ya tiene.

Hace unos días comencé a estudiar el sistema de archivos *FAT*. Lo elegí por su presunta simpleza, en fin, se me ocurrió que podría utilizar una *EEPROM* serial *24Cxx* para formatearla en FAT, sería grandioso porque con un sistema de archivos es más fácil accesar a los datos por medio de cualquier microcontrolador. Enseguida pensé... ¿Porqué no accesar a la memoria FAT mediante una computadora, de esa manera le podría meter archivos reales (mientras quepan claro), pensé en implementar una interfaz *I2C* con el *Handshake* del puerto *RS-232 *y desarrollar un programa para introducirle los archivos. 

Hasta ahora la proyección iba genial, pero pensé, _tener que accesar a dicha memoria a través de un programa_. Por muy bueno que fuera el GUI no deja de ser molesto, sería una mejor experiencia entrar a *"Mi PC"* en XP y encontrar la memoria como una unidad más del sistema. El punto es que si se puede con una memoria flash con interfaz USB debe de haber alguna manera de hacer lo mismo con esta memoria y con la interfaz *I2C / RS-232* (Handshake). Estuve cavilando un rato y me pregunté ¿Que tiene una pendrive que no tenga mi memoria aparte del protocolo y el formato? Llegué a la conclusión de que necesito conseguir o desarrollar un *driver *nativo, dll o api que permita el reconocimiento de mi memoria como una unidad del sistema y que pueda ser navegada por el Explorer de Windows.

Si alguien que sepa del tema fuera tan amable de orientarme le estaría muy agradecido.
No busco quien me ofrezca el problema resuelto, más bien necesito conocer las pautas para entrar en este rollo, aunque si alguien ya lo hizo y quiere compartir sus trabajos y experiencias estaría de lujo.

Espero sus respuestas amigos, bienvenida cualquier crítica en son de opinión.


----------



## Moyano Jonathan (Mar 12, 2010)

Lo que tratas de hacer está completamente probado @Javilondo , solo que está en C18 para PIC18F....lo que tenés que descargarte es el USB framework de microchip y en unos de los ejemplos aparece el protocolo MSD (Mass storage device) y un ejemplo de como implementar un memory stick USB con un PIC y una memoria EEPROM.


----------



## Javilondo (Mar 13, 2010)

Moyano Jonathan te agradezco la ayuda, pero no deseo realizarlo con un PIC, ni con USB, sino utilizando los pines de Handshaking (control de flujo/control por hardware) del puerto RS-232.
Mas bien me gustaría saber cómo o que pautas tomar para desarrollar el driver para la PC en Windows XP.
De hecho mi proyecto no tiene nada que ver con sistemas embebidos, es una réplica de un tema que inicié en Interfaces y programación que fue cerrado en calidad de "tema repetido", Chico3001 (moderador) me recomendó consultarlo en este tema ya que es supuestamente el tema con el cual se repetía la coincidencia por el simple hecho de implementar el FAT, cosa que no tiene relevancia porque yo puedo implementar cualquier otro sistema de archivos que se acople a las capacidades de la memoria y si es preciso puedo cambiar de memoria, a mi lo que me interesa es el desarrollo de un driver el cual reconozca cierta memoria como unidad del sistema, que la represente en "Mi PC" y que pueda ser escudriñada a través del explorador de Windows. Creo que mi proyecto no es tan ambicioso como parece puesto que teniendo el driver, el resto es tarea del sistema operativo.
Este es el tema original: *Memoria 24Cxx (FAT) como unidad en "MI PC" (XP)*
En verdad estoy algo preocupado porque no se si podré encontrar las respuestas que espero en una sección a la cual no pertenece.
De todas maneras agradezco su apoyo y cooperación. 
También felicito a los que rescataron este tema después de que fue abandonado por su autor @NANO1985, en verdad gracias a ustedes he podido aprender muchas cosas que se me complicaban y lo mejor de todo es que no fui el único que obtuvo beneficios, sino toda la comunidad interesada en esto.


----------



## Chico3001 (Mar 14, 2010)

Haber si entendi... tu duda es como crear una especie de "Disco Virtual" con una memoria 24xXX pero usando el puerto serial de la computadora??

En ese caso el driver no va a ser tan facil de hacer... el RS232 no fue creado con ese proposito, aunque en teoria si se podria usar con ese fin, el problema es del lado de Windows... no creo que exista un driver como tal que permita accesar datos como si fuera un disco duro externo...


----------



## Javilondo (Mar 15, 2010)

Ahora nos estamos entendiendo, es precisamente lo que me interesa.
Se que probablemente no exista ningún driver capaz de ello o tal vez si, pero como Windows es una plataforma orientada a la abstracción de hardware, un nuevo driver, según yo se, puede ser construido a partir de los ya existentes, Windows debe tener un driver especializado para unidades virtuales, un ejemplo son los discos .ISO. También debe tener un driver especializado para manejar el puerto serial que, como dices, no fue diseñado para manejar una memoria de ese tipo en esa forma, pero la flexibilidad de su protocolo permite dicha interfaz, un ejemplo es el conocido programa ICProg que graba microcontroladores y memorias sin implementar el protocolo RS-232, solo aprovecha el control de flujo _(Handshaking)_.
Se supone que también existe una API capaz de manejar el sistema de archivos FAT de tal forma que todo queda transparente para el programa _explorer.exe_ que es el explorador nativo del sistema.
Por lo tanto debe de haber una manera de conjuntar estos drivers y APIs de distintos niveles en una sola capa de abstracción de hardware superior que daría origen al nuevo driver y todo esto para evitar confeccionar un programa especial que maneje todos estos aspectos de manera indirecta. Así se tendría la comodidad de hacer clic derecho en cualquier archivo, elegir entre el menú de la Shell la opción de _Enviar a_... y seleccionar la unidad que representa nuestra memoria sin un software dedicado.
Se que no es imposible, puesto que Windows lo hace y muchos aficionados que no pertenecen al equipo de desarrollo de Windows han logrado vencer retos más grandes.
Creo que hay mucho talento en esta comunidad y pienso que si le dan a alguien la oportunidad de compartir información hay una alta probabilidad de que esta resulte de utilidad para más de una persona y con mayor razón en un foro como este.
No quiero aplicar la ley del mínimo esfuerzo, les aseguro que he estado investigando sobre esto, solo que se me ha ocurrido publicar mi duda en este sitio porque pienso que no seré el único al que le sirvan las posibles respuestas generadas aquí, cuya información podrá ser utilizada para aclarar alguna duda como la mía o como motor para nuevos proyectos.


----------



## Chico3001 (Mar 15, 2010)

Volvemos al punto... si se puede...  pero es trabajo de programacion en alto nivel, necesitarias crear un programa que abra y cierre el puerto serial y se comunique con tu circuito, y cada vez que conectes tu dispositivo tienes que correr el programa debido a  que a diferencia del puerto USB donde Windows detecta que algo fue conectado, en el RS232 no se puede

Ese programa como bien dices debe hacer uso de las APIs de Windows para ir recibiendo datos hexadecimales e irlos guardando en forma de archivo, lo cual es relativamente facil...


----------



## Darrenz (Abr 8, 2010)

Buenasss

Estoy trabajando en un proyecto usando un LPC2148 (ARM7) para poder inicializar la tarjeta SD.

Tengo dos tarjetas de 128MB para probar, una de HP y otra de "D-TEC"

Me he mirado todos los documentos oficiales y un monton de ejemplos de terceros. Muchos de ellos coinciden en algunos puntos:

-CS = 1, Enviar más o menos 80 pulsos de CLK (una instrucción FOR de 10 ciclos enviando 0xFF).

-Enviar CMD0 y ecibir R1 con 0x01.

Mi problema es que mi tarjeta no se inicia. Por ahora solo estoy probando a recibir la respuesta del comando CMD0, pero lo unico que recibo es 0xFF. Fijo el valor de CLK a unos 350 KHz, CS = 1, 80 CLKs, CS = 0, CMD 0 más un While para esperar la respuesta 0x01, pero mi código se queda ahí, como no le llega 0x01, sigue enviando 0xFF eternamente.

A ver que tal se nos da señores 

Os dejo aquí el código para que le echéis una ojeada.

**Rx es el Byte de respuesta recibido por cada comando enviado, se actualiza cada vez que se manda un byte, porque como ya sabéis, la comunicación es Full-duplex- 



> IOSET0 = 0x100000;                          //CS = 1 antes de emitir los pulsos.(disable)
> for (j = 0; j > 10; j++){
> SSP_SPI_Send (0xFF); //80 Clks
> }
> ...


----------



## george.manson.69 (May 16, 2010)

Tengo una microSD , tengo un PIC16F887 regulador de 3.3v ...bueno en pocas palabras tengo todo lo que se necesita para usar la targeta SD...en la simulacion funciona al 100% pero cuando lo hago fisicamente....no funciona nada... ...para que se den una idea lo tengo como al principio del tema...y no se que hacer y que podra ser.......

no se si me ayuden con un tips...de porque no funciona...o que podre revisar fisicamente a mi circuito...


----------



## Moyano Jonathan (Sep 3, 2010)

> quisiera saber si puedes subir los duiagrams y el codigo utilizado a proposito moyano aun se espera el manual gracias



El manual está siendo desarrollado , pero no es algo que se haga de la noche a la mañana ....muchos me han preguntado lo mismo y les he respondido esto. Otra cosa es un trabajo que realizo lentamente debido a que la electronica no es a lo unico que me dedico, tengo muchas otras actividades que me atarean muchos más y tengo que cumplir con todo.


----------



## javio1022 (Nov 8, 2010)

hola, la verdad espero que me puedan entender, antes que nada quisiera saber como puedo, con un pic previamente programado leer o tomar los datos que se encuentran en una memoria usb, con el fin de manipularlos, en especial los archivos de musica.. mi proyecto es reproducir la musica contenida en las memorias, supongo que tendria que hacer un conversor de digital a analogo, pero como extraigo la informacion y la manipulo(osea, paso de cancion etc), como la memoria me indica que esta en el primer dato y que yo le indico que arranque o que pare etc.. Gracias


----------



## Scooter (Nov 8, 2010)

Eso está complicado, muy complicado, en principio el usb de los pic no es host (que yo sepa).
Vendían un modulito que adaptaba el usb a uart y spi controlando todo el sistema de archivos y tal, si lo localizo te pondré el enlace.

No era este el que recordaba pero podría valer, es cuestión de buscar:
http://microcontrollershop.com/product_info.php?products_id=2648


----------



## ByAxel (Nov 8, 2010)

En efecto como dice @scooter pero lo de imposible es aplicado a los PIC18 y otros modelos cuyo módulo USB no trabaja (no existe) como host USB; sin embargo si existen los PIC host USB como los PIC24 o PIC32...

No recuerdo donde pero vi algo de un reproductor mp3 con PIC, creo que era en el foro pero lo buscarías... mp3 + PIC o en la misma web de microchip
saludos


----------



## Moyano Jonathan (Nov 9, 2010)

Hola mirá no se si te sirva pero con un PIC18F se puede leer un archivo .WAV y reproducir temas con una calidad aceptable:
El proyecto no es de mi autoría ....tendrías que armarlo y probarlo.


----------



## javio1022 (Nov 10, 2010)

muchas gracias amigos, la verdad es de gran ayuda, lo que busco es algo parecido a lo que moyano jonathan ha publicado, otra pregunta muy interesante es como es la comunicacion entre pic y usb, la verdad me gustaria entender como controlo los datos que estan en la usb pues esto es lo que hace el pic..


----------



## ByAxel (Nov 10, 2010)

javio1022 dijo:
			
		

> muchas gracias amigos, la verdad es de gran ayuda, lo que busco es algo parecido a lo que moyano jonathan ha publicado, otra pregunta muy interesante es como es la comunicacion entre pic y usb, la verdad me gustaria entender como controlo los datos que estan en la usb pues esto es lo que hace el pic..



Comunicación entre PIC <-> PC por USB, un tema por donde puedes iniciar es este: Control de dispositivos a través del módulo USB del PIC18F2550.

saludos.


----------



## sbl (Ene 4, 2011)

hola nesecito ayuda con al secuencia e unicio de una tarjeta micro sd 4Gb clase 4, ya que la secuencia de inicializacion de la sd normal no me resulta estoy utilizando esta secuencia

envio cmd0 luego cmd1 luego cmd16 con lo cual queda listo.

puedo leer y escribir la mayoria de sectores todo funciono bien en una sd de 1Gb kingston pero por alguna razon mi sd se quemo ahora no dispongo de una sd de esas caracteristicas como mencione antes la misma secuencia no funciona en la micro sd de 4Gb


----------



## Moyano Jonathan (Ene 5, 2011)

Por que efectivamente la secuencia no es la misma. La SD de 4GB es SDHC...cumple con otro protocolo y utiliza comandos diferentes.


----------



## sbl (Ene 29, 2011)

hola aqui de nuebo con la duda de la tarjeta SDHC de 4G estube probando las secuemcia de inicializacion pero por alguna razonno funciona, esta todo bien hasta el envio del CMD8 recibe y responde correctamente de ahi a mas alla no funciona dice que todo va bien pero cuando mando leer me debuelbe puro ceros no se en que pued estar el problema ya la compare con viars rutinas en C que pueden inicializar (no se mucho de C solo lo basico por so lo ago en ASM).

tambien adjunto la hoja de datos de las SDHC-SDXC




prueba call RX232
movf r,w ;carga en w el dato recibido
movwf tmp1
xorlw h'30'
btfsc Z ;VERIFICANDO SI SON IGUALES
call onSDHC
movf tmp1,w
xorlw h'31'
btfsc Z ;VERIFICANDO SI SON IGUALES
call CMD55
movf tmp1,w
xorlw h'32'
btfsc Z ;VERIFICANDO SI SON IGUALES
call ACMD41
movf tmp1,w
xorlw h'33'
btfsc Z ;VERIFICANDO SI SON IGUALES
call CMD58B
movf tmp1,w
xorlw h'36'
btfsc Z ;VERIFICANDO SI SON IGUALES
call CMD17
clrf r
goto prueba ;itera indefinidamente

onSDHC clrf r
bcf ptoc,1
call sdclok
resetHC call CMD0
call CMD8 
movlw 'S'
call TX232
goto prueba



sdclok movlw d'10' ;;se envia 10 byte de sincronia
movwf tmpsd
movlw h'FF' ;New data to xmit
call TxSPI
movwf dato1
decfsz tmpsd,1
goto $-4
bsf ptoc,1
return
CMD0 bcf ptoc,1
movlw h'40' ;New data to xmit
call TxSPI
movwf dato1 
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1 
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'95' ;New data to xmit
call TxSPI
movwf dato1
movlw d'5' 
movwf tmpsd2

r1d1 movlw h'FF' ;New data to xmit
call TxSPI
movwf tmpsd
xorlw h'01'
btfsc Z ;VERIFICANDO SI SON IGUALES
goto $+4 ;;return ;si acepto ok
decfsz tmpsd2,1
goto r1d1
goto CMD0 ;NO
call tvs
call ada4
return

CMD8 bcf ptoc,1
movlw h'48' ;valor de comando
call TxSPI
movwf dato1 
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1 
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'01' ;New data to xmit
call TxSPI
movwf dato1
movlw h'AA' ;New data to xmit
call TxSPI
movwf dato1
movlw h'87' ;valor de CRC
call TxSPI
movwf dato1
movlw d'5' 
movwf tmpsd2

r7d8 movlw h'FF' ;New data to xmit
call TxSPI
movwf tmpsd
xorlw h'01'
btfsc Z ;VERIFICANDO SI SON IGUALES
goto $+4 ;;return ;si acepto ok
decfsz tmpsd2,1
goto r7d8
call mal
movlw d'4' 
movwf tmpsd2
movlw h'FF' ;New data to xmit
call TxSPI
call TX232
decfsz tmpsd2,1
goto $-4
call OK
return 
CMD55 bcf ptoc,1
movlw h'77' ;valor de comando
call TxSPI
movwf dato1 
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1 
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'01' ;valor de CRC65
call TxSPI
movwf dato1
movlw d'5' 
movwf tmpsd2

r1d55 movlw h'FF' ;New data to xmit
call TxSPI
movwf tmpsd
xorlw h'01'
btfsc Z ;VERIFICANDO SI SON IGUALES
goto $+4 ;;return ;si acepto ok
decfsz tmpsd2,1
goto r1d55
goto mal ;NO
call OK
return

ACMD41 bcf ptoc,1
movlw h'69' ;valor de comando69
call TxSPI
movwf dato1 
movlw b'01000000' ;New data to xmit
call TxSPI
movwf dato1 
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'77' ;valor de CRC 77
call TxSPI
movwf dato1
movlw d'6' 
movwf tmpsd2

r3d41 movlw h'FF' ;New data to xmit
call TxSPI
movwf tmpsd
xorlw h'01'
btfsc Z ;VERIFICANDO SI SON IGUALES
goto $+4 ;;return ;si acepto ok
decfsz tmpsd2,1
goto r3d41
goto mal ;NO
OCR1 movlw d'4' 
movwf tmpsd2
movlw h'FF' ;New data to xmit
call TxSPI ;rebido 00H
call TX232
decfsz tmpsd2,1
goto $-4
call OK
return

CMD58B bcf ptoc,1
movlw h'7A' ;valor de comando
call TxSPI
movwf dato1 
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1 
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'FD' ;valor de CRC fd
call TxSPI
movwf dato1
movlw d'5' 
movwf tmpsd2

r3d58B movlw h'FF' ;New data to xmit
call TxSPI
movwf tmpsd
xorlw h'00'
btfsc Z ;VERIFICANDO SI SON IGUALES
goto $+4 ;si acepto ok
decfsz tmpsd2,1
goto r3d58B
goto mal ;NO
OCRb movlw d'4' 
movwf tmpsd2
movlw h'FF' ;New data to xmit
call TxSPI ;rebido 00H
call TX232
decfsz tmpsd2,1
goto $-4
call OK
return



secuencia para recepcion de 545 bytes 
CMD17 bcf ptoc,1
movlw h'51' ;cmdX bits 47-40
call TxSPI
movwf dato1 
movlw h'00' ;arg bits 39-32 U LSB
;movf Nsectr,w
call TxSPI
movwf dato1 
movlw h'00' ;arg bits 31-24 D
call TxSPI
movwf dato1
movlw h'00' ;arg bits 23-16 C
call TxSPI
movwf dato1
movlw h'00' ;arg bits 15-8 M Msb
call TxSPI
movwf dato1
movlw h'FF' ;CRC bits 7-0
call TxSPI
movwf dato1
movlw d'5' 
movwf tmpsd2 

r17R1d0 movlw h'FF' ;New data to xmit
call TxSPI
movwf dato1
xorlw h'00'
btfsc Z ;VERIFICANDO SI SON IGUALES
goto $+4
decfsz tmpsd2,1
goto $-7
goto mal
;;bloque de datos lectura
Nbloc movlw d'5' ;numero de veces de bits a leer 103*5= 515
movwf tmpsd2
bloqDt movlw h'67' ;numero de dits recicidos 
movwf tmpsd
bcf ptoc,1
movlw h'FF' ;New data to xmit
call TxSPI
call TX232
decfsz tmpsd,1
goto $-4
decfsz tmpsd2,1
goto bloqDt

movlw d'10'
movwf tmpsd
movlw h'FF' ;New data to xmit
call TxSPI
call TX232
decfsz tmpsd,1
goto $-4
bsf ptoc,1
return


----------



## Gonzalonal (Feb 11, 2011)

Hola como andan? Les comento que  estoy realizando un proyecto en el que la interaccion entre el pic y una memoria sd son primirdiales. Utilizo un pic18f4520, y la conexion con la sd la hago mediante Software SPI o tambien llamado Bitbang. Cabe aclarar que programo en C. La cuestion es la siguiente, al utilizar el SPI por soft no puedo obtener un velocidad de CLOCK relativamente alta. A 8 mhz de fosc el clock de spi alcansa los 50khz. Tengo entendido que para que la SD funcione tiene que ser al menos de 200khz. Es esto correcto? alguien tiene alguna experiencia similar a la mia?
Muchas gracias saludos

Editado: olvide aclarar que el bus i2c lo tengo por hardware y no es factible modificarlo


----------



## cristian_elect (Feb 11, 2011)

Eso de la SD a menos de 200Khz funciona seguro eran las antiguas, yo le pongo la velocidad del clock del SPI lo pongo a 25Mhz y funciona normal.
Eso con ARM.


----------



## sbl (Feb 11, 2011)

cristian_elect dijo:


> Eso de la SD a menos de 200Khz funciona seguro eran las antiguas, yo le pongo la velocidad del clock del SPI lo pongo a 25Mhz y funciona normal.
> Eso con ARM.



hola este estas trabajando con tarjetas SD estandar  o con tarjetas SDHC ?

yo la standar no logre trabajarla a mas alla de 300Khz.



			
				nestorg85 dijo:
			
		

> Hola...me encuentro desarrollando un lector de imagenes desde una  tarjeta SD bien sea estandar o HC...me base en las librerias SD y Fat de  suky y realice las midificaciones necesarias para inicaliaziar ambos  tipos de memoria tanto en hardware como en software (FAT). El problema  surgue cuando quiero leer el direcotiro raiz de una tarjeta SDHC de 4GB,  me envia error en la r1 al enviar el comando CMD17, pero solo cuando  quiero leer sector muy alto. Dentro de las pruebas me leyo bien el  sector 15000 luego cuando quise leer el secto 16000 genera error y  ningun sector de ahi en adelante, pero al tratar de leer ese mismo  sector en una tarjeta estandar..lo hace de manera correcta....por favor  necesito ayuda
> 
> 
> 
> ...




hola yo estoy en las mismas en caso de SD estandar todo bin pero no logro inicializar la SDHC.
podrias subir tu codigo para poder ver dnd tengo errores por favor. grasias


----------



## cristian_elect (Feb 11, 2011)

Yo trabajo con fat32/16 el codigo es grande uso una micro sd de 2GB kingston
Aque esta un ejemplo para ATMEL atmega pero se modifica lo hice para PIC,ARM,
funciona para sdhc mira como maneja los CMD y lo modificas para pic.
Funciona con clock SPI 2MHZ, 8MHZ y 25MHZ este ultimo en arm.
en sample_mmc.c esta las rutinas de inicio.


----------



## sbl (Feb 11, 2011)

hola cristian_elect gracias por el codigo.
disculpa mi ignorancia pero no soy bueno en lenguaje C (recien inico en lenguaje C) lo estoy transcribiendo a ASM y no logro entender des el envio del CMD55 a mas alla ni  que respuestas debo recibir a los comandos


/*-----------------------------------------------------------------------*/
/* Initialize Disk Drive                                                 */
/*-----------------------------------------------------------------------*/

DSTATUS disk_initialize (
    BYTE drv        /* Physical drive nmuber (0) */
)
{
    BYTE n, ty, ocr[4];


    if (drv) return STA_NOINIT;            /* Supports only single drive */
    if (Stat & STA_NODISK) return Stat;    /* No card in the socket */

    power_on();                            /* Force socket power on */
    for (n = 10; n; n--) rcvr_spi();    /* 80 dummy clocks */ enbia 10 bytes en blanco
    SELECT();                /* CS = L */ lleva a bajo el cs    ty = 0;
    if (send_cmd(CMD0, 0) == 1) {            /* Enter Idle state */
        Timer1 = 100;                        /* Initialization timeout of 1000 msec */
        if (send_cmd(CMD8, 0x1AA) == 1) {    /* SDC Ver2+ */
            for (n = 0; n < 4; n++) ocr[n] = rcvr_spi();
            if (ocr[2] == 0x01 && ocr[3] == 0xAA) {    /* The card can work at vdd range of 2.7-3.6V */
hasra este punto si logro llegar recibo la 01 y luego la ocr que es 1AA.
de aqui en adelante no logro entender ya que a todos los comando que envia despues de me responde  00 no indica error ni nada cuando envio el CMD17 solo recibo 00

                do {
                    if (send_cmd(CMD55, 0) <= 1 && send_cmd(CMD41, 1UL << 30) == 0)    break;    /* ACMD41 with HCS bit */ no se que respuesta recibir al CMD55 ni al ACMD41 ya que solo recibo 00                } while (Timer1);
                if (Timer1 && send_cmd(CMD58, 0) == 0) {    /* Check CCS bit */
                    for (n = 0; n < 4; n++) ocr[n] = rcvr_spi();
                    ty = (ocr[0] & 0x40) ? 6 : 2;
                }
            }
        } else {                            /* SDC Ver1 or MMC */
            ty = (send_cmd(CMD55, 0) <= 1 && send_cmd(CMD41, 0) <= 1) ? 2 : 1;    /* SDC : MMC */
            do {
                if (ty == 2) {
                    if (send_cmd(CMD55, 0) <= 1 && send_cmd(CMD41, 0) == 0) break;    /* ACMD41 */
                } else {
                    if (send_cmd(CMD1, 0) == 0) break;                                /* CMD1 */
                }
            } while (Timer1);
            if (!Timer1 || send_cmd(CMD16, 512) != 0)    /* Select R/W block length */
                ty = 0;
        }
    }
    CardType = ty;
    DESELECT();            /* CS = H */
    rcvr_spi();            /* Idle (Release DO) */

    if (ty) {            /* Initialization succeded */
        Stat &= ~STA_NOINIT;        /* Clear STA_NOINIT */
    } else {            /* Initialization failed */
        power_off();
    }

    return Stat;
}


----------



## cristian_elect (Feb 12, 2011)

Mejor manda en proteus tu circuito.
Parecido como que pongo aqui.


----------



## sbl (Feb 12, 2011)

hola este es mi codigo esta echo en asm, lo simulo en proteus 6.9
las ordenes se mandan mediante el puerto virtual de proteus


----------



## sbl (Feb 14, 2011)

el prteus 6.9 no dispone de un simulador de tarjetas SD asi que de acuerdo a la hoja de datos del SD estructura el programa cargo en el simulador de SPI la suestas respuestas que debe dar la tarjeta SD y luego lo grabo en el pic y pruebo fisicamente mediente el puerto virtual por RS 232 a 9600 B enviando desde la pc las ordenes 

el 0 ejecuta el 80 clock-CMD0-CMD8
el 1 ejecuta el CMD55
el 2 ejecuta ACMD41
el 3 ejecuta CMD58

asta ahi deberia de inicializar la tarjeta SDHC 
luego son opcionales  el 4 ejecuta el CMD16 y el 5 ejecuta CMD17.


----------



## sbl (Feb 23, 2011)

volviendo al tema de las tarjets sigo sin lograr inicializar la tarjeta de 4G, pero consegui una de dos 2G en deshuso lo curioso fue que cuando la formatee se conbirtio a 1G raro??????
pero funciona asi que segui con el proyecto
y ya logre escribir la tabla fat1-crear un archivo de txt de 500Kb que la PC puede ler perfectamente.
ahora estoy tratamdo de ver en que lo aplico. (solo empese por curiosidad y ya logre todo eso)

Haora buelvo al tema de inicializar la tarjeta de 4G sdhc ya les aviso si lo logro inicializar.
y grasias a todos de este tema su aporte fue muy valioso.

       "vive, muere y renace una y mil veces"  sbl


----------



## Meta (Feb 23, 2011)

Hola:

Esto de manejar tarjetas MMC, SD, MicroSD etc con PIC es un completo reto, al mismo tiempo interesante. Buscando por Internet, a persar de haber encontrados cositas, aún está muy verde, ni siquiera hay libros para hacer proyectos de este tipo. Los diseñadores de móviles, PDA, etc, tienen muy claro como se hace. Espero que haya más tutos aunque sea en inglés para coger el hilo, ejemplos incluido.

Ah, otra cosa, el 16F877A y no se fabrica, solo quedan en stock hasta fin de existencias. Piensen ahora en los 16F877 que es el sustituto directo.

Migración del 16F877A al 16F887. (Datos en tener en cuenta).
http://www.microchip.com.ar/rs2009/soporte/clases/Migracion_877_a_887.pdf
Saludo.


----------



## yohis960 (May 8, 2011)

Hola....quisiera saber si para usar la SD toca tener un pc??...porque necesito bajar unos datos de un PIC18F452  a una memoria SD, pero leyendo vi que había un cable para un PC, entocnes es necesario? ya que el dispositivo que estoy haciendo queda en un carro y no se puede accesar un pc allí, por eso pensamos en la posibilidad de sacar los datos por una memoria SD, pero aún tenemos la duda :S......La idea es bajar los datos desde una memoria EEPROM externa que está en el dispositivo a una memoria SD, esos datos despues queremos bajarlos al computador, pero como dije está en un carro entonces no se puede ¡(por efectos de practicidad, comodidad, etc) un pc allí :S hay algún problema allí??? Les agradezco cualquier aporte!!! Gracias ;D


----------



## sbl (May 10, 2011)

lo que quieres es bajar de una memrie que esta en el carro a una sd para volverlo portable la informacion de la memoria lo cual si es posible pero tienes que implemenar todo una unidad para volcar la informacion de la memoria a la sd hay varios ejemplos aqui de eso

aunque lo recomendable seria que escribas directammenbte sobre la sd implementandolo sobre el pic


----------



## eldo (Jul 2, 2011)

buenas, tengo un problema al inicializar una tarjeta sd, debo aclarar que como no puedo hacerlo fisicamente lo estoy simulando en proteus, mi problema es el siguiente cuando mando un dato a la tarjeta ejemplo el cmd0 los datos me llegan dezplazados en un bit, por ejemplo en lugar de 0x40 veo 0x20, alguien tiene idea de porque puede estar pasando esto???


----------



## sbl (Jul 4, 2011)

hola eldo te fijaste si tu modo spi esta a 9 o 8 bits puede ser eso.


----------



## eldo (Jul 4, 2011)

gracias x la respuesta sbl... si, esta a 8, BITS=8, ahora, logre hacer que reciba cambiando una cosita del spi debugger de proteus, el tema ahora es q mi respuesta es siempre 0xff y a la tercera vez q escribo la respuesta es 0x00, que estare haciendo mal???


----------



## sbl (Jul 4, 2011)

hl eldo que tarjeta esta inicializanfo un SD p HC y a q comando te da esa respuesta ya que a a los comandos debe responder 00 pero a algunos comando 01 la cantidad de intentos de recibir respuesta debe ser por lo menos 5 byte ya que puede responder al 1 o al 3 byte.


----------



## eldo (Jul 4, 2011)

para ser sincero sbl lo que intento es simular en proteus la inizializacion de una sd a travez del cmd0 la cuestion es que la respuesta que me da proteus(spi debugger) es hasta el 3 byte 0xff a partir de ahi la respuesta es 0x00 y la verdad que no se si es el proteus oalgun fallo en mi programa


----------



## sbl (Jul 5, 2011)

la verdad te recomendaria que lo pruebes con una tarjeta sd fisica ya que la verdad no he utilizado la simulacion yo hice el programa en proteus6.9 y no sabria decirte como simula la sd card las versiones superiores


----------



## sbl (Jul 16, 2011)

hola patolin lo que intentas hacer creo que ya esta echo la informacion solo esta para revisar en los programas ya subidos anteriormente.

hola quetzal la verdad la velocidad que yo trabaje con pic a una veloidad de escritura a sd de 250Khz pero tengo entendido que es posible trabajr a una mayor velocidad dependera mucho del de la frecuencia a la cual trabaje el pic o el arduino, lo de comprimir so se si sera factible tendrias q buscar informacion y ver de que manera se puede hacer lacompresion


----------



## eldo (Jul 20, 2011)

estuve tratando de inicializar una sd real(fisica) y me surgio la duda, si la salida del micro es de 5V y las tarjetas sd trabajan a 3,3 eso no representa un problema??? en cualquier caso, alguien sabe de algun esquema para que pueda guiarme???? muchisimas gracias desde ya compañeros


----------



## sbl (Jul 20, 2011)

eso lo solucionas con un divisor de tension si mal no recuerdo es una ress de 2.2K y 3.3K y listo con eso trabaja sin problemas solo que calcula bien


----------



## eldo (Jul 27, 2011)

buenas, tengo una pregunta,  decidi hacer el proyecto con una tarjeta real el problema es que  cuando quiero ver en la pc lo que he escrito con el pic en la sd esta esta vacia, en mi plaqueta no parece haber ningun problema y en mi software, lo he simulado y tampoco pareciera haber problema alguna idea???? gracias eso me esta rompiendo la kabeza jajaja


----------



## sbl (Jul 28, 2011)

la escritura la realizastte a nivel logico o a nivel fisico, la computadora solo reconose nivel logico para lo cual tendrias que escribir en la sd atravez de fat


----------



## eldo (Jul 28, 2011)

gracias, estuve revisando y ni siquiera inisializa me fije bien las tensiones que tenia y si, son las correctas asi que eso no es, entonces debe ser algo del soft, tenes idea de como se maneja la frecuencia del clk usando spi por software??? gracias sbl


----------



## sbl (Jul 28, 2011)

la frecuencia del spi la tienes que configurar en el segundo byte, despues de inicializarlo puedes alterar ese byte y configurarlo a mayor velocidad dependiendo del pic que utilises.


----------



## eldo (Jul 28, 2011)

mmm la verdad que no te entiendo, mira, yo lo que hago para configurarlo es esto(aclaro que la simulacion anda bien) 
#include <16f84a.h> 
#fuses HS,NOWDT
#use delay(clock=10M)
#use spi(master,di=pin_a0,do=pin_a1,clk=pin_a2,bits=8,baud=9600)


void main(){
 //instrucciones funciones etc
//en lugar del spi_write uso spi_xfer(funcion que se usa cuadno se implementa spi por software)
}



lo que nose es con que frecuencia estaria trabajando el clk del spi que implemento.. espero haberme explicado bien


----------



## sbl (Jul 28, 2011)

la verdad con un f84 no me funciono utilise un f873 y logre inicialisar una SD standar, me puedes dar tu codigo para revisarlo a simple vista veo que debes de moodificar 
aud=9600 por una mayor lo cual debe darte mayor velocidad pero el limite no sabria darte


----------



## eldo (Jul 29, 2011)

que diferencias hay entre usar una sd comun y una micro sd con su adaptador?
#include <16f84a.h>
#fuses HS,NOWDT
#use delay(clock=10M)
#use spi(master,di=pin_a0,do=pin_a1,clk=pin_a2,bits=8)


int sd_init(){                     //funcion de reset e inicializacion

      int8 i;
      output_high(pin_a3);  //desactivo la sd
     for(i=0;i<10;i++){
             spi_xfer(0xff);  //sincronizacion con sd que se le envian 80 ciclos de reloj, esto lo he leido
             }                   // en un foro
       output_low(pin_a3); //activo la sd
       spi_xfer(0x40);
       spi_xfer(0x00);
       spi_xfer(0x00);
       spi_xfer(0x00);
       spi_xfer(0x95);
       while(i!=0x01){
                  i=spi_xfer(0xff);     //espero respuesta al cmd0
                  output_high(pin_b1);     //asi me avisa que esta esperando la respuesta
                  }
             output_low(pin_b1);
          //una vez que obtuvo la respuesta...
       output_high(pin_a3);
       output_low(pin_a3);
       spi_xfer(0x41);
       spi_xfer(0x00);
       spi_xfer(0x00);
       spi_xfer(0x00);
       spi_xfer(0x00);
       spi_xfer(0x01);
       while(i!=0x00){
             i=spi_xfer(0xff);
             output_high(pin_b1);
             }
      output_low(pin_b1);

      return 1;


void main(){
     setup_tris_b(0x00);

     sd_init();

   }






    bien, ese es el programa que estoy utilizando, lo interesante es que en la simulacion anduvo de maravillas, pero en la tarjeta real no hay caso no responde

bien estuve revisando mi programa completo y mi plaqueta y llegue a la conclucion de que la inicializacion la hace bien, el problema viene en la escritura de la tarjeta, alguna recomendacion acerca del sistema fat? la verdad nose nada de eso y lo que he encontrado no me ha ayudado mucho que digamos jejeje alguien que me diga como funciona asi intento con eso escribir la tarjeta.. muchisimas gracias enseguida les adjunto mi funcion de escritura para ver si encuentran uds algun error en lo que estoy haciendo muchisimas gracias

funcion de escritura( hecha por mi, haber si porfavor me ayudan a descubrir los errores....)

int escritura(){
   int8 i;
        spi_xfer(0x58);
        spi_xfer(0x00);
        spi_xfer(0x00);
        spi_xfer(0x00);
        spi_xfer(0x00);
        spi_xfer(0x01);
        while(i!=0x00){
                  i=spi_xfer(0xff);
                  output_high(pin_b1);
                  }
       return 1;
}




esta funcion es parte de mi codigo anterior

lo que nececito saber es que moco me estoy mandando????muchas gracias


----------



## sbl (Jul 29, 2011)

la verdad yo me rifiero a si estas utilizando una tarjeta de 1GB o micro sd de 4GB ya que la de 1GB es SD pero la de 4GB es SDHC con respecto a la secuencia que envias revisaste en la hoja de de datos de las tarjetas SD si mal no recuerdo son mas codigos los necesarios para una adecuada inicializacion.


----------



## eldo (Jul 30, 2011)

la verdad estoy utilizando una micro-sd de 128MB con un adaptador supongo que es factible el proyecto con esa tarjeta, con respecto a la informacion solo he leido lo que encontre en internet el unico datasheet sobre las sd que tengo esta en ingles lo cual mucho no manejo pero me voy a poner a estudarlo bien en estos dias, muchisimas gracias x tu ayuda sbl, voy a estudiar esa informacion y a revisar lo que me dijiste, gracias


----------



## sbl (Jul 30, 2011)

eldo te recomiendo que utilises esta secuancia 
clok  los 80pulsos
reset	CMD0 reseteo de tarjeta
mdSPI CMD1 mado spi de trabajo
bloqdt CMD16 dimencion de bloq de datos
y recien despues de esto utiliza cualquier otro comando que quieras, esta secuencia me sirvio hasta una tarjeta de 2GB en modo SPI a 4 hilos DI-DO-CLK-CS

qui una imagen de la secuencia para SD y SDHC


----------



## eldo (Ago 1, 2011)

bueno, despues de un gran esfuerzo logre que la tarjeta inicialise, pero todavia no logro que me responda al cmd24 para escribirla alguien tiene alguna funcion implementada en c para eso? muchas gracias


----------



## sbl (Ago 2, 2011)

la forma para escribir es enviar el comando esperar la respuesta que tarda unos 6 byte luego enviar FE y el bloque de datos de acuerdo al tamaño que fijaste con CMD16.


----------



## eldo (Ago 3, 2011)

bien, esto es lo que hice, envie el cmd24 despues de enviar el cmd16, me responde con 0x00, envio 0xfe mas los 512 bytes de ahi espero la respuesta (0x05) pero esta nunca llega, que sugieren?


----------



## eldo (Ago 4, 2011)

#include <16f84a.h>
#fuses HS,NOWDT
#use delay(clock=10M)
#use spi(master,di=pin_a0,do=pin_a1,clk=pin_a2,bits=8)
#use rs232(xmit=pin_b0,rcv=pin_b1)

int1 cmd(int8 byte1,int32 arg,int8 crc,int8 resp){
         int8 i;
         int16 j=0xffff;
         spi_xfer(byte1);
         spi_xfer(make8(arg,3));
         spi_xfer(make8(arg,2));
         spi_xfer(make8(arg,1));
         spi_xfer(make8(arg,0));
         spi_xfer(crc);
         while(i!=resp){
                  i=spi_xfer(0xff);
                  j--;
                  if(j==0) return 0;
         }
         return 1;
}

int1 sd_init(){
      int8 i;
      output_high(pin_a3);
      for(i=0;i<10;i++){
               spi_xfer(0xff);
      }
      output_low(pin_a3);
      if(cmd(0x40,0,0x95,0x01)==0){
                  return 0;
      }
      if(cmd(0x41,0,0xff,0)==0){
                  return 0;
      }
      if(cmd(0x50,0xff,0xff,0)==0){
                  return 0;
      }
      return 1;
}


int1 sd_escribe(int32 dir){
      if(cmd(0x58,dir,0xff,0x00)==0){
                  return 0;
      }
      return 1;
}


void main(){
      int16 i, j=0x000f;
      int32 direccion=0;
      if(sd_init()==0){
                  printf("no se puedo inicializar tarjeta/n");
      }
      else{
                  printf("tarjeta inicializada /n/r");
      }
      output_high(pin_a3);
      delay_ms(100);
      output_low(pin_a3);
      if(sd_escribe(direccion)==0){
                  printf("no se pudo escribir /n/r");
      }
      else{
                  spi_xfer(0xfe);
                  for(i=0;i<256;i++){
                        spi_xfer('e');
                  }
                  spi_xfer(0xff);
                  spi_xfer(0xff);
                  while(i!=0x05){
                           i=spi_xfer(0xff);
                           j--;
                           if(j==0) printf("error al escribir en direccion %Lu /n",direccion);
                  }
                  direccion++;
      }
}

ese es mi codigo, el que estoy usando actualmente, el problema que tengo es que nunca llega la respuesta 0x05 despues de enviar los 512 bytes alguna sugerencia?


----------



## sbl (Ago 4, 2011)

eldo si mal no veo en tu programa solo veo que envias 255 byte no 512 o caso contrario podrias ser mas explicativo con tu programa y no lo peges ahi lo buelves muy largo adjuntalo como un txt.

else{
spi_xfer(0xfe);
for(i=0;i<256;i++){   --- solo veo que envia 255 byte 
spi_xfer('e');
}


----------



## eldo (Ago 4, 2011)

Si, es que setee en el cmd16 como 256 bytes los que fi¡orman un bloque de todos modos si aun seteandolo como 512 buytes no funciona y disculpa por lo del codigo no me di cuenta de adjuntarlo se me paso..


----------



## sirhonter (Ago 19, 2011)

saludos a todos ustedes bueno yo estoy empezando a programar en C de CCS pero para esto ya he estado buscando mucha informacion y poco a poco voy comprendiendo 
Eldo  queria preguntarte hacia donde diriges tu CS de la memoria  a PIN_a3 ? 

gracias de antemano


----------



## sirhonter (Ago 20, 2011)

hola consulta de antemano mis amigos foreros ¿alguien ha bajado los ejemplos de paloky , jaiser , kike entre otros  y ha corrido bien los archivos *.c?
lo que pasa es que yo los baje sin embargo corren en proteus 7.5 pero cuando  voy a analizar el codigo en *.c con el programa PIC C  Compiler (pcw.exe)  me sale errores al momento de compilar espero que alguien lo haya bajado y lo este usando para que me oriente un poco acerca de en donde estoy fallando 
PDt: todo lo estoy haciendo de manera virtual , no tendra alguien un codigo facilito de entender ??? gracias  salu2


----------



## circuitmaker (Ago 21, 2011)

oye voy a haceer un proyecto q para nada va a usar el pc, requiere mucha memoria y pensé en las 32 GB de la sd, solo necesito 8 pero bueno.
mirando encontré tú aporte y quería preguntarte, q tanto has avanzado, y ps la idea mia es no trabajar con pic sino con fpgas, pero te voy a pedir un favor, me podrías rotar los pcbs con pic y tu codigo, o almenos los esquematicos, pa montar tu ejemplo y adecuarlo a fpgas, no me conecto mucho asi que si te quedan dudas de lo que te solicito, es unicamente el pcb ya sea en eagle o la foto de los pines  gracias

Ola amigo,  a mi me interesa lo del socket, dame por fa info relativa a el para comprarlo

amigo, me podrias pasar los esquematicos y el firmware, te lo agradeceria mucho


----------



## andresaat (Oct 1, 2011)

hola amigos, gracias por sus aportes y comentarios, les cuento que tengo un problema, he logrado grabar datos en la SD pero cuando pasa un cierto tiempo, unos 20 segundos o más falla la grabación, ingreso la memoria al pc y me pide formatearla
a alguno de uds le ha sucedido
Gracias


----------



## sbl (Oct 3, 2011)

hl resisaste tu codigo posiblemente en algun punto hay un error q origine q se baya a escribir en el sector0 lo cual borra la parte principal de la sd y este pierde el formato revisa tu temporisadores y la cuenta de tus secores a escribir


----------



## andresaat (Oct 3, 2011)

adjunto mi código y librerías utilizadas, por si alguien me puede ayudar, debido a que lo he revisado pero no encuentro donde puede estar el error que hace que la SD pierda el formato después de un tiempo.
http://www.mediafire.com/?8xk45u9p73emebg
Gracias


----------



## carlostex (Nov 19, 2011)

Hola he estado haciendo un proyecto con una SD, en proteus todo va bien, se inicia la tarjeta y luego el comando 41y funciona, el problema es cuando lo hago en el circuito, el reset de la tarjeta funciona pero cuando le envio el comando 41 esta hace corto y se apaga la fuente de poder es una ATX, que tiene alimentación de 3.3 V, uso un pic18f4550. cual sera el problema? es un poco raro que la tarjeta haga corto no?


----------



## zidaemon (Ene 21, 2012)

La memoria hace corto??? eso es muy raro y lo puedes descartar haciendo el cambio de la tarjeta, yo creo que es otra parte de tu circuito ya que la memoria explotaria literalmente si tuviera la capacidad de absorber mas de 1 amp.  Yo tambien apenas inicio en este proyecto, y lo estoy haciendo en lenguaje sagrado "ENSAMBLADOR" jeje... pronto hare mi aporte ¡¡


----------



## juankry (May 24, 2013)

Moyano Jonathan dijo:
			
		

> Lo que plantea pablo es intersante, hay alguna forma de que el pic me notifique cuando la targeta está puesta en el zocalo o no?



Hola, para el proyecto que yo estoy realizando hago esa comprobación por software:

           while(SD_Init()!=0)//(Ciclo para detectar si la tarjeta SD está insertada)
	         {
	             //No SD card detected (puedes usar printf ("Inserte una tarjeta SD correcta") o algo parecido)
	          }


Mi función SD init devuelve 1 si la SD se inicializa correctamente o 0 si hay algún fallo, luego me sirve para inicializar la tarjeta en modo SPI, para comprobar si hay tarjeta insertada o en caso de tener una insertada, saber si se ha detectado correctamente o no. 

No se si es eso lo que querías decir.

Saludos


----------



## Moyano Jonathan (May 24, 2013)

Si, de todas maneras ya había resuelto lo que me planteas por software, verificando que la tarjeta se haya inicializado correctamente.

Saludos !


----------



## snow (Sep 16, 2013)

La duda es la siguiente, quiero mezclar mediante programación en un microcontrolador 2 archivos WAV para que suenen al mismo tiempo por un mismo altavoz, y no tengo claro como hacerlo.
¿Seria sumar el valor de las muestras? ¿Sumar y dividir por 2? ¿Van por ahi los tiros o no tiene nada que ver el sumar? 
La duda queda expresada de forma mas extendida en el tema creado hoy por mi aqui


----------



## Chico3001 (Sep 17, 2013)

decodificas ambos wav y los sumas entre si... ya sea de forma analogica con un operacional a la salida de los DACs... o de forma digital..


----------



## snow (Sep 17, 2013)

Chico3001 dijo:
			
		

> decodificas ambos wav y los sumas entre si... ya sea de forma analogica con un operacional a la salida de los DACs... o de forma digital..




Gracias por la respuesta. Prefiero hacerlo de forma digital, para ahorrar componentes y consumo del circuito. 

Supongamos que los 2 WAV son de 8 bits por muestra y quiero una salida de 8 bits tambien. 
Las 2 primeras muestras son 23 y 4D. Sumas 23 + 4D = 70. 
Las 2 sigientes muestras son de valor F2 y 9C. Sumar las 2 F2+ 9C = 18E. <-overflow

A esto me refiero si hay que dividir por 2 la suma de las muestras. O si en caso de overflow esta muestra quedaria mejor como FF.
*M1*->70/2=*38* 
*M2*->18E/2=*C7* 
o 
*M1*->*70* 
*M2*->*FF*

¿Que sería mejor?


----------



## ByAxel (Sep 17, 2013)

Hola.
Si expresas matemáticamente el funcionamiento de un mezclador análogo te puede dar una luz sobre el asunto ya que son prácticamente iguales (toma en cuenta la amplitud y otras cosas), ésto lo aplique con un dsPIC, pero claro, no se como estas tratando internamente la decodificación de los archivo wav.
Por otro lado puedes leer Mixing Digital Audio como ejemplo para 8 bits.

Saludos.


----------



## Chico3001 (Sep 18, 2013)

Tienes que dividir entre 2 el resultado.. o tendrias demasiados overflows y se oiria todo distorsionado


----------



## AlanB (May 26, 2015)

Amigos, consulta tomando como referencia este párrafo...


```
-Enviar el comando 24 0x58, 0xXX,0xXX,0xXX,0xXX,0xYY. Los 4 bytes XX corresponden a la dirección a partir de la cual se quieren guardar los datos. 0xYY corresponde al byte de CRC y como la tarjeta esta en modo SPI pueden tomar cualquier valor ya que no se consideran.
```
 
¿Porqué el comando CMD24 es igual a 0x58, como se obtiene el mismo?
¿En donde 0xXX, 0xXX, 0xXX, 0xXX, 0xXX; es el byte 0 de la dirección del offset a grabar?

No consigo ningún manual o tutorial que explique con manzanas esta parte 

Yo encontré un source code pero aparentemente es para utilizar el SD Bus y no el SPI, ya que en ningun momento hace uso de el pin CS/SS y si lo hace con pienes nombrados CMD, CLK, DAT0... A quien le interese solo me avisa y lo cuelgo en el post... De momento me gustaría que alguien me aclare esas dudas consultadas arriba 



marcosbrusa dijo:


> Ahi lo hice andar. Ahora estoy viendo lo de fat 16 pero la leí con comunicacion serie y la grabe bien. CUALQUIER AYUDA QUE NECESITEN AVISEN. Aca mando los pasitos pero despues deescribir hay que esperar una sola respuesta.


----------



## nelsonr (Mar 10, 2016)

Hola amigo  saludo tengo una pregunta como puede manejar el FAT16 con ccs compiler tengo un pic16f877a.
les agradezco cualquier guía ya que por lo visto no ahí librerías para  este manejo.


----------



## D@rkbytes (Mar 10, 2016)

nelsonr dijo:


> Les agradezco cualquier guía, ya que por lo visto no hay librerías para  este manejo.


  Dentro de la carpeta "Examples" de la instalación de PIC C Compiler, viene un ejemplo. (ex_fat.c)


----------



## nelsonr (Mar 10, 2016)

gracias  amigo por tus consejos siempre atinado, voy a estudiar el ejemplo y te comento las dudas que me surjan
saludos


----------



## nelsonr (Mar 12, 2016)

D@rkbytes sabes desde que versión viene ese ejemplo  mi versión es  4.032 y no la trae


----------



## D@rkbytes (Mar 12, 2016)

Versión, no lo sé, pero el archivo tiene el año 2007.


> /////////////////////////////////////////////////////////////////////////
> ////                     fat_ex_shell.c                              ////
> ////                                                                 ////
> ////    This is a neat little shell utility that resembles a DOS or  ////
> ...


Así que desde ese entonces debe venir ese ejemplo en las instalaciones.

Usa el buscador de Windows, posiblemente así la puedas encontrar. (Yo hago eso)
O búscala con el nombre que viene interno. "fat_ex_shell.c" Posiblemente en versiones anteriores así se llame.

Si de plano no la encuentras, ya es tiempo de que actualices el compilador, porque la versión que tienes ya es obsoleta.
La versión actual a esta fecha, es la v5.056


----------



## nelsonr (Mar 12, 2016)

Lo que voy hacer es a migrar de versión y cuando la instalo y estudio el ejemplo le cuento haber como me fue.
Gracias por tu tiempo.



la ultima pregunta por hoy.
 D@rkbytes, sabes de una versión de 5.056 que no se tenga que pagar jejejeje  y que no se un demo de 30 días. Las que veo discretamente gratis  son versiones mas viejas.


----------



## nelsonr (Mar 12, 2016)

Hola  D@rkbytes ya actualice la versión de mi PIC C y me encuentro estudiando el ejemplo que me comentaste en líneas anteriores (ex_fat.c) pero cada línea que  voy analizando  me pregunto si esta librería me ayudara para lo que tengo en mente.
El ejercicio que tengo en mente es con un pic16f877a  comunicarme con una SD por el puerto SIP y así de esta manera poder grabar archivo que el micro necesite utilizar más adelante. Por ejemplo
Antes  yo grababa en la memoria del PIC un número que para ese caso era una clave ‘123456’ pero ahora lo que me gustaría es grabar ese número en la memoria SD y cuando lo necesite el PIC que se comunique con la memoria y devuelva el dato,
De esta misma manera me gustaría grabar audio y reproducirlo cuando el pic asi lo solicite.
Pensé que para el formato de audio podía ser mp3, o algo que se ajuste a los recursos del pic.
Por este último punto, pensé que tengo que aprender a manejar el arregle de FAT, pero si crees que puedo manejarlo de otra manera el tema te agradezco tu orientación.


----------



## D@rkbytes (Mar 12, 2016)

Si ese ejemplo tiene la posibilidad de escritura, si te puede servir. No lo he usado.
Reproducir archivos MP3 con un PIC desde una microSD, si es posible pero no es tarea fácil.
Yo lo he hecho con un PIC18F2550 y con un muestreo de 44.1 KHz. (Monoaural)

Ahora ya no hago el proceso con el PIC, ahora lo hago con módulos WT5001M02 v1.00
Es mucho más sencillo, ya que se puede usar USART o SPI como protocolos de comunicación.
Tienen otras características interesantes y aparte se pueden usar memorias en formato FAT16 y FAT32 y de más de 2 GB.

Así que mejor vete por el lado de ese módulo o por otro de los tantos que existen actualmente.


----------



## nelsonr (Mar 14, 2016)

hola D@rkbytes me encuentro estudiando el módulo  WT5001M02 28P  que me comentaste y  como bien  dijiste, ahorra mucho tiempo de trabajo.  Pero me Ha surgido una duda,  los protocolos de comunicación para su control son los mismo tanto para  el  serial control RS232, como para el del SPI.


----------



## D@rkbytes (Mar 14, 2016)

No estoy seguro si el puerto SPI usado para la microSD también pueda utilizarse para comunicación entre el WT5001M02 y el microcontrolador.
La persona que me vende esos módulos me dijo que si, pero yo no lo he comprobado.
Yo uso el protocolo RS-232, ya que me resulta más cómodo que el SPI.


----------



## nelsonr (May 21, 2016)

Hola D@rkbytes hasta ahora puede conseguir una versión del WT5001M02 no sé porque el fabricante le borro la serie de la pastilla, pero el modulo funciona bien. 
El problema que estoy teniendo es que  quiero hacer la comunicación vía SPI, esto me llevo a buscar en la red foros que hablaran del tema pero es poco lo que se dice de este módulo manejado por SPI.
Recurrí a el modulo físicamente y pude notar que el modulo tiene un integrado M2I-12G (la foto la adjunto) 


Que al parecer es el que maneja la comunicación SIP para el módulo wt5001.
Estuve investigando la hoja de datos y la verdad no se cómo armar la línea de comando  a enviar

 Te pregunto si tienes algún manual de cómo saber armar estas tramas de comando o si me puedes explicar cómo anda eso porque la verdad no se cómo tomar el caso.
o algo que me pueda orientar porque  todas las  notas que he visto en la web no saben tampoco cómo usarlo.
Nota: la presunta es abirta a respuesta de cualquier persona.

** Una solución que ami se me ocurre es  usar  algún converso de SPI-a-UART 
    Conocen alguno que sea fácil de manejar? .
Hoja de datos
Ver el archivo adjunto mx25l8006em2i-12g_3789808.pdf


----------



## D@rkbytes (May 21, 2016)

Saludos.
Como te mencioné anteriormente, yo usé el protocolo de comunicación serial RS-232.
Con SPI ni lo intenté ya que estaba limitado de pines y porque usar RS-232 es más sencillo.


Actualmente lo tengo funcionando y en etapa final de desarrollo. 

En dado caso, la comunicación por SPI no debería tener problema si se usa el protocolo dado por el fabricante y se realizan las conexiones correctamente.​


----------



## nelsonr (May 22, 2016)

Hola D@rkbytes  gracias por tus comentarios, el módulo Wt5001 me ha ahorrado un montón de tiempo en estudio, construcción y montaje.
Pero mi proyecto consiste en dos modulo (WT5001(vos) y SIM900(modem)) que se comunican vía UART.
Ambos módulos los quiero comunicar  a un solo pic para  dales las órdenes.
El detalle está en que el Pic que estoy usando es el pic16f877a y solo tiene  un puerto uart y el del SPI hasta donde yo tengo entendido. De ahí radica por qué quería usar el puerto SPI. Un puerto para el SIM900 y el otro para el WT5001.
Yo pensé en un Pic que tenga dos puerto UART pero no  se si existen y si CCS  compiler los maneje.
Se pueden conectar dos módulos con comunicacion UART a un solo puerto?
Qué opciones me puedes sugerir para  usar los dos módulos desde un solo  pic?

 Gracias por tu tiempo dedicado.


----------



## D@rkbytes (May 22, 2016)

Puedes manejar los puertos seriales que quieras, pero los demás por software.
Para esto se usa un identificador (Stream) en cada puerto serial extra por software.

Por ejemplo:
#use RS232 (UART1, STREAM = uart_1) // Puerto serial por módulo USART (Hardware)
#use RS232 (XMIT = PIN_XX, RCV = PIN_XX, STREAM = uart_2) // Puerto extra por software.

Si se omite "BAUD", el compilador usará 9600 Bps. Por defecto.

Pero al usar el identificador "STREAM" también se deben usar otras instrucciones para enviar y recibir.
Ahora a las instrucciones les precede una "f".
Por ejemplo, para enviar: fprintf (uart_2,"%c",dato);
Para recibir: dato = fgetc(uart_2);

Aún así, y aunque se puedan tener más de dos puertos seriales, sería interesante hacerlo por SPI.


----------



## nelsonr (May 22, 2016)

Gracias por tu ayuda voy probar como me comentaste y despues voy ver como ago que trabaje con spi uno de los dos modulos.
Al timpo te comento como me fue


----------



## D@rkbytes (May 22, 2016)

Estuve investigando un poco, y parece que el chip WT5001 únicamente se puede comunicar por RS-232 cuando se usa un microcontrolador.
Ya que al parecer, el bus SPI es sólo para la comunicación con la SPI Flash y la microSD.

De hecho, en la hoja de datos no viene nada relacionado sobre comunicación por SPI hacia el WT5001, que tenga que ver con los comandos de reproducción.

Posiblemente se pueda, pero esa información no la he visto por ningún lado.


----------



## nelsonr (May 27, 2016)

Estoy tratando de hacer una comunicación con el WT5001 y el PIC16F877A.
He creado un programa que lo único que hace es mandar una cadena al modulo WT5001 para que reproduzca la canción 0001.mp3.
Además de encender y apagar un LED para indicar que el programa está funcionando.

La trasmisión la estoy realizando por el puerto RS-232 manejado por software, pero aún no he podido hacer que ejecute la orden.

¿Me podrían decir que ven en el código que esté impidiendo hacer la comunicación entre el PIC y el módulo?

Agradezco todo el apoyo brindado.

El módulo WT5001M02-28P así lo tengo conectado:
la patilla    14 a gnd
la patilla_Tx 16   Rx del pic
la patilla_Rx 17   Tx del pic
la patilla    22  5vdc
la patilla    09 y 10 speaker.


```
#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES WRT_50%                  //Lower half of Program Memory is Write Protected

#use delay(clock=4194304)   
#use delay(crystal = 4.194304MHz)
#use rs232(baud=9600,parity=N,xmit=PIN_E0,rcv=PIN_B0, stream=COM2,bits=8) 
//#use rs232(baud=9600, xmit=PIN_E0, rcv=PIN_B0, stream=COM2) // WT5001 Software

-----------------------------------------------------------
#include "E:\WT5001.h"
#include <string.h> 
#define  Luz_p Pin_C4
#Byte    Puerto_A = 0x85
#Byte    ProtA    =  0X05
#Byte    Puerto_D = 0x88
#Byte    ProtD    =  0X08

char cmd0[]={0x7E,0x04,0xA0,0x00,0x01,0x7E};     // Comando CMDO datos a enviar ;
     Int   i=0;
 
#int_TIMER1
void  TIMER1_isr(void) 
{
 // setup_timer_1(T1_DISABLED);
  set_timer1(0);
 // setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
 
} 

 #int_rda
void rda_isr(Void) // harware Sim900
{
  //aquí llega la interruptor de Sim900
  // VGN_Resive = getc( );
}
 
 /********************************************************************/
#int_EXT
void EXT_isr(void) // Software Wt5001
{
//aquí llega la interruptor de Wt5001
}
 
 
//---------------------------- 
 
 void main()
{  
 
   setup_adc_ports(NO_ANALOGS);// decimos al compilador que todos los puertos pasan hacer digitales y no analogos
   setup_adc(ADC_OFF);//se encarga básicamente de setear que puertos van a trabajar como analógicos y que puertos van a trabajar como digitales.
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   // -----------------------------------------------------
    enable_interrupts(GLOBAL);
    enable_interrupts(INT_EXT);
    enable_interrupts(int_rda);
    set_timer1(0);
   //--------------------------------------------------------
   Puerto_A = 0x00;
   PROTA    = 0x00;
 
   Puerto_D = 0x00;
   PROTD    = 0x00; 
   //-------------------------------------------------

    
  for(i=0;i<=5;i++) 
  {   
    fprintf (COM2,"%c",cmd0[i]); 
  } 
  //fprintf (COM2,"%C","0x7E,0x04,0xA0,0x00,0x01,0x7E");
  
   while(true)
   {
    output_high(PIN_A0);
    delay_ms(1000);
    output_low(PIN_A0);
    delay_ms(1000);
   
  }// while(true)
}//void main()
```


----------



## D@rkbytes (May 27, 2016)

Hay muchas cosas declaradas en ese código que no son necesarias.
Adjunto un ejemplo que escribí de rápido con las funciones básicas.
No lo probé pero creo que debe funcionar.

Como el módulo también responde, se puede usar el retorno para determinar el estado.
Eso y las funciones para el volumen no las incluí, pero más o menos llevan la misma estructura. 

Actualmente tengo un problema con la lectura de la cantidad de archivos en la uSD.
Sólo me envía la cantidad de archivos después de dar dos reset, y no he encontrado como solucionarlo.

Espero te sirva el ejemplo.


----------



## nelsonr (May 31, 2016)

Gracias D@rkbytes voy a comenzar hacer las pruebas y te comento como me fue, ya que me callo una gripe de esas modernas que me dejo neutralizado por un par de días.


----------



## nelsonr (May 31, 2016)

Hola D@rkbytes y a todos. La versión easy ya me salió.
Ahora voy a meterle un poco de complejidad para ver como me sale.

Gracias D@rkbytes por ayudarme a conocer y entender este modulo, y gracias a todos los que han estado pendiente del tema. 


```
void main()
{  
 int contador =20;
   while(true)
   {
    if(!input(PIN_B2))
    {
     fprintf(COM2,"%c%c%c%c%c%c",0x7E,0x04,0xA0,0x00,0x02,0x7E);
     output_high(PIN_A0);
     Delay_ms(1000);
    }
    
    if(!input(PIN_B3))
    {
     fprintf(COM2,"%c%c%c%c%c%c",0x7E,0x04,0xA0,0x00,0x01,0x7E);  
     output_high(PIN_A0);
      Delay_ms(1000);
    }
     
    if(!input(PIN_B1))
      {
       contador = contador +1;
          if(contador  == 31)
          {
          contador  = 0;
          }
        fprintf(COM2,"%c%c%c%c%c",0x7E,0x03,0xA7,contador,0x7E);
         delay_ms(500);  
      }
     
      output_low(PIN_A0);
  }// while(true)
}//void main()
```


----------



## nelsonr (Nov 7, 2016)

hola D@rkbytes, durante estos días he trabajado en el modulo wt5001, pero me nacido una pregunta.
¿Con cuantos mili amperios trabaja correctamente el modulo wt5001?
 He tratado de resolver la pregunta con la hoja de datos y no lo puedo encontrar.
yo realice una  prueba en vivo (Un poco desesperado )con 5v, 1.5 amp, el modulo trabajo muy bien pero el modulo toma una temperatura no aceptable.
Provee con 5v 1 amp y el modulo trabajo = de bien, y toma una temperatura que para mi es de trabajo, ya que no se calienta pero si se nota un leve cambio de temperatura.
por ende me gustaría saber cual debe ser la I ideal del modulo wt5001,para  que dicho modulo tenga una una larga vida.


----------



## D@rkbytes (Nov 7, 2016)

Saludos.
Realmente no lo sé, ya que nunca he medido la corriente de consumo del módulo.
Pero esa información si está en la hoja de datos.
Dice que en reproducción consume 39.1 mA con una carga de 8 Ω
Entonces eso consumirá aunque la fuente pueda entregar 10 Amperes.


​


----------



## nelsonr (Nov 7, 2016)

Gracias D@rkbytes por tus comentarios. La parte de la hoja de datos ya me queda claro, pero me queda la duda de cuantos amperios soporta el modulo, puesto que la fuente que alimenta al el modulo es de 1A y no se si sea mucha corriente para el modulo.
No se si hay una técnica para sacar esto, o si me puedes dar un aproximando.


----------



## D@rkbytes (Nov 7, 2016)

Creo que no tienes claro el concepto sobre la corriente.
Si el módulo consume 39.1 mA, en reproducción, eso va a consumir aunque lo alimentes con una fuente que entregue 3.3 Voltios a 1000 Amperes.
O sea, que si la fuente de poder o batería puede entregar 100 mA, con eso será más que suficiente, únicamente para alimentar al módulo.
Ya no tomará más corriente aunque el suministro pueda ofrecer 1000 Amperes.

Y claro que hay una fórmula, la Ley de Ohm.


----------



## nelsonr (Nov 7, 2016)

Gracias D@rkbytes la verdad es cierto, esto me cuesta un poco, ya que como no soy ingeniero en esto temas de electrónica y lo poco que se ya tengo mucho tiempo de no verlo, me cuenta un poco aprender o recordar ciertos temas , por eso les doy las gracias a ti y al foro por  ayudarme con mis auto investigaciones.

Pero porque se abra presentado el caso de que cuando al modulo lo alimento con un fuente de 5 V 1.5 A el modulo toma una temperatura Bastante alta y cuando le pongo una fuente de 5V 1 A el modulo toma una temperatura muy moderada o pasable. 
La única variable en esto fue los Amp.
Por esto fue que me nació la duda. Que esta pasando que se eleva la temperatura solo con elevar el amperaje?


----------



## D@rkbytes (Nov 7, 2016)

No lo sé, no debería de suceder.
El consumo de corriente debe ser estable aunque las fuentes tengan diferentes intensidades de corriente.
O sea que teóricamente, si el módulo consume 39.1 mA con la fuente de 1 Amper, también debería consumir lo mismo con una de 2 o más Amperes.


----------



## nelsonr (Nov 7, 2016)

Voy a trabajar en eso, y cuando tenga una respuesta les comento los resultados.
Muchas gacias por todo, estamos en contacto, saludos.


----------



## nicosplatt (Nov 7, 2016)

Muy buenas a todos, me leí la 15 paginas de este hilo para intentar encontrar una solución al problema que tengo en la escritura de una SD (micro sd con adaptador a sd) con el pic 18f65j50.
Lo que descubrí hasta el momento es que puedo leer los datos de la sd y mostrarlos en un display lcd. Pero a la hora de escribir, la sd acepta el comando 24 con la direccion de donde grabar ya que me responde con "00" pero despues de que le mando los 512 bytes, todas las respuestas que obtengo son 0xFF. Espero que alguien me pueda ayudar ya que es un proyecto del colegio y estamos estancados.
Por si las dudas aclaro que el compilador es el CCS 4.104 y para programar utilizo el mplab.


----------



## D@rkbytes (Nov 7, 2016)

No me gusta nada ese programa, y sin esquema, menos.
No veo que estés usando las rutinas adecuadas para leer y escribir una memoria SD.
En la carpeta de instalación del compilador hay un ejemplo que se llama "ex_mmcsd.c"
Míralo para que veas los procedimientos de lectura, escritura y configuración de pines.


----------



## asherar (Nov 15, 2016)

D@rkbytes dijo:


> No estoy seguro si el puerto SPI usado para la microSD también pueda utilizarse para comunicación entre el WT5001M02 y el microcontrolador.
> La persona que me vende esos módulos me dijo que si, pero yo no lo he comprobado.
> Yo uso el protocolo RS-232, ya que me resulta más cómodo que el SPI.



No voy a afirmar nada sobre las microSD, pero me gustaría decir que en mi opinión 
el protocolo SPI es considerablemente más simple de implementar que el RS232. 
Yo probé ambos protocolos para cosas diferentes y cada uno tiene lo suyo. 

En el RS232 la frecuencia es un estándar (ventaja) pero si no la podés sincronizar perfectamente se pierde la "trama" (contra). 

En el SPI también se usan como mínimo 2 bits, pero uno mismo maneja el CLK y así sabe en qué momento tomar cada bit y enviarlo o guardarlo (ventaja). Esto es bueno para el principiante que puede probar la transmisión a baja velocidad y ver el valor de los bits en un led de control. En algunos casos viene implementado en modo bidireccional, de manera que uno envía datos y a la vez los recibe en forma cíclica (usando un 3er pin). 
Además, algunos dispositivos como el MAX6675 (lector de termocupla compensado) solo se pueden leer mediante SPI. https://datasheets.maximintegrated.com/en/ds/MAX6675.pdf
A veces no se puede elegir. 

Un abrazo.


----------



## nelsonr (Dic 7, 2016)

Hola a todos, tengo una pregunta. Yo deceso pasar la señal de audio generada por el Wt5001 aun un moden Sim900, la forma en que lo realice en un principio fue de forma directa, cosa que no me funciono  ya que el modulo Wt sufrió traumas serios a tal punto que se daño  jejejejej.
Ahora lo que realice fue que la señal de audio primero la paso por un transformador 1.1 de audio, y le coloque una resistencia 10 Oh para simular la resistencia de la bocina.
“ Conexión de la resistencia: La pata 1 del primario a la pata 1 de la resistencia, la 2 de la resistencia a un terminal del modulo wt .
De la pata 2 del primario a el terminar de el wt.
Siendo  los terminales del modulo lo que generan la señal”
Luego la salida del secundario lo conecto a la entrada del MIC del modulo sim900.
Existe una manera en el que yo pueda suprimir el transformador 1:1 o de que otra forma puedo acoplar la señal del modulo de audio a el modulo SIM900, sin tanto componente de por medio.
Les agradezco su tiempo y paciencia


----------



## D@rkbytes (Dic 7, 2016)

Los módulos WT5001 tienen un pin llamado AL, (ADC Audio Output) aparte de los pines LOUT y ROUT.
Dicho pin entrega una señal de audio de baja intensidad, apta para entradas de línea.
De ahí puedes tomar la señal a través de un capacitor, una resistencia y un preset o potenciómetro.


----------



## nelsonr (Dic 9, 2016)

Gracias  D@rkbytes por tus muy buenos concejos  y oportunos, la verdad que has sido un gran maestro para mi. 
Voy a realzar la maniobra utilizando un capacitor electrolítico, conectando la pata + del -|(- a la salida del (ADC Audio Output) luego de la pata - del -|(- colocare la pata 1 de la resistencia y la pata dos de la resistencia al preset y de ahi saldra la señal para el siguiente modulo.
Te comento como me fue.


----------



## nelsonr (Dic 27, 2016)

Hola D@rkbytes Gracias, ya pude realizar el acople de manera perfecta pero me gustaría dejar la señal sin ese zumbido característico de grond (ñiiiiiiiiiiiiiii). 
le coloque un  electrolítico -|(-  de 100 micro F.


----------



## D@rkbytes (Dic 30, 2016)

Aumenta el valor a unos 470 µF
Con ese valor debe ser suficiente para obtener un buen filtraje para el módulo.


----------



## nelsonr (Ene 12, 2017)

Hola  amigos como ustedes saben estoy estudiando el tema del acoplamiento, y según los datos suministrados en el foro ya pude acoplar  la señal y eliminar el ruido en  un 80 %.Pero el otro 20%  aún se resiste   jejejejeje.
He notado el siguiente comportamiento.
Cuando sale la señal del acoplador para el moden gprs shield de arduino uno,  el celular que uso  de prueba previo recibe la llamada y cuando escucho el mensaje  tiene un ruidito.
Ahí mismo,  en ejecución desconecto la señal  enviada por wt5001  justo antes de la  etapa de acoplamiento,  y espero que el sonido del mensaje  en el celular de prueba  se deje de escuchar. Luego conectó la señal para que se escuche el mensaje nuevamente y cuando lo reproduce el celular de prueba, el mensaje de voz está completamente limpio 0  ruidos (no puedo creerlo hechicería jejejje). 
Si han tenido alguna experiencia  o tiene alguna idea de cómo tratar el tema,  le agradezco que me orienten un poco para documentarme en el caso y poder realizar los cambios en el circuito.Sé que suena  como a locura pero eso me está pasando.
Gracias por su tiempo.


----------



## Meta (Ene 12, 2017)

Hola:

Quiero saber si se puede almacenar datos en una Micro-SD sin ningún formato de archivo sea deWindwos, Linux o en Mac, solo en crudo y cómo funciona por dentro.

Y si hay ejemplos en asm o en C en microchip sobre controlar dicha tarjeta. Da igual el PIC que uses.

Se que si guardas algo, Windows no lo reconocerá precisamente porque no usa formato, solo en crudo.

Saludos


----------



## nelsonr (Ene 14, 2017)

Hola que tal amigo, creo haber encontrado el origen de mi problema.

Creo que el problema está en que yo estoy enviado la señal de audio del  Wt5001 a una entrada de un micrófono. Quizás a mi  circuito acoplador (Capacitor, resistencia y preset )le falte algo más para poder convertir  la entra del micrófono en una especie de entrada auxiliar.
La entrada del micrófono es solo para hablar no es de grabar, por lo que tengo entendido, la entrada del micrófono es como la de las PC.
Al final de toda las pruebas a mi circuito de acoplamiento le coloque un transformado de audio 1:1 y el sonido se  escucha   muy bien 'clarito'.
Les agradezco que si estoy equivocado con mi hipótesis de que una entrada de micrófono  no se puede usar como entrada de señal  auxiliar, me corrijan. Y de estar en lo correcto de que otra forma puedo pasar la señal sin usar un trasformador de audio.


----------



## JosM89 (Abr 4, 2019)

Hola amigos entusiastas de la electrónica. 

Tengo problemas con este tema de los microcontroladores y las memorias SD. En el simulador mi señal de reloj se ve cuadrada y bien definida, con los parámetros necesarios, pero en cuanto la grabo en el PIC, la señal se ve muy mal. He intentado cambiar la programación y grabar en otros PICs nuevos para descartar la falla, pero solo en el simulador se logra una señal buena.

¿Alguien ha tenido un problema similar? he estado pensando incluso que podría estar fallando la programadora de los micros cuando los grabo.

Adjunto algunas capturas y la programación con la que he estado intentando por lo menos inicializar.

Esto es lo que estoy usando:
-Compilador: CCS Compiler V5.081
-Simulador Proteus 8.8 SP1
-Programador PIC600 
-Microcontrolador PIC18F4550 

Gracias por sus respuestas y un saludo.


----------



## D@rkbytes (Abr 4, 2019)

Sería maravilloso que en la vida real las señales se vieran tan definidas como en el simulador.
Existen cosas como las capacidades parásitas que pueden deformar la señal, y más si se usa un protoboard.
Sin embargo, mientras las señales estén dentro del rango interpretable por el dispositivo, las debe reconocer.


----------



## Dr. Zoidberg (Abr 4, 2019)

Por lo que se vé, parece tener un problema de terminacion de linea. Si es un protoboard seria entendible, pero yo pondría algunas resistencias de terminacion de valor...vaya uno a saber. Con que no perjudique el fan-out de los terminales del transmisor SPI seria un buen comienzo...


----------



## D@rkbytes (Abr 5, 2019)

JosM89 dijo:


> He intentado cambiar la programación y grabar en otros PICs nuevos para descartar la falla, pero solo en el simulador se logra una señal buena.


Lo que te hizo falta cambiar es la palabra de configuración.
Por mera curiosidad compilé el programa que adjuntas para ver los fuses y existe un problema.

El CPU está funcionando con una frecuencia dividida por dos.


Si se requiere que trabaje a 10 MHz, (HS_OSC) se tiene que desactivar el prescaler y el PLL.
Como no se va a usar el USB, tampoco tiene caso activar el regulador interno.


Y para lograr esa configuración en PIC C de CCS, no hay mucho que declarar...

#use delay (CRYSTAL = 10 MHz, CLOCK = 10 MHz)
#fuses NOVREGEN, NOFCMEN

Con eso basta.

Nota:
Cuando se desactiva el prescaler, la parte donde dice: -Oscillator Selection- (Postscaler) ya no es tomada en cuenta.


----------



## JosM89 (Abr 5, 2019)

Gracias, lo intentare con los cambios que mencionas, llevo un rato en esto y no acabo de entender bien cómo manejar la memoria con el PIC y las librerías y ejemplos que circulan por la red, parece no funcionar.


----------



## JosM89 (Abr 10, 2019)

Bien, pues sigo con el problema.

¿Alguien ha utilizado la librería de suky? Se lee que es buena, pero a mi se me queda en esta parte:

```
BOOL SDCard_send_command_R7(UINT8 cmd,UINT32 arg,UINT8 CRC,SDCARD_RESPUESTA *res)

{


   UINT8_VAL ResTmp;

   UINT16 i;

   UINT32_VAL Temp;

 

   Temp.Val=arg;

   SD_CS=0;

   for( i=0;i<16;i++) WriteMedia(0xFF);

   WriteMedia(cmd|0x40);

   WriteMedia(Temp.MB);

   WriteMedia(Temp.UB);

   WriteMedia(Temp.HB);

   WriteMedia(Temp.LB);

   WriteMedia(CRC);

 

    

   // Se espera respuesta R1

   i=0;

   do{

      ResTmp.Val=ReadMedia();

      i++;

   }

   while((ResTmp.b7)!=0 && i<SDCARD_TIMEOUT);// mientras no corresponda con 0xxxxxxx.-

   if(i>=SDCARD_TIMEOUT){SDDeselect();return(0);}

   Temp.MB=ReadMedia();

   Temp.UB=ReadMedia();

   Temp.HB=ReadMedia();

   Temp.LB=ReadMedia();

 

   res->R1.Val=ResTmp.Val;

   res->Retorno=Temp.Val;

   #if defined(SDCARD_DEBUG)

      printf("Repeticiones para respuesta de CmdXX: %Lu; Respuesta recibida:%u,0x%lX\r\n",i,ResTmp.Val,Temp.Val);

   #endif

   return(1);

}
```
Solo recibo Repeticiones para respuesta de CmdXX: 1; Respuesta recibida: 0 y de ahí no sale.


----------



## JosM89 (Abr 12, 2019)

Bien, pues comento que encontre el problema , ya logre una inicialización exitosa, por lo menos en el simulador, falta probarlo en real, pero por ahora intentare con la lectura y escritura también simuladas, la librería me parece una chulada  ya les comentare que pasa después y les doy las gracias por sus respuestas anteriores, saludos.


----------

