Autor Tema: Como puedo recibir datos por rs232?  (Leído 19932 veces)

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

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Como puedo recibir datos por rs232?
« Respuesta #30 en: 23 de Julio de 2009, 18:05:48 »
resulta q tengo un problema, estoy ensayando comunicar 2 pic mediante RS232 lei estepost de don Diego para iniciarme, en principio tengo en un PIC dos entradas analogas y mostrando por Lcd el valor del las conversiones y el voltaje, adicionalmente envio el valor de una de las conversiones(valor del ADC) hacia el otro, este PIC debe mostrarse en el Lcd el valor recibido. Pues bien el segundo pic no muestra el valor recibido y siempre muestra un 10.. le pongo el virtual terminal al primer pic y  sale el valor correcto, pero cuando quiero mostrar en el otro ahí esta el problema..entonces no doy con el error,,no se si seran los formatos para las variables.

adjunto el codigo,supongo que lo q no he de utilizar no ha de causar problema.

Codigo primer PIC, convierte AN0 AN1 y muestra en LCD, Envia valor ADC
Código: CSS
  1. #include "flex_lcd.c"
  2.  
  3.  
  4. /* #######################INTERRUPCIONES##########################
  5. #int_RB              //CAMBIO DE NIBBLE
  6. void  RB_isr(void)
  7. {
  8.  
  9. }
  10.  
  11. #int_EXT
  12. void  EXT_isr(void)
  13. {
  14.  
  15. }
  16.  
  17. #int_RDA             //INTERRUPCION POR RECEPCION SERIE
  18. void  RDA_isr(void)
  19. {
  20.  
  21. }
  22.          
  23. #int_TIMER0          //INTERRUCPION DESBORDAMIENTO TMR0
  24. void  TIMER0_isr(void)
  25. {
  26.  
  27. }
  28.  
  29. #####################################################################*/
  30.  
  31. int8 O,Q;
  32. FLOAT P,R;
  33. void main()
  34. {
  35.  
  36.    setup_adc_ports(AN0_AN1_VREF_VREF);
  37.    setup_adc(ADC_CLOCK_DIV_8);
  38.    setup_psp(PSP_DISABLED);
  39.    setup_spi(SPI_SS_DISABLED);
  40.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  41.    setup_timer_1(T1_DISABLED);
  42.    setup_timer_2(T2_DISABLED,0,1);
  43.    setup_comparator(NC_NC_NC_NC);
  44.    setup_vref(FALSE);
  45.    enable_interrupts(INT_RB);
  46.    enable_interrupts(INT_EXT);
  47.    enable_interrupts(INT_RDA);
  48.    enable_interrupts(INT_TIMER0);
  49.    //enable_interrupts(GLOBAL);
  50.  
  51.  
  52.    
  53.    LCD_INIT();
  54.    LCD_PUTC("PRUEBA LCD");
  55.    DELAY_MS(1000);
  56.    LCD_PUTC("\f");
  57.    FOR(;;)
  58.    {
  59.    SET_ADC_CHANNEL(0);
  60.    DELAY_US(20);
  61.    Q=READ_ADC();
  62.    SET_ADC_CHANNEL(1);
  63.    DELAY_US(20);
  64.    O=READ_ADC();
  65.    P=(5.0*Q)/255.0;
  66.    R=(5.0*O)/255.0;
  67.    PRINTF(LCD_PUTC,"\fADC'S=%u  %u",Q,O);
  68.    PRINTF(LCD_PUTC,"\nV1=%1.2fV V2=%1.2fV",P,R);
  69.    PRINTF("%u\r\n",Q);
  70.    DELAY_MS(500);
  71.    }//FIN DEL FOR
  72.    
  73.    
  74.  
  75. }//FIN DEL MAIN

