Autor Tema: duda interrupciones de pic 18f4450 implementado sobre wiegand 26  (Leído 1899 veces)

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

Desconectado FADO

  • PIC10
  • *
  • Mensajes: 4
Hola a todos!
Bien, estoy haciendo un programa sobre wiegand 26 el cual lo he estado haciendo con todo lo que encuentro en el foro pero tengo unas dudas ya que no llevo mucho programando

--Tengo un lector de proximidad y una tarjeta de wiegand y me funcionan perfecto y tengo el codigo en bits de la tarjeta, cree un programa que me leyera la tarjeta por medio de interrupciones externas en el pic 18f4550 y las enviara por rs232, entonces lo que hice fue tomar cada interrupción de la tarjeta y enviarlo de una vez por rs 232 y el codigo llega bien

--El problema es que cada vez que alimento por primera vez el pic me toma estas flancos y me envia dos bits mas y aveces por esto dos bits el codigo de la tarjeta cambia ya que llegan 28 bits

Código: [Seleccionar]
#Include <18F4550.h>
#Fuses HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN
#Use delay (clock=20000000)
#Use Rs232(Baud=9600,Xmit=PIN_c6,Rcv=PIN_c7)
#Include <string.h>

//resgistros especiales del PIC
#byte   porta = 0xf80
#byte   portb = 0xf81
#byte   portc = 0xf82
#byte   portd = 0xf83
#byte   porte = 0xf84

const int a=26;
int i=0;
int b;
int d=0;
int c;
int e=0;

#int_ext
void handler_ext_int(){
b='0';  
putc(b);
d++;
if(d==a){
   e=1;
   }
}


#int_ext1
void handler_ext1_int(){
c='1';
putc(c);
d++;
   if(d==a){
   e=1;
   }
}

void main(){

disable_interrupts(global);   //Deshabilito las interrupciones globales
set_tris_b(0x0f);             //configuracion del puerto B

ext_int_edge(0,L_TO_H);       //Asingo flancos de subida
ext_int_edge(1,L_TO_H);       //Asingo flancos de subida

delay_ms(100);
enable_interrupts(int_ext1);  
enable_interrupts(int_ext);
enable_interrupts(global);    //Habilito interrupciones

do{
   if(e==1){      
   b=0,c=0,d=0,e=0,i=0;
   delay_ms(100);
   enable_interrupts(global);
   }
}

while(true);
}


--Algunas veces coloco el retardo antes de habilitar las interrupciones para ver si no me toma esos dos flancos de subida iniciales y funciona pero después de tiempo no envía los bits

--si alguien tiene una idea para que no me tome esas dos interrupciones iniciales y únicamente me tome los 26 bits o si estoy cometiendo un error en la programación?


Gracias!