Autor Tema: Leer tarjetas magneticas con pic basic  (Leído 3872 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Eduagra

  • PIC16
  • ***
  • Mensajes: 116
Leer tarjetas magneticas con pic basic
« en: 11 de Marzo de 2006, 17:58:00 »
Hola compañeros:

Estoy haciendo un invento para abrir una puerta usando tarjetas de banda magnética (las que me voy llevando de los hoteles ;-) )

Desgraciadamente soy muy limitado en mis conocimientos, pero soy bastante constante (lease cabezón) y aunque me cueste mi matrimonio me he propuesto conseguirlo.

Tengo un lector de tarjetas que pille de un surtidor de gasolina en una chatarrería, he hecho un pequeño programa en PBP y  he conectado el lector al pic y este al ordenador para poder leer el contenido de la tarjeta.

Mi problema es que cada vez que paso la tarjeta me aparecen unas cifras totalmente diferentes. No se si es por que el lector esta defectuoso, o por que yo he metido la pata en algo (esto último será lo más seguro).

Me gustaría saber si alguien ha hecho algo en PBP y le funciona, si me pudiera pasar el código en PBP se lo agradecería en el alma.


Os pongo aqui el código que he realizado yo dentro de mis escasos conocimientos por si alguien quiere echarle un vistazo.

Un saludo
Eduardo


" ------------------------------------------------------
" Para Pic 16F628
"---------------------------------------------------------
    define osc 4
    cmcon = 7
    low porta.1
" -------------------------------------------------
"   Definición de variables
" -------------------------------------------------
    i        var     byte
    contador var     byte
    variable var     byte
    a        var     bit
    b        var     bit
    c        var     bit
    d        var     bit
    e        var     bit
   
" -------------------------------------------------
"   Definición de pines
" -------------------------------------------------
    fondo     var     portb.0     " Sensor fondo, tarjeta insertada totalmente
    datos     var     portb.1     " Datos pista 2
    tarjeta   var     portb.2     " tarjeta presente
    reloj     var     portb.3     " señal strobe (sincronizacion)
    tx        var     porta.4     " Pin de salida RS232
" -------------------------------------------------
" Inicio del PROGRAMA
" ------------------------------------------------
" La pista 2 de las tarjetas magnéticas esta estructurada en bloques de 5 bits,
" (caracter + checsum)
    pause 1000
    serout2 tx, 3313, ["Preparado ",10,13]
salto01:
contador=0
input tarjeta           " Espera a que el detector
if tarjeta=1 then       " de presencia de tarjeta
    goto salto01        " pase a 0
endif                   " Si esta a 1 es que no hay tarjeta
" ---------------- Bucle de lectura del primer bit ---------------------
salto02:
input reloj             " Espera a que la
if reloj =1 then        " señal de reloj pase
    goto salto02        " de 1 a 0
endif                   "
input datos
if datos=0 then
    a=1
else
    a=0
endif
salto03:
input reloj
if reloj=0 then
    goto salto03
endif
" --------------- Fin bucle de lectura del primer bit ---------------------
" ---------------- Bucle de lectura del segundo bit ---------------------
salto02a:
input reloj             " Espera a que la
if reloj =1 then        " señal de reloj pase
    goto salto02a       " de 1 a 0
endif                   "
input datos
if datos=0 then
    b=1
else
    b=0
endif
salto03a:
input reloj
if reloj=0 then
    goto salto03a
endif
" --------------- Fin bucle de lectura del segundo bit ---------------------
" ---------------- Bucle de lectura del tercer bit ---------------------
salto02b:
input reloj             " Espera a que la
if reloj =1 then        " señal de reloj pase
    goto salto02b       " de 1 a 0
endif                   "
input datos
if datos=0 then
    c=1
else
    c=0
endif
salto03b:
input reloj
if reloj=0 then
    goto salto03b
endif
" --------------- Fin bucle de lectura del tercer bit ---------------------
" ---------------- Bucle de lectura del cuarto bit ---------------------
salto02c:
input reloj             " Espera a que la
if reloj =1 then        " señal de reloj pase
    goto salto02c       " de 1 a 0
endif                   "
input datos
if datos=0 then
    d=1
else
    d=0
endif
salto03c:
input reloj
if reloj=0 then
    goto salto03c
endif
" --------------- Fin bucle de lectura del cuarto bit ---------------------
" ---------------- Bucle de lectura del quinto bit ---------------------
salto02d:
input reloj             " Espera a que la
if reloj =1 then        " señal de reloj pase
    goto salto02d       " de 1 a 0
