Hasta acá viene funcionando todo bien en la simulación de RS232, pero tengo que pasarme al 485, para ello voy a emplear un SN75179BP o algún MAX.
El problema lo tengo con el código de la función para manejar el RS485, lo estoy empezando a ver, pero aun no entiendo bien como funciona, lo estuve estudiando de un tutorial que subio red pic, en breve estare actualizando la informacion, creo que es todo problema de como manejar las funciones para RS485, pero por ahora no lo saque andando, subo la ultima version que tengo del codigo que viene funcionando bien con RS232.
//****************************************************************************
//EL TRANSMISOR O SENSOR PROPIAMENTE DICHO
//
//*****************************************************************************
//Esta unidad emula a la transmision de datos de una Hydraprobe II
//*****************************************************************************
///////////////////////////////////////////////////////////Definiciones Standart
#include <16F873A.h>
#device adc=10
#FUSES XT,NOWDT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7))
#include <LCD420.C>
#include <string.h>
int flag=0;
char comando[7];
#int_rda
void serial_isr()
{
while(comando!=0x0D)
{ // mientras que buffer sea diferente de 0x0A
gets(comando);
}
//
}
void main()
{
float p,q, qq, pp;
int i, j, k;
char triplebarra [7] = "OK";
char T0[7] = "T0";
char T3[7] = "T3";
setup_adc_ports(AN0_AN1_AN3); //Canal 0 analógico
setup_adc(ADC_CLOCK_INTERNAL); //Fuente de reloj RC
enable_interrupts(global);
enable_interrupts(int_rda);
lcd_init();
printf(lcd_putc, " HERACLES V1.00 ");
delay_ms(1000);
/*printf(lcd_putc, "\f");
printf(lcd_putc, "///TO\r\n");
delay_ms(1000);
printf("///TO\r\n");
delay_ms(1000);
printf(lcd_putc, "r");
delay_ms(1000);
printf("r");
delay_ms(10000);*/ //Rutina de prueba de impresion
enable_interrupts(global);
enable_interrupts(int_rda);
//case 1: //TR\n\r ascii: TR0xD0x10
//
//printf(lcd_putc, "\fMEDIR....>");
//delay_ms(100);
//break;
//case 2: //T3\n\r ascii: T30xD0x10
while (TRUE)
{
i = strncmp (comando, triplebarra, 4);
while(i != 0)
{
while (TRUE)
{
j = strcmp (comando, T0);
while (j != 0)
{
while (TRUE)
{
k = strcmp (comando, T3);
while (k != 0)
{
set_adc_channel(0);
delay_us(20);
q = read_adc();
p = (5 * q/512)/10+0.003;
set_adc_channel(1);
delay_us(20);
qq = read_adc();
pp = (5 * qq/512)*10+0.003;
printf(lcd_putc, "\fMEDICION ....\n");
printf(lcd_putc, "%.3f", p);
delay_ms(100);
printf("004+26.2,+79.1,+%.3f,+0.944,+0.034,+%.3f,+13.552\n\r", p, pp);
}
}
}
}
}
}
}
//**********************************************************************************
//**********************************************************************************
// EL RECEPTOR O MICRO.
//**********************************************************************************
//
///////////////////////////////////////////////////////////Definiciones Standart
#include <16F876A.h>
#use delay(clock=4000000) //Reloj en 4Mhz
#FUSES XT,NOWDT //Cristal XT sin Watchdog
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7))
//Configuro la uart del pic con:
//9600 Kbaudios
//8N1
//TX: RC6 RX: RC7
#include <string.h> //Con esta libreria puedo manejar cadenas.
#include <LCD420.C> //Para manejar un LCD de 4x20
#BYTE PORTC = 0x07 //Defino la posicion del puerto C
#BYTE TRISC = 0x0F //Defino la posicion de configuracion del puerto C
#BYTE PIR1 = 0x0C //Defino la posicion del registro de interrupciones
char cadena[]; //Cadena que se utiliza para almacenar el contenido
//del puerto serie de la UART.
int1 flag=0; //bandera auxiliar
#int_rda
void serial_isr() //Servicio de interrupcion del puerto serie.
{
gets(cadena); //se almacena el contenido del puerto serie en el vector
//cadena[50]
flag=1; //se actualiza el valor de flag con 1.
}
void main()
{
char humedad[7], RD[8], cad_hum[45], cad_RD[45];
// humedad:
// RD:
// cad_hum:
// cad_RD:
setup_adc_ports(AN0); //Canal 0 analógico
setup_adc(ADC_CLOCK_INTERNAL); //Fuente de reloj RC
enable_interrupts(global); //Habilito interrupciones globales
enable_interrupts(int_rda); //Habilito
lcd_init(); //Funcion que inicializa el LCD
//----------------------------- INTRO -----------------------------------------
printf(lcd_putc, "\f HERACLES V1.00 ");
delay_ms(100);
lcd_gotoxy(1,2);
printf(lcd_putc, " Sistema manual de ");
lcd_gotoxy(1,3);
printf(lcd_putc, " medicion de ");
lcd_gotoxy(1,4);
printf(lcd_putc, " humedad de suelo ");
delay_ms(1000);
//------------------------------------------------------------------------------
printf(lcd_putc, "\fPresione un boton...");
while(TRUE)
{
//La siguiente condicion impone que para comenzar se presione cualquier boton
if (bit_test(portc,0)==1 || bit_test(portc,1)==1)
{
delay_ms(200);
if (bit_test(portc,0)==1 || bit_test(portc,1)==1)
{
while (TRUE)
{
printf(lcd_putc, "\fPresione TR ...");
delay_ms(100);
if (bit_test(portc,0)==1 )
{
delay_ms(100);
if (bit_test(portc,0)==1 )
{
printf(lcd_putc, "\nOK!");
delay_ms (1000);
printf(lcd_putc, "\nPresione T3...");
delay_ms (500);
while (bit_test(portc,2)!=1)
{
if (bit_test(portc,1)==1 )
{
delay_ms(100);
if (bit_test(portc,1)==1 )
{
printf(lcd_putc, "\n.");
delay_ms (400);
printf(lcd_putc, ".");
delay_ms (400);
printf(lcd_putc, ".");
delay_ms (400);
printf(lcd_putc, "OK!");
delay_ms (500);
//Cadena
//004+26.2,+79.1,+0.217,+0.944,+0.034,+13.218,+13.552,+12.478,+12.273,+0.035,+26.2,
strncpy (cad_hum, strchr(cadena, ',')+1, 45);
strncpy (humedad, strchr(cad_hum, ',')+2, 5);
printf(lcd_putc, "\fHumedad = %s ", humedad);
strncpy (cad_RD, strchr(cad_hum, ',')+2, 45);
strncpy (cad_hum, strchr(cad_RD, ',')+1, 45);
strncpy (cad_RD, strchr(cad_hum, ',')+2, 45);
strncpy (RD, strchr(cad_RD, ',')+2, 6);
printf(lcd_putc, "\nRD = %s", RD);
//strncpy (cad_RD, strchr(cad_hum ',')+3, 20);
//strncpy (RD, strchr(cad_RD, ',')+2, 5);
//strncpy (cad_hum, strchr(cad_RD, ',')+3, 10);
//strncpy (RD, strchr(cad_hum, ',')+2, 5);
delay_ms(500);
//printf(lcd_putc, "\fHum = %s ", cad_hum);
} //Cierre if anidado antirrebote
} //Cierre if anidado
}
flag = 0;
} //Cierre del ciclo while anidado
} //Cierre de primer if
} //Cierre de segundo if despues del antirrebote
} //Cierre del while
}
}
} //Cierre del MAIN
//***********************************************************************************
Eso es lo que tengo andando ahora en el ISIS, la idea es pasarlo a RS485 para comunicarme de una con el sensor que requiere algunos comandos especificos para poder entrar en confianza jeje.
Esta tarde subo mis avances saludos !