El problema es que yo en el tema de las comunicaciones voy en bicicleta y para "coger" al programita del esclavo modbus hay que ir como mínimo en ferrari.
Os expongo como estoy intentando enviar variables de un PIC a otro. En este programa al activar una entrada en PORTB del PIC emisor, se debe de activar la correspondiente salida del PORTB en el PIC receptor.
PIC EMISOR:#include <16f876.h>
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7)
#use fast_io(B)
#byte port_b = 6
#byte port_c = 7
main()
{
static short E1,E2,E3,E4,E5,E6,S1,S2,S3,S4,S5,S6,S7;
static char c[14];
set_tris_b(0xFF); // E1,E2,E3,E4,E5,E6 entradas
while(1)
{
E1 = input(PIN_B0);
E2 = input(PIN_B1);
E3 = input(PIN_B2);
E4 = input(PIN_B3);
E5 = input(PIN_B4);
E6 = input(PIN_B5);
S1 = E1;
S2 = E2;
S3 = E1 && E2;
S4 = E1||E2;
S5 = E5;
S6 = E6;
S7 = E5&&E6;
// Asignación de variables de E/S al array de caracteres
c[0] = E1 + "0";
c[1] = E2 + "0";
c[2] = E3 + "0";
c[3] = E4 + "0";
c[4] = E5 + "0";
c[5] = E6 + "0";
c[6] = S1 + "0";
c[7] = S2 + "0";
c[8] = S3 + "0";
c[9] = S4 + "0";
c[10] = S5 + "0";
c[11] = S6 + "0";
c[12] = S7 + "0";
puts(c);
delay_ms(1000); //Se mandan datos cada segundo
}
}
PIC RECEPTOR:#include <16f876.h>
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7)
#use fast_io(B)
#byte port_b=6
main()
{
static short E1,E2,E3,E4,E5,E6,S1,S2,S3,S4,S5,S6,S7;
static char c[14];
set_tris_b(0b00000000);
set_tris_c(0b10000000);
output_B(0x00);
while(1)
{
gets(c); // Lo que le llega lo almacena en la variable c
if (c[0]=="0") // Conversión para las entradas físicas
E1 = 0;
else
E1=1;
if (c[1]=="0")
E2 = 0;
else
E2=1;
if (c[2]=="0")
E3 = 0;
else
E3=1;
if (c[3]=="0")
E4 = 0;
else
E4=1;
if (c[4]=="0")
E5 = 0;
else
E5=1;
if (c[5]=="0")
E6 = 0;
else
E6=1;
if (c[6]=="0") // Conversión para las salidas físicas
S1 = 0;
else
S1=1;
if (c[7]=="0")
S2 = 0;
else
S2=1;
if (c[8]=="0")
S3 = 0;
else
S3=1;
if (c[9]=="0")
S4 = 0;
else
S4=1;
if (c[10]=="0")
S5 = 0;
else
S5=1;
if (c[11]=="0")
S6 = 0;
else
S6=1;
if (c[12]=="0")
S7 = 0;
else
S7=1;
output_bit(PIN_B0,E1); // VISUALIZACION DE LAS ENTRADAS DEL PIC EMISOR
output_bit(PIN_B1,E2);
output_bit(PIN_B2,E3);
output_bit(PIN_B3,E4);
output_bit(PIN_B4,E5);
output_bit(PIN_B5,E6);
}
}
No funciona bien, el problema que tiene es que sin activar ninguna entrada en el PIC emisor, se activa la primera salida en el PIC receptor.
Si activo la primera entrada en el PIC emisor se activa la segunda salida (en lugar de la primera) en el PIC receptor.
Si activo la segunda entrada en el PIC emisor se activa la tercera salida (en lugar de la segunda) en el PIC receptor.
Os dejo todos los archivos, junto con la simulación en PROTEUS por si quereis darle un vistazo:
http://miarroba.com/foros/ver.php?foroid=256746&temaid=1450765Un saludo