hola bueno hace un tiempo atras estuve preguntando como hacer la comunicacion de dos pic mediante la comunicacion RS232, el cual entendi, pero ahora estoy teniendo problemas con él y me di cuaenta ya en el circuito impreso, les comento, los 2 pic se envian datos, todo esto funciona bien, los datos que se envian es que el master ve su puerto B y dependiendo como esta este se lo envia al esclavo, en cuanto al esclavo le envia al master un 0 o 1 dependiendo de la entrada C0. bueno todo funciona bien asta que el master tiene su puerto B casi todo en 1 (solo faltandole 2 o más) osea 00111111 por que en este momento se queda pegada la comunicacion y no hace nada el esclavo, por que deveria el esclavo reflejar en el puerto B tambien lo que tiene el master, pero no hace nada cuando le cambio o pongo todo el puerto B del master a cero este ya no pesca (esclavo) y segue manteniendo todo el puerto B en 1. bueno espero que m pueda nechar una manito en mi codigo por favor.
les dejo el codigo del master y del esclavo.
master:
#include <16F873a.h>
#FUSES NOWDT, XT, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay (clock=4000000) //Fosc=4Mhz
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)
#include <stdlib.h>
#use standard_io(C)
int16 x;
void main(void)
{
set_tris_B(0xFF);
while(true){
if(kbhit()){
activado=GETC(); //guarda el valor enviado por el RS-232
}
x=input_B(); //visualisa todo el puerto B y lo guarda en x
putc(0x00 + x); // enviamos por la RS232 lo que tenemos en el puerto B mediante la vatiable x
}
}
esclavo:
#include <16F873a.h>
#device adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay (clock=20000000) //Fosc=20Mhz
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)
#use standard_io(C)
#use standard_io(A)
int16 lectura;
int a;
char i=0;
char flag=0,var=20; //variables globales
#int_RDA //interrupcion para la resepcion del master
void RDA_isr()
{
if(kbhit()){
lectura=GETC(); //guarda el valor enviado por el RS-485
}}
///LLAMADA FUNCION INTERRUPCION
#INT_TIMER0
void interrupcion()
{
if(flag>var){ //¿ya es 1 segundo?
var--; //SI -> decremento var...
if(var<18)
var=20; //...ajuste fino de 1s
flag=0; //reset flag para contar 1s
if(i>2){ //¿se ha mostrado digito 9?
i=0; //SI -> restaura valor indice(para mostrar digito 0)
}
else{ //(*) NO -> incrementa i
i++;}
}
set_timer0(61); //reset TMR0
flag++; //incremento variable flag
}
void main(void)
{
set_tris_B(0x00);
enable_interrupts(INT_TIMER0); //interrupcion TIMER0 activada
setup_counters(RTCC_INTERNAL,RTCC_DIV_256); //configuracion interrupcion TMR0
set_timer0(61); //carga TMR0
enable_interrupts(GLOBAL); //todas las interrupciones activadas
enable_interrupts(INT_RDA); //interrupcion INT_RDA activada. comunicacion RS-485
while(TRUE){
if(input(PIN_C0)){//mando senal al master
if(i==2){putc(a=1);}
output_high(PIN_C1);
output_low(PIN_C2);}
else{ // esta desactivada
if(i==2){putc(a=0);}
output_low(PIN_C1);
output_high(PIN_C2);}
output_b(lectura); //avilito puerto b como resepcion de comunicacion con master
}
}