endif                   "
input datos
if datos=0 then
    e=1
else
    e=0
endif
salto03d:
input reloj
if reloj=0 then
    goto salto03d
endif
" --------------- Fin bucle de lectura del quinto bit ---------------------
gosub conversion
write contador, variable
input tarjeta
if tarjeta=0 then
    contador = contador + 1
    goto salto02
else
    for i=1 to contador
        read i,variable
        pause 10
        serout2 tx, 3313, [variable]
    next i
    serout2 tx, 3313, ["   Contador=",#contador,10,13]
    goto salto01
endif

" -------- Rutina de conversión del valos leido a ASCII
conversion:
if a=1 and b=0 and c=0 and d=0 and e=0 then
    variable="0"
endif
if a=0 and b=0 and c=0 and d=0 and e=1 then
    variable="1"
endif
if a=0 and b=0 and c=0 and d=1 and e=0 then
    variable="2"
endif
if a=1 and b=0 and c=0 and d=1 and e=1 then
    variable="3"
endif
if a=0 and b=0 and c=1 and d=0 and e=0 then
    variable="4"
endif
if a=1 and b=0 and c=1 and d=0 and e=1 then
    variable="5"
endif
if a=1 and b=0 and c=1 and d=1 and e=0 then
    variable="6"
endif
if a=0 and b=0 and c=1 and d=1 and e=1 then
    variable="7"
endif
if a=0 and b=1 and c=0 and d=0 and e=0 then
    variable="8"
endif
if a=1 and b=1 and c=0 and d=0 and e=1 then
    variable="9"
endif
if a=1 and b=1 and c=0 and d=1 and e=0 then
    variable=":"
endif
if a=0 and b=1 and c=0 and d=1 and e=1 then
    variable=";"
endif
if a=1 and b=1 and c=1 and d=0 and e=0 then
    variable="<"
endif
if a=0 and b=1 and c=1 and d=0 and e=1 then
    variable="="
endif
if a=0 and b=1 and c=1 and d=1 and e=0 then
    variable=">"
endif
if a=1 and b=1 and c=1 and d=1 and e=1 then
    variable="?"
endif
return


Desconectado Eduagra

  • PIC16
  • ***
  • Mensajes: 116
RE: Leer tarjetas magneticas con pic basic
« Respuesta #1 en: 20 de Marzo de 2006, 12:29:00 »
Bueno, como veo que nadie ha hecho nada sobre el tema de tarjetas, voy a intentar pedir ayuda de otro modo.

El problema tengo claro ya que es por que el tráfico de datos entre el lector de tarjetas y el pic es muy rápido y con pic basic pierdo bastantes caractéres.
Desgraciadamente no tengo ni idea de assembler y creo que ahi estaría la solución, haciendo el programa en assembler creo que no se perderían datos.

Voy a describir el funcionamiento del lector de tarjetas, por si alguien se anima a echarme una mano.

Disponemos de 3 señales que vienen del lector de tarjetas;

-CARD PRESENT. Esta señal pasa a 0 cuando hay presencia de tarjeta en el lector.
-STROBE. Esta es una señal de reloj generada por el deslizamiento de la propia tarjeta.
-DATA, aqui tenemos los datos grabados en la tarjeta.

Lo que yo necesito es lo siguiente:
Con la señal STROBE conectada a RB0, cada vez que esta señal pase de 1 a 0 debe de generar una interrupción.
La interrupción debe de leer el valor de la señal DATA, teniendo en cuenta que si es 0V se trata de un 1 lógico y si hay 5V se trata de un 0 lógico.

Todoe sto debe de producirse mientras la señal CARD PRESENT este a 0.

Una vez que la señal CARD PRESENT pasa a 1, el pic debe de mandar los datos leidos en serie hacia un PC con hyperterminal.

HAy que tener en cuenta que cada 5 bits leidos de la tarjeta es un carácter, según la siguinte tabla:

10000 ----- 0            00100 ----- 4          01000 ---- 8       11100 ------ C
00001 ----- 1            10101 ----- 5          11001 ---- 9       01101 ------ D
00010 ----- 2            10110 ----- 6          11010 ---- A       01110 ------ E
10011 ----- 3            00111 ----- 7          01011 ---- B       11111 ------ F

Mi ruego es si alguien me puede ayudar a generar la parte de código para leer la tarjeta y luego yo implementarlo en mi programilla en Pic Basic.

Gracias a todos



Desconectado mirazulado

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 142
RE: Leer tarjetas magneticas con pic basic
« Respuesta #2 en: 21 de Marzo de 2006, 07:19:00 »
Bueno, buscando en los archivos encontre uno de los primeros programas en C para PIC que realice, te cuento que es absolutamente ineficiente, pero funciona !!

while (1){
...if(!input(clo)&(!input(data))){..............//chequeo presencia de Clock
...fin=0;..................................................// ojo que no chequeo CardPresente !
...while(!fin){.........................................// con esto me ahorro un pin pierdo TIMER1
......if(!input(clo)){.................................//Loop cuando detecta clock
......TMR1=0;
......set_timer1(0);
......enable_interrupts(INT_TIMER1);....//como no uso el CP tengo que usar el T1
......if(!input(data)){.............................//aca esta el truco. por cada data en 1 voy
......bit_set(tmpad,a);..........................//armando dos variables (previa puesta a 0)
......bit_set(tmpat,c);}.........................//1 de adelante para atras y la otra de
......a++;..............................................//atras para adelante, por que ?
......c--;................................................//por que podes pasar la TJ al reves y los
...while(!input(clo));............................//datos en este tipo de lectores llega al reves
...if(a>6).............................................//cuando los datos leidos son 6bit.. fin lectura
......if(b<max){....................................//si los bytes leidos son todos..
.........auxadela=tmpad;...................//voy armando dos vectores..
.........auxatras[(max-1)-(b++)]=tmpat;.//adelante y atras..
.........tmpad=0;
.........tmpat=0;
.........c=6;
.........a=0;
.........}
......else
......set_timer1(0xffff);
   }
   }
   
Listo !!!!!! en Timer1 chequeo cual de los dos vectores es el correcto esto depende del sentido por el cual se paso la TJ... Como detectas cual es el correcto ? buscas el byte de start... esto depende de la codificacion pero en mi caso era el byte "E"... Despues chequeas paridad le vas pasando los byte a esta funcion:

int paridad(int valor){
int a;
int b=0;
...for(a=0;a<=8;a++)
...if(bit_test(valor,a))
......b++;
...return (b%2);
}

simple, no ?
Como te decia es de los primeros prog. que realice, no conocia las INT EXT que seguramente arian mas agil el tema, ademas se puede optimizar mas y en alguna ocacion pense en si seria posible usar la USAR en modo sincronico... funcionara ? se podra setear la USAR para trabajar en 6 bit que es lo que manda el lector ?

Espero que te sirva y lo puedas traspasar a PBP..

Un abrazo Mariano..

PD:Edite el texto y puse "." para que puedas ver mejor el codigo ya que no se como hacer los TABS !!

Desconectado doppel

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1534
RE: Leer tarjetas magneticas con pic basic
« Respuesta #3 en: 21 de Marzo de 2006, 14:38:00 »
Hola Mirazulado

para colocar el codigo sin que se desordene lo pegás en el editor de respuesta y luego lo seleccionás y elegis la opción  "#" (que es para insertar código)  
y muy bueno lo que estan haciendo con las tarjetas!!

Eduagra!! hace rato que no veia temas tuyos! jeje muy buenos tus proyectos!


saludos
Hernán
" Para ser exitoso no tienes que hacer cosas extraordinarias. Haz cosas ordinarias, extraordinariamente bien "

Desconectado Eduagra

  • PIC16
  • ***
  • Mensajes: 116
RE: Leer tarjetas magneticas con pic basic
« Respuesta #4 en: 23 de Marzo de 2006, 09:57:00 »
Como dijo Jack el destripador.... ¡¡ vamos por partes ¡¡¡

Muy buena la solución de nuestro amigo Mirazulado .... si no fuera por que para mi el C es igual que si fuera ensamblador, o sea, no me entero de nada y no tengo ni idea.
Pretendo solucionarlo en PBP y poco a poco voy consiguiendo algo.

Gracias tambien a doppel, la verdad es que se trata más de un tema de investigación que de algo práctico. La cosa es que tengo un lector de tarjetas y le quiero dar algún tipo de utilidad (apertura de puertas, etc)

He modificado el programa un poco y he conseguido mejorar la lectura, ahora sólo me oscila entre 38 y 45 caracteres cada vez que paso la tarjeta.

Seguiré investigando y si consigo solucionarlo lo expondré aqui.

salu2


 

anything