Autor Tema: AYUDA RS232 con 16f877  (Leído 4911 veces)

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

Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
AYUDA RS232 con 16f877
« en: 25 de Mayo de 2009, 00:09:15 »
hola a todo, estoy teniendo problemas para enviar un mensaje de PIC a PIC, solo quiero enviar una cadena de caracteres algo asi como "HOLA A TODOS" pero solo llega la primera letra.

Les explico mejor, quiero que un PIC me funcione como una interface entre un lector de codigo de barras RS232 y una PC, entonces yo hago la simulacion con un PIC 16f877a del lector de codigo de barras y esta informacion la recibe otro PIC 16f877a y luego la envia por otros pines RS232 a un hyperterminal, pero solamente me estan llegando la primera letra de un mensaje o un numero del 0 a 9, si envio el 10 me llega el 1 solamente, y si envio un mensaje "HOLA" solo llega la H.

Me gustaria que me ayudaran a recibir una cadena de caracteres y numeros tipo long por rs232.

Desde ya gracias!!

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: AYUDA RS232 con 16f877
« Respuesta #1 en: 25 de Mayo de 2009, 00:34:54 »
seria bueno q postee el codigo
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
Re: AYUDA RS232 con 16f877
« Respuesta #2 en: 25 de Mayo de 2009, 09:51:25 »
Hola a todos,

bueno la primera parte simulo un lector de codigo de barra que se comunica por rs232 ASCII, no se que protocolo usa porque hasta el miercoles es que puedo empezar hacer pruebas.

De todas formas quiero ganarle tiempo al tiempo y decidí empezar a enviar informacion entre dos PIC uno simulando el lector de codigo (LR) y otro que me hace la interface entre LR y un Computador que llamo RS232. MI PROBLEMA es que solo puedo enviar 1 letra o un digito. que estoy haciendo mal? aca estan los codigos:

CODIGO DEL LECTOR:
Código: [Seleccionar]
#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
int c1;

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   while(true){
   
      if(input(PIN_B0)){
         c1=5;
         puts("1");
         while(input(pin_b0)){\\ANTIREBOTE
         }
         
      }
     
      if(input(PIN_B1)){
         c1=8;
         puts("2");
         while(input(pin_b1)){
         
         }
      }
     
      if(input(PIN_B2)){
         c1=7;
         puts("3");
         while(input(pin_b2)){
         }
         
      }
     
   }

}

EL CODIGO DE LA INTERFASE:

Código: [Seleccionar]
#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected

#use delay(clock=4000000)
#use rs232(stream=PC,baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use rs232(stream=LR,baud=9600,parity=N,xmit=PIN_C4,rcv=PIN_C5,bits=8)
#include "flex_lcd.c"
char c;


void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   c=0;
   lcd_init();
   
   while(TRUE){
   
      c=getc(LR);
     
      if(c!=0){
         
         fprintf(PC,"\fRecibe:%d",c);\\mostrar en el PC
         printf(lcd_putc,"\fRecibe:%d",c);\\mostrar en lcd
         
      }
     
   }


}

No se que estoy haciendo mal, pero solo puedo enviar 1 solo digito, me gustaria enviar un numero tipo long o depronto mas largo, ya que no se a que me voy a enfrentar cuando tenga el lector de codigo.

en todo caso me gustaria enviar y recibir cualquier cosa tipo char, int, long, long long sin ningun problema y de principio a fin.

Desde ya gracias!!
« Última modificación: 25 de Mayo de 2009, 10:20:17 por fidodido18 »

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: AYUDA RS232 con 16f877
« Respuesta #3 en: 25 de Mayo de 2009, 10:45:32 »
Hola.

Seria mejor que uses interrupciones para la recepcion. De esa manera puedes ir guardando en un bufer todo la que vaya llegando.

Código: C#
  1. #int_RDA
  2. void recepcion (void)
  3. {
  4.  if(kbhit())
  5.  {
  6.    Bufer[contador++]=getc();
  7.  }
  8. }


Que lector estas usando? Tienes alguna ficha tecnica? He oido que algunos se comunican por PS2

Saludos.
El papel lo aguanta todo

Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
Re: AYUDA RS232 con 16f877
« Respuesta #4 en: 25 de Mayo de 2009, 10:54:25 »
Hola.

Seria mejor que uses interrupciones para la recepcion. De esa manera puedes ir guardando en un bufer todo la que vaya llegando.


gracias MLO, esto quiere decir que no puedo recibir un mensaje o un numero y almacenarlo en una sola variable? cuando se hace de PIC a PIC?

no tengo el manual tecnico del lector de codigo de barras, pero es por rs232 estoy a la espera de uno que me van a facilitar y que me tocará explorar...

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: AYUDA RS232 con 16f877
« Respuesta #5 en: 25 de Mayo de 2009, 10:58:58 »
Hola.

