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

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

Desconectado sauron

  • PIC12
  • **
  • Mensajes: 78
Como puedo recibir datos por rs232?
« en: 04 de Junio de 2009, 19:24:55 »
Hola compañeros foristas.
Al ser mi primer post es mi deber presentarme, soy estudiante de electrónica y estoy entrando al mundo de los pic.

He estado practicando la comunicación pic-pc y tengo una duda que gracias de antemano me la puedan aclarar:

Para practicar estoy usando el 16f84a, mi duda es: ¿Como puedo recibir una cadena de caracteres (por rs232) para compararlo con el pic?, por ejemplo: Deseo que el pic reciba "soy yo" y lo compare, es decir, la oración completa y no un solo caracter, y luego al ser positiva la comparación pues el pic dirá que fue correcta.
Ya he practicado y me ha funcionado cuando se trabaja con un solo caracter, pero la duda es con una cadena completa.

Gracias compañeros y seguiré en esta gran comunidad. :o

salu2
« Última modificación: 04 de Junio de 2009, 19:35:01 por sauron »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como puedo recibir datos por rs232?
« Respuesta #1 en: 05 de Junio de 2009, 02:19:06 »
Este es un ejemplo que trae el PICC:

Código: C
  1. char string[30];
  2.  
  3. printf("Password: ");
  4.  
  5. gets(string);
  6.  
  7. if(strcmp(string, password)){ //Compara con el real con el ingresado.
  8.    printf("OK");
  9. }
No contesto mensajes privados, las consultas en el foro

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Como puedo recibir datos por rs232?
« Respuesta #2 en: 05 de Junio de 2009, 02:37:44 »
Como envias "sos vos", esto quedara guardado en el bufer string[30] byte a byte: {'s','o','s',' ','v','o','s',\0}.

Es decir, recibes caracter a caracter por medio de la interrupcion y cada caracter lo vas añadiendo al bufer para luego hacer la comparacion.
El papel lo aguanta todo

Desconectado sauron

  • PIC12
  • **
  • Mensajes: 78
Re: Como puedo recibir datos por rs232?
« Respuesta #3 en: 05 de Junio de 2009, 19:00:54 »
Vale compañeros muy agradecido por la aclaración, a la vez voy a usar de ahora la ayuda del picc (gracias Suky).

Tambien MLO gracias por la explicación interna.

Para quien le pueda interesar sobre la función gets, adjunto un simple código que hice como ejemplo...

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_A1, FORCE_SW) //manejo del RS232

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

void main(void){
 SET_TRIS_A(0b00010);
 while(1){
  printf("\n\rPassword: "); // el password es: entrar
  gets(string);
  if(!strcmp(string, pass))  // cuando la comparación NO es igual, retorna 1
   printf("\n\rPassword correcto");
  else
   printf("\n\rError, intente de nuevo");
 }
}

Como tengo que trabajar con el RS232, voy a empezar a meterme con las interrupciones, si me pudieran dar una guía para empezar muy agradecido, ya que meterme de una con (por ejemplo) int_RDA que creo que es para el RS232, para uno que no tiene idea es complicado al no entender, gracias ignorancia :D.


salu2.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Como puedo recibir datos por rs232?
« Respuesta #4 en: 05 de Junio de 2009, 22:51:18 »
Hola.

Para el manejo de la interrupcion seria asi -lo pones antes del void main (void)-

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

y en el main habilitas la interrupcion con enable_interrupts(INT_RDA);

Saludos
El papel lo aguanta todo

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como puedo recibir datos por rs232?
« Respuesta #5 en: 06 de Junio de 2009, 01:13:16 »
Código: C#
  1. #int_RDA
  2. void serial_isr(void)
  3. {    
  4.   gets(string);
  5. }

