TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Medusa en 16 de Febrero de 2009, 01:35:54

Título: Pic con dos Puerto Serie
Publicado por: Medusa en 16 de Febrero de 2009, 01:35:54
Hola estoy tratando de implementar un modulo que esta constituido por un pic que tiene dos puertos serie (USART Fisico y USART Virtual), este es un fragmento de mi programa, el compilador del CCS me da un error  :?: pero no logro entender a que se debe, alguien me podria decir cual es mi error?  :g)

Código: [Seleccionar]
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

const char ID[]="placa-0001";
char c;

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,STREAM =USART_FISICO)
#use rs232(baud=9600, xmit=PIN_B6, rcv=PIN_B7,STREAM=USART_VIRTUAL)

void main(){
while (1) {
    if (kbhit(USART_FISICO))
 
    fputc(("Esto es una prueba de la",ID),USART_VIRTUAL);
 
  }
}
Título: Re: Pic con dos Puerto Serie
Publicado por: RALF2 en 16 de Febrero de 2009, 11:12:10
Hola Meduza!
Yo lo probe asi:
Citar
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

const char ID[]="placa-0001";
char c;

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,STREAM =USART_FISICO)
#use rs232(baud=9600, xmit=PIN_B6, rcv=PIN_B7,STREAM=USART_VIRTUAL)

void main()
{
while (1)
   {
    if (kbhit(USART_FISICO))
      {
      for (c=0;c<11;c++)
      fputc(("Esto es una prueba de la %s",ID[c]),USART_VIRTUAL);
      }
    }
}
Y me funciono!

Saludos
Título: Re: Pic con dos Puerto Serie
Publicado por: joseto en 19 de Febrero de 2009, 19:04:43
 :) Hola

Prefiero usar algo asi:

fprintf(USART_VIRTUAL,"Esto es una prueba de la %s",ID);

funciona OK
Título: Re: Pic con dos Puerto Serie
Publicado por: RALF2 en 20 de Febrero de 2009, 22:57:43
Perfecto joseto!
Gracias por la sugerencia   :mrgreen:

Saludos
Título: Re: Pic con dos Puerto Serie
Publicado por: Medusa en 23 de Febrero de 2009, 15:05:33
Código: [Seleccionar]
Hola, nuevamente tengo una duda  :mrgreen:
En el siguiente codigo el USART_FISICO envia a un periferico el mensaje "Inicializando el Controlador placa-0001" y en respuesta el periferico devuelve el mensaje "OK", entonce es pic debe de verificar este mensaje y si es igual debe de enviar el mensaje "Comando Recibido" al USART_VIRTUAL el problema es que no se cumple esto cual es mi error?


#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

const char ID[]="placa-0001";
char c;

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,STREAM =USART_FISICO)
#use rs232(baud=9600, xmit=PIN_B6, rcv=PIN_B7,STREAM=USART_VIRTUAL)

void main()
{
//
//
//
        fprintf(USART_FISICO,"Inicializando el Controlador,%s",ID);
        delay_ms(200);

while (TRUE){
        if (kbhit(USART_FISICO)){
     
            c=fgetc(USART_FISICO);
            if (c=="OK")
fprintf(USART_VIRTUAL,"Comando Recibido");
                 }
      }   
}
Título: Re: Pic con dos Puerto Serie
Publicado por: MLO__ en 23 de Febrero de 2009, 15:30:47
Hola.

Yo usaria como pin de Rx para el USART_VIRTUAL uno que tenga una interrupcion (RB0, o alguno con CCPx) y gestionaria la recepcion de los caracteres mediante la interrupcion.

No puedes compara strings de la manera como esta en el if, usa la libreria string.h para hacer las comparaciones, o hazlas tu mismo, son solo 2 bytes que tienes que comparar.

Saludos
Título: Re: Pic con dos Puerto Serie
Publicado por: Medusa en 23 de Febrero de 2009, 15:45:55
Hola Mlo,

Gracias por tu sugerencia pero el PortB0 ya lo tengo usando para otra cosa, y en cuanto a la comparacion de string me podrias dar un ejemplo?
Título: Re: Pic con dos Puerto Serie
Publicado por: MLO__ en 23 de Febrero de 2009, 16:33:41
Hola.

Una de las formas de hacerlo seria la siguiente:
Código: [Seleccionar]
if(!strncmp(cbuff, dbuff,4))
{
 ...
}

En donde cbuff[], seria el array donde estan los datos obtenidos en la transmision serial y dbuff[] seria el array donde tengo la referencia a comparar, por ejemplo: "OK". El ultimo numero (4) es el numero de bytes que quiero comparar.

Saludos
Título: Re: Pic con dos Puerto Serie
Publicado por: Medusa en 23 de Febrero de 2009, 17:54:44
Hola Mlo,

Podrias decirme cual es mi error?

Código: [Seleccionar]
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

#include <stdlib.h>

