Estoy haciendo un programa que lee tarjetas magnéticas y cuando el PC le pregunta, le envía a este la ID leída, siempre y cuando halla tarjeta. El problema es que el programa funciona para un ciclo completo con tarjeta y también funciona siempre que no hay tarjeta leída(es decir: el PC pregunta, el PIC envía la tarjeta y el PC le dice que todo bien o todo mal y si no hay tarjeta el PIC responde que no y el PC vuelve a preguntar sucesivamente). Pero, para un ciclo con tarjeta, el PIC responde, envía la ID, el PC le dice que bien o que mal y automáticamente el PIC entra en la interrupción EXT que corresponde a leer tarjeta misteriosamente.
Os pego el código, no tengo la más remota idea de cuál es el problema
Tornos PIC.c
#include "TornosPIC.h"
int adress=0b00000001;
byte ID[50],LRC;
boolean hayTarjeta=false;
boolean tipoUsuario=false;
int1 leerBit(){
int1 bit;
while(input(PIN_B0));
bit=!input(PIN_C0);
while(!input(PIN_B0));
return(bit);
}
void buscarStartSentinel(){
byte buffer=0b00000000;
byte ss=0b01011000;
boolean found=false;
do{
shift_right(&buffer,1,leerBit());
//comprobar si buffer contiene ss en los 5 ultimos bits
buffer=buffer&0b11111000;
if(ss==buffer){
found=true;
}
}while(!found);
}
boolean esEndSentinel(byte bloque){
byte es=0b11111000;
bloque=bloque&0b11111000;
if(es==bloque){
return true;
}
else{
return false;
}
}
byte leerBloque (){
byte bloque=0b00000000;
int i;
for(i=0;i<5;i++){
shift_right(&bloque,1,leerBit());
}
return bloque;
}
void enviarID(){
int j;
for(j=0;j<6;j++){
bit_set(ID[j],7);
if(tipoUsuario){
bit_set(ID[j],0);
}
putc(ID[j]);
}
}
boolean esMiAdress(char paquete){
int i,n=0;
boolean es_mi_adress=true;
for(i=2;i<=6;i++){
if(bit_test(paquete,i)!=bit_test(adress,n)){
es_mi_adress=false;
}
n++;
}
return es_mi_adress;
}
boolean paqueteParaMi(byte paquete){
if(bit_test(paquete,7)==0 && esMiAdress(paquete)){
return true;
}
else
return false;
}
boolean paquetePedirID(byte paquete){
if (bit_test(paquete,1)==0 && bit_test(paquete,0)==1)
return 1;
return 0;
}
byte generarRespuesta(boolean hayTarjeta,boolean tipoUsuario){
byte respuesta;
if(hayTarjeta){
respuesta=0b11000000;
}
else{
respuesta=0b10000000;
}
return respuesta;
}
void pase(byte val){
if(bit_test(val,1)){
port_c=0b11111101;
delay_ms(500);
}
else{
port_c=0b11111011;
}
}
#int_EXT
void EXT_isr()
{
int i=0;
boolean fin=false;
disable_interrupts(int_RDA);
port_b=0b11111101;
buscarStartSentinel();
//Leer PAN + ES
do{
ID[i]=leerBloque();
if(esEndSentinel(ID[i])){
fin=true;
}
i++;
}while(!fin);
//Leer LRC
LRC=leerBloque();
//Fin
hayTarjeta=true;
//Forma aleatoria de saber si es habitual o esporadico
tipoUsuario=bit_test(ID[5],5);
bit_clear(intcon,1);
port_b=0b11111001;
enable_interrupts(int_RDA);
}
#int_RDA
void RDA_isr()
{
byte pregunta,validacion,permiso;
disable_interrupts(int_EXT);
port_b=0b11111011;
pregunta=getc();
if(paqueteParaMi(pregunta)){
putc(generarRespuesta(hayTarjeta,tipoUsuario));
if(hayTarjeta){
permiso=getc();
if(paqueteParaMi(permiso) && paquetePedirId(permiso)){
enviarID();
hayTarjeta=false;
tipoUsuario=false;
validacion=getc();
if(paqueteParaMi(validacion)){
pase(validacion);
}
}
}
}
port_b=0b11111001;
enable_interrupts(int_EXT);
}
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
enable_interrupts(INT_EXT);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
// TODO: USER CODE!!
set_tris_a(0b00000000);
set_tris_b(0b00000001);
set_tris_c(0b10000001);
port_c=0b11111011;
while(true){
port_c=0b11111011;
if(hayTarjeta){
bit_clear(intcon,1);
disable_interrupts(int_EXT);
}
else{
bit_clear(intcon,1);
enable_interrupts(int_EXT);
}
}
}
TornosPIC.h
#include <16F873.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#byte port_b=6
#byte port_c=7
#byte intcon=0x0B
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)