Autor Tema: Trama de datos por RS485 a RS232 con Pic y Display  (Leído 11455 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado BINARIO

  • PIC16
  • ***
  • Mensajes: 156
Trama de datos por RS485 a RS232 con Pic y Display
« en: 29 de Noviembre de 2013, 15:22:11 »
 :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/  :mrgreen: :mrgreen:

Estimados:
                Estoy comenzando un desarrollo con un sensor de humedad que tiene dentro de su circuito un micro que devuelve los datos por RS485, estoy un poco perdido. En realidad lo que quiero hacer es sencillo pero no tanto.
Es asi, yo tengo mi sensor de humedad de suelo es un Hydra probe II el mismo se puede comunicar con una PDA que tiene un programita que te permite ver los datos de la humedad del suelo y la constante dielectrica del mismo, asi como tambien la salinidad. Bien todos esos datos el sensor los devuelve en una trama que puedo conocer como es porque el fabricante me da esa informacion; mi idea es para no tener que comprar una pda usar un pic, ya que actualmente tomo los datos con una netbook y un conversor de RS485 a RS232.
Cuando conecto la netbook mediante el hercules le mando tres comandos al sensor SN - TR y TE

SN: me devuelve el numero de serie.
TR: le dice al sensor que realize una medicion.
TE: Me devuelve la medicion que realizo el sensor.

Mi idea es poder migrar todo esto a un PIC, quiero usar un PIC16F873 con un SN75176 que es un integrado que me convierte los niveles 485 directamente a RS232 con lo cual podria comunicarme directamente desde el pic al sensor sin demasiados problemas.

OK hasta aca todo bien, sin embargo mi problema radica en que no se leer tramas con el pic, usualmente he leido caracteres como 'R' o 'T' y con eso hacia que se active alguna cosa mediante el puerto serie.
Como yo conozco la trama que me envia el sensor querria saber como se lee una trama asi de toda esa info puedo seleccionar los datos que necesito.

Saludos y gracias por leer.
000101111 101110000011110 00010 11101 110 1 000111 00010010011010111100 101101001 11110000 001 00 10110 111 00001 01110 0010101 01011110 00 00011111111 0011111 011110001111111111 1011111111101100000000

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Trama de datos por RS485 a RS232 con Pic y Display
« Respuesta #1 en: 29 de Noviembre de 2013, 16:12:29 »
  Todo depende de como sea la trama. Si tiene algún caracter de inicio y alguno de final de trama es bien sencilla la lectura.

Básicamente es ir recibiendo y almacenando todos los caracteres hasta que aparezca el final de trama.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado BINARIO

  • PIC16
  • ***
  • Mensajes: 156
Re: Trama de datos por RS485 a RS232 con Pic y Display
« Respuesta #2 en: 02 de Diciembre de 2013, 10:00:43 »
El viernes charlando con un colega me dijo que puedo utilizar un vector e ir almacenando los datos si tiene caracter de fin de trama leer ese como condicion para salir, y si no puedo usar algo que el lama timeout, es decir que si paso un determinado tiempo sin recibir nada dar por terminada la transmision, ahora estoy leyendo los manuales a ver si sale algo pero mucho no me dice sobre la trama, tendre que investigar mas.
000101111 101110000011110 00010 11101 110 1 000111 00010010011010111100 101101001 11110000 001 00 10110 111 00001 01110 0010101 01011110 00 00011111111 0011111 011110001111111111 1011111111101100000000

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Trama de datos por RS485 a RS232 con Pic y Display
« Respuesta #3 en: 02 de Diciembre de 2013, 10:09:01 »
  Puedes subir la información de tu dispositivo, para ver si entre todos comprendemos como manejar la trama.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado BINARIO

  • PIC16
  • ***
  • Mensajes: 156
000101111 101110000011110 00010 11101 110 1 000111 00010010011010111100 101101001 11110000 001 00 10110 111 00001 01110 0010101 01011110 00 00011111111 0011111 011110001111111111 1011111111101100000000

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Trama de datos por RS485 a RS232 con Pic y Display
« Respuesta #5 en: 02 de Diciembre de 2013, 11:27:11 »
  Por lo que entiendo del datasheet, se pueden hacer varias operaciones sobre el dispositivo. Una muy importante es la configuración del Address si es que tienes varios dispositivos similares conformando una red. Así como también la lectura del address.

  ¿Tienes varios dispositivos en paralelo? ¿Sabes cuál es el address del mismo?

  Por lo visto cada una de las tramas termina con los caracteres <CR><LF> que son los decimales 13 y 10 respectivamente.

  Entiendo que para leer cierta información hay que mandar el comando T<set> y va a devolver la lectura e el formato <readings> que son valores separados por una coma ",". Según el T que se solicite será la información recibida.

  Imagino que si se envía un T0, se recibe toda la información correspondiente a dicha petición y que, según el datasheet, son 9 parámetros, y por lo tanto <readings> constará de 9 "valores" separados por una coma.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado BINARIO

  • PIC16
  • ***
  • Mensajes: 156
Re: Trama de datos por RS485 a RS232 con Pic y Display
« Respuesta #6 en: 02 de Diciembre de 2013, 16:02:05 »
LA idea es colocar solo un dispositivo, dado que son realmente caros, y de hecho es para hacer un medidor portatil de humedad del suelo, o sea que solo se maneja un dispositivo RS485 con el micro
000101111 101110000011110 00010 11101 110 1 000111 00010010011010111100 101101001 11110000 001 00 10110 111 00001 01110 0010101 01011110 00 00011111111 0011111 011110001111111111 1011111111101100000000

Desconectado BINARIO

  • PIC16
  • ***
  • Mensajes: 156
Re: Trama de datos por RS485 a RS232 con Pic y Display
« Respuesta #7 en: 16 de Diciembre de 2013, 13:12:42 »
Bueno perfecto, el protocolo SDI12 es solo para algunos de estos sensores, pero tambien vienen RS-485 aca traduje una parte de la hoja de datos del sensor donde explica en buen detalle como manejar los comandos los voy a colocar a continucacion:

 :arrow: :arrow: :arrow: :arrow: :arrow: :arrow: :arrow: :arrow: :arrow: :arrow: :arrow: :arrow:

Apéndice B – Comunicación RS-485

La sonda Hydra RS-485 es también digital y usa formato de comunicación RS-485. La sonda Hydra RS-485 usa 4 cables: un cable de tierra, un cable de alimentación de 12V y dos cables de datos. LA sonda Hydra Rs-485 se comunica por 2 cables de dato y puede conectarse a un puerto RS485 en un Logger. Se puede conectar a un conjunto de terminales como la versión SDI-12, pero con 4 cables en vez de 2. La ventaja  del RS485 sobre el SDI12 es que la versión RS485 puede trabajar a más de 3000 pies. La desventaja es que consume más potencia.

Requerimientos de potencia   9 a 20 VDC  (12VDC ideal)

Cable rojo           Tensión de alimentación
Cable negro   Tierra
Cable azul           Señal de datos A – señal no invertida
Cable verde   Señal de datos B – señal invertida
Tasa de Baudios   9600 8N1
Consumo            <10 mA  Idle / 30 mA en modo Activo

Sonda Stevens Hydra RS485 Especificaciones de comando.

Formato de comandos
AAACC<CR><LF>      Ejecutar
AAACC=?<CR><LF>      Consulta la configuración actual
AAACC=XXX…<CR><LF>   Asigna un nuevo valor
AAA:                              Dirección de 3byte
                              Caracteres ASCII, 0-9 A-Z a-z
                              Carácter comodín  ‘/’
                              Dirección de transmisión ‘///’

CC:                             Comando de 2 bytes
XXX…:                     Comandos de datos. Ver información de comandos para requerimientos específicos
<CR>                          Retorno de carro ASCII 13
<LF>                                  Carácter de retorno de línea ASCII 10

Otros Gramaticales

<d>:                            Dígitos, ASCII ‘0’ al ASCII ‘9’
<a>:                            ASCII ‘A’ al ASCII ‘D’, usado para la constante de agua personalizada
<serial>:                         Numero serial, 8 dígitos <d><d><d><d><d><d><d><d>
<soil>:                         Tipo de suelo, 1 carácter { ‘1’ |‘2’ |‘3’ |‘4’ |‘C’ |‘D’ }
<quick>:                         Modo Rápido, 1 carácter { ‘1’  - ‘6’, ‘X’ }
<warump>:                 tiempo de calentamiento, 1-5 dígitos, 0-65535
<bool>:                         Valor booleano, 1 carácter { ‘0’ | ‘1’ }
<firmware>                 Firmware, 3 o 4 bytes, formateado como “2.7” o “R.2.7” o “2S7”
<text>:                         Texto ASCII imprimible
<float>:                         Numero decimal, opcionalmente usado en forma de notación científica.
                     
                                                 Ej. “+23.54, 0.001, -123.0E5, 45E-3”

<readings>:                 Cadena de flotantes, delimitadas por comas. Ej. “+23.54, -42.532, +2342.12”


Especificaciones Sonda Hydra  comandos RS485

Información de comandos


Numero serial

Descripción:      Retorna el número de serie de fábrica.
Nivel de acceso:    Solo lectura.
Dirección de lectura:   Broadcast, Exact
Comando de lectura:   <addr>SN=?<CR><LF>
Respuesta de lectura:   <addr><serial><CR><LF>

Versión de Firmware
Descripción:      Devuelve el número de versión de firmware.
Nivel de acceso:    Solo lectura.
Dirección de lectura:   Broadcast, Exact
Comando de lectura:   <addr>FV=?<CR><LF>
Respuesta de lectura:   <addr><firmware><CR><LF>


Comandos de configuración Estándar


Dirección
Descripción:      Captura y establece la dirección de la sonda
Nivel de acceso:           Lectura/Escritura
Dirección de lectura:   Broadcast, Exact
Comando de lectura:   <addr>AD=?<CR><LF>
Respuesta de lectura:   <addr><CR><LF>
Dirección de escritura:   Exact
Comando de escritura:   <addr>AD=<serial><new_addr><CR><LF>
Respuesta de escritura:    <new_addr><CR><LF>

Tipo de suelo
Descripción:      Captura y establece el tipo de suelo de la sonda
Nivel de acceso:    Lectura/Escritura
Dirección de lectura:   Broadcast, Exact
Comando de lectura:   <addr>ST=?<CR><LF>
Respuesta de lectura:   <addr><CR><LF>
Dirección de escritura: Broadcast, Exact , Wildcard
Comando de escritura: <addr>ST=<soil><CR><LF>
Respuesta de escritura: <soil><CR><LF>   (no hay respuesta en la dirección comodín)



Comandos de configuración avanzada.


Ubicación
Descripción:      Captura y establece la ubicación de la sonda
Nivel de acceso:    Lectura/Escritura
Dirección de lectura:   Broadcast, Exact
Comando de lectura:   <addr>LO=?<CR><LF>
Respuesta de lectura:   <addr><text><CR><LF>
Dirección de escritura: Exact
Comando de escritura: <addr>LO=<text><CR><LF>
Respuesta de escritura:  <addr><text><CR><LF>   

Descripción
Descripción:      Captura y establece la descripción de sonda
Nivel de acceso:    Lectura/Escritura
Dirección de lectura:   Broadcast, Exact
Comando de lectura:   <addr>DS=?<CR><LF>
Respuesta de lectura:   <addr><text><CR><LF>
Dirección de escritura: Exact
Comando de escritura: <addr>DS=<text><CR><LF>
Respuesta de escritura: <addr><text><CR><LF>   

Constante Hídrica personalizada
Descripción:      Captura y establece la constante hídrica de la sonda
Nivel de acceso:    Lectura/Escritura
Dirección de lectura:   Broadcast, Exact
Comando de lectura:   <addr>X<a>=?<CR><LF>
Respuesta de lectura:   <addr><float><CR><LF>
Dirección de escritura: Exact
Comando de escritura: <addr>X<a>=<float><soil><CR><LF>
Respuesta de escritura: <addr><float><CR><LF>

Modo rápido
Descripción:      Captura y establece la constante hídrica de la sonda
Nivel de acceso:    Lectura/Escritura
Dirección de lectura:   Broadcast, Exact
Comando de lectura:   <addr>QM=?<CR><LF>
Respuesta de lectura:   <addr><quick><CR><LF>
Dirección de escritura: Exact
Comando de escritura: <addr>QM=<quick><CR><LF>
Respuesta de escritura:  <addr><float><CR><LF>


Comandos del Debug


Warmup time

Descripción:      Captura y establece el tiempo de calentamiento
                                           personalizado de la sonda
Nivel de acceso:    Lectura/Escritura
Dirección de lectura:   Broadcast, Exact
Comando de lectura:   <addr>WT=?<CR><LF>
Respuesta de lectura:   <addr><warump><CR><LF>
Dirección de escritura: Exact
Comando de escritura: <addr>WT=<warmup><CR><LF>
Respuesta de escritura:  <addr><warmup><CR><LF>

Sonda habilitada
Descripción:                    Captura y establece si el circuito de la sonda está
                                           habilitado
Nivel de acceso:                  Lectura/Escritura
Dirección de lectura:          Broadcast, Exact
Comando de lectura:         <addr>PE=?<CR><LF>
Respuesta de lectura:         <addr><bool><CR><LF>
Dirección de escritura:   Exact
Comando de escritura:   <addr>PE=<bool><CR><LF>
Respuesta de escritura:    <addr><bool><CR><LF>



Comandos de medición

//Comandos fundamentales para la lectura de la humedad de suelo

Tomar Lectura
Descripción:      Indica a una sonda o un grupo de sondas tomar una lectura
Nivel de acceso:    Lectura/Escritura
Dirección de lectura:   Broadcast, Exact
Comando de lectura:   <addr>TR<CR><LF>
Respuesta de lectura:   (ninguna)

Transmitir Conjunto leído
Descripción:      Indica a una sonda transmitir una lectura especifica
Nivel de acceso:           Lectura/Escritura
Dirección de lectura:   Broadcast, Exact
Comando de lectura:   <addr>TR<CR><LF>
Respuesta de lectura:   (ninguna)


RS485 Conjuntos Transmitidos
(tc) indica valores que deben ser corregidos por temperatura

T0 – Conjunto transmisión 0:
H) Humedad
J) Conductividad eléctrica del suelo (tc)
F) Temperatura °C
G) Temperatura °F
O) Conductividad eléctrica del suelo
K) Permitividad Dieléctrica real.
M) Permitividad Dieléctrica Imaginaria.
L) Permitividad Dieléctrica real (tc).
N) Permitividad Dieléctrica imaginaria (tc)