La confusion es en el manejo del serial. El serial envia bytes, para enviar un float, por ejemplo, se necesitan 4 bytes, lo cual no alcanza en el bufer de recepcion del PIC, por lo tanto se envia mejor strings que son arreglos de bytes.

Ya habiendo recibido el string correspondiente tu puedes convertirlo a float o long o a lo que gustes.
El papel lo aguanta todo

Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
Re: AYUDA RS232 con 16f877
« Respuesta #6 en: 25 de Mayo de 2009, 11:16:15 »
Hola.

La confusion es en el manejo del serial. El serial envia bytes, para enviar un float, por ejemplo, se necesitan 4 bytes, lo cual no alcanza en el bufer de recepcion del PIC, por lo tanto se envia mejor strings que son arreglos de bytes.

Ya habiendo recibido el string correspondiente tu puedes convertirlo a float o long o a lo que gustes.

ok, pero lo que pasa es que solamente estoy recibiendo de a digito, es decir todavia no he podido enviar el numero 10 o el numero 254, o un mensaje que diga "HOLA" si me explico?

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: AYUDA RS232 con 16f877
« Respuesta #7 en: 25 de Mayo de 2009, 11:21:15 »
Pues para enviar es mas sencillo todavia !!!!

Código: [Seleccionar]
printf("Hola");
Y listo.

Si quieres enviar un float por ejemplo -guardado en la variable valor-:
Código: [Seleccionar]
printf("Float: %f", valor);
Saludos
El papel lo aguanta todo

Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
Re: AYUDA RS232 con 16f877
« Respuesta #8 en: 25 de Mayo de 2009, 11:33:01 »
Pues para enviar es mas sencillo todavia !!!!

Código: [Seleccionar]
printf("Hola");
Y listo.

Si quieres enviar un float por ejemplo -guardado en la variable valor-:
Código: [Seleccionar]
printf("Float: %f", valor);
Saludos

Gracias de nuevo MLO, listo ahora que enviaste
Código: [Seleccionar]
printf("Float: %f", valor); como se recibe? ya que enviaste la palabra "float" y luego el valor.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: AYUDA RS232 con 16f877
« Respuesta #9 en: 25 de Mayo de 2009, 11:45:20 »
 :-) :-)

Se recibe mediante interrupciones, como te lo explique arriba.

Por ejemplo: Vamos a enviar el numero 2.45 guardado en valor. Para enviarlo usamos el socorrido printf();
Código: [Seleccionar]
printf("Float: %f", valor);
Esto hace que se envie por medio del serial un arreglo de bytes de la siguiente manera:
Código: C#
  1. {'F','l','o','a','t',':',' ','2','.','4','5',\0}

Por lo tanto el receptor tiene que guardar en el bufer de almacenamiento que llamaremos Bufer[] todos esos bytes. Cada vez que llega un nuevo byte al bufer de recepcion del serial se activa la interrupcion y procederemos a llenar la variable Bufer[]. Al final del envio, tendremos almacenado en la variable Bufer[] lo enviado por el emisor:
Código: C#
  1. Bufer[]={'F','l','o','a','t',':',' ','2','.','4','5',\0}

Saludos
El papel lo aguanta todo

Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
Re: AYUDA RS232 con 16f877
« Respuesta #10 en: 25 de Mayo de 2009, 11:54:14 »
:-) :-)

Jajaja a veces necesito un poco de plastilina para entender :D

bueno lastima que no puedo almacenarla en una sola variable, me tocara detectar cuantos bytes envia el lector y reenviarlos al PC...

Gracias de nuevo!! por fin entendi :-/

Una pregunta mas MLO y en caso que tenga un lector de codigo de barra por USB se complica aun mas la cosa? o practicamente es igual?

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: AYUDA RS232 con 16f877
« Respuesta #11 en: 25 de Mayo de 2009, 12:28:15 »
Hola.

Ahi no podras hacer nada con PICs ya que los pics que tienen USB no son concentradores son solo esclavos....

Tu si puedes guardar en una variable lo enviado por el serial, en lugar de enviar "Float %f" puedes enviar "%f" con lo que el bufer solo tendra el string de la variable valor, de ahi, solo bastará convertir el string en float y listo.

saludos
El papel lo aguanta todo

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 439
    • Mcu Tronics
Re: AYUDA RS232 con 16f877
« Respuesta #12 en: 17 de Octubre de 2012, 19:48:34 »
MLO estoy teniendo un problema con un lector de codigos de barras podrias indicarme como tendria que ser la recepcion en el PIC,estoy recibiendo 8bytes numericos,te lo agradesco
Nunca se deja de aprender

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: AYUDA RS232 con 16f877
« Respuesta #13 en: 17 de Octubre de 2012, 20:46:56 »
Hola.

Pues, la mejor manera seria usando la interrupcion USART ... cada byte enviado lo guardas en un buffer ;)

Saludos
El papel lo aguanta todo


 

anything