Este es el codigo del PIC que deberia recibir y mostrar en LCD el dato del ADC
Código: CSS
  1. #INCLUDE "FLEX_LCD.C"
  2.  
  3. int8 C=0;
  4. /*#int_RB   ####################INTERRUPCIONES#################################
  5. void  RB_isr(void)
  6. {
  7.  
  8. }*/
  9.  
  10. /*#int_EXT
  11. void  EXT_isr(void)
  12. {
  13.  
  14. }*/
  15.  
  16. #int_RDA
  17. void  RDA_isr(void)
  18. {
  19. C=GETC();
  20. }
  21.  
  22. /*#int_TIMER0
  23. void  TIMER0_isr(void)
  24. {
  25.  
  26. }
  27.  #################### #################### #################### ####################*/
  28.  
  29.  
  30. void main()
  31. {
  32.  
  33.    setup_adc_ports(NO_ANALOGS);
  34.    setup_adc(ADC_OFF);
  35.    setup_psp(PSP_DISABLED);
  36.    setup_spi(SPI_SS_DISABLED);
  37.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  38.    setup_timer_1(T1_DISABLED);
  39.    setup_timer_2(T2_DISABLED,0,1);
  40.    setup_comparator(NC_NC_NC_NC);
  41.    setup_vref(FALSE);
  42.   // enable_interrupts(INT_RB);
  43.   // enable_interrupts(INT_EXT);
  44.    enable_interrupts(INT_RDA);
  45.   // enable_interrupts(INT_TIMER0);
  46.    
  47.  
  48.    
  49.    LCD_INIT();
  50.    enable_interrupts(GLOBAL);
  51.    FOR(;;)
  52.    {
  53.    PRINTF(LCD_PUTC,"\f%u",C);
  54.    DELAY_MS(500);
  55.    }
  56.    
  57.  
  58. }//FIN DEL MAIN

De antemano gracias por la ayuda
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado wbg666

  • PIC10
  • *
  • Mensajes: 3
Re: Como puedo recibir datos por rs232?
« Respuesta #31 en: 25 de Julio de 2009, 22:58:15 »
hola soy estudiante de electronica
y le comento que si hay una solucion para poder conectar varios elementos que utilicen rs232 al mismo pic.
bueno esto se logra con la utilizacion de and haciendo como un tipo de mux
es muy sencillo y sirve para muchos proyectos y asi no utilizar varios pic para conectar cada dispositivo
las and se conectan al pic haciendolas que actuen como interruptores, y desde el programa se activa la que pertenesca al dispositivo que se quiere resivir o enviar datos
espero sus dudas o comentarios

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Como puedo recibir datos por rs232?
« Respuesta #32 en: 26 de Julio de 2009, 11:00:23 »
Esta muy interesante la solucion.

Creo que la mejor opcion seria usar varias USAR por soft, de esta manera ahorramos pines.

jhozate:

En el PIC de recepcion, usa la funcion kbhit(); antes de obtener el dato:
Código: [Seleccionar]
if(kbhit())
{
 c = getc();
}

Los baud rate de los dos micros deben ser los mismos para que halla una buena comunicacion.

Saludos
El papel lo aguanta todo

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como puedo recibir datos por rs232?
« Respuesta #33 en: 26 de Julio de 2009, 12:20:05 »
En el PIC de recepcion, usa la funcion kbhit(); antes de obtener el dato:
Código: [Seleccionar]
if(kbhit())
{
 c = getc();
}

MLO_, si se usa interrupción esto no es necesario para un solo dato. Porque si se genera quiere decir que se ha recibido un dato. En cambio si se recibe varios datos consecutivos con la interrupción del primero, en ese si a partir del segundo utilizamos kbhit()

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Como puedo recibir datos por rs232?
« Respuesta #34 en: 26 de Julio de 2009, 14:18:11 »
como asi...la entrada a la interrupcion solo me serviria una vez y luego habria que usar el KBHIT, segun he visto el KBHIT se usa cuando no se quiere recurrir a la interrupcion pero su uso dejaria al programa en un bucle en espera de la llegada de un dato.
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Como puedo recibir datos por rs232?
« Respuesta #35 en: 26 de Julio de 2009, 14:49:01 »
Pues algo lei que es asi ...

De todas maneras, yo prefiero ponerlo, no esta demas.

Es preferible usar banderas o flags en la interrupcion RDA y reemplazar ese delay_ms(500) por una espera a cambio de flag.
El papel lo aguanta todo

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: Como puedo recibir datos por rs232?
« Respuesta #36 en: 28 de Julio de 2009, 10:17:25 »
amigo suky te refieres a que el kbhit, serviria cuando este recepcionando dato2(en el ejemplo de abajo), de ahi en adelante si se reciben mas datos.?

if (kbhit)
{
dato1=getc();
dato2=getc();
dato3=getc();

}

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: Como puedo recibir datos por rs232?
« Respuesta #37 en: 28 de Julio de 2009, 10:19:40 »
que raro, supongo que te he entendido mal, porque el kbhit se evalua cuando ocurre la primera recepcion de datos

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Como puedo recibir datos por rs232?
« Respuesta #38 en: 29 de Julio de 2009, 16:01:55 »
sigo sin poder mostrar el dato que me envia el otro pic utilizando la USART, no se si el problema es de los formatos de las variables, el lcd siempre me muestra el numero 10. Basicamente lo que trato de enviar es el dato de la conversion AD(8bits).
adjunto mis archivos y tambien la simulacion

