Librería de tareas para SmartCard (Tarjetas Chip) ASM

Hola que tal a todos. He creado esta libreria de subrutinas para operar con tarjetas chip SmartCard.
Por ahora es solo de lectura de ID de la misma.

Queria consultar con ustedes que les parece y que modificarian o agregarian.

La información para armar estas subrutinas la saque de pablin.

http://www.pablin.com.ar/electron/información/chipcard/index.htm

Código:
;
;
;En esta libreria tenemos tres tareas basicas para aplicaciones
;con tarjetas chip SmartCard de 8 contactos.
;
;*****************************************************************************************************
;SC_LeeID =	Lee los tres bytes de ID de la tarjeta y los guarda en tres registros
;		"SC_IDByte1", "SC_IDByte2" y "SC_IDByte3".
;
;	//	DEFINIR LINEA Y PUERTO DEL MICRO DONDE SE ENCUENTRA EL PIN "IO" DE	//
;	//			LA TARJETA CHIP COMO "SC_IO"				//
;
;*****************************************************************************************************
;
;SC_Reset =	Resetea la tarjeta poniendola en la direccion 0 de memoria.

;	//	DEFINIR LINEA Y PUERTO DEL MICRO DONDE SE ENCUENTRA EL PIN "RESET" DE	//
;	//			LA TARJETA CHIP COMO "SC_Rst"				//
;
;*****************************************************************************************************
;
;SC_Clock =	Da un pulso de reloj a la tarjeta.
;
;	//	DEFINIR LINEA Y PUERTO DEL MICRO DONDE SE ENCUENTRA EL PIN "CLOCK" DE	//
;	//			LA TARJETA CHIP COMO "SC_CLK"				//
;
;*****************************************************************************************************

	CBLOCK
	SC_IDByte1
	SC_IDByte2
	SC_IDByte3
	BCont_A
	ENDC

SC_LeeID
		clrf	SC_IDByte1		;-----------------------------------------------------
		clrf	SC_IDByte2
		clrf	SC_IDByte3
		call	SC_Reset
		movlw	.40
		movwf	BCont_A
CKInt		bsf	SC_CLK
		call	Retardo_1ms
		bcf	SC_CLK
		call	Retardo_1ms
		decfsz	BCont_A
		goto	CKInt			;------------------------------------------------------
		movlw	.8			;------------------------------------------------------
		movwf	BCont_A
Byte1		btfss	SC_IO
		goto	EsCero1
EsUno1		bsf	STATUS,C
		goto	FinID1
EsCero1		bcf	STATUS,C		;Recupera el Byte #1
FinID1		rrf	SC_IDByte1,F		;de ID de la SmartCard
		bsf	SC_CLK
		call	Retardo_1ms
		bcf	SC_CLK
		call	Retardo_1ms
		decfsz	BCont_A
		goto	Byte1			;------------------------------------------------------
		movlw	.8			;------------------------------------------------------
		movwf	BCont_A
Byte2		btfss	SC_IO
		goto	EsCero2
EsUno2		bsf	STATUS,C
		goto	FinID2
EsCero2		bcf	STATUS,C		;Recupera el Byte #2
FinID2		rrf	SC_IDByte2,F		;de ID de la SmartCard
		bsf	SC_CLK
		call	Retardo_1ms
		bcf	SC_CLK
		call	Retardo_1ms
		decfsz	BCont_A
		goto	Byte2			;-----------------------------------------------------
		movlw	.8			;-----------------------------------------------------
		movwf	BCont_A
Byte3		btfss	SC_IO
		goto	EsCero3
EsUno3		bsf	STATUS,C
		goto	FinID3
EsCero3		bcf	STATUS,C		;Recupera el Byte #3
FinID3		rrf	SC_IDByte3,F		;de ID de la SmartCard
		bsf	SC_CLK
		call	Retardo_1ms
		bcf	SC_CLK
		call	Retardo_1ms
		decfsz	BCont_A
		goto	Byte3			;-----------------------------------------------------
		return				;Sale de la subrutina de lectura de la SmartCard

;*****************************************************************************************************

SC_Reset
		bcf	SC_Rst
		call	Retardo_1ms
		call	SC_Clock
		bsf	SC_Rst
		return

;*****************************************************************************************************

SC_Clock
		bcf	SC_Clk
		call	Retardo_1ms
		bsf	SC_Clk
		call	Retardo_1ms
		return



