Buenas, resulta que me he estado cabeceando para poder leer tarjetas y tag RFID con un lector RFID que tiene salida Wiegand26, (esto lo tengo conectado a un PIC18F1320), coo no he encontrado mucha info sobre la conexion del hardware ( o sea como conectar el lector al PIC) medi los pines de datos, y como mientras no hay lectura ambas lineas de datos (D0 y D1) estan en estado logico alto, y efectivamente estaban en 5 v, por lo que los conecte directo al PIC (data0 a la INT0 que en este pic es el pin RB0, y la data1 a la INT2 que en este pic esta en el pin RB2), hice una rutina pequeña, solo quiero leer la tarjeta (y para poder mostrar sin LCD ni nada, separo en 3 bytes el codigo que (supuestamente estoy leyendo) que es un longword (si no me equiboco), pero solo me lee ceros, y me muestra ceros (esto lo se por que despues de leer y separar el codigo lo escribi a la eeprom del pic y despues lo lei del PC)...mucho blba bla no?? bueno este es el codigo que estaba haciendo. cualquier ayuda sera bienvenida. (esta escrito en mikrobasic)
program Comunicacion_vRFID_wiegand26
dim tarjeta_leida, FC, D1, D2, B, i as byte
'dim codigo as longint
'##########################################################
'### ################
'### Procedimiento que me devuelve FC, D1 y D2 ################
'### a partir de la variable codigo ################
'### ################
'##########################################################
sub procedure arreglo_codigo (dim codigo as longword)
dim n, i, primer_dato, B as byte
'for i = 0 to 7 '<--
' if codigo.i = 1 then ' \
' FC.i = codigo.i ' \ FC <- este fue el primer intento de lectura
' end if ' \
'next i '<--
FC = Lo(codigo) ' <----este fue el segundo
'for i = 8 to 15 '<--
' if codigo.i = 1 then ' \
' n = i-8 ' \ D1
' D1.n = codigo.i ' \
' end if ' \
'next i '<--
D1 = hi(codigo)
'for i = 16 to 23 '<--
' if codigo.i = 1 then ' \
' n = i-16 ' \ D2
' D2.n = codigo.i ' \
' end if ' \
'next i '<--
D2 = higher(codigo)
tarjeta_leida = 1
primer_dato = 0
B = 0
codigo = $0000
end sub
'###############################################################################
sub procedure Interrupt
dim primer_dato, B, FC, D1, D2, tarjeta_leida as byte
dim codigo as longword
clearbit(INTCON, 7) 'deshabilito interrupciones globales
clearbit(INTCON, 4) 'deshabilito interrupciones int0
clearbit(intcon3, 4) 'deshabilito interrupciones int2
if TestBit(INTCON, INT0IF) = 1 then ' si es data 0 INT0 (RB0)
if primer_dato = 0 then
primer_dato = 1
B = $00
goto Fin_Interrupcion
else
codigo.B = 0
INC(B)
if B = 23 then
arreglo_codigo(codigo)
goto Fin_Interrupcion
else
goto Fin_Interrupcion
end if
end if
else
if TestBit(INTCON3, INT2IF) = 1 then ' si es data 1 INT2 (RB2)
if primer_dato = 0 then
primer_dato = 1
B = $00
goto Fin_Interrupcion
else
codigo.B = 1
INC(B)
if B = 23 then
arreglo_codigo(codigo)
goto Fin_Interrupcion
else
goto Fin_Interrupcion
end if
end if
end if
end if
Fin_Interrupcion:
setbit(INTCON,7) ' Habilita interrupciones Globales
setbit(INTCON,4) ' Habilita interrupcion INT0IE (RB0)
setbit(INTCON3,4) ' Habilita interrupcion INT2IE (RB2)
ClearBit(INTCON2, 6) ' Interrupcion por canto de bajada INT0/RB0.
ClearBit(INTCON2, 4) ' Interrupcion por canto de bajada INT2/RB2.
clearbit(INTCON,INT0IF)' Borro flag INT0IF
clearbit(INTCON3,INT2IF) ' Borro flag INT2IF
end sub
main:
setbit(INTCON,7) ' Habilita interrupciones Globales
setbit(INTCON,INT0IE) ' Habilita interrupcion INT0IE (RB0)
setbit(INTCON3,INT2IE) ' Habilita interrupcion INT2IE (RB2)
ClearBit(INTCON2, 6) ' Interrupcion por canto de bajada INT0/RB0.
ClearBit(INTCON2, 4) ' Interrupcion por canto de bajada INT2/RB2.
OSCCON = $7E
ADCON1 = $7F
setbit(TRISB, 0) ' RB0 entrada
setbit(TRISB, 2) ' RB2 entrada
TRISA = $00
LATA = $00
LATB = $00
tarjeta_leida = 0
Inicio:
While true
if tarjeta_leida = 1 then
tarjeta_leida = 0
eeprom_write($00, FC)
eeprom_write($01, D1)
eeprom_write($02, D2)
PORTA = FC
delay_ms(2000)
PORTA = $00
delay_ms(1000)
PORTA = D1
delay_ms(2000)
PORTA = $00
delay_ms(1000)
PORTA = D2
delay_ms(2000)
PORTA = $00
delay_ms(1000)
end if
sleep
wend
end.
Desde ya muchas gracias
program Comunicacion_vRFID_wiegand26
dim tarjeta_leida, FC, D1, D2, B, i as byte
'dim codigo as longint
'##########################################################
'### ################
'### Procedimiento que me devuelve FC, D1 y D2 ################
'### a partir de la variable codigo ################
'### ################
'##########################################################
sub procedure arreglo_codigo (dim codigo as longword)
dim n, i, primer_dato, B as byte
'for i = 0 to 7 '<--
' if codigo.i = 1 then ' \
' FC.i = codigo.i ' \ FC <- este fue el primer intento de lectura
' end if ' \
'next i '<--
FC = Lo(codigo) ' <----este fue el segundo
'for i = 8 to 15 '<--
' if codigo.i = 1 then ' \
' n = i-8 ' \ D1
' D1.n = codigo.i ' \
' end if ' \
'next i '<--
D1 = hi(codigo)
'for i = 16 to 23 '<--
' if codigo.i = 1 then ' \
' n = i-16 ' \ D2
' D2.n = codigo.i ' \
' end if ' \
'next i '<--
D2 = higher(codigo)
tarjeta_leida = 1
primer_dato = 0
B = 0
codigo = $0000
end sub
'###############################################################################
sub procedure Interrupt
dim primer_dato, B, FC, D1, D2, tarjeta_leida as byte
dim codigo as longword
clearbit(INTCON, 7) 'deshabilito interrupciones globales
clearbit(INTCON, 4) 'deshabilito interrupciones int0
clearbit(intcon3, 4) 'deshabilito interrupciones int2
if TestBit(INTCON, INT0IF) = 1 then ' si es data 0 INT0 (RB0)
if primer_dato = 0 then
primer_dato = 1
B = $00
goto Fin_Interrupcion
else
codigo.B = 0
INC(B)
if B = 23 then
arreglo_codigo(codigo)
goto Fin_Interrupcion
else
goto Fin_Interrupcion
end if
end if
else
if TestBit(INTCON3, INT2IF) = 1 then ' si es data 1 INT2 (RB2)
if primer_dato = 0 then
primer_dato = 1
B = $00
goto Fin_Interrupcion
else
codigo.B = 1
INC(B)
if B = 23 then
arreglo_codigo(codigo)
goto Fin_Interrupcion
else
goto Fin_Interrupcion
end if
end if
end if
end if
Fin_Interrupcion:
setbit(INTCON,7) ' Habilita interrupciones Globales
setbit(INTCON,4) ' Habilita interrupcion INT0IE (RB0)
setbit(INTCON3,4) ' Habilita interrupcion INT2IE (RB2)
ClearBit(INTCON2, 6) ' Interrupcion por canto de bajada INT0/RB0.
ClearBit(INTCON2, 4) ' Interrupcion por canto de bajada INT2/RB2.
clearbit(INTCON,INT0IF)' Borro flag INT0IF
clearbit(INTCON3,INT2IF) ' Borro flag INT2IF
end sub
main:
setbit(INTCON,7) ' Habilita interrupciones Globales
setbit(INTCON,INT0IE) ' Habilita interrupcion INT0IE (RB0)
setbit(INTCON3,INT2IE) ' Habilita interrupcion INT2IE (RB2)
ClearBit(INTCON2, 6) ' Interrupcion por canto de bajada INT0/RB0.
ClearBit(INTCON2, 4) ' Interrupcion por canto de bajada INT2/RB2.
OSCCON = $7E
ADCON1 = $7F
setbit(TRISB, 0) ' RB0 entrada
setbit(TRISB, 2) ' RB2 entrada
TRISA = $00
LATA = $00
LATB = $00
tarjeta_leida = 0
Inicio:
While true
if tarjeta_leida = 1 then
tarjeta_leida = 0
eeprom_write($00, FC)
eeprom_write($01, D1)
eeprom_write($02, D2)
PORTA = FC
delay_ms(2000)
PORTA = $00
delay_ms(1000)
PORTA = D1
delay_ms(2000)
PORTA = $00
delay_ms(1000)
PORTA = D2
delay_ms(2000)
PORTA = $00
delay_ms(1000)
end if
sleep
wend
end.
Desde ya muchas gracias