Buenos dias estimados amigos del foro!!!
Me dirijo a ustedes porque necesito crear una red de pic basada en RS487, en la que necesito para empezar que un pic 18f4550 pueda tener disponible el estado de las entradas y controlar las salidas de un 16f877a, para ello es necesario que ambos se comuniquen en forma bidireccional. Para empezar estoy utilizando dos codigos el del 18f4550 se llama maestroA y del 16f877A se llama esclavoA1. Basicamente lo que deberian hacer estos sencillos codigo fuentes pero que no hacen, es que desde el 18f4550 se envie el caracter 'S' hacia el 16f877A luego este verifique que es el dato y de una salida por el puerto D (esto si logro conseguirlo), luego despues que el 16f877A realizo esto procede a enviar un caracter 'R' al 18f4550 que igualmente lo comparara y arrojara una salida por el puerto D (este es el inconveniente que no me llega el caracter 'R' al 18f4550).
Aqui adjunto ambos codigos fuentes para que evaluen y me ayuden a detectar en que estoy equivocado y porque no logro hacer la comunicación de esta manera, o si existe otra manera agradeceria me la facilitaran.
Codigo del maestroA
#include <18F4550.h>
#fuses HS,NOPROTECT,NOLVP,NOWDT
#use delay(clock=20000000)
#use rs232(baud=9600,bits=8,UART1)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#define bytes_for_USART_buffer 12
int entb,disp=0;
const char Tipo='R';
static char USART_buffer[bytes_for_USART_buffer];
static int8 USART_nextRec;
void enviar(){
output_bit(pin_c0,1);
delay_ms(5);
printf("S");
delay_ms(5);
output_bit(pin_c0,0);
delay_ms(1);
}
void USART_add_to_buffer(char c){
if(c==Tipo)
output_d(0b01010101);
}
#INT_RDA
void serial_isr(){
char USART_nextChar;
USART_nextChar='\0';
if(kbhit()){
USART_nextChar=getc();
USART_add_to_buffer(USART_nextChar);
}
}
void main(){
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
set_tris_b(0xff);
set_tris_d(0x00);
set_tris_c(0b10000000);
output_bit(pin_c0,0);
output_d(0x00);
do{
entb=input_b();
if(disp==0){
enviar();
disp=1;
}
}while(true);
}
Codigo del esclavoA1
#include <16F877.h>
#fuses HS,NOPROTECT,NOLVP,NOWDT
#use delay(clock=20000000)
#use rs232(baud=9600,bits=8,UART1)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#define bytes_for_USART_buffer 12
const char Tipo='S';
static char USART_buffer[bytes_for_USART_buffer];
static int8 USART_nextRec;
void enviar(){
output_bit(pin_c0,1);
delay_ms(5);
printf("R");
delay_ms(5);
output_bit(pin_c0,0);
delay_ms(1);
}
void USART_add_to_buffer(char c){
if(c==Tipo)
output_d(0b01010101);
enviar();
}
#INT_RDA
void serial_isr(){
char USART_nextChar;
USART_nextChar='\0';
if(kbhit()){
USART_nextChar=getc();
USART_add_to_buffer(USART_nextChar);
}
}
void main(){
set_tris_b(0xff);
set_tris_d(0x00);
set_tris_c(0b10000000);
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
output_bit(pin_c0,0);
output_d(0x00);
do{
entb=input_b();
}while(true);
}
Y a continuación les adjunto los codigos fuentes asi como la simulacion en proteus!!!
Les agradesco de antemano su respuesta!!! Que tengan un feliz dia!!!