;*****************************************************************************************************
;/////////////////////////////////////////////////////////////////////////////////////////////////////
;///////////////////////							//////////////////////
;///////////////////////	 Libreria hecha por Mariano Renzi 2008		//////////////////////
;///////////////////////							//////////////////////
;/////////////////////////////////////////////////////////////////////////////////////////////////////
;*****************************************************************************************************

el chip esta siempre en modo lectura, en este caso nunca pasa a modo de programacion, es decir que Vpp se conecta a Vcc y RW en nivel bajo.

muchas gracias,
mano.
 
Hola:

Me parece una idea interesante. Vamos a intentar hacer este proyecto entre todo y que al final sea funcional. Veo que no usa instrucciones para los 18F, punto a su favor ya que podemos usarlo para los 16F.

La única modificación que he modificado está en azul. Así podrás ver lo que he hecho. En este caso es mejor bajo mi punto de vista así porque si vas a cambiar muchas veces Entero_2 que su valor es .8, desde que lo cambies en #DEFINE Entero_2 .8, por ejemplo el valor .64, entonces ya no hace falta cambiarla una a una que es una tarea muy larga sobre todo si trabajas con miles de líneas de código por poner un ejemplo.

Me gustaría recuperar los datos de cualquier tarjeta y poder mostrarlo en una interfaz en Windows con Visual C# y guardar los datos en archivos de textos, pero...
...ya es otro cantar.

;
;
;En esta libreria tenemos tres tareas basicas para aplicaciones
;con tarjetas chip SmartCard de 8 contactos.
;
;*****************************************************************************************************
;SC_LeeID = Lee los tres bytes de ID de la tarjeta y los guarda en tres registros
; "SC_IDByte1", "SC_IDByte2" y "SC_IDByte3".
;
; // DEFINIR LINEA Y PUERTO DEL MICRO DONDE SE ENCUENTRA EL PIN "IO" DE //
; // LA TARJETA CHIP COMO "SC_IO" //
;
;*****************************************************************************************************
;
;SC_Reset = Resetea la tarjeta poniendola en la direccion 0 de memoria.

; // DEFINIR LINEA Y PUERTO DEL MICRO DONDE SE ENCUENTRA EL PIN "RESET" DE //
; // LA TARJETA CHIP COMO "SC_Rst" //
;
;*****************************************************************************************************
;
;SC_Clock = Da un pulso de reloj a la tarjeta.
;
; // DEFINIR LINEA Y PUERTO DEL MICRO DONDE SE ENCUENTRA EL PIN "CLOCK" DE //
; // LA TARJETA CHIP COMO "SC_CLK" //
;
;*****************************************************************************************************

CBLOCK
SC_IDByte1
SC_IDByte2
SC_IDByte3
BCont_A
ENDC
#DEFINE Entero_1 .40
#DEFINE Entero_2 .8


SC_LeeID
clrf SC_IDByte1 ;-----------------------------------------------------
clrf SC_IDByte2
clrf SC_IDByte3
call SC_Reset
movlw Entero_1
movwf BCont_A
CKInt bsf SC_CLK
call Retardo_1ms
bcf SC_CLK
call Retardo_1ms
decfsz BCont_A
goto CKInt ;------------------------------------------------------
movlw Entero_2 ;------------------------------------------------------
movwf BCont_A
Byte1 btfss SC_IO
goto EsCero1
EsUno1 bsf STATUS,C
goto FinID1
EsCero1 bcf STATUS,C ;Recupera el Byte #1
FinID1 rrf SC_IDByte1,F ;de ID de la SmartCard
bsf SC_CLK
call Retardo_1ms
bcf SC_CLK
call Retardo_1ms
decfsz BCont_A
goto Byte1 ;------------------------------------------------------
movlw Entero_2 ;------------------------------------------------------
movwf BCont_A
Byte2 btfss SC_IO
goto EsCero2
EsUno2 bsf STATUS,C
goto FinID2
EsCero2 bcf STATUS,C ;Recupera el Byte #2
FinID2 rrf SC_IDByte2,F ;de ID de la SmartCard
bsf SC_CLK
call Retardo_1ms
bcf SC_CLK
call Retardo_1ms
decfsz BCont_A
goto Byte2 ;-----------------------------------------------------
movlw Entero_2 ;-----------------------------------------------------
movwf BCont_A
Byte3 btfss SC_IO
goto EsCero3
EsUno3 bsf STATUS,C
goto FinID3
EsCero3 bcf STATUS,C ;Recupera el Byte #3
FinID3 rrf SC_IDByte3,F ;de ID de la SmartCard
bsf SC_CLK
call Retardo_1ms
bcf SC_CLK
call Retardo_1ms
decfsz BCont_A
goto Byte3 ;-----------------------------------------------------
return ;Sale de la subrutina de lectura de la SmartCard

