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

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
 
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.
 
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.
 
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,

Código:
;
;****************************************************
;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
;
 
SIMONF

MEnudo curro amigo.


Código:
;
    ;****************************************************
    ;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.
 
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!!!
 
Última edición por un moderador:
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
 
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 :D

Saludos!!!
 
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
 
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 0x00 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!!
 
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.
Código:
;******************************************************************************
;                                                                             *
;    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
 
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.
 
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.

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