saludos
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Como puedo recibir datos por rs232?
« Respuesta #39 en: 29 de Julio de 2009, 16:29:51 »
Hola.

Le mejor opcion es asignar un flag de recepcion en la rutina de la interrupcion serial y en el main desplegar la variable cuando el flag este en TRUE. Esta espera se haria por medio de un while:

Código: [Seleccionar]
while(!FlagDatoOk);
Saludos
El papel lo aguanta todo

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Como puedo recibir datos por rs232?
« Respuesta #40 en: 29 de Julio de 2009, 16:43:28 »
hice esto en la interrupcion
Código: CSS
  1. #int_RDA
  2. void  RDA_isr(void)
  3. {
  4. if(kbhit())
  5.    {
  6.    FlagDatoOk=1;
  7.    c = getc();
  8.    }
  9.    ELSE
  10.    FlagDatoOk=0;
  11. }

en el main asi:
Código: CSS
  1. DO
  2.    {
  3.    PRINTF(LCD_PUTC,"\f%U",C);
  4.    }
  5.    while(!FlagDatoOk);

sin embargo cuando simulo la simulacion se pausa, pero no muestra error..pero no funciona

tengo una duda conceptual, hacer !FlagDatoOk quiere decir que "haga mientras FlagDatoOk es diferente de cero" o "haga mientras !FlagDatoOk es falso" (¿ "lo mismo" es diferentes palabras? ), ¿es lo mismo que poner FlagDatoOk!=0; ?
« Última modificación: 29 de Julio de 2009, 16:56:47 por jhozate »
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Como puedo recibir datos por rs232?
« Respuesta #41 en: 29 de Julio de 2009, 23:13:35 »
Hola.

El else dentro de la interrupcion no es necesario. Para poner a ceros el flag, se haria en el main, luego de la espera del while.

El while trabaja mientras lo que este entre sus parentesis sea 1. Como FlagDataOk=0, !FlagDataOk=1, por lo tanto, se mantendra en el ciclo while, el cual no hace si no esperar (por eso esta: while(!FlagDataOk);) hasta que cambia en la interrupcion.

Código: [Seleccionar]
while(true)
{
 printf(lcd_putc,"\f%u",c);//Imprimo el dato en la LCD
 while(!FlagDataOk);//Espero al cambio en la interrupcion
 FlagDataOk=0;//Clareo el flag
}

La interrupcion seria:
Código: [Seleccionar]
#int_RDA
void RDA_isr(void)
{
 if(kbhit())
 {
  c=getc();
  FlagDatoOk=1;
 }
}

Saludos
El papel lo aguanta todo

Desconectado RB2000

  • PIC10
  • *
  • Mensajes: 18
Re: Como puedo recibir datos por rs232?
« Respuesta #42 en: 25 de Septiembre de 2009, 04:12:00 »
Hola Suky:
Estoy probando los ejemplos del foro de todopic.
Iba  bien hasta que intenté interconectar el PIC con la PC a través de
RS232.

Con  el  hyperterminal  de  Windows  XP  va  todo bien. Puedo enviar o
recibir  desde  la  PC  y  el  PIC  recibe  los  comandos, ejecuta las
instrucciones y envía el retorno.

Mi problema es que quiero hacerlo a través de C (en la PC).
Vi algunos ejemplos pero casi todos usan el turbo C de Borland y tiene
una librería (conio) que permite usar el puerto serie en C.

Yo  uso  un compilador DEV -C++ y si bien encontré una emulación de la
librería  conio,  no es completa y casualmente no incluye la emulación
del manejo del puerto serial que sí tiene la conio de Borland.

Si pudieras orientarme cómo empezar te lo agradeceré.

Muchas gracias desde ya.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como puedo recibir datos por rs232?
« Respuesta #43 en: 25 de Septiembre de 2009, 09:33:17 »
Hola RB2000, no voy a poder ayudarte porque en PC programo con Visual Studio, ya sea en VB o C# o en LabWindows.  :? Puedes buscar en el subforo Lenguaje C para PC y sus variantes y si no encuentras lo necesario crear un tema allí con tu duda especifica.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado RB2000

  • PIC10
  • *
  • Mensajes: 18
Re: Como puedo recibir datos por rs232?
« Respuesta #44 en: 02 de Octubre de 2009, 02:10:23 »
Muchas gracias Suky, voy para allí.  :lol:


 

anything