;*****************************************************************************************************

SC_Reset
bcf SC_Rst
call Retardo_1ms
call SC_Clock
bsf SC_Rst
return

;*****************************************************************************************************

SC_Clock
bcf SC_Clk
call Retardo_1ms
bsf SC_Clk
call Retardo_1ms
return



;*****************************************************************************************************
;/////////////////////////////////////////////////////////////////////////////////////////////////////
;/////////////////////// //////////////////////
;/////////////////////// Libreria hecha por Mariano Renzi 2008 //////////////////////
;/////////////////////// //////////////////////
;/////////////////////////////////////////////////////////////////////////////////////////////////////
;*****************************************************************************************************

Un cordial saludo.
 
si queres hacer una interfaz con pc, podrias, en vez de usar un uC, conectar la tarjeta directamente al puerto paralelo o serie y hacer el programa de arriba cn el C#.

gracias por las sugerencias, ahora las voy a aplicar.
en cuanto a la funcionalidad del programa, como la ves? esta bien o algun error?

gracias,
mano.
 
Hola:

Para poder ver errores de funcionamiento, antes hay que probarlo físicamente. ¿También vale las SIM? Claro que actualmente sea de cualquier cosa ya son de 6 patas utilizables.

Saludo.
 
Bueno, termine de diseñar mi proyecto de lector de tarjetas y les dejo los archivos para realizarlo.

El funcionamiento es simple. Cuando prende, se configuran los puertos, interrupciones, flancos, pull up y se inicializa el LCD. Se muestra un mensaje en la pantalla diciendo "Introduzca una tarjeta" y se echa a dormir.

Cuando se inserta una tarjeta, el pulsador interno del slot, que esta conectado a RB0/INT, comienza el servicio de interrupcion. Si al iniciar el servicio, esta presionado el pulsador que esta conectado a RA1, se procede a guardar en la memoria eeprom el codigo de identidad de la tarjeta en cuestion, se muestra un mensaje en el LCD y se prenden los leds rojo y verde (qe al ser un led bicolor de tres patas, el color resultante seria el naranja).

Si el pulsador, en cambio, no esta presionado, se procede a leer la tarjeta y a compararla con la grabada en la memoria eeprom, si pasa la prueba de validacion, se prende el led verde y se muestra un mensaje de bienvenida, caso contrario, se prende el led rojo y se muestra un mensaje de error.

todavia no probe el circuito ni el programa ni nada, pero en teoria esta todo bien.

en este post incluyo:

Circuito electrico o esquematico.
PCB (compatible tanto para procesar placa como para pasarlo a una placa universal o de prototipos perforada)
Programa principal
SUBRUTINAS: lectura de tarjeta, lectura/escritura de memoria eeprom, controladoras de LCD 16x2 de Hitachi y de retardos.

cualquier duda me consultan.
salu2,
mano.
 

Adjuntos

  • placa_universal_122.pcb
    7.9 KB · Visitas: 35
  • circuito_638.jpg
    circuito_638.jpg
    87.1 KB · Visitas: 53
  • lector_smartcard_491.asm
    3.1 KB · Visitas: 58
  • subrutinas_170.rar
    8.8 KB · Visitas: 36
aaah, me olvide de cambiar en la subrutina de lectura de la tarjeta lo de definir los enteros.
ya lo cambio y en la proxima revision lo publico.

de paso aclaro que yo la placa no la hice, sino qe la hice en una placa perforada, tomando como referencia los puntos de la grilla del pcb wizard (que lo configure a .1 pulgadas para que cada punto sea un agujerito)

salu2,
mano.
 
alguien tiene alguna subrutina de conversion de binario 24 bits a bcd? para poder mostrar en el lcd el codigo de identificacion de la tarjeta...

gracias,
mano.
 
Meta dijo:

6 contactos.
Código:
; GENERATED BY WINDIS84, (C) NIGEL GOODWIN 1998.
; CREADO POR SELMAR GRACIAS A LA INESTIMABLE COLABORACION DEL CANAL #PIC
	LIST      P=16F84A, F=INHX8M
	INCLUDE "P16F84A.INC"
	__CONFIG 3FF1					