T1 – Conjunto de transmisión 1:
F) Temperatura °C
G) Temperatura °F
I) Tangente de perdida

T2 – Conjunto de transmisión 2:
F) Temperatura °C
G) Temperatura °F
H) Humedad
O) Conductividad eléctrica
J) Conductividad eléctrica (tc)
I) Tangente de perdida

T3 – Conjunto de transmisión 3:
F) Temperatura °C
G) Temperatura °F
H) Humedad
I) Tangente de perdida
J) Conductividad eléctrica del suelo (tc)
K) Permitividad dieléctrica real
L) Permitividad dieléctrica real (tc)
M) Permitividad dieléctrica imaginaria
N) Permitividad dieléctrica imaginaria (tc)
O) Conductividad eléctrica del suelo
P) Temperatura de diodo
Q) Vacío

T4 – Conjunto de transmisión 4:
A) V1 (Volts)
B) V2 (Volts)
C) V3 (Volts)
D) V4 (Volts)
E) V5 (Volts)

T5 – Conjunto de transmisión 5:
R) V1 ADC en bruto
S) V2 ADC en bruto
T) V3 ADC en bruto
U) V4 ADC en bruto
V) V5 ADC en bruto


 :arrow: :arrow: :arrow: :arrow: :arrow: :arrow: :arrow: :arrow: :arrow: :arrow: :arrow: :arrow:

