comunicar pic por infrarrojo

#1
Hola compañeros del foro, he vuelto con una gran duda, ahora estoy haciendo un proyecto el cual consiste en que un pic 16f84a envia datos por medio de infrarrojos hacia otro pic 16f84a, mi problema es el siguiente, el que envia los datos los envia bien y el hardware lo recive bien los pulsos pero el ic no reacciona y le llegan los pulsos a la pata RB0 pero no hace nada.

Espero me puedan ayudar aqui les pongo el codigo del receptor

PHP:
#include <16F84A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#use delay(clock=4000000)
 
int8 word[6];
int8 state=0;
int8 i=0;          
int8 b=0;
int8 b2=0;

#INT_EXT
 
void ext_isr(void)
 
{
output_high(PIN_B3);
disable_interrupts(global);
disable_interrupts(INT_EXT);


do{
     if(i>0)
      {
       delay_ms(25);
      }
     word[i]=input(pin_B0);
     if(i==0)
      {
       delay_ms(50);
      }
      else
      {
      delay_ms(25);
      }
     ++i;      
   }while(i<=4);

enable_interrupts(INT_EXT); //habilita interrupcion externa
enable_interrupts(GLOBAL);
output_low(PIN_B3);
return;
}


void main(void)
{
  
disable_interrupts(global);
disable_interrupts(INT_EXT);
i=0;
state=0;
set_tris_a(0b00000); // PA salida
set_tris_b(0b11110001); // PB0,PB4,PB5,PB6,PB7 entrada, los demas salidas
word[0]=0;
word[1]=0;
word[2]=0;
word[3]=0;
word[4]=0;

output_A(0);
  
//setup_timer_0(RTCC_INTERNAL | RTCC_DIV_1);
 
ext_int_edge(L_TO_H); //configura interrupcion externa por
                       //flanco de bajada
  
enable_interrupts(INT_EXT); //habilita interrupcion externa
enable_interrupts(GLOBAL);
  
do
{
if((word[1]==1) && (word[2]==1) && (word[3]==1) && (word[4]==1))
  {//0
    if(b==0)
     {
      output_high(PIN_A0);//enciende luces de adentro
      b=1;
      state=0;
     }
    else
     {
      output_low(PIN_A0);apaga luces de adentro
      b=0;
      state=0;
     }
  }

if((word[1]==1) && (word[2]==0) && (word[3]==0) && (word[4]==1))
      {//1
      while(input(PIN_B4)==0)
      {
      output_high(PIN_A1);//linea 1 del motor
      output_low(PIN_A2);//linea 2 del motor     estos son para subir persianas
      output_high(PIN_A4);//linea de alimentacio del motor
      state=0;
      }
      }    

if((word[1]==0) && (word[2]==1) && (word[3]==1) && (word[4]==0))
      {//2
      while(input(PIN_B5)==0)
      {
        output_low(PIN_A1);//linea 1 del motor
        output_high(PIN_A2);//linea 2 del motor    estos son para bajar persianas
        output_high(PIN_A4);//linea de alimentacio del motor
        state=0;
      }
      }
   
if((word[1]==1) && (word[2]==1) && (word[3]==0) && (word[4]==0))
    {//3
      if(b2==0)
     {
      output_high(PIN_A3);//enciendo luces de afuera
      b2=1;
      state=0;
     }
    else
     {
      output_high(PIN_A3);apago luces de afuera
      b2=0;
      state=0;
     }
        
    }
      
if((word[1]==0) && (word[2]==0) && (word[3]==1) && (word[4]==1))
      {//4
        output_high(PIN_B1);//linea 1 del enllavador
        output_low(PIN_B2);//linea 2 del enllavador
       delay_ms(200);
        output_low(PIN_B1);//linea 1 del enllavador
        output_low(PIN_B2);//linea 2 del enllavador
        state=0;
      }
      
if((word[1]==1) && (word[2]==1) && (word[3]==1) && (word[4]==0))
      {//5
        output_high(PIN_B2);//linea 1 del enllavador
        output_low(PIN_B1);//linea 2 del enllavador
        delay_ms(200);
        output_low(PIN_B2);//linea 2 del enllavador
        output_low(PIN_B1);//linea 1 del enllavador
        state=0;
      }   
      
if((word[1]==0) && (word[2]==0) && (word[3]==0) && (word[4]==1))
      {//6
        output_high(PIN_B6); // linea de  salida extra
        state=0;
      }
output_low(PIN_B3);     


word[0]=0;
word[1]=0;
word[2]=0;
word[3]=0;
word[4]=0;
state=0;
i=0;
if(i==0)
{
output_high(pin_b3);// luz de testigo 
}
else
{
output_low(pin_b3);
}

}while(i>0);
}


aqui les pongo el codigo del pic que envia los datos y la simulacion en proteus del emisor
RA0 es la linea del infrarrojo
RA1 es la linea del led de testigo que se esta enviando datos

#include <16F84A.h>
#fuses XT,NOWDT,NOPROTECT,NOPUT// Opciones de configuración
#use delay(clock=4000000)              // Velocidad del Cristal : 4 Mhz

int8 rebote=0;

