Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

14/04/2010 #1


PIC16F887 Tx de cadenas por RS232
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.
15/04/2010 #2

Avatar de FRYCK

Respuesta: PIC 16F887 Tx DE CADENAS POR RS232
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,bi ts=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
15/04/2010 #3

Avatar de tecnogirl

Respuesta: PIC 16F887 Tx DE CADENAS POR RS232
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
15/04/2010 #4


Respuesta: PIC 16F887 Tx DE CADENAS POR RS232
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
16/04/2010 #5

Avatar de Moyano Jonathan

Respuesta: PIC 16F887 Tx DE CADENAS POR RS232
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.
12/02/2014 #6


Recepcion de un String por RS232
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
12/02/2014 #7
Moderador

Avatar de D@rkbytes

Azlan dijo: Ver Mensaje
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.
13/02/2014 #8


Recepción de un String por RS232
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.
13/02/2014 #9
Moderador

Avatar de D@rkbytes

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.
Archivos Adjuntos
Tipo de Archivo: rar 16F628A Recibir cadenas.rar (59,1 KB (Kilobytes), 233 visitas)
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.