; ASIGNAMOS POSICIONES DE MEMORIA A LAS VARIABLES NECESARIAS.

MODO EQU 0X0C		;Define si vamos a escribir o a comparar
SERIE EQU 0X0D		;Primer byte del numero de serie.
SERIE1 EQU 0X0E		;Segundo byte del numero de serie.
SERIE2 EQU 0X0F		;Tercer byte del numero de serie.
PUNTERO EQU 0X10	;Variable para el mapeo de la tarjeta.
INCORRECTA EQU 0X11	;Variable que guarda intentos fallidos.
PARPADEO EQU 0X12	;Variable para conseguir el parpadeo del led.



; CONFIGURACION DE LOS PUERTOS Y DEL PIC
	ORG 0X00
	GOTO CONFIG_
	ORG 0X05
	
CONFIG_	BSF STATUS,RP0		;Banco 1
	CLRF TRISB		;TRISB=0 (SALIDAS).
	MOVLW 0XFF		;
	MOVWF TRISA		;TRISA=FF (ENTRADAS) 
	MOVLW 0X87		;Cargamos W con 87H
	MOVWF OPTION_REG	;Activa Pull-up y div al TMRO
	BCF STATUS,5		;Banco 0.
	CLRF PORTB		;Limpiamos el puerto B
	CLRF INCORRECTA		;Limpiamos variable intentos fallidos
	CLRF PARPADEO

INICIO	BTFSC INTCON,T0IF	;MIRA EL FLAG DE DESBORDAMIENTO DEL TMR0, SALTA LA SIGUIENTE INS 				;SI VALE 1
	CALL TOGGLE
	BTFSC PORTA,3		;Antisabotaje activado ?
	CALL ACTIVA_ALARMA	;SI,ALARMA. No, continuamos.
	BTFSC PORTA,3		;Continua antisabotaje activado despues de activar alarma ?
	GOTO INICIO		;Sí, escaneando de nuevo antisabotaje.
	BTFSS PORTA,0		;Tarjeta dentro ? (insert=0 ?) 	
	GOTO INICIO		;NO, entra en bucle.
	BSF PORTB,5

;GRABA_O_LEE			;Si, continuamos
	BCF PORTB,5
	CLRF MODO		;MODO=0
	BTFSC PORTA,1		;Grabamos o comparamos? 
	BSF MODO,0		;prog=1 (lectura).prog=0 (grabacion)
PULSADO	BTFSS PORTA,1		;Hemos soltado Programacion? (Prog=1 ?)
	GOTO PULSADO		;No,Vuelve a escanear (bucle)
	CALL DELAY_10_MS	;Si, continuamos.
		



;RESET DE LA TARJETA.		
	
	BSF PORTB,0		;Damos un reset a la tarjeta
	CALL PULSO_RELOJ	;    __________
	BCF PORTB,0		;    I        I
	CALL DELAY_10_MS	;----          -----


APUNTA_A_NUMERO_DE_SERIE
	MOVLW 0X24		;32d=20h, primer bit de  numero serie en tarjeta.
	MOVWF PUNTERO		;Cargamos variable con el desplazamiento. 
apunta  CALL PULSO_RELOJ	
	DECFSZ PUNTERO,F	;Decrecer puntero, puntero=0?
	GOTO apunta		;No,volvemos a decrecer
	
;PREPARAMOS LOS REGISTROS Y VARIABLES.

LEE_NUMERO_SERIE		;Sí, continuamos
	CLRF SERIE		;Serie(X)=0
	CLRF SERIE1
	CLRF SERIE2
	BCF STATUS,0		;Carry=0
	MOVLW 0X0D
	MOVWF FSR		;FSR=0x0D(serie) (indf=serie(dato))
	CLRF EEADR		;Lipiamos EEADR
	

