#include <16F876A.h>
#device ADC=16
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#use delay(crystal=20000000)
#define HAY_PUERTO_SERIE
#use rs232(baud=57600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=CR95HF)
#ifdef HAY_PUERTO_SERIE
#use rs232(baud=9600,parity=N,xmit=PIN_B0,rcv=PIN_B1,bits=8,stream=SERIE)
#endif
#define LONG_MAX_BUFFER 16
#define LED_ROJO PIN_B2
#define LED_VERDE PIN_B5
char buffer[LONG_MAX_BUFFER];
unsigned int8 indice=0;
unsigned int8 ModoHex=0;
unsigned int8 HayRespuesta=0;
unsigned int8 Detectada=0;
char UID[7]={0,0,0,0,0,0,0};
char const tarjeta_valida[7]= {0x04, 0x66, 0xC3, 0xDC, 0x36, 0x80, 0x28};
// Cada vez que se recibe un carácter del CR95HF se almacena en el buffer y
// reseteamos el timer
#INT_RDA
void RecibeByteCR95HF() {
buffer
[indice
]=fgetc(CR95HF
); if (indice<LONG_MAX_BUFFER)
indice++;
set_timer1(0);
}
// Si el timer desborda, es que hace "tiempo" que el CR95HF no envía nada, por
// tanto entendemos que la trama ha terminado de llegar y la procesamos
#INT_TIMER1
void BufferCompleto() {
unsigned int8 i=0;
disable_interrupts(INT_TIMER1);
if (indice) {
#ifdef HAY_PUERTO_SERIE
for (i=0;i<indice;i++) {
if ((i<2) || (ModoHex))
else
}
#endif
indice=0;
HayRespuesta=1;
#ifdef HAY_PUERTO_SERIE
#endif
}
set_timer1(0);
enable_interrupts(INT_TIMER1);
}
void main()
{
unsigned int8 i;
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8);
set_timer1(0);
#ifdef HAY_PUERTO_SERIE
fprintf (SERIE
,"\n\rLECTOR NFC\n\r\n\r"); #endif
enable_interrupts(INT_RDA);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
ModoHex=0;
// IDN: identificación del CR95HF
#ifdef HAY_PUERTO_SERIE
#endif
while (!HayRespuesta);
HayRespuesta=0;
// Protocol Select: ISO14443-A
Buffer[1]=1;
ModoHex=1;
#ifdef HAY_PUERTO_SERIE
fprintf (SERIE
,">>02 02 02 00 --- "); #endif
fprintf (CR95HF
,"%c%c%c%c",2,2,2,0); while (!HayRespuesta);
HayRespuesta=0;
if (Buffer[0] || Buffer[1]) {// Si la respuesta es distinto a 0x00 0x00
#ifdef HAY_PUERTO_SERIE
fprintf (SERIE
, "No se ha podido establecer el protocolo ISO14443-A\n\r"); #endif
while (1);
}
// Una vez inicializado, entramos en un bucle de detección y lectura de tags
while (1) {
while (!Detectada) {
// REQA: detección de tarjeta
#ifdef HAY_PUERTO_SERIE
fprintf (SERIE
,">>04 02 26 07 --- "); #endif
fprintf (CR95HF
,"%c%c%c%c",4,2,0x26,7); while (!HayRespuesta);
HayRespuesta=0;
Detectada = !((Buffer[0]==0x87) && (Buffer[1]==0x00));
}
#ifdef HAY_PUERTO_SERIE
fprintf (SERIE
, "Tarjeta detectada\n\r"); #endif
Detectada=0;
// ANTICOL 1
#ifdef HAY_PUERTO_SERIE
fprintf (SERIE
,">>04 03 93 20 08 --- "); #endif
fprintf (CR95HF
,"%c%c%c%c%c",4,3,0x93,0x20,0x08); while (!HayRespuesta);
HayRespuesta=0;
if ((Buffer[0]==0x80) && (Buffer[1]==0x08)) {
#ifdef HAY_PUERTO_SERIE
fprintf (SERIE
,"UID %02X%02X%02X%02X%02X\n\r",Buffer
[2],Buffer
[3],Buffer
[4],Buffer
[5],Buffer
[6]); #endif
UID[0]=Buffer[3];
UID[1]=Buffer[4];
UID[2]=Buffer[5];
} else
break;
// SELECT 1
#ifdef HAY_PUERTO_SERIE
fprintf (SERIE
,">>04 08 93 70 %02X%02X%02X%02X%02X %02X--- ",Buffer
[2],Buffer
[3],Buffer
[4],Buffer
[5],Buffer
[6],Buffer
[7]); #endif
fprintf (CR95HF
,"%c%c%c%c%c%c%c%c%c%c",0x04,0x08,0x93,0x70,Buffer
[2],Buffer
[3],Buffer
[4],Buffer
[5],Buffer
[6],Buffer
[7]); while (!HayRespuesta);
HayRespuesta=0;
// ANTICOL 2
#ifdef HAY_PUERTO_SERIE
fprintf (SERIE
,">>04 03 95 20 08 --- "); #endif
fprintf (CR95HF
,"%c%c%c%c%c",4,3,0x95,0x20,0x08); while (!HayRespuesta);
HayRespuesta=0;
UID[3]=Buffer[3];
UID[4]=Buffer[4];
UID[5]=Buffer[5];
UID[6]=Buffer[6];
#ifdef HAY_PUERTO_SERIE
fprintf (SERIE
,"UID: %02X%02X%02X%02X%02X%02X%02X\n\r",UID
[0],UID
[1],UID
[2],UID
[3],UID
[4],UID
[5],UID
[6]); #endif
// Comparamos el UID leído con el de nuestra tarjeta válida
Detectada=1;
for (i=0;i<7;i++)
if (UID[i]!=tarjeta_valida[i])
Detectada=0;
if (Detectada)
output_high (LED_VERDE);
else
output_high (LED_ROJO);
Detectada=0;
delay_ms(1000);
output_low(LED_VERDE);
output_low(LED_ROJO);
};
}