TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: hernanfire en 15 de Junio de 2007, 15:56:53

Título: Comunicacion con PIC por RS232
Publicado por: hernanfire en 15 de Junio de 2007, 15:56:53
hola! Soy nuevo en C y les cuento que estoy tratando de pasar un codigo asm a c para un PIC 16F628, el tema esta cuando tengo que mostrar una cadena de caracteres (algo previamente ingresado) y tambien cuando quiero almacenar una cadena de caracteres ingresando por rs232, segun esta cadena de caracteres se enciende un Led a la salida la idea es comparar la cadena ingresada y si son iguales enciendo y sino no!!
Mire diferentes ejemplos de VsZeNer o de RedPic pero no logro dar con la tecla! Necesitaria una ayuda con el codigo un manual o un LinK en este foro!! que lo explique, uso el CCS para compilar y el Proteus para simular.
Desde ya muchas Gracias a todos!
SALU2
Título: Re: Comunicacion con PIC por RS232
Publicado por: maunix en 15 de Junio de 2007, 17:11:25
¿El código en ASM hacía lo que pretendes que haga?
 ¿Tienes problemas con la migración del código de ASM a C ? o tienes problemas en que no sabes cómo comparar 2 cadenas de datos?

Título: Re: Comunicacion con PIC por RS232
Publicado por: hernanfire en 16 de Junio de 2007, 15:42:21
EXACTAMENTE! tengo problemas en comparar dos cadenas de datos, 1ro, no se como ingresar una cadena de datos a una posicion de memoria para que quede almacenada en el pic y me la muetre por RS232 para comprobar que lo que ingrese esta bien, y 2do quiero comparar esa cadena con algo que ingresa por RS232 y decidir si son iguales o no.
El proyecto es in CELULAR conectado al PIC, la cadena del mensaje de texto que debe llegar ya la conozco (que seria la ingresada en la memoria del pic) pero me falta la comparacion (que es el SMS que llega al celu)para ejecutar alguna accion o no. Es por eso que pido un link en este foro o un manual o alguna ayuda con el codigo igual sigo buscando.
Muchas Gracias Maunix por responder tan rapido y a todos!

Salu2
Título: Re: Comunicacion con PIC por RS232
Publicado por: maunix en 16 de Junio de 2007, 15:56:49
hernanfire es que si estás en C, no te importa donde está el dato. 

Según veo yo debieras tener un vector de chars, donde guardar los datos que te vienen y luego compararlo con otro vector de chars (probablemente estos últimos en ROM ya que son fijos).

Al ir recibiendo datos por la usart vas guardando los datos en el vector y te hará falta tener un puntero o un indice que te diga qué byte es el que has recibido.

Una vez que terminas de recibir, haces la comparación.  Si quieres la puedes ir haciendo byte a byte, pero lo veo menos eficiente salvo que si un byte ya no coincide tengas que directamente cancelar todo.

Saludos
Título: Re: Comunicacion con PIC por RS232
Publicado por: hernanfire en 16 de Junio de 2007, 19:44:51
Eso es lo que quiero hacer, pero la cuestion es como arranco con el codigo  para tener una ayuda!  algun ejemplo de los que hay, para poder ver como lo genero (la parte de los datos fijos en rom la dejo para mas adelante ya que todavia estoy aprendiendo) solo me gustaria saber como ingreso un dato fijo en el pic (en una variable) y comparar lo que entre por rs232 con este.  Estoy leyendo algo de redPic (una demo de String) para familiarizarme con la programacion!
Gracias otra vez maunix!
Título: Re: Comunicacion con PIC por RS232
Publicado por: DarkVect en 17 de Junio de 2007, 18:44:03
La cadena patrón la pretendes ingresar en el PIC en tiempo de programación (insertada en el código) o en tiempo de ejecución (una vez el PIC ya esté funcionando).

Si es la primera opción basta con crear una cadena constante en tu código y luego leer el RS-232, ir almacenando las letras de la cadena leída en otra variable y comparar ambas cadenas.

En el segundo caso es hacer dos veces la segunda parte.

En los ejemplos de RedPic y Nocturno tienes cómo leer cadenas por el RS-232. Una vez las tengas guardadas en dos varibales es ir recorriéndolas y verificando si son o no iguales.
Título: Re: Comunicacion con PIC por RS232
Publicado por: hernanfire en 17 de Junio de 2007, 20:40:43
Voy a estudiar mas a ver si lo puedo solucionar, ejemplos de RedPic consegui unos cuantos de manejo de caracteres me faltaria de Nocturno para comenzar.......
Gracias  DarkVect!!
Salu2
Título: Re: Comunicacion con PIC por RS232
Publicado por: Jorge Aurelio en 18 de Junio de 2007, 12:27:21
Hola a todos!! Amigos tengo una pregunta quiero comunicar un pic con la maquina por 232 sólo quisiera saber si alguno de ustedes podría decirme si existe una interrupción por 232!!!! Para que el pic esté haciendo otras cosas y al llegar un dato tomarlo y comenzar un ciclo de nuevo, estý programando en C así que estoy apenas entendiendo!! Ahora para ingresar un dato que instrucción es exactamente?? Estoy probando en hyperterminal de la máquina así que no estoy seguro de poder visualizar!!!!! AYUDA PORFAVOR!!!!!
Título: Re: Comunicacion con PIC por RS232
Publicado por: jfh900 en 18 de Junio de 2007, 13:18:45
Hola Jorge Aurelio, efectivamente hay una interrupción para la comunicación RS 232. Todo depende del compilador que utilices, se definirá de una forma u otra. En el caso de CCS es:

#INT_RDA

Busca en la ayuda de tu compilador.

Un saludo
Título: Re: Comunicacion con PIC por RS232
Publicado por: hernanfire en 19 de Junio de 2007, 22:12:07
Aqui he puesto el codigo que quiero usar para comparar una cadena de caracteres, el problema es que no funciona correctamente la comparacion, ya que al ingresar 11111 como caracteres de entrada siempre la comparacion es incorrecta. Use 2 puertos serie solo para mostrar lo que  ingresaba.
Dejo el codigo para escuchar diferentes aclaraciones de la comparacion y que estoy haciendo mal!! GRACIAS A TODOS!

///////////////////////////////////////////////////
//
// Comparacion de carateres.
//
///////////////////////////////////////////////////
#include <16F648a.h>
#use delay(clock=4000000)
#fuses HS,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT
#use rs232(baud=9600, xmit=PIN_B2,rcv=PIN_B1,stream=GPS)
#use rs232(baud=9600, xmit=PIN_A1,rcv=PIN_A0,stream=PC)

// Constantes y definiciones ///////////////////////////////////////////////////
int const lenbuff=5;  // Tamaño del buffer de recepción

// Variables Globales //////////////////////////////////////////////////////////
char smsbuff[lenbuff]; // Buffer GPS
char latitud[lenbuff];
char longitud[lenbuff];
char SMS1[6]={'1','1','1','1','1'};

// Declaracion de Funciones ////////////////////////////////////////////////////
void inicbuff(void); // Borra el buffer de recepción
void inicia_sms(void); // Inicia SMS
void comando(void); // Comando para comparar

void inicbuff(void){  // Inicia a \0 cbuff
int i;
for(i=0;i<lenbuff;i++) // Bucle que pone ...
       {               
        smsbuff=0;   // a 0 smsbuff
       }
}
void comando(void){
int  i;
printf("INGRESE:%s ",SMS1,PC);
   while(kbhit(GPS)); // tomo las teclas presionadas
      {
      for(i=0;i<lenbuff;i++) //incremento contador para almacenar
         {
         smsbuff=fgetc(GPS); // almaceno
         }
       }
      printf("\r\n INGRESADO %s ",smsbuff,GPS); //muestro lo ingresado como SMS

    if(SMS1==smsbuff){ // quiero comparar lo ingresado con lo fijo
    printf("\r\nClave\nCorrecta!\r\n",PC); //si son iguales... Correcto
    }
    else
    {
    printf("\r\nClave\nNO!!!!!!\r\n",PC); //sino incorrecto...
    }
}
void main()
   {
   printf("Esperando SMS...\r\n",GPS); // Señal de que funciona
   delay_ms(100);
   inicbuff(); // Funcion que inicia el SMS en 0
   comando(); // llamando al comando que compara
}

Título: Re: Comunicacion con PIC por RS232
Publicado por: jfh900 en 19 de Junio de 2007, 22:29:51
Las cadenas no se pueden comprar directamente. Hay que utilizar una función de comparación de cadenas. Para el compilador de CCS:

Código: C
  1. cresult=strcmp(s1, s2) Compare s1 to s2

En la ayuda de tu compilador traerá las funciones de cadena y su uso:

Código: C
  1. ptr=strcat (s1, s2) Concatenate s2 onto s1
  2.  
  3. ptr=strchr (s1,  c) Find c in s1 and return &s1[i]
  4.  
  5. ptr=strrchr  (s1,  c) Same but search in reverse
  6.  
  7. cresult=strcmp  (s1, s2) Compare s1 to s2
  8.  
  9. iresult=strncmp  (s1, s2, n) Compare s1 to s2 (n bytes)
  10.  
  11. iresult=stricmp  (s1, s2) Compare and ignore case
  12.  
  13. ptr=strncpy (s1, s2,  n) Copy up to n characters s2->s1
  14.  
  15. iresult=strcspn  (s1, s2) Count of initial chars in s1 not in s2
  16.  
  17. iresult=strspn  (s1, s2) Count of initial chars in s1 also in s2
  18.  
  19. iresult=strlen  (s1)  Number of characters in s1
  20.  
  21. ptr=strlwr (s1) Convert string to lower case
  22.  
  23. ptr=strpbrk (s1, s2) Search s1 for first char also in s2
  24.  
  25. ptr=strstr  (s1, s2) Search for s2 in s1
  26.  
  27. ptr=strncat(s1,s2) Concatenates up to n bytes of s2 onto s1
  28.  
  29. iresult=strcoll(s1,s2) Compares s1 to s2, both interpreted as appropriate to the current locale.
  30.  
  31. res=strxfrm(s1,s2,n) Transforms maximum of n characters of s2 and places them in s1, such that strcmp(s1,s2) will give the same result as strcoll(s1,s2)
  32.  
  33. iresult=memcmp(m1,m2,n) Compare m1 to m2 (n bytes)
  34.  
  35. ptr=memchr(m1,c,n) Find c in first n characters of m1 and return &m1[i]

Un saludo