DATO	BTFSC PORTA,2		;A2=0 ? Bit de numero de serie.
	BSF INDF,0		;No, indf(0)=1
	BCF STATUS,0		;Sí, lo pasamos al carry (
	INCF PUNTERO,F
	BTFSS PUNTERO,3		;Puntero=8 ?
	RLF INDF,F		;No, rotamos el bit leido a la Izq.
	CALL PULSO_RELOJ
	BTFSS PUNTERO,3		;Puntero=8 ?
	GOTO DATO		;No, vuelve a leer otro dato
	BTFSS MODO,0		;Sí, continua y MODO=0 ?
	GOTO ESCRITURA		;Sí, vamos a escritura.
		
				;No, continuamos.
	
COMPARA	BSF STATUS,RP0		;Banco 1
	BSF EECON1,RD		;Seteamos RD (lectura EPROM)
	BCF STATUS,RP0		;Banco 0
	MOVF EEDATA,W		;Cargamos la lectura en W
	BCF STATUS,Z		;Borramos el FLAG Z
	SUBWF INDF,W		;Serie(x)-W
	BTFSS STATUS,Z		;Z=1?
	GOTO NO_AUTORIZADO	;No, serie(x) y el byte leido no eran iguales.
	CLRF PUNTERO
	INCF EEADR,F		;Sí,serie(x) y el byte leido eran iguales Incrementamos EEADR (siguiente pos EPROM)
	INCF FSR,F		;Incremetamos FSR, siguiente variable de serie(x).
	BTFSC FSR,4		;FSR=0x08, (ha leido tres bytes serie(x) ?)
	GOTO AUTORIZADO		;Sí, BYTE OK
	GOTO DATO		;No, compara otro serie(x). Hasta 3.
		 
ESCRITURA

	MOVF INDF,W		;Cargamos el byte serie(x) en W.
	MOVWF EEDATA		;Cargamos EEDATA con serie(x) para grabarlo en EPROM.
	BSF STATUS,RP0		;Banco1
	BSF EECON1,WREN		;Habilitamos permiso de escritura
	MOVLW 0X55		;NI PUTA IDEA DE PORQUE PERO HAY QUE HACERLO.
	MOVWF EECON2		;NI PUTA IDEA DE PORQUE PERO HAY QUE HACERLO.	
	MOVLW 0XAA		;NI PUTA IDEA DE PORQUE PERO HAY QUE HACERLO.
	MOVWF EECON2		;NI PUTA IDEA DE PORQUE PERO HAY QUE HACERLO.
	BSF EECON1,WR		;Seteamos WR para escribir en la Eprom.

WRITING BTFSS   EECON1,EEIF     ;Ha grabado? EEIF=1? 
        GOTO    WRITING		;No, vuelve a mirar el FLAG.
        BCF     EECON1,EEIF	;Sí, limpiamos los registros y flag.     
        BCF     EECON1,WREN     
	BCF     STATUS,RP0	;Banco 0
	CLRF PUNTERO				
	INCF EEADR,F		;Incrementamos EEADR para apuntara siguiente posición.
	INCF FSR,F		;Incrementamos el FSR para cargar en INDF el siguiente byte serie(x).
	BTFSS FSR,4		;Miramos si el FSR apunta a 0100_b,para ver si se ha guardado el número completo. 
	GOTO DATO		;Como no ha terminado vuelve a grabar otro byte serie(x).
	BSF PORTB,5
	CALL TARJETA_DENTRO
	GOTO INICIO
	
PULSO_RELOJ
	CALL DELAY_10_MS
	BSF PORTB,1
	CALL DELAY_10_MS
	BCF PORTB,1
	CALL DELAY_10_MS
	RETURN

DELAY_10_MS
	BCF 0x0B,2		;LIMPIAMOS EL FLAG DE DESBORDAMIENTO TMRO
	BCF OPTION_REG,PSA
	MOVLW 07
	MOVWF TMR0		;CARGAMOS EL TMR0 CON 215d
NO_DESBORDADO
	BTFSS INTCON,T0IF	;MIRA EL FLAG DE DESBORDAMIENTO DEL TMR0, SALTA LA SIGUIENTE INS 				;SI VALE 1
	GOTO NO_DESBORDADO
	RETURN			;SE HA PRODUCIDO DEBORDAMIENTO VUELVE AL PUNTO DE LLAMADA.


NO_AUTORIZADO
	INCF INCORRECTA,F
	BSF PORTB,5
	CALL TARJETA_DENTRO
	BTFSC INCORRECTA,3
	CALL ACTIVA_ALARMA
	GOTO INICIO

AUTORIZADO
	CLRF INCORRECTA		;Limpia la variable
	BSF PORTB,7		;Activamos el contacto del coche.
	CALL DELAY_10_MS
	BSF PORTB,6		;Activamos starter del coche.
	CALL TARJETA_DENTRO
	BCF PORTB,6		;Sí, desactivamos el starter.
	BCF PORTB,7		;Desactivamos el contacto.
	GOTO INICIO

TARJETA_DENTRO
	BTFSC PORTA,0		;Se ha sacado la tarjeta? (insert=1)
	GOTO TARJETA_DENTRO	;No, volvemos a escanear insert.
	CALL DELAY_10_MS	;Sí, retornamos.
	BCF PORTB,5
	RETURN			

ACTIVA_ALARMA
	BSF PORTB,4
	CALL DELAY_10_MS
	BCF PORTB,4
	CLRF INCORRECTA		;Limpiamos variable intentos
	RETURN

TOGGLE  MOVLW 20
	INCF PARPADEO,F
	BTFSC PARPADEO,3
	XORWF PORTB,F
	BTFSC PARPADEO,3
	CLRF PARPADEO
	BCF INTCON,2
	RETURN




  	ORG     0x2100
            DATA    0x00
            DATA    0x00
            DATA    0x00
            DATA    0x53
            DATA    0x65
            DATA    0x72
            DATA    0x69
            DATA    0x65
            DATA    0x43
            DATA    0x6F
            DATA    0x6E
            DATA    0x74
            DATA    0x72
            DATA    0x6F
            DATA    0x6C
            DATA    0x20
            DATA    0x61
            DATA    0x63
            DATA    0x63
            DATA    0x65
            DATA    0x73
            DATA    0x6F
            DATA    0x2E
            DATA    0x20
            DATA    0x53
            DATA    0x65
            DATA    0x6C
            DATA    0x6D
            DATA    0x61
            DATA    0x72
            DATA    0x20
            DATA    0x20
            DATA    0x56
            DATA    0x20
            DATA    0x31
            DATA    0x2E
            DATA    0x30
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
	END

8 contactos
Código:
; GENERATED BY WINDIS84, (C) NIGEL GOODWIN 1998.
; CREADO POR SELMAR GRACIAS A LA INESTIMABLE COLABORACION DEL CANAL #PIC
	LIST      P=16F84, F=INHX8M
	INCLUDE "P16F84A.INC"	
	__CONFIG 3FF1				



; ASIGNAMOS POSICIONES DE MEMORIA A LAS VARIABLES NECESARIAS.

MODO EQU 0X0C		;Define si vamos a escribir o a comparar
SERIE EQU 0X0D		;Primer byte del numero de serie.
SERIE1 EQU 0X0E		;Segundo byte del numero de serie.
SERIE2 EQU 0X0F		;Tercer byte del numero de serie.
PUNTERO EQU 0X10	;Variable para el mapeo de la tarjeta.
INCORRECTA EQU 0X11	;Variable que guarda intentos fallidos.
PARPADEO EQU 0X12	;Variable para conseguir el parpadeo del led.



; CONFIGURACION DE LOS PUERTOS Y DEL PIC
	ORG 0X00
	GOTO CONFIG_
	ORG 0X05
	
CONFIG_  BSF STATUS,RP0		;Banco 1
	CLRF TRISB		;TRISB=0 (SALIDAS).
	MOVLW 0XFF		;
	MOVWF TRISA		;TRISA=FF (ENTRADAS) 
	MOVLW 0X87		;Cargamos W con 87H
	MOVWF OPTION_REG	;Activa Pull-up y div al TMRO
	BCF STATUS,5		;Banco 0.
	CLRF PORTB		;Limpiamos el puerto B
	CLRF INCORRECTA		;Limpiamos variable intentos fallidos
	CLRF PARPADEO

INICIO	BTFSC INTCON,T0IF	;MIRA EL FLAG DE DESBORDAMIENTO DEL TMR0, SALTA LA SIGUIENTE INS 				;SI VALE 1
	CALL TOGGLE
	BTFSC PORTA,3		;Antisabotaje activado ?
	CALL ACTIVA_ALARMA	;SI,ALARMA. No, continuamos.
	BTFSC PORTA,3		;Continua antisabotaje activado despues de activar alarma ?
	GOTO INICIO		;Sí, escaneando de nuevo antisabotaje.
	BTFSS PORTA,0		;Tarjeta dentro ? (insert=0 ?) 	
	GOTO INICIO		;NO, entra en bucle.
	BSF PORTB,5

;GRABA_O_LEE			;Si, continuamos
	BCF PORTB,5
	CLRF MODO		;MODO=0
	BTFSC PORTA,1		;Grabamos o comparamos? 
	BSF MODO,0		;prog=1 (lectura).prog=0 (grabacion)
PULSADO	BTFSS PORTA,1		;Hemos soltado Programacion? (Prog=1 ?)
	GOTO PULSADO		;No,Vuelve a escanear (bucle)
	CALL DELAY_10_MS	;Si, continuamos.
		



;RESET DE LA TARJETA.		
	
	BCF PORTB,0		;Damos un reset a la tarjeta
	CALL PULSO_RELOJ	;    __________
	BSF PORTB,0		;    I        I
	CALL DELAY_10_MS	;----          -----


APUNTA_A_NUMERO_DE_SERIE
	MOVLW 0X28		;40d=28h, primer bitde  numero serie en tarjeta.
	MOVWF PUNTERO		;Cargamos variable con el desplazamiento. 
apunta  CALL PULSO_RELOJ	
	DECFSZ PUNTERO,F	;Decrecer puntero, puntero=0?
	GOTO apunta		;No,volvemos a decrecer
	
;PREPARAMOS LOS REGISTROS Y VARIABLES.

LEE_NUMERO_SERIE		;Sí, continuamos
	CLRF SERIE		;Serie(X)=0
	CLRF SERIE1
	CLRF SERIE2
	BCF STATUS,0		;Carry=0
	MOVLW 0X0D
	MOVWF FSR		;FSR=0x0D(serie) (indf=serie(dato))
	CLRF EEADR		;Lipiamos EEADR
	

DATO	BTFSC PORTA,2		;A2=0 ? Bit de numero de serie.
	BSF INDF,0		;No, indf(0)=1
	BCF STATUS,0		;Sí, lo pasamos al carry (
	INCF PUNTERO,F
	BTFSS PUNTERO,3		;Puntero=8 ?
	RLF INDF,F		;No, rotamos el bit leido a la Izq.
	CALL PULSO_RELOJ
	BTFSS PUNTERO,3		;Puntero=8 ?
	GOTO DATO		;No, vuelve a leer otro dato
	BTFSS MODO,0		;Sí, continua y MODO=0 ?
	GOTO ESCRITURA		;Sí, vamos a escritura.
		
				;No, continuamos.
	
COMPARA	BSF STATUS,RP0		;Banco 1
	BSF EECON1,RD		;Seteamos RD (lectura EPROM)
	BCF STATUS,RP0		;Banco 0
	MOVF EEDATA,W		;Cargamos la lectura en W
	BCF STATUS,Z		;Borramos el FLAG Z
	SUBWF INDF,W		;Serie(x)-W
	BTFSS STATUS,Z		;Z=1?
	GOTO NO_AUTORIZADO	;No, serie(x) y el byte leido no eran iguales.
	CLRF PUNTERO
	INCF EEADR,F		;Sí,serie(x) y el byte leido eran iguales Incrementamos EEADR (siguiente pos EPROM)
	INCF FSR,F		;Incremetamos FSR, siguiente variable de serie(x).
	BTFSC FSR,4		;FSR=0x08, (ha leido tres bytes serie(x) ?)
	GOTO AUTORIZADO		;Sí, BYTE OK
	GOTO DATO		;No, compara otro serie(x). Hasta 3.
		 
ESCRITURA

	MOVF INDF,W		;Cargamos el byte serie(x) en W.
	MOVWF EEDATA		;Cargamos EEDATA con serie(x) para grabarlo en EPROM.
	BSF STATUS,RP0		;Banco1
	BSF EECON1,WREN		;Habilitamos permiso de escritura
	MOVLW 0X55		;NI PUTA IDEA DE PORQUE PERO HAY QUE HACERLO.
	MOVWF EECON2		;NI PUTA IDEA DE PORQUE PERO HAY QUE HACERLO.	
	MOVLW 0XAA		;NI PUTA IDEA DE PORQUE PERO HAY QUE HACERLO.
	MOVWF EECON2		;NI PUTA IDEA DE PORQUE PERO HAY QUE HACERLO.
	BSF EECON1,WR		;Seteamos WR para escribir en la Eprom.

WRITING BTFSS   EECON1,EEIF     ;Ha grabado? EEIF=1? 
        GOTO    WRITING		;No, vuelve a mirar el FLAG.
        BCF     EECON1,EEIF	;Sí, limpiamos los registros y flag.     
        BCF     EECON1,WREN     
	BCF     STATUS,RP0	;Banco 0
	CLRF PUNTERO				
	INCF EEADR,F		;Incrementamos EEADR para apuntara siguiente posición.
	INCF FSR,F		;Incrementamos el FSR para cargar en INDF el siguiente byte serie(x).
	BTFSS FSR,4		;Miramos si el FSR apunta a 0100_b,para ver si se ha guardado el número completo. 
	GOTO DATO		;Como no ha terminado vuelve a grabar otro byte serie(x).
	BSF PORTB,5
	CALL TARJETA_DENTRO
	GOTO INICIO
	
PULSO_RELOJ
	CALL DELAY_10_MS
	BSF PORTB,1
	CALL DELAY_10_MS
	BCF PORTB,1
	CALL DELAY_10_MS
	RETURN

DELAY_10_MS
	BCF 0x0B,2		;LIMPIAMOS EL FLAG DE DESBORDAMIENTO TMRO
	BCF OPTION_REG,PSA
	MOVLW 07
	MOVWF TMR0		;CARGAMOS EL TMR0 CON 215d
NO_DESBORDADO
	BTFSS INTCON,T0IF	;MIRA EL FLAG DE DESBORDAMIENTO DEL TMR0, SALTA LA SIGUIENTE INS 				;SI VALE 1
	GOTO NO_DESBORDADO
	RETURN			;SE HA PRODUCIDO DEBORDAMIENTO VUELVE AL PUNTO DE LLAMADA.


NO_AUTORIZADO
	INCF INCORRECTA,F
	BSF PORTB,5
	CALL TARJETA_DENTRO
	BTFSC INCORRECTA,3
	CALL ACTIVA_ALARMA
	GOTO INICIO

AUTORIZADO
	CLRF INCORRECTA		;Limpia la variable
	BSF PORTB,7		;Activamos el contacto del coche.
	CALL DELAY_10_MS
	BSF PORTB,6		;Activamos starter del coche.
	CALL TARJETA_DENTRO
	BCF PORTB,6		;Sí, desactivamos el starter.
	BCF PORTB,7		;Desactivamos el contacto.
	GOTO INICIO

TARJETA_DENTRO
	BTFSC PORTA,0		;Se ha sacado la tarjeta? (insert=1)
	GOTO TARJETA_DENTRO	;No, volvemos a escanear insert.
	CALL DELAY_10_MS	;Sí, retornamos.
	BCF PORTB,5
	RETURN			

ACTIVA_ALARMA
	BSF PORTB,4
	CALL DELAY_10_MS
	BCF PORTB,4
	CLRF INCORRECTA		;Limpiamos variable intentos
	RETURN

TOGGLE  MOVLW 20
	INCF PARPADEO,F
	BTFSC PARPADEO,3
	XORWF PORTB,F
	BTFSC PARPADEO,3
	CLRF PARPADEO
	BCF INTCON,2
	RETURN




  	ORG     0x2100
            DATA    0x00
            DATA    0x00
            DATA    0x00
            DATA    0x53
            DATA    0x65
            DATA    0x72
            DATA    0x69
            DATA    0x65
            DATA    0x43
            DATA    0x6F
            DATA    0x6E
            DATA    0x74
            DATA    0x72
            DATA    0x6F
            DATA    0x6C
            DATA    0x20
            DATA    0x61
            DATA    0x63
            DATA    0x63
            DATA    0x65
            DATA    0x73
            DATA    0x6F
            DATA    0x2E
            DATA    0x20
            DATA    0x53
            DATA    0x65
            DATA    0x6C
            DATA    0x6D
            DATA    0x61
            DATA    0x72
            DATA    0x20
            DATA    0x20
            DATA    0x56
            DATA    0x20
            DATA    0x31
            DATA    0x2E
            DATA    0x30
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x0
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
            DATA    0x20
	END
 
alguien podria volver a subir la documentacion de pablin porfavor?? estoy buscando artisimo por internet sobre como es la arquitectura interna de estos chips, y como se pueden leer o escribir y lo unico q encontr es un libro que esta en ingles y no hay para descargarlo por ningun lado, solo para comprar, alguien tiene documentacion que quiera compartir por favor?? el de microchip.com practicamente ya esta listo para el horno, enrealidad lo que yo quiero es la receta, como les dije, la arquitectura interna etc etc, y hay otro proyecto en todopic.com, pero tambien esta listo para hornear, no hay documentacion basica

por cierto este es el libro [ame]http://www.amazon.com/Smart-Card-Applications-Design-programming/dp/047005882X/ref=sr_1_32?ie=UTF8&qid=1385262488&sr=8-32&keywords=smart+card[/ame]
 
Atrás
Arriba