Вы находитесь на странице: 1из 10

15/8/2016 Trama de datos por RS485 a RS232 con Pic y Display

TODOPIC

Hola mariacontenis
Mostrar mensajes no leídos desde la última visita.
Mostrar nuevas respuestas a tus mensajes.
15 de Agosto de 2016, 20:45:03

   Este tema   Buscar

Inicio Ayuda Buscar Perfil Mis mensajes Mis Favoritos Calendario Usuarios Salir

TODOPIC » Microcontroladores PIC » Lenguaje C para microcontroladores PIC (Moderadores: pikman, pocher, vszener, Suky) »


Trama de datos por RS485 a RS232 con Pic y Display

« anterior próximo »
RESPONDER FAVORITO NOTIFICAR MARCAR COMO NO LEÍDOS ENVIAR TEMA IMPRIMIR

Páginas: 1 2 [3]   Ir Abajo

Autor  Tema: Trama de datos por RS485 a RS232 con Pic y Display  (Leído 5605
mariacontenis y 0 Visitantes están viendo este tema.

 rivale Re: Trama de datos por RS485 a
Citar
RS232 con Pic y Display
Colaborador
« Respuesta #30 en: 20 de Marzo de 2014,
PIC24H
11:34:17 »

porque necesitas ese delay para enviar los datos?
Reportar al moderador     En línea

"Nada es imposible, no si puedes imaginarlo"

Mensajes: 1705

 AngelGris Re: Trama de datos por RS485 a
Citar
RS232 con Pic y Display
Colaborador
« Respuesta #31 en: 20 de Marzo de 2014,
PIC24H
12:27:35 »

Mensajes: 2459   Viendo en el manual, entiendo que el comando T3 devolverá 12 valores
  separados por ',' (coma).

Para leer, digamos el primer valor de "Real Dielectric", que sería el parámetro K
se podría intentar algo como....

ir recorriendo la cadena original hasta encontrar el caracter ',' e ir almacenando
http://www.todopic.com.ar/foros/index.php?topic=41804.30 1/10
15/8/2016 Trama de datos por RS485 a RS232 con Pic y Display

ir recorriendo la cadena original hasta encontrar el caracter ',' e ir almacenando
en alguna variable las posiciones de las ',' encontradas. Luego nos interesará
copiar desde la 5º hasta la 6º ',' que sería el parámetro K
Supongo que se podría utilizar un array para almacenar dicha información.

Código: C

1.  unsigned char posicionDeComa[15];
2.   
3.  void encontrarComas(unsigned char *cadena)
4.  {
5.    unsigned char indiceDecoma;
6.    unsigned char indiceDeCadena;
7.   
8.    indiceDeComa = 0;
9.    indiceDeCadena = 0;
10.    while (*cadena != 0)  // mientras haya caracteres en la 
cadena
11.    {
12.      if (*cadena == ',') 
13.      {
14.        posicionDeComa[indiceDeComa] = indiceDeCadena;
15.        indiceDeComa++;
16.      }
17.      indiceDeCadena++;
  Ése código almacenaría en una array todos los índices de las comas y por lo
tanto ese array se lo podría utilizar para copiar las cadenas.
  No lo probé, e imagino que será mejorable el código... pero puede servir como
punto de partida.
Reportar al moderador     En línea

De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

 BINARIO Re: Trama de datos por RS485 a
Citar
RS232 con Pic y Display
PIC16
« Respuesta #32 en: 20 de Marzo de 2014,
14:02:50 »

Cita de: rivale en 20 de Marzo de 2014, 11:34:17

porque necesitas ese delay para enviar los datos?

Mensajes: 142
Rivale: Ese tiempo necesita el sensor entre cada comando para poder realizar y
  almacenar la medicion en su memoria interna., luego de eso envia los datos, lo
hemos probado varias veces con el hyperterminal y siempres es por lo menos 1
segundo entre comando y comando.
Reportar al moderador     En línea

000101111 101110000011110 00010 11101 110 1 000111 00010010011010111100
101101001 11110000 001 00 10110 111 00001 01110 0010101 01011110 00
00011111111 0011111 011110001111111111 1011111111101100000000

 BINARIO Re: Trama de datos por RS485 a
Citar
RS232 con Pic y Display
PIC16
http://www.todopic.com.ar/foros/index.php?topic=41804.30 2/10
15/8/2016 Trama de datos por RS485 a RS232 con Pic y Display
« Respuesta #33 en: 20 de Marzo de 2014,
14:09:03 »

Cita de: AngelGris en 20 de Marzo de 2014, 12:27:35

  Viendo en el manual, entiendo que el comando T3 devolverá 12 valores separados por ','
(coma).
Mensajes: 142
Para leer, digamos el primer valor de "Real Dielectric", que sería el parámetro K se podría
  intentar algo como....

ir recorriendo la cadena original hasta encontrar el caracter ',' e ir almacenando en alguna
variable las posiciones de las ',' encontradas. Luego nos interesará copiar desde la 5º hasta
la 6º ',' que sería el parámetro K
Supongo que se podría utilizar un array para almacenar dicha información.

Código: C

1.  unsigned char posicionDeComa[15];
2.   
3.  void encontrarComas(unsigned char *cadena)
4.  {
5.    unsigned char indiceDecoma;
6.    unsigned char indiceDeCadena;
7.   
8.    indiceDeComa = 0;
9.    indiceDeCadena = 0;
10.    while (*cadena != 0)  // mientras haya caracteres en 
la cadena
11.    {
12.      if (*cadena == ',') 
13.      {
14.        posicionDeComa[indiceDeComa] = indiceDeCadena;
15.        indiceDeComa++;
16.      }
17.      indiceDeCadena++;
  Ése código almacenaría en una array todos los índices de las comas y por lo tanto ese
array se lo podría utilizar para copiar las cadenas.
  No lo probé, e imagino que será mejorable el código... pero puede servir como punto de
partida. 

AngelGris:

               Yo intente algo similar, tratando a la cadena como un array y
buscando dentro de la cadena como si fuese un array, pero no funciono, es
decir, de algun modo no ve a la cadena como un array, por eso lo resolvi con
instrucciones de cadena, por ahora esa implementacion que use funciona bien,
lo que tengo que modificar es cuando la RD tiene una sola cifra significativa
antes del punto, en ese caso tendria menos de una decena y me mostraria en
vez de:

+13.258  .........................> +1.258,

Porque como el tamaño que le di a RD es fijo, siempre me va a mostrar 6
caracteres, sin importar lo que sea, ahora estaba implementando if anidados,
hasta encontrar la coma siguiente, para delimitar mi cadena RD.
Reportar al moderador     En línea

000101111 101110000011110 00010 11101 110 1 000111 00010010011010111100
101101001 11110000 001 00 10110 111 00001 01110 0010101 01011110 00
00011111111 0011111 011110001111111111 1011111111101100000000

http://www.todopic.com.ar/foros/index.php?topic=41804.30 3/10
15/8/2016 Trama de datos por RS485 a RS232 con Pic y Display

 AngelGris Re: Trama de datos por RS485 a
Citar
RS232 con Pic y Display
Colaborador
« Respuesta #34 en: 20 de Marzo de 2014,
PIC24H
18:37:23 »

Mensajes: 2459   Acá te muestro un ejemplo en XC8. Utilizo una trama emulada (son los datos
  que tu pusiste aquí) y luego utilizo una función para encontrar la tercer y cuarta
coma (',') y por último una función para copiar en una cadena temporal los
datos de la cadena principal que se encuentran entre las comas encontradas
anteriormente.

Código: C

1.  #include <xc.h>
2.  #include <stdint.h>
3.   
4.  /* Trama emulada */
5.   uint8_t cadena[] = 
{"004+26.2,+79.1,+0.217,+0.944,+0.034,+13.218"
6.                              
"+13.552,+12.478,+12.273,+0.035,+26.2"};
7.   
8.   
9.   
10.   
11.  /*
12.   * Devuelve el indice de la coma buscada
13.   */
14.  uint8_t encontrarComa(uint8_t *str, uint8_t posicion);
15.   
16.  /*
Reportar al moderador     En línea

De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

 BINARIO Re: Trama de datos por RS485 a
Citar
RS232 con Pic y Display
PIC16
« Respuesta #35 en: 05 de Septiembre de
2014, 12:16:58 »

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
Mensajes: 142 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
 //***********************************************************************
 
http://www.todopic.com.ar/foros/index.php?topic=41804.30 4/10
15/8/2016 Trama de datos por RS485 a RS232 con Pic y Display

 
 
 
///////////////////////////////////////////////////////////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);
http://www.todopic.com.ar/foros/index.php?topic=41804.30 5/10
15/8/2016 Trama de datos por RS485 a RS232 con Pic y Display

 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);
         }  
      }  
     } 
    }
   } 
  }

 
 

 
http://www.todopic.com.ar/foros/index.php?topic=41804.30 6/10
15/8/2016 Trama de datos por RS485 a RS232 con Pic y Display

 
 
 
}

//************************************************************************

//************************************************************************
// 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:
http://www.todopic.com.ar/foros/index.php?topic=41804.30 7/10
15/8/2016 Trama de datos por RS485 a RS232 con Pic y Display

 // 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);
http://www.todopic.com.ar/foros/index.php?topic=41804.30 8/10
15/8/2016 Trama de datos por RS485 a RS232 con Pic y Display

               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,+
                     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 

   
http://www.todopic.com.ar/foros/index.php?topic=41804.30 9/10
15/8/2016 Trama de datos por RS485 a RS232 con Pic y Display

   
   }     //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 !

Reportar al moderador     En línea

000101111 101110000011110 00010 11101 110 1 000111 00010010011010111100
101101001 11110000 001 00 10110 111 00001 01110 0010101 01011110 00
00011111111 0011111 011110001111111111 1011111111101100000000

Anuncios Google   ► RS232 to rs485   ► Pic 16f877   ► RS232 LCD display   ► Rs485

RESPONDER FAVORITO NOTIFICAR MARCAR COMO NO LEÍDOS ENVIAR TEMA IMPRIMIR

« anterior próximo »
Páginas: 1 2 [3]   Ir Arriba

TODOPIC » Microcontroladores PIC » Lenguaje C para microcontroladores PIC (Moderadores: pikman, pocher, vszener, Suky) »


Trama de datos por RS485 a RS232 con Pic y Display

Ir a:  => Lenguaje C para microcontroladores PIC   ir

SMF 2.0.11 | SMF © 2015, Simple Machines
SMFAds for Free Forums
XHTML  RSS  WAP2

http://www.todopic.com.ar/foros/index.php?topic=41804.30 10/10

Вам также может понравиться