# PIC16F887 Tx de cadenas por RS232



## kummell (Abr 14, 2010)

Hello
Hace un tiempo estuve trabajando para multiplexar varias entradas análogas y convertirlas a digital para mandarlas por rs232.

Lo que necesito ahora es enviar estos datos en una cadena ya que solo me está enviando úna conversión a la vez. La razón por la que quiero hacer esto es para poder coger ésta cadena y separarla por medio de un plc para tratar los datos de manera individual ya que el mismo no concatena los datos sino que reescribe el dato con el siguiente.

Por ejemplo, leo los siguientes datos a convertir: 2,14 y 3,89
Quiero mandarlos al plc o al hyperterminal de la siguiente forma: 2,143,89

Sé que puedo ir almacenando los bytes en la memoria del pic, pero cómo hago para mandarlo todo al mismo tiempo por rs232? 

He tenido ya varias ideas que todavía no me funcionan, espero poder contar con su ayuda.

Subo el código.


----------



## FRYCK (Abr 15, 2010)

hola kummell en que lenguaje   cuantos datos quiere enviar todos  tienen el mismo formato 2,14 y 3,89   son flotantes

si es el c de ccs 
con estas  lieas  hoces lo que necesitas teniendo  activa  la directiva  de rs232

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)


 while(TRUE)
   {

   float x=2.1421;
   float y=3.8922; 
   char cadena[10]="";
   sprintf(cadena, "%.2f%.2f", x, y);
   printf("cadena concatenada: %s\n", cadena);
   }

si no es con  ccs me comentas a ver si te puedo colaborar


----------



## tecnogirl (Abr 15, 2010)

kummell: Una aclaracion. Los datos individuales a enviar SIEMPRE son x.yy, es decir son cifras de 3 digitos ?
Si es asi, puedes eliminar la coma y constituir la cadena en ternas de digitos.
Saludos


----------



## kummell (Abr 15, 2010)

Mucahs gracias a todos por su aporte, pero por medio del software S7 del plc he encontrado la manera de tratar los datos como quiero
Bye


----------



## Moyano Jonathan (Abr 16, 2010)

pero para poder meter los 3 valores flotantes en una cadena ...no tendrías que convertir el tipo de dato primero en un valor entero de 10 bits y despues....enviar la parte alta y baja de cada valor ?? ...me parece que se dificulta...si querés imprimir en pantalla los 3 valores..es mucho mejor imprimirlos a los 3 por separado usando la impresión formateada de CCS. en C18 no se pueden imprimir variables con coma flotante.


----------



## Azlan (Feb 12, 2014)

Hola, lo que pasa es que estoy trabajando con 2 pics los cuales quiero comunicar vía rs232, la prueba que estoy haciendo consiste en que al pulsar un boton envio un string y el otro pic lo debe recibir y encender un led los códigos son:

codigo1:


```
#include <16F628A.H>
#fuses INTRC_IO,NOMCLR, NOWDT 
#Use delay(CLOCK = 4MHZ) 
#Use RS232(BAUD = 9600, XMIT = PIN_B2, RCV = PIN_B1)

#use standard_io(A)
#use standard_io(B) 

char Id[3]={'0','0','1'};         
int1 bEnviar;



 void main(){ 
   while(TRUE){
      bEnviar=input(PIN_A7);
      if(bEnviar==1){
         printf("%c%c%c\r",Id[0],Id[1],Id[2]);         
        }      
      while(bEnviar==1){
         delay_ms(10);
         bEnviar=input(PIN_A7);
        } 
     }
  }
```
codigo 2: 

```
#include <18F4550.H>
#include <string.h>
#fuses XT, NOWDT
#use delay(CLOCK = 4MHZ)

#Use RS232(BAUD = 9600, XMIT = PIN_C6, RCV = PIN_C7)


#use standard_io(A)
#use standard_io(B)
#use standard_io(C)
#use standard_io(D)


char buffer[3];
char valor;

#int_RDA          //Interrupción por recepción de datos
void RDA_isr(){
   
    gets(buffer);
   output_toggle(PIN_D0);
   delay_ms(500);
  
   
 

void main(){
  enable_interrupts(INT_RDA);
  enable_interrupts(GLOBAL);
   
   while(TRUE){
      output_toggle(PIN_B0);
      delay_ms(1000);
   }
  
}
```

En el hyperterminal veo el dato bien al pulsar el boton del pic 1, e igualmente si desde el hyperterminal envió un dato el led en el pic 2 enciende, pero si envio el dato directamante de un pic a otro no funciona. Las prueba las estoy haciendo fisicamente el pic 1 es un16f628a y el pic 2 es un 18f4550


----------



## D@rkbytes (Feb 12, 2014)

Azlan dijo:


> En el hyperterminal veo el dato bien al pulsar el botón del pic 1, e igualmente si desde el hyperterminal envío un dato el led en el pic 2 enciende, pero si envío el dato directamente de un pic a otro no funciona. Las prueba las estoy haciendo físicamente el pic 1 es un16f628a y el pic 2 es un 18f4550


La palabra de configuración que estás usando para el PIC18F4550 no es la adecuada.
Si quieres que el CPU trabaje directamente con 4MHz cámbiala por esta otra.
*#fuses NOVREGEN,NOBROWNOUT,NOFCMEN,NOIESO
#use delay(crystal = 4MHZ)*

Cómo en esa configuración que estás usando quedan activos los fuses* IESO* y *FCMEN*,
el oscilador a cristal no está trabajando, lo que está trabajando es el oscilador interno,
y no a la frecuencia de 4MHz que requieres para que tu circuito trabaje correctamente.

Te puedes dar cuenta que si quitas el cristal el PIC sigue trabajando. 
Con la palabra de configuración que te sugerí, eso ya no sucede.
Para utilizar las ventajas del *Fail Safe Monitor* (*FCMEN*) debes configurar el registro *OSCCON*.
En CCS se hace con la instrucción *setup_oscillator();*

Lee la hoja de datos para que tengas una referencia sobre cómo configurar la frecuencia de trabajo.

Suerte.


----------



## Azlan (Feb 13, 2014)

Gracias D@rkbytes pero ya lo hice y nada, el problema esta en que el pic receptor no recibe el "ENTER" que indica que el string finalizo. al pulsar el  botón envió " *printf("hola\n\r");*"; también he probado enviando "*printf("%c%c%c\n\r",Id[0],Id[1],Id[2]);*";  pero si envió únicamente " *printf("\n\r");*";  si funciona e incluso probé enviando después del printf "*putc(13);*" que equivale a CR y nada.


----------



## D@rkbytes (Feb 13, 2014)

Ok, cómo quiera si estaba mal la palabra de configuración. 
No sé que sea realmente lo que quieres hacer, pero si tan sólo quieres que al recibir un dato se encienda un LED, cómo estás usando recepción de datos por interrupción UART, debe actuar con cualquier dato recibido.

Si quieres que el LED se prenda con algún dato especifico, debes usar un If, o un Select Case (Switch).
Y si quieres separar cadenas, puedes usar un bucle For con un array y luego concatenar o comparar los valores de la cadena.

Algo que debes tener en cuenta, es que tanto transmisor cómo receptor deben estar sincronizados en tiempos, de otra forma se pierde información.

Adjunto un ejemplo de recepción de cadenas y su comparación.
No es 100% eficaz, pero te puede dar una idea.


----------

