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

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
 
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!
 
Última edición por un moderador:
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?
 
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...)
 

Adjuntos

  • estrategia_186.gif
    estrategia_186.gif
    7.5 KB · Visitas: 197
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).
 
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
 
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
 
oye estaba viendo la pg..que tienes ahi...esta muy buena..tiene mcuhos proyectos....y estaba chekando este codigo

Código:
#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?

Código:
Spi_Init_Advanced(MASTER_OSC_DIV64, DATA_SAMPLE_MIDDLE, CLK_IDLE_LOW, LOW_2_HIGH);
 
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.
 
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?
 
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.
 
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!
 
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"
 
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:

Código:
#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
 
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.
 
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
 
Atrás
Arriba