void main()
{
set_tris_B(0b11111111);
 
   while(true) 
   {
    if(input(PIN_B0)==1)  //Si el pin RB0, está a 1.
    {
    
    if(rebote==0)
    {
    delay_ms(20);
      rebote=1;
    if(input(PIN_B0)==1)
     { 
    OUTPUT_bit(PIN_A1,1);
    OUTPUT_bit(PIN_A0,1);
    delay_ms(50);
    OUTPUT_bit(PIN_A0,1);
    delay_ms(50);
    OUTPUT_bit(PIN_A0,1);
    delay_ms(50);
    OUTPUT_bit(PIN_A0,1);
    delay_ms(50);
    OUTPUT_bit(PIN_A0,1);
    delay_ms(50);
    OUTPUT_LOW(PIN_A1);
    OUTPUT_LOW(PIN_A0);    
   
     }
    }
    }
    
    if(input(PIN_B1)==1)  //Si el pin RB0, está a 1.
    {
    if(rebote==0)
    {
    delay_ms(20);
    rebote=1;    
    if(input(PIN_B1)==1)
     { 
    OUTPUT_HIGH(PIN_A1);
    OUTPUT_high(PIN_A0);
    delay_ms(50);
    OUTPUT_high(PIN_A0);
    delay_ms(50);
    OUTPUT_low(PIN_A0);
    delay_ms(50);
    output_low(PIN_A0);
    delay_ms(50);
    output_high(PIN_A0);
    delay_ms(50);
    OUTPUT_LOW(PIN_A1);
    OUTPUT_LOW(PIN_A0);    
     }
    }
    }
    
    if(input(PIN_B2)==1)  //Si el pin RB0, está a 1.
    {
    
    if(rebote==0)
    {
    delay_ms(20);
    rebote=1;
    if(input(PIN_B2)==1)
     { 
    OUTPUT_HIGH(PIN_A1);
    output_bit(PIN_A0,1);
    delay_ms(50);
    output_bit(PIN_A0,0);
    delay_ms(50);
    output_bit(PIN_A0,1);
    delay_ms(50);
    output_bit(PIN_A0,1);
    delay_ms(50);
    output_bit(PIN_A0,0);
    delay_ms(50);
    OUTPUT_LOW(PIN_A1);
    OUTPUT_LOW(PIN_A0);    
    }
    }
    } 
    if(input(PIN_B3)==1)  //Si el pin RB0, está a 1.
    {
    if(rebote==0)
    {
    delay_ms(32);
    rebote=1;
    OUTPUT_HIGH(PIN_A1);
    output_bit(PIN_A0,1);
    delay_ms(50);
    output_bit(PIN_A0,1);
    delay_ms(50);
    output_bit(PIN_A0,1);
    delay_ms(50);
    output_bit(PIN_A0,0);
    delay_ms(50);
    output_bit(PIN_A0,0);
    delay_ms(50);
    OUTPUT_LOW(PIN_A1);
    OUTPUT_LOW(PIN_A0);    
    }
    }
    
    if(input(PIN_B4)==1)  //Si el pin RB0, está a 1.
    {
    if(rebote==0)
    {
    delay_ms(32);
    rebote=1;
    OUTPUT_HIGH(PIN_A1);
    output_bit(PIN_A0,1);
    delay_ms(50);
    output_bit(PIN_A0,0);
    delay_ms(50);
    output_bit(PIN_A0,0);
    delay_ms(50);
    output_bit(PIN_A0,1);
    delay_ms(50);
    output_bit(PIN_A0,1);
    delay_ms(50);
    OUTPUT_LOW(PIN_A1);
    OUTPUT_LOW(PIN_A0);
    }
    }
    if(input(PIN_B5)==1)  //Si el pin RB0, está a 1.
    {
    if(rebote==0)
    {
    delay_ms(32);
    rebote=1;
    OUTPUT_HIGH(PIN_A1);
    output_bit(PIN_A0,1);
    delay_ms(50);
    output_bit(PIN_A0,1);
    delay_ms(50);
    output_bit(PIN_A0,1);
    delay_ms(50);
    output_bit(PIN_A0,1);
    delay_ms(50);
    output_bit(PIN_A0,0);
    delay_ms(50);
    OUTPUT_LOW(PIN_A1);
    OUTPUT_LOW(PIN_A0);
    }
    }
    if(input(PIN_B6)==1)  //Si el pin RB0, está a 1.
    {
    if(rebote==0)
    {
    delay_ms(32);
    rebote=1;
    OUTPUT_HIGH(PIN_A1);
    output_bit(PIN_A0,1);
    delay_ms(50);
    output_bit(PIN_A0,0);
    delay_ms(50);
    output_bit(PIN_A0,0);
    delay_ms(50);
    output_bit(PIN_A0,0);
    delay_ms(50);
    output_bit(PIN_A0,1);
    delay_ms(50);
    OUTPUT_LOW(PIN_A1);
    }
    }
    if(rebote==1)
    {
      output_bit(PIN_A0,0);
      delay_ms(500);
      rebote=0;
    }
     else // si no !!
      output_bit(PIN_A0,0);
         
   }

}
y no pude simular ambos pic en proteus no se xq pero no lo permite y no pude hacer la simulacion del receptor por que necesito que algo me envie esa secuendia de datos y que mejor que el otro pic para hacer eso :D , espero me puedan ayudar me he estado matando :cabezon: y nada
 

Adjuntos

Última edición por un moderador:
#2
Y tu transmisor y receptor de infrarojos trabajan a la misma frecuencia, segun se si usas de esos receptores de 3 patas solo reaccionan bien cuando reciben a la misma frecuencia 37Khz es muy clasico lo mas seguro es que tenga que ver con los tiempos dejame darle una leida a tu codigo va
 

Temas similares

Arriba