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
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 :cabezon: y 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
Adjuntos
Última edición por un moderador: