PIC16F887 Tx de cadenas por RS232

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

Adjuntos

#2
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
 
Última edición:
#3
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
 
#5
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.
 
#6
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:

Código:
#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:
Código:
#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
 
Última edición:
#7
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. :cool:
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.
 
Última edición:
#8
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.
 
#9
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.
 

Adjuntos

Última edición:
Arriba