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

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

Desconectado sauron

  • PIC12
  • **
  • Mensajes: 78
Re: Como puedo recibir datos por rs232?
« Respuesta #15 en: 08 de Junio de 2009, 13:53:08 »
Todos tienen razon, sin el USART no se puede usar la int_RDA, pero usando el codigo de Suky se puede lograr la interrupción deseada. Usando el código funciona perfectamente:

Código: [Seleccionar]
#include <16f84A.h>
#include <string.h>
#use delay(clock=4M)
#fuses NOWDT,NOPUT
#use rs232(baud=9600, xmit=PIN_A0, rcv=PIN_B0, FORCE_SW) //manejo del RS232

char string[30];
char pass[8]="entrar";

#int_EXT
void EXT_isr(void)
{
 gets(string);
}

void main(void)
{
 SET_TRIS_B(0b00000001);
 SET_TRIS_A(0b00000);
 ext_int_edge(H_TO_L);
 enable_interrupts(global);
 enable_interrupts(INT_EXT);
 pedir: printf("\n\rPassword: ");
 delay_ms(5000);          //Espera 5 segundos por el password
 if(!strcmp(string, pass)) //cuando la comparación NO es igual, retorna 1
 {
  printf("\n\rPassword correcto");
  disable_interrupts(global); // apagado del programa
  disable_interrupts(INT_EXT);
//  goto pedir;      //Para que vuelva a pedir el password
 }
 else
 {
  printf("\n\rError, intente de nuevo");
  goto pedir;      //Para que vuelva a pedir el password
 }
}

Ya estoy comprendiendo el uso de las interrupciones :), pero como todo lo nuevo salen las observaciones:
1. Observé que el programa no termina a pesar de que no hay ciclos infinitos, así que le agregué la desactivación de las interrupciones.
2. Si no se pone el salto "goto", luego de que muestra "error" observo que el programa queda allí "en espera" hasta que se presione ENTER para luego volver al delay, esto siempre ocurre con este tipo de interrupción?
3. Interesante prueba de aprendizaje, pero mejor voy a usar un micro que tenga USART para tener mas facilidad

salu2.
« Última modificación: 08 de Junio de 2009, 13:58:39 por sauron »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como puedo recibir datos por rs232?
« Respuesta #16 en: 08 de Junio de 2009, 15:13:47 »
Yo lo haría de la siguiente manera:
Código: C
  1. #include <16f84A.h>
  2. #include <string.h>
  3. #use delay(clock=4M)
  4. #fuses NOWDT,NOPUT
  5. #use rs232(baud=9600, xmit=PIN_A0, rcv=PIN_B0, FORCE_SW) //manejo del RS232
  6.  
  7. char string[30];
  8. char pass[8]="entrar";
  9. int1 kbhit_rs232=0; // Para saber si llego dato desde la PC.
  10.  
  11. #int_EXT
  12. void EXT_isr(void)
  13. {
  14.  gets(string);
  15.  kbhit_rs232=1;
  16. }
  17.  
  18. void main(void)
  19. {
  20.  SET_TRIS_B(0b00000001);
  21.  SET_TRIS_A(0b00000);
  22.  ext_int_edge(H_TO_L);
  23.  enable_interrupts(global);
  24.  enable_interrupts(INT_EXT);
  25.  
  26. while(1){
  27.  printf("\n\rPassword: ");
  28.  while(kbhit_rs232==0){} //Espero a que llegue dato desde la PC.
  29.  kbhit_rs232=0; // Reinicio bandera para proxima espera.
  30.  
  31.  if(!strcmp(string, pass)) //cuando la comparación NO es igual, retorna 1
  32.  {
  33.   printf("\n\rPassword correcto");
  34.   disable_interrupts(global); // apagado del programa
  35.   disable_interrupts(INT_EXT);
  36.  }
  37.  else
  38.  {
  39.   printf("\n\rError, intente de nuevo");
  40.  }
  41. }
  42. }
