Autor Tema: Problemas interrupciones RDA y EXT  (Leído 1569 veces)

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

Desconectado Arvydas

  • PIC10
  • *
  • Mensajes: 8
Problemas interrupciones RDA y EXT
« en: 21 de Mayo de 2008, 09:11:47 »
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
Código: [Seleccionar]
#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
Código: [Seleccionar]
#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)


 

anything