const char ID[]="placa-0001";
int const MAXLENBUFF=4;
char cbuff[MAXLENBUFF];
char dbuff[MAXLENBUFF];

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,STREAM =USART_FISICO)
#use rs232(baud=9600, xmit=PIN_B6, rcv=PIN_B7,STREAM=USART_VIRTUAL)

void main()
{
strcpy(dbuff,"OK");
//
//
//
        fprintf(USART_FISICO,"Inicializando el Controlador,%s",ID);
        delay_ms(200);

while (TRUE){

        if (kbhit(USART_FISICO)){
            cbuff=fgetc(USART_FISICO);
            if(!strncmp(cbuff,dbuff,4))
                fprintf(USART_VIRTUAL,"Comando Recibido\r\n");
               
             }
         }   
}
Título: Re: Pic con dos Puerto Serie
Publicado por: MLO__ en 23 de Febrero de 2009, 23:06:47
Hola.

Es la forma como adquieres el dato del serial, de la forma como lo haces solo captas la letra O. Debes capturar dos letras: O y K.
Título: Re: Pic con dos Puerto Serie
Publicado por: Medusa en 24 de Febrero de 2009, 01:45:09
No entiendo?  :(
Título: Re: Pic con dos Puerto Serie
Publicado por: MLO__ en 24 de Febrero de 2009, 02:25:10
La funcion que estas usando para obtener el string OK, no es el adecuado, ya que la funcion fgetc() retorna un byte. En el codigo que tu tienes, primero quieres capturar la letra O y luego comparas (ademas, la asignacion del dato al array esta mal hecho, debes indicarle en que posicion del array lo vas a guardar).

Revisa bien los conceptos de definicion de array, veo que los tienes muy enredados.

Saludos
Título: Re: Pic con dos Puerto Serie
Publicado por: Medusa en 24 de Febrero de 2009, 19:59:46
Hola Mlo, he tratado de seguir tus consejos pero no doy con la solucion a mi problema, tendrias la amabilidad de poner un ejemplo o retocar mi codigo, te agradecera

Código: [Seleccionar]
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

#include <stdlib.h>

const char ID[]="placa-0001";

// Variables Globales ///////////////////////////////////////////////////////////////////

char buffrec[2];                        // Buffer de Recepcion
int  xbuffrec=0x00;                              // índice del Buffer de Recepcion

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,STREAM =USART_FISICO)
#use rs232(baud=9600, xmit=PIN_B6, rcv=PIN_B7,STREAM=USART_VIRTUAL)
 

void main()
{

 char xcommand[2];
//
//
//
        fprintf(USART_FISICO,"Inicializando el Controlador,%s",ID);
        delay_ms(200);

while (TRUE){
    xbuffrec=0x00;

        if (kbhit(USART_FISICO)){
           buffrec[xbuffrec++]=fgetc(USART_FISICO);                       // lo recibo y lo añado al Buffer de Recepcion
           strcpy(xcommand,"OK");
           if(!strncmp(buffrec,xcommand,strlen(xcommand))){

   fprintf(USART_FISICO,"Comando Recibido\r\n");
           }   
        }
     }   
}
Título: Re: Pic con dos Puerto Serie
Publicado por: MLO__ en 25 de Febrero de 2009, 02:48:53
Hola.

Primero captura los dos bytes y luego comparas. La inicializacion de la variable xbuffrec deberia ser fuera del while(true). Se podria usar un tercer byte (\r o \n por ejemplo) para avisarle al PIC que el envio termino y que pueda pasar a la comparacion del string.
Título: Re: Pic con dos Puerto Serie
Publicado por: joseto en 27 de Febrero de 2009, 03:03:05
Que tal   :)

En el encabezado de tu programa agrega #include <string.h>  es la libreria que nos ayuda a manejar cadenas de caracteres y prueba lo siguiente:

Código: [Seleccionar]

if (kbhit(USART_FISICO)){
           buffrec[xbuffrec]=fgetc(USART_FISICO);                              // lo recibo y lo añado al Buffer de Recepcion
           if(buffrec[xbuffrec]==0x0D)                                         //verifica si llego el Enter (caracter 0x0D) que me indica el fin del comando
           {
                  buffrec[xbuffrec]='\0';                                       //borro el Enter para realizar comparacion
                  strcpy(xcommand,"OK");                                        //preparo el texto con el que voy a comparar
                  if(!strcmp(buffrec,xcommand))
                  {
                          fprintf(USART_FISICO,"Comando OK\r\n");            //comparacion exitosa
                  }else
                  {
                          fprintf(USART_FISICO,"Comando Desconocido\r\n")
                   }
                  xbuffrec=0;                                                    //encero el contador para recibir nuevo comando
            }else
            {
                  ++xbuffrec;                                                  //incremento contador para recibir nuevo caracter
            }

}



Cabe indicar que el caracter 0x0D (Tecla Enter) es el que indica que el comando se termino de recibir, por lo tanto se debe proceder a realizar la comparacion.
Todo este codigo concuerda con lo que MLO indica en el post anterior.


 8)