No contesto mensajes privados, las consultas en el foro

Desconectado sauron

  • PIC12
  • **
  • Mensajes: 78
Re: Como puedo recibir datos por rs232?
« Respuesta #17 en: 08 de Junio de 2009, 20:08:26 »
Yo lo haría de la siguiente manera:

Vale suky que elegancia como lo arreglaste, funciona perfecto!

Hoy fui a buscar el pic 16f876 o parecido para probar en físico, pero lo unico que hay es el 16F84a, con éste ultimo no se pueden conectar dos puertos seriales a la vez verdad?

Gracias!

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Como puedo recibir datos por rs232?
« Respuesta #18 en: 08 de Junio de 2009, 22:37:40 »
Hola!
Fijate si conseguis el 16f628 o el 16f873. Son muy comunes y tienen modulo UART. De ese modo podes implementar un puerto serie por hardware y otro por software.
Suerte!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: Como puedo recibir datos por rs232?
« Respuesta #19 en: 09 de Junio de 2009, 08:00:01 »
wow amigo suky, que hermosa solucion.

Desconectado sauron

  • PIC12
  • **
  • Mensajes: 78
Re: Como puedo recibir datos por rs232?
« Respuesta #20 en: 10 de Junio de 2009, 03:55:21 »
Hola!
Fijate si conseguis el 16f628 o el 16f873. Son muy comunes y tienen modulo UART. De ese modo podes implementar un puerto serie por hardware y otro por software.
Suerte!!

Gracias compañero por la sugerencia, de todas maneras tampoco hay esos modelos, estan agotados, tengo que esperar como una semana a que lleguen, así que mientras llegan estoy simulando.

Quiero comunicar dos dispositivos full duplex, por el momento estoy empezando y uso el 16F876, un puerto por hardware (pines C6 y C7) y el otro por software (pines B0(int) y B1), la interrupción RDA funciona perfecto, pero tengo problemas con la EXT del RB0, ya que la interrupción no funciona correctamente y no recibe los datos como debe. Todo lo estoy probando con proteus y el virtual terminal
Este es el codigo...

Código: [Seleccionar]
#include <16f876.h>
#include <string.h>
#use delay(clock=4M)
#fuses NOWDT,NOPUT,NOPROTECT
#use rs232(STREAM=ALARMA, baud=9600, xmit=PIN_C6, rcv=PIN_C7, parity=N, bits=8)
#use rs232(STREAM=MODEM, baud=9600, xmit=PIN_B2, rcv=PIN_B0, parity=N, bits=8)

char string_alarma[16];
char string_modem[16];
int1 kbhit_alarma=0; // Para saber si llego dato desde la alarma.
int1 kbhit_modem=0; // Para saber si llego dato desde el modem.

#int_RDA
void rda_isr()
{
 gets(string_alarma);
 kbhit_alarma=1;
}
 
#int_EXT
void ext_isr()
{
 gets(string_modem);
 kbhit_modem=1;
}

void main(void)
{
 SET_TRIS_B(0b00000001);
 SET_TRIS_C(0b10000000);
 ext_int_edge(H_TO_L);
 enable_interrupts(int_RDA);
 enable_interrupts(int_EXT);
 enable_interrupts(GLOBAL);
 while(1)
 {
  while(kbhit_alarma==0&&kbhit_modem==0){} //Espero a que llegue dato desde algun dispositivo.
  if(kbhit_alarma)
   fprintf(MODEM,"\n\rEl dato de la alarma fue: %s",string_alarma);
  if(kbhit_modem)
   fprintf(ALARMA,"\n\rEl dato del modem fue: %s",string_modem);
  kbhit_alarma=0;
  kbhit_modem=0; // Reinicio bandera para proxima espera.
 }
}

La idea es escribir en un virtual terminal y que el otro lo reciba y viceversa, pero solo uno escribe y funciona (int_rda) y el otro no (int_ext).