Ahora comienzo con algunas simulaciones en proteus ocupando el hyperterminal para ver como mandar los comandos y armar la comunicacion propiamente dicha, el hardware es sencillo, ya que solo necesito un pic, un sn75175 y un lcd para visualizar las respuestas y configurar, como veran el hard es simple, mas aun cuando necesito hacer un dispositivo portatil. Saludos les voy contando como sale.
000101111 101110000011110 00010 11101 110 1 000111 00010010011010111100 101101001 11110000 001 00 10110 111 00001 01110 0010101 01011110 00 00011111111 0011111 011110001111111111 1011111111101100000000

Desconectado BINARIO

  • PIC16
  • ***
  • Mensajes: 156
Re: Trama de datos por RS485 a RS232 con Pic y Display
« Respuesta #8 en: 18 de Diciembre de 2013, 10:00:39 »
Hasta ahora e implementado lo siguiente con dos pics como para probar uno de ellos seria quien simula a la hydra pero de momento los dos hacen lo mismo, como primera prueba de transmision intente que cuando uno transmite algo al otro lo publique en el lcd por interrupcion de la USART, pero hasta ahora solo me funciono una vez, en el compilador me dio mensaje de que las interrupciones se deshabilitan para prevenir una re entrada, asi que en el ciclo iterativo le puse que active nuevamente las interrupciones de la USART les muestro el programa a continuacion:

------------------------------------------------------------------------------------------------------------------------------------------------------
#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>

int ch;

#int_rda
void serial_isr()
{
 ch=getchar();
 printf("Recibido = %c", ch);
 
 printf(lcd_putc, "\fANDUVO = %c", ch);
 delay_ms(100);
}

void main()
{
 int16 q;
 float p;

 
 setup_adc_ports(AN0); //Canal 0 analógico
 setup_adc(ADC_CLOCK_INTERNAL); //Fuente de reloj RC
 
 enable_interrupts(global);
 enable_interrupts(int_rda);

 lcd_init();
 
 for ( ; ; ) {
 enable_interrupts(global);
 enable_interrupts(int_rda);
 set_adc_channel(0); //Habilitación canal0
 delay_us(10);
 q = read_adc(); //Lectura canal0
 p = 5.0 * q / 1024.0; //Conversión a tensión
 printf(lcd_putc, "\fADC = %4ld", q);
 printf(lcd_putc, "\nVoltage = %01.2fV", p);
 delay_ms(100);
 printf("\fADC = %4ld \r", q);
 printf("Voltage = %01.2fV", p);
 
 }
}
----------------------------------------------------------------------------------------------------------------------------------------------------

Les adjunto el circuito de prueba en proteus, acepto sugerencias sobre como hacer una transmision de caracteres ascii con la usart, hasta ahora logre eso sigo renegando mientras.
000101111 101110000011110 00010 11101 110 1 000111 00010010011010111100 101101001 11110000 001 00 10110 111 00001 01110 0010101 01011110 00 00011111111 0011111 011110001111111111 1011111111101100000000

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Trama de datos por RS485 a RS232 con Pic y Display
« Respuesta #9 en: 18 de Diciembre de 2013, 10:48:54 »
  La instrucción printf consume muchísimos ciclos de instrucción (en asm) por lo tanto demora mucho tiempo. Nunca es recomendable tardar mucho dentro de la interrupción. Será mejor que utilices un flag indicativo de que hay datos y luego evalues dicho flag en el main del programa. Justamente si hay datos los muestras en el LCD.

  A su vez, quizá sería recomendable hacer funcionar al PIC a una mayor frecuencia, para tener más ciclos de instrucción para hacer cosas.

