Saludos.
Buscando en el foro siempre me tope con temas similares, pero no logre obtener información detallada para mi proyecto:
La idea es implementar un sistema de adquisición de datos.
PIC18F452 como maestro y dos PIC16F877A.
No utilizo I2C, SPI. Por cuestiones de diseño debo usar RS 232.
No es una comunicación convencional: Half-Duplex, Asincrono.
El maestro envía el identificador del pic esclavo que desea consultar mediante una cadena de caracteres. Esta cadena es recibida "simultaneamente" por los esclavos.
El pic esclavo que verifique su id. es el que toma la linea y envia sus datos al maestro.
Luego el maestro recibe los datos y pasa a consultar con el sgt pic esclavo, prepara la trama completa y envia al PC. Y luego vuelva a consultar...
Los problemas aparecen cuando trato de comunicar el maestro y los esclavos.
Utilizo un tri-state para tomar la linea y enviar datos al maestro.
La simulacion en proteus 7.8, entre una terminal virtual (q hace de maestro) y los pic esclavos funciona perfectamente, pero al colocar al maestro se arruina.
Subo los codigos fuente y los esquemas.
El codigo para el esclavo 1 es el mismo solo cambia el id_pic.
Esquema adjunto.
Les agradezco de antemano por la ayuda que me puedan dar.
Buscando en el foro siempre me tope con temas similares, pero no logre obtener información detallada para mi proyecto:
La idea es implementar un sistema de adquisición de datos.
PIC18F452 como maestro y dos PIC16F877A.
No utilizo I2C, SPI. Por cuestiones de diseño debo usar RS 232.
No es una comunicación convencional: Half-Duplex, Asincrono.
El maestro envía el identificador del pic esclavo que desea consultar mediante una cadena de caracteres. Esta cadena es recibida "simultaneamente" por los esclavos.
El pic esclavo que verifique su id. es el que toma la linea y envia sus datos al maestro.
Luego el maestro recibe los datos y pasa a consultar con el sgt pic esclavo, prepara la trama completa y envia al PC. Y luego vuelva a consultar...
Los problemas aparecen cuando trato de comunicar el maestro y los esclavos.
Utilizo un tri-state para tomar la linea y enviar datos al maestro.
La simulacion en proteus 7.8, entre una terminal virtual (q hace de maestro) y los pic esclavos funciona perfectamente, pero al colocar al maestro se arruina.
Subo los codigos fuente y los esquemas.
Código:
////////////////////////////////////////////////////////
MAESTRO .c
#include <main_MASTER.h>
#include <stdlib.h>
#define c_max 2 //cantidad de esclavos a consultar por datos
void main()
{
int id_cont = 0;
char buffer_t[15];
char buffer_p[5];
while(true)
{
delay_ms(2000); //espera 2s
strcpy(buffer_t, "x"); //caracter de inicio del buffer total
while(id_cont < c_max)
{
strcpy(buffer_p, ""); //limpia el buffer parcial
itoa(id_cont, 10, buffer_p); //convierte int a string
fputs(buffer_p, A_PICS); //envia id a esclavos
fputc(13, A_PICS); //enter
strcpy(buffer_p, ""); //limpia el buffer parcial
fgets(buffer_p, A_PICS); //lee datos de esclavo correspondiente
delay_ms(100);
strcat(buffer_t, buffer_p); //concatena al buffer total el parcial
id_cont = id_cont + 1; //prepara cont para sgt pic esclavo
}
id_cont = 0;
fputs(buffer_t, A_COM); //escribe la cadena hacia el computador
strcpy(buffer_t, "x"); //limpia el buffer total
}
}
/////////////////////////////////////////
MAESTRO .h
#include <18C452.h>
#device adc=16
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES NOPROTECT //Code not protected from reading
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOOSCSEN //Oscillator switching is disabled, main oscillator is source
#FUSES NOPUT //No Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV20 //Brownout reset at 2.0V
#FUSES STVREN //Stack full/underflow will cause reset
#use delay(clock=4000000)
#use rs232(baud=2400,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=A_PICS)
#use rs232(baud=2400,parity=N,xmit=PIN_D0,rcv=PIN_D1,bits=8,stream=A_COM)
////////////////////////////////////////////////
Esclavo 0 .c
#include <main_S0.h>
#INCLUDE <stdlib.h>
#define id_pic 0 //identificador del pic esclavo 0
void main()
{
char buffer_s[5];
OUTPUT_LOW(PIN_C1); //Deshabilita linea TX
while(true)
{
strcpy(buffer_s, ""); //inicializo buffer
fgets(buffer_s, A_MASTER); //leo buffer del master
if(atoi(buffer_s) == id_pic) //verifica si se pide informacion a este pic
{
OUTPUT_HIGH(PIN_C1); //habilita linea TX
delay_ms(100);
strcpy(buffer_s, "p0|"); //cargo datos para enviar
fputs(buffer_s, A_MASTER); //envio buffer cargado al master
strcpy(buffer_s, ""); //limpio el buffer
OUTPUT_LOW(PIN_C1); //deshabilita la linea TX
}
}
}
//////////////////////////////////////////////////////
Esclavo 0 .h
#include <16F877A.h>
#device adc=16
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT //No Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOPROTECT //Code not protected from reading
#use delay(clock=4000000)
#use rs232(baud=2400,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=A_MASTER)
//////////////////////////////////
El codigo para el esclavo 1 es el mismo solo cambia el id_pic.
Esquema adjunto.
Les agradezco de antemano por la ayuda que me puedan dar.