Gracias compañeros por las sugerencias, anexo el esquemático con el cof, hex y demás por si quieren probarlo, no se ve complicado pero bendita ignorancia :) ...disculpen tantas preguntas pero llega un momento donde uno se traba
« Última modificación: 10 de Junio de 2009, 03:59:13 por sauron »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como puedo recibir datos por rs232?
« Respuesta #21 en: 10 de Junio de 2009, 14:18:25 »
Faltaba colocar con que puerto recibir los datos:
Código: C
  1. #int_EXT
  2. void ext_isr()
  3. {
  4.  gets(string_modem,MODEM);
  5.  kbhit_modem=1;
  6. }
  7.  
  8. #int_RDA
  9. void rda_isr()
  10. {
  11.  gets(string_alarma,ALARMA);
  12.  kbhit_alarma=1;
  13. }

Y cuando se devolvían los datos estaban invertidos la selección de puertos:

Código: C
  1. if(kbhit_alarma){
  2.    fprintf(ALARMA,"\n\rEl dato de la alarma fue: %s",string_alarma);}
  3.   if(kbhit_modem){
  4.    fprintf(MODEM,"\n\rEl dato del modem fue: %s",string_modem);}
No contesto mensajes privados, las consultas en el foro

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Como puedo recibir datos por rs232?
« Respuesta #22 en: 10 de Junio de 2009, 14:31:37 »
El stream seria como un descriptor para saber por donde se tienen q recibir o enviar los datos?

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como puedo recibir datos por rs232?
« Respuesta #23 en: 10 de Junio de 2009, 15:03:27 »
El stream seria como un descriptor para saber por donde se tienen q recibir o enviar los datos?
Exactamente!
No contesto mensajes privados, las consultas en el foro

Desconectado sauron

  • PIC12
  • **
  • Mensajes: 78
Re: Como puedo recibir datos por rs232?
« Respuesta #24 en: 10 de Junio de 2009, 16:07:54 »
Faltaba colocar con que puerto recibir los datos:

Vale compañero Suky mas que agradecido, mas conocimiento al respecto y menos ignorancia, hice la corrección y funciona perfecto, ya con ésto tengo la base para comunicar los dos dispositivos....gracias! :-/

Ahora siguiendo con este asunto de la comunicación, ¿Alguien ha trabajado con el RTS y CTS aqui en lenguaje C?
« Última modificación: 10 de Junio de 2009, 17:26:31 por sauron »

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Como puedo recibir datos por rs232?
« Respuesta #25 en: 10 de Junio de 2009, 23:02:43 »
El stream seria como un descriptor para saber por donde se tienen q recibir o enviar los datos?
Exactamente!

Muchas gracias por aclararme la duda Suky!! :D

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como puedo recibir datos por rs232?
« Respuesta #26 en: 11 de Junio de 2009, 01:28:36 »
El stream seria como un descriptor para saber por donde se tienen q recibir o enviar los datos?
Exactamente!

Muchas gracias por aclararme la duda Suky!! :D
De nada!  :D  :D
No contesto mensajes privados, las consultas en el foro

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Como puedo recibir datos por rs232?
« Respuesta #27 en: 28 de Junio de 2009, 20:13:59 »
 hola a todos resulta q estoy tratando de probrar un ejemplo de los programas del compañero vszener, pero no me funciona
