Hola PICamigos!!!!
Conseguí enviar y recibir tal y como queria con mis dos 16F877. Adjunto los programas tal y cómo los tengo funcionando; sólo una duda: fijaros en el programa del PIC2. Tal y cómo está anda; sin embargo si coloco el envío correspondiente al estado de los pines A0 y A1 dentro del switch, envía pero deja de comunicar correctamente el controlador con el PIC1. Si pongo dicho envío de los dos pines A0 y A1 fuera del switch lo mismo....Tal y cómo está, uno dentro y otro fuera funciona. Raro, raro, raro...
Saludos
#include <16f877.h> //PROGRAM PIC1
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD,NOWRT
#use delay(clock=20000000)
#use RS232 (baud=38400, bits=8, parity=N, xmit=PIN_C6, rcv=PIN_C7,STREAM=P1)
#use RS232 (baud=9600, xmit=PIN_B1, rcv=PIN_B0,STREAM=P2 )
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
#byte PORTA = 0X05
#byte PORTB = 0X06
#byte PORTC = 0X07
#byte PORTD = 0X08
#byte PORTE = 0X09
#bit D0=PORTD.0
#bit D1=PORTD.1
#bit D2=PORTD.2
#bit D6=PORTD.6
#bit D7=PORTD.7
#PRIORITY RDA, EXT
const int SX1=0X2B;//coordenadas max y min: X
const int SX2=0X61;
const int S0Y1=0X26;//coordenadas max y min: Y_TECLA S0
const int S0Y2=0x3C;
const int S1Y1=0X40;//coordenadas max y min: Y_TECLA S1
const int S1Y2=0x59;
const int S2Y1=0X5B;//coordenadas max y min: Y_TECLA S2
const int S2Y2=0x73;
int1 Xok=0;
int lectura=0;
int signal=0;
int valor[4];
int i=0;
int1 flag=0;
#int_RDA // recepción datos del controlador
void RDA_isr()
{
lectura=fgetc(P1);
valor[i]=lectura;
i++;
if(i==4)
{
flag=1;
i=0;
}
}
#int_EXT //recepción datos PIC2
ext_isr()
{
if (kbhit(P2))
{
signal=fgetc(P2);
switch (signal)
{
case 1:
output_high(pin_D6);
break;
case 2:
output_low(pin_D6);
break;
case 3:
output_high(pin_D7);
break;
case 4:
output_low(pin_D7);
break;
}
}
}
void main()
{
delay_ms(50);//incialización controlador
SET_TRIS_A (0xFF);
SET_TRIS_B (0x01);//b0->in, b1->out
SET_TRIS_C (0x80);//c6->out, c7->in
SET_TRIS_D (0X00);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_psp(PSP_DISABLED);
PORTD=0X00;
int dato=0;
enable_interrupts(INT_RDA);//INTERRUPCIÓN USART
enable_interrupts (INT_EXT);//INTERRUPCIÓN EXTERNA (EN RB0)
ext_int_edge (H_TO_L);
enable_interrupts(GLOBAL);
while(true)
{
if(flag==1)
{
delay_ms(50);
flag=0;
if((valor[2]<(SX2))&&(valor[2]>(SX1)))//las X; las 3 teclas en este caso están alineadas verticalmente==>mismas coordenadas X
{
Xok=1;
}
if ((Xok==1)&&(valor[0]<S0Y2)&&(valor[0]>S0Y1))
{
Xok=0;
output_toggle(pin_D0);
dato=1;
fputc(dato,P2);
}
if ((Xok==1)&&(valor[0]<S1Y2)&&(valor[0]>S1Y1))
{
Xok=0;
output_toggle(pin_D1);
dato=2;
fputc(dato,P2);
}
if ((Xok==1)&&(valor[0]<S2Y2)&&(valor[0]>S2Y1))
{
Xok=0;
output_toggle(pin_D2);
dato=3;
fputc(dato,P2);
}
}//flag==1
}//while(1)
}//main()
#include <16f877.h> //PROGRAM PIC2
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD,NOWRT
#use delay(clock=8000000)
#use RS232 (baud=9600, bits=8, parity=N, xmit=PIN_C6, rcv=PIN_C7)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
#byte PORTA = 0X05
#byte PORTB = 0X06
#byte PORTC = 0X07
#byte PORTD = 0X08
#byte PORTE = 0X09
#bit D0=PORTD.0
#bit D1=PORTD.1
#bit D2=PORTD.2
#bit A0=PORTA.0
#bit A1=PORTA.1
int lectura=0X00;
int valor=0;
int1 flag=0;
#int_RDA // recepción datos del PIC1
void RDA_isr()
{
lectura=getc();
valor=lectura;
flag=1;
}
void main()
{
delay_ms(50);//incialización controlador
SET_TRIS_A (0xFF);
SET_TRIS_B (0xff);
SET_TRIS_C (0x80);//c6->out, c7->in
SET_TRIS_D (0X00);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_psp(PSP_DISABLED);
int signal1=0;
PORTD=0X00;
enable_interrupts(INT_RDA);//INTERRUPCIÓN USART
enable_interrupts(GLOBAL);
while(true)
{
if(input(pin_A0)==0)
{
//signal1=1;
//putc(signal1);
valor=4;
flag=1;
}
else
{
//signal1=2;
//putc(signal1);
valor=5;
flag=1;
}
if(input(pin_A1)==0)
{
signal1=3;
putc(signal1);
//valor=6;
//flag=1;
}
else
{
signal1=4;
putc(signal1);
//valor=7;
//flag=1;
}
///////////////////////////////////
if(flag==1)
{
delay_ms(50);
flag=0;
switch(valor)
{
case 1:
output_toggle(pin_D0);
break;
case 2:
output_toggle(pin_D1);
break;
case 3:
output_toggle(pin_D2);
break;
case 4://d6 pic1 on
signal1=1;
putc(signal1);
break;
case 5:// d6 pic1 off
signal1=2;
putc(signal1);
break;
}
/*
case 6://d7 pic1 on
signal1=3;
putc(signal1);
break;
case 7://d7 pic1 off
signal1=4;
putc(signal1);
break;
}*/
}//flag==1
}//while(1)
}//main()