Utilizando gets creo que así debería funcionar. Y para la habilitación de interrupciones no te olvides también de enable_interrupts(GLOBAL).
No contesto mensajes privados, las consultas en el foro

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: Como puedo recibir datos por rs232?
« Respuesta #6 en: 06 de Junio de 2009, 22:03:10 »
hola , al ver esta instruccion me causo extrañeza
#use delay(clock=4M)
funciona asi, o lo correcto seria
#use delay(clock=4000000)?
lo he compilado en ccs y no funciona

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como puedo recibir datos por rs232?
« Respuesta #7 en: 06 de Junio de 2009, 22:06:48 »
Siempre he usado la última opción :wink:
No contesto mensajes privados, las consultas en el foro

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Como puedo recibir datos por rs232?
« Respuesta #8 en: 06 de Junio de 2009, 22:57:42 »
Eso depende de la version, yo he usado las dos y me funcionan sin problemas.
El papel lo aguanta todo

Desconectado sauron

  • PIC12
  • **
  • Mensajes: 78
Re: Como puedo recibir datos por rs232?
« Respuesta #9 en: 07 de Junio de 2009, 01:06:31 »
Probando el codigo de la interrupción, por mas que le he dado vuelta, el CCS siempre dice:
"Invalid Pre-Processor directive", es decir, error con la #int_rda, sera por el 16f84a?, ya he visto varios ejemplos en el foro con la int_rda y pues he escrito el codigo bien, tambien según lo que me han dicho ustedes.
« Última modificación: 07 de Junio de 2009, 02:48:05 por sauron »

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: Como puedo recibir datos por rs232?
« Respuesta #10 en: 08 de Junio de 2009, 02:00:18 »
pero si el 16f84a no tiene implementado por hardware el puerto usart por lo tanto no puede generar interrupcion #rda, sera por eso?

Desconectado sauron

  • PIC12
  • **
  • Mensajes: 78
Re: Como puedo recibir datos por rs232?
« Respuesta #11 en: 08 de Junio de 2009, 02:10:26 »
pero si el 16f84a no tiene implementado por hardware el puerto usart por lo tanto no puede generar interrupcion #rda, sera por eso?

Tambien estaba pensando eso, esperar que lo confirmen los expertos :)

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Como puedo recibir datos por rs232?
« Respuesta #12 en: 08 de Junio de 2009, 02:16:24 »
Bueno, no soy un experto pero el 16F84A no tiene USART, por lo tanto no se puede usar la #int_RDA. Para saber que interrupciones posee el micro se revisa el .h del micro respectivo.
El papel lo aguanta todo

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: Como puedo recibir datos por rs232?
« Respuesta #13 en: 08 de Junio de 2009, 02:17:02 »
es por eso amigo, lo que generan interrupciones en el pic son los perifericos de estos, en este caso, el 16f84a no tiene este periferico.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como puedo recibir datos por rs232?
« Respuesta #14 en: 08 de Junio de 2009, 10:10:23 »
Probando el codigo de la interrupción, por mas que le he dado vuelta, el CCS siempre dice:
"Invalid Pre-Processor directive", es decir, error con la #int_rda, sera por el 16f84a?, ya he visto varios ejemplos en el foro con la int_rda y pues he escrito el codigo bien, tambien según lo que me han dicho ustedes.
Nunca me fije que micro estabas usando! Claro, el PIC16F84 no tiene módulo USART.
Pero hay una solución, usar la interrupción externa por RB0 y flanco descendente. Esta interrupción detectaría el bit start. En C no lo he realizado, pero probaría lo siguiente:

Código: C
  1. #use rs232(baud=9600, xmit=PIN_A0, rcv=PIN_B0, FORCE_SW) // Pin RB0 para la recepción.
  2.  
  3. #int_EXT
  4. void  EXT_isr(void)
  5. {
  6.      gets(string);
  7. }
  8.  
  9.  
  10.  
  11. void main()
  12. {
  13.  
  14.    ext_int_edge(H_TO_L);
  15.    enable_interrupts(INT_EXT);
  16.    enable_interrupts(GLOBAL);
  17.  
  18. }



« Última modificación: 08 de Junio de 2009, 10:23:11 por Suky »
No contesto mensajes privados, las consultas en el foro