La sintaxis básica de la utilización de un flag sería algo así....

Código: C
  1. unsigned char caracter; // donde se almacenara un byte llegado del UART
  2. unsigned char flag; // flag para saber si hay datos
  3.  
  4. interrupcion
  5. {
  6.   caracter = getchar();
  7.   flag = 1;
  8. }
  9.  
  10. main
  11. {
  12.   while (1)
  13.   {
  14.     if (flag == 1)
  15.     {
  16.       mostrar en LCD
  17.       flag = 0;
  18.     }
  19.     todo el resto de tu programa
  20.   }
  21. }

  No utilizo CCS como compilador así que puse una especie de pseudocodigo para que se entienda la idea
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado BINARIO

  • PIC16
  • ***
  • Mensajes: 156
Re: Trama de datos por RS485 a RS232 con Pic y Display
« Respuesta #10 en: 09 de Enero de 2014, 14:34:28 »
Tengo un problemita ahora.

Implemente dos pics para simular la trama de datos, por ahora lo que hago es leer el valor de un potenciometro con el adc y enviarlo por puerto serie de un pic al otro, ok funciona, pero lo que le llega al otro pic es otra cosa yo hice asi:

en un display pongo lo que lee el adc y por ejemplo es 1.25, en el otro pic leo ese valor en un vector que es char y segun yo lee caracter por caracter y lo almacena en cada posicion del vector, luego muestro ese vecto pero me sale por ejemplo asi:

< > < 1 > < 1 >

En lugar de mostrarme el valor < 1 > < . > < 4 >

no se porque es, y ademas cuando yo cambio el valor del potenciometro mantiene esa lectura y no la actualiza como si la interrupcion del puerto serie no volviese a ocurrir...

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

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Trama de datos por RS485 a RS232 con Pic y Display
« Respuesta #11 en: 09 de Enero de 2014, 17:47:58 »
Algunas correcciones a tu codigo:

Código: [Seleccionar]
#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>

int ch;
char cadena[30];
int1 flag=0;

#int_rda
void serial_isr()
{
 cadena=gets;
 flag=1;
}

void main()
{
 int16 q;
 float p;

 
 setup_adc_ports(AN0); //Canal 0 analógico
 setup_adc(ADC_CLOCK_INTERNAL); //Fuente de reloj RC
 
 enable_interrupts(global);
 enable_interrupts(int_rda);

 lcd_init();
 enable_interrupts(global);
 enable_interrupts(int_rda);
 set_adc_channel(0); //Habilitación canal0

 
 while(true)
 {
 delay_us(10);
 q = read_adc(); //Lectura canal0
 p = 5.0 * (float)q / 1024.0; //Conversión a tensión
 printf(lcd_putc, "\fADC = %4ld", q);
 printf(lcd_putc, "\nVoltage = %01.2fV", p);
 delay_ms(100);
 printf("\fADC = %4ld \r", q);
 printf("Voltage = %01.2fV", p);
  if(flag)
  {
      printf("Recibido = %c", ch);
 
         printf(lcd_putc, "\fANDUVO = %c", ch);
      delay_ms(100);
      flag=0;
  }
 }
}


Si estas usando printf para enviar datos puedes usar gets para leer la cadena completa, tambien cambie algunas lineas que no necesitan ir dentro de tu ciclo infinito

espero te ayude

Saludos
"Nada es imposible, no si puedes imaginarlo"

Desconectado BINARIO

  • PIC16
  • ***
  • Mensajes: 156
Re: Trama de datos por RS485 a RS232 con Pic y Display
« Respuesta #12 en: 16 de Enero de 2014, 14:22:27 »
HOLA RIVALE!!!

muchas gracias por tu ayuda, hasta ahora el codigo que implementaste como correccion parece dar resultado, sin embargo hay un error en proteus, este seria el codigo

#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>

int i=0;
char cadena[3]={0,0,0};
int1 flag=0;

#int_rda
void serial_isr()
{
 gets(cadena);
 flag=1;
 
}

void main()
{
 int16 q;
 float p;

 
 setup_adc_ports(AN0); //Canal 0 analógico
 setup_adc(ADC_CLOCK_INTERNAL); //Fuente de reloj RC
 
 enable_interrupts(global);
 enable_interrupts(int_rda);

 lcd_init();
 enable_interrupts(global);
 enable_interrupts(int_rda);
 set_adc_channel(0); //Habilitación canal0

 
 while(true)
 {
 delay_us(10);
 q = read_adc(); //Lectura canal0
 p = 5.0 * (float)q / 1024.0; //Conversión a tensión
 printf(lcd_putc, "\fADC = %4ld", q);
 printf(lcd_putc, "\nVoltage = %01.2fV", p);
 delay_ms(10);
 printf("\fADC = %4ld \r", q);
 printf("Voltage = %01.2fV", p);
 
if (flag == 1)
    {
     printf(lcd_putc, "\fDATO = %s", cadena);
     delay_ms(40);
     flag = 0;
     i++;
     if (i==3)
     i=0;
    }
 }
}

Funciona, muestra el valor pero hace un error como veraz en estas imagenes como si fuese un desplazamiento, he adjuntado el error que me da en proteus, no se bien porque lo genera hoy le dedique la mañana a esto si logro algun avance lo publico

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

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Trama de datos por RS485 a RS232 con Pic y Display
« Respuesta #13 en: 16 de Enero de 2014, 15:07:06 »
incrementa la longitud de tu variale cadena, si estas enviando 4 caractares necesitas que su longitud sea de al menos 5
"Nada es imposible, no si puedes imaginarlo"

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Trama de datos por RS485 a RS232 con Pic y Display
« Respuesta #14 en: 16 de Enero de 2014, 15:11:43 »
no se si entendí bien el problema

tu envias 2.34 desde un pic, y en el pic que recibes solo ves 35

si es eso creo que es por lo que comenté arriba, en tu cadena no caben los 4 caracteres por eso te lo corta

si lo entendí mal por favor corrígeme para que pueda ayudarte  :-)
"Nada es imposible, no si puedes imaginarlo"


 

anything