este es el cogido q tengo, identificas alguna falla?, practicamente no cambie nada del programa q hizo vazener
Código: CSS
  1. #include "C:\Archivos de programa\PICC\Projects\pruebaRS232.h"
  2.  
  3.  
  4. void main()
  5. {
  6.  
  7.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  8.    setup_adc(ADC_OFF);
  9.    setup_spi(SPI_SS_DISABLED);
  10.    setup_wdt(WDT_OFF);
  11.    setup_timer_0(RTCC_INTERNAL);
  12.    setup_timer_1(T1_DISABLED);
  13.    setup_timer_2(T2_DISABLED,0,1);
  14.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  15.    setup_comparator(NC_NC_NC_NC);
  16.    setup_vref(FALSE);
  17.    setup_oscillator(OSC_4MHZ|OSC_TIMER1|OSC_31250|OSC_PLL_OFF);
  18.    
  19.    SET_TRIS_B(0X00);
  20.    OUTPUT_B(0X00);
  21.    // TODO: USER CODE!!
  22.  
  23. PUTS("PRUEBA DEL PUERTO SERIE  ");
  24. PUTS("MENU");
  25. PUTS("[1]PRENDER LED 1"); // \r PERMITE EL CAMBIO DE LINEA
  26. PUTS("[2]PRENDER LED 2");
  27. PUTS("[3]PRENDER LED 3");
  28. PUTS("[4]PRENDER LED 4");
  29.  
  30.        
  31.  
  32. FOR(;;)
  33. {
  34.    switch(getc())//coge tecla
  35.    {
  36.       case '1':output_high(pin_B0);
  37.       delay_ms(500);
  38.       output_low(PIN_B0);
  39.       break;
  40.      
  41.       case '2': output_high(PIN_B1); //led on verde
  42.       delay_ms(500);
  43.       output_low(PIN_B1);
  44.       break;
  45.      
  46.       case '3': output_high(PIN_B2); //led on rojo
  47.       delay_ms(500);
  48.       output_low(PIN_B2);
  49.       break;
  50.      
  51.       case '4': output_high(PIN_B3); //led on amarillo
  52.       delay_ms(500);
  53.       output_low(PIN_B3);
  54.    }
  55. }//FIN FOR INFINITO
  56.    
  57.  
  58. }//FIN MAIN
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como puedo recibir datos por rs232?
« Respuesta #28 en: 28 de Junio de 2009, 22:43:29 »
En ese código no veo error, muéstranos el código de pruebaRS232.h.
No contesto mensajes privados, las consultas en el foro

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Como puedo recibir datos por rs232?
« Respuesta #29 en: 28 de Junio de 2009, 22:47:56 »
este?
Código: CSS
  1. #include <18F2550.h>
  2. #device adc=8
  3.  
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  6. #FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
  7. #FUSES NOPROTECT                //Code not protected from reading
  8. #FUSES BROWNOUT                 //Reset when brownout detected
  9. #FUSES BORV20                   //Brownout reset at 2.0V
  10. #FUSES NOPUT                    //No Power Up Timer
  11. #FUSES NOCPD                    //No EE protection
  12. #FUSES NOSTVREN                 //Stack full/underflow will not cause reset
  13. #FUSES NODEBUG                  //No Debug mode for ICD
  14. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  15. #FUSES NOWRT                    //Program memory not write protected
  16. #FUSES NOWRTD                   //Data EEPROM not write protected
  17. #FUSES NOIESO                   //Internal External Switch Over mode disabled
  18. #FUSES NOFCMEN                  //Fail-safe clock monitor disabled
  19. #FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
  20. #FUSES NOWRTC                   //configuration not registers write protected
  21. #FUSES NOWRTB                   //Boot block not write protected
  22. #FUSES NOEBTR                   //Memory not protected from table reads
  23. #FUSES NOEBTRB                  //Boot block not protected from table reads
  24. #FUSES NOCPB                    //No Boot Block code protection
  25. #FUSES MCLR                     //Master Clear pin enabled
  26. #FUSES LPT1OSC                  //Timer1 configured for low-power operation
  27. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  28. #FUSES PLL12                    //Divide By 12(48MHz oscillator input)
  29. #FUSES CPUDIV4                  //System Clock by 4
  30. #FUSES USBDIV                   //USB clock source comes from PLL divide by 2
  31. #FUSES VREGEN                   //USB voltage regulator enabled
  32.  
  33. #use delay(clock=4000000)
  34. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA


 

anything