Autor Tema: Problema Comunicacion RS-232 con Pic 16F876A  (Leído 3509 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Raybak

  • PIC10
  • *
  • Mensajes: 12
Problema Comunicacion RS-232 con Pic 16F876A
« en: 19 de Abril de 2010, 05:29:27 »
Hola buenas, estoy intentando leer via RS-232 la informacion que me da un medidor de humedad. Le tengo que enviar un ? al dispositivo para que este me conteste y me de dicha informacion. El problema es que el medidor de humedad cuando termina de enviar los datos no me envia un enter(13) entonces con el comando gets se me queda muerto el Pic a la espera del enter y no consigo nada. No se si habra una solucion a este problema pero me estoy volviendo loco de mirar.... el codigo del programa es el siguiente:

#include <16F876A.h>
#Fuses XT,NOWDT,NOPROTECT,NOLVP,PUT
#Use delay (clock=4000000)
#Use rs232 (BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7, BITS=8, PARITY=E)
#include <lcd2.c>
#Byte Port_a = 0b00000101
#Byte Port_b = 0b00000110
#Byte Port_c = 0b00000111

char a;
char b;

main()
{
a='?';
b=a;
lcd_init();
lcd_putc("\f");
printf(lcd_putc, "Iniciando...");
delay_ms(2000);
lcd_putc("\f");
while(1)
{
putc(a);
delay_ms(250);
gets(b);
delay_ms(150);
lcd_putc("\f");
printf(lcd_putc, "%s",b);
delay_ms(2000);
lcd_putc("\f");
delay_ms(1000);
}
}

Si alguien ve algun fallo o como conseguir leer el dato...

Gracias de antemano


Un saludo
Si Quieres Ser El Mejor, Tienes Que Vencer Al Mejor

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Problema Comunicacion RS-232 con Pic 16F876A
« Respuesta #1 en: 19 de Abril de 2010, 09:36:09 »
Hola Raybak, lo que puedes hacer es ir controlando el ingreso de cada caracter y utiliza mejor la funcion getc()

saludos.

Desconectado Raybak

  • PIC10
  • *
  • Mensajes: 12
Re: Problema Comunicacion RS-232 con Pic 16F876A
« Respuesta #2 en: 19 de Abril de 2010, 10:14:20 »
Gracias Diego, es lo que estaba intentando hacer ahora. Crear una matriz de 6 datos por ejemplo y ir almacenando caracteres uno a uno, el problema que tengo ahora es juntarlos todos en un string para poder transformarlo luego a float que es como necesito tener el dato para posteriormente tratarlo.... lo que he ido haciendo es esto pero no se si va a funcionar bien o no ya que en proteus sigue necesitando que prete el enter para funcionar....

Os dejo el codigo:

#include <16F876A.h>
#Fuses XT,NOWDT,NOPROTECT,NOLVP,PUT
#Use delay (clock=4000000)
#Use rs232 (BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7, BITS=8, PARITY=E, STOP=1)
#include <lcd2.c>
#include <stdio.h>
#include <stdlib.h>
#Byte Port_a = 0b00000101
#Byte Port_b = 0b00000110
#Byte Port_c = 0b00000111

char a;
char b[6];
int c;
float d;
int e;
char f;

main()
{
a='?';
lcd_init();
lcd_putc("\f");
printf(lcd_putc, "Iniciando...");
delay_ms(2000);
lcd_putc("\f");
while(1)
{
e=0;
putc(a);
delay_ms(250);
for (e=0,e=5,e++)
{
b[e]=getc();
}
strcat(f, b[0]);
strcat(f, b[1]);
strcat(f, b[2]);
strcat(f, b[3]);
strcat(f, b[4]);
strcat(f, b[5]);
delay_ms(150);
c=atoi(f);
d=(float)c;
lcd_putc("\f");
printf(lcd_putc, "%2.3f",d);
delay_ms(2000);
lcd_putc("\f");
delay_ms(1000);
}
}

Luego otro problema que tengo es el pasar de string a float ya que como se hacerlo es pasando primero por int, el problema que me da esto que pierdo todos los decimales :s

Un saludo
Si Quieres Ser El Mejor, Tienes Que Vencer Al Mejor

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Problema Comunicacion RS-232 con Pic 16F876A
« Respuesta #3 en: 19 de Abril de 2010, 12:13:54 »
Raybak, luego de tener los datos como cadena en una matriz utiliza la función atof(), esta te pasa la cadena un número flotante.

saludos.

Desconectado Raybak

  • PIC10
  • *
  • Mensajes: 12
Re: Problema Comunicacion RS-232 con Pic 16F876A
« Respuesta #4 en: 19 de Abril de 2010, 19:07:11 »
Gracias Diego ya he conseguido e tema del float sin problemas... el problemilla es la captacion de datos que tal como lo tengo con los getc() me sigue pidiendo el enter en el proteus y en la maquina no llega a recibir nada... no se si lo estare haciendo bien o se me esta yendo la olla del todo xD

Lo que tengo puesto para la recepcion es lo siguiente:

for (e=0,e=5,e++)
{
b[e]=getc();
}
strcat(f, b[0]);
strcat(f, b[1]);
strcat(f, b[2]);
strcat(f, b[3]);
strcat(f, b[4]);
strcat(f, b[5]);


Un saludo
Si Quieres Ser El Mejor, Tienes Que Vencer Al Mejor

Desconectado Raybak

  • PIC10
  • *
  • Mensajes: 12
Re: Problema Comunicacion RS-232 con Pic 16F876A
« Respuesta #5 en: 21 de Abril de 2010, 05:07:46 »
Indagando mas en el tema este de la maquina he encontrado que si que envia el retorno de carro al terminar de enviar los datos... pero aun asi con un gets() no consigo recibir nada de lo que me manda... :S

Segun lo que he ido averiguando cuando a la maquina le mando un ? esta me contesta de la siguiente forma:

(Bit Bell) 77.1 ppM 12:00:00 NoAlrm (Retorno de Carro) (Nueva Linea)

La idea es leer un string de longitud 5 para que unicamente me almacene el dato y luego convertirlo a float. De momento lo que estoy intentando hacer es leer el string y que me lo muestre en la LCD para saber que es lo que está leyendo, pero no lee nada.... y se queda "pillado" en el gets(). He ido variando un poco el codigo y ahora sobre el que estoy trabajando es el siguiente:

#include <16F876A.h>
#Fuses XT,NOWDT,NOPROTECT,NOLVP,PUT
#Use delay (clock=4000000)
#Use rs232 (BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7, BITS=8, PARITY=E)
#include <lcd2.c>
#include <stdio.h>
#include <stdlib.h>
#Byte Port_a = 0b00000101
#Byte Port_b = 0b00000110
#Byte Port_c = 0b00000111

char a;
char b[5];
float c;

main()
{
a="?";
lcd_init();
lcd_putc("\f");
printf(lcd_putc, "Iniciando...");
delay_ms(2000);
lcd_putc("\f");
while(1)
{
puts("?");
gets(b);
delay_ms(150);
c=atof(b);
lcd_putc("\f");
printf(lcd_putc, "%s",b);
delay_ms(2000);
lcd_putc("\f");
delay_ms(1000);
}
}

Lo que no se si influenciara en algo a la recepcion es el bit bell ese, que por lo que he leido sirve para llamar la atencion del receptor o algo asi... :s aundo un poco perdido en ese tema....
No se si me podreis aclarar un poco el tema del bit bell o algo sobre el codigo porque algo que aparentemente tiene que ser muy simple como leer un string me esta volviendo loco....

Un Saludo y gracias de antemano
Si Quieres Ser El Mejor, Tienes Que Vencer Al Mejor

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Problema Comunicacion RS-232 con Pic 16F876A
« Respuesta #6 en: 21 de Abril de 2010, 11:01:08 »
Hola, raybak, veo varias cosas
1- Si vas a utilizar caracteres a = "?" no lo hagas así, mejor a = '?' , las comillas" convierten el dato en una cadena y esto gasta más recursos del PIC
2- Los datos recíbelos mejor por interrupción.
3- Debes tener presenta que al definir una matriz cadena debes dejar un caracter disponible para el caracter nulo, además el primer byte que envía el dispositivo tambien cuenta, debes definir char dato[7]
4- Mira este ejemplo:
5- Luego de tener los datos en la matriz y como valor flotante continúa con el programa

saludos.

Código: [Seleccionar]
float valor;
char dato[7];

///////////////////////////////////////////////////////////////////////////////
#int_rda //Vector de interrupcion de la recepcion de datos
void interrupcion_rx() //por el usart
{
gets(dato); //Se lee el dato recibido
valor = atof(dato);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#zero_ram //Borrado de la memoria ram

void main() //Rutina principal
{

set_tris_b(0b00000000); //Configuracion de entradas y salidas del puerto B
set_tris_c(0b10111111); //Configuracion de entradas y salidas del puerto C

enable_interrupts(global); //Habilitación de todas las interrupciones
enable_interrupts(int_rda); //Habilita interrupcion rx

while(true) //Rutina general
{
while(bit_test(tecla));
putc('?');
while(!bit_test(tecla));
}
}
///////////////////////////////////////////////////////////////////////////////