Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

28/09/2010 #1

Avatar de master666

comunicar pic por infrarrojo
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

Código 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 , espero me puedan ayudar me he estado matando y nada
28/09/2010 #2

Avatar de Ajna

Respuesta: comunicar pic por infrarrojo
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
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.