TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: MGLSOFT en 09 de Marzo de 2007, 07:59:22

Título: Problemas con #use rs232()
Publicado por: MGLSOFT en 09 de Marzo de 2007, 07:59:22
A quien me pueda ayudar... :) :)

Estoy haciendo que mi proyecto pueda seleccionar entre diferentes velocidades, paridades y bits por byte para ser seleccionados desde un menu de pantalla.
El menu de seleccion esta hecho.
Desde el menu incremento un valor entre 0 y 11, al grabarlo lo comparo con el valor que tenia y si cambio entonces debo reconfigurar mi comunicacion...hasta alli todo bien.

Para hacer la seleccion de la velocidad hice esta funcion:

Código: [Seleccionar]
Void Selecciona_Velocidad (int8 Baudrate)
{
    switch Baudrate
        {
           case 0: #use rs232(baud=2400,parity=N,bits=8,xmit=PIN_C6,rcv=PIN_C7,bits=8)
                       break;
           case 1: #use rs232(baud=2400,parity=E,bits=8,xmit=PIN_C6,rcv=PIN_C7,bits=8)
                       break;
           case 2: #use rs232(baud=2400,parity=O,bits=8,xmit=PIN_C6,rcv=PIN_C7,bits=8)
                       break;
           case 3: #use rs232(baud=4800,parity=N,bits=8,xmit=PIN_C6,rcv=PIN_C7,bits=8)
                       break;
           case 4: #use rs232(baud=4800,parity=E,bits=8,xmit=PIN_C6,rcv=PIN_C7,bits=8)
                       break;
           case 5: #use rs232(baud=4800,parity=O,bits=8,xmit=PIN_C6,rcv=PIN_C7,bits=8)
                       break;
           default: #use rs232(baud=9600,parity=E,bits=8,xmit=PIN_C6,rcv=PIN_C7,bits=8)
                       break;
         }
}

El problema que se me presenta es que aun sin ejecutar esta funcion nunca, la comunicacion queda seteada en el formato de la etiqueta default.
Crei que por ser default seria ese el problema, por lo tanto lo comente, en la siguiente me quedo configurada con la seleccion del case 5 !!!

Lo llamativo es que nunca use la funcion !!

Busque alternativas, tengo setup_uart() y set_uart_speed(), pero no encuentro la forma que estos buedan configurar los bits por byte y la paridad...

Puede alguien tirarme una soga ?? :P :P :P

Desde ya gracias!!
Título: Re: Problemas con #use rs232()
Publicado por: Nocturno en 09 de Marzo de 2007, 13:07:26
Me da la impresión de que la sentencia #use sólo funciona en tiempo de compilación, y no en tiempo de ejecución. Por eso pilla el último estado que encuentre y no va a funcionar dentro del switch.

Me temo que lo único que puedes hacer es cambiar los valores de los registros de configuración de la USART "a pelo".
Título: Re: Problemas con #use rs232()
Publicado por: MGLSOFT en 09 de Marzo de 2007, 15:01:09
Me temia esto!! :( :(
Gracias por contestar Manolo!! :mrgreen: :mrgreen:
Título: Re: Problemas con #use rs232()
Publicado por: vszener en 09 de Marzo de 2007, 15:43:28
Al ser instrucciones de preprocesado, debes usar instrucciones de preprocesado.

Puedes usar algo como esto:
Código: C
  1. #define baudrate1 x
  2. #define baudrate2 y
  3.  
  4. #ifndef baudrate1
  5.     #use rs232(baud=2400,parity=N,bits=8,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  6. #else
  7.     #use rs232(baud=2400,parity=E,bits=8,xmit=PIN_C6,rcv=PIN_C7,bits=8
  8. #endif

Pero una vez compilado, sólo tendrá la opción que se eliga.


Suerte!!! ;)
Título: Re: Problemas con #use rs232()
Publicado por: MGLSOFT en 09 de Marzo de 2007, 16:17:09
Igual me resisto, debe haber alguna forma de hacerlo y voy a encontrarla... :x :x :x 8) 8)
Título: Re: Problemas con #use rs232()
Publicado por: vszener en 09 de Marzo de 2007, 16:38:43
Si te sobran pines, puedes configurar para cada par de pines, una velocidad de transmisión distintas, y ya en tú programa se daria la opción de elegir la velocidad dependiendo de los pines en que estén configurados.


Suerte!!! ;)
Título: Re: Problemas con #use rs232()
Publicado por: Nocturno en 09 de Marzo de 2007, 17:44:55
Como te dije antes, siempre existe la opción de la fuerza bruta: pelearte con el datasheet y configurar los registros a mano.

Pero también puedes aprovecharte del esfuerzo que ya hicieron los programadores del compilador. Yo compilaría las distintas sentencias #use que te interesan y me quedaría con el código ASM que cada una de ellas genera por separado.

Luego montaría el switch que tú quieres utilizar pegando en cada case el trozo de #asm ... #endasm que corresponda.
Título: Re: Problemas con #use rs232()
Publicado por: PalitroqueZ en 09 de Marzo de 2007, 18:24:54
ya veo que para la directiva #use ocurre igual, yo intenté hacer lo mismo con #DEVICE y al compilar, ya me salía el error. En mi caso como trataba de cambiar la justificación del CAD, Lo que tuve que hacer en ensamblador mediante una función aparte.

Salu2
Pedro
Título: SOLUCIONADO!! Problemas con #use rs232()
Publicado por: MGLSOFT en 19 de Marzo de 2007, 18:23:57
Voy a poner mañana como solucione este problema que plantee al principio del POST.
No tengo aqui el codigo pero mañana lo cuelgo para que vean como lo hice... :mrgreen: :mrgreen:
Título: Re: Problemas con #use rs232()
Publicado por: MGLSOFT en 09 de Mayo de 2007, 14:43:47
Mas vale tarde que nunca no??
 
Aqui va la configuracion que hice para disponer de las diferentes velocidades de comunicacion y los diferentes Use RS232...
 
Código: [Seleccionar]
//Constantes de los seteos de configuracion de velocidades y modos.
 
enum Sel_Protocolo {ModBusRTU, ModBusASCII, SerialASCII}; // 0,1 y 2 respectivamente
 
enum Sel_Velocidad { B9600_E_8_1, B9600_N_8_1, B9600_O_8_1, //default 9600,E,8,1
                    B19200_E_8_1, B19200_N_8_1, B19200_O_8_1,
                    B38400_E_8_1, B38400_N_8_1, B38400_O_8_1,
                    B57600_E_8_1, B57600_N_8_1, B57600_O_8_1};
/**************************************************************************************
Enumeracion de las diferentes velocidades elegidas para el puerto serial
***************************************************************************************/
#use rs232(baud=19200, PARITY=E, BITS=8, xmit=PIN_C6,rcv=PIN_C7,enable=PIN_C5,stream=E81)
 
#use rs232(baud=19200, PARITY=O, BITS=8, xmit=PIN_C6,rcv=PIN_C7,enable=PIN_C5,stream=O81)
#use rs232(baud=19200, PARITY=N, BITS=8, xmit=PIN_C6,rcv=PIN_C7,enable=PIN_C5,stream=N81)
 
 //rutina seleccion velocidad
 
void Elige_Velocidad_Comm (Int8 Baudrate)
   {
   switch (Baudrate)
      {
      case B9600_E_8_1: set_uart_speed(9600,E81); break;
      case B9600_N_8_1: set_uart_speed(9600,N81); break;
      case B9600_O_8_1: set_uart_speed(9600,O81); break;
      case B19200_E_8_1: set_uart_speed(19200,E81); break;
      case B19200_N_8_1: set_uart_speed(19200,N81); break;
      case B19200_O_8_1: set_uart_speed(19200,O81); break;
      case B38400_E_8_1: set_uart_speed(38400,E81); break;
      case B38400_N_8_1: set_uart_speed(38400,N81); break;
      case B38400_O_8_1: set_uart_speed(38400,O81); break;
      case B57600_E_8_1: set_uart_speed(57600,E81); break;
      case B57600_N_8_1: set_uart_speed(57600,N81); break;
      case B57600_O_8_1: set_uart_speed(57600,O81); break;
    // default:
      //   #use rs232(baud=57600, PARITY=E, BITS=8, xmit=PIN_C6,rcv=PIN_C7,enable=PIN_C5)
      }
   }

Luego en mi rutina elijo segun un menu de configuraciones que no viene al caso, cual velocidad y modo utilizo de este modo:
 
Código: [Seleccionar]
switch (Mi_Velocidad)
               {
                  case B9600_E_8_1:  fputc(modbus.trama[i],E81); break;
                  case B9600_N_8_1:  fputc(modbus.trama[i],N81); break;
                  case B9600_O_8_1:  fputc(modbus.trama[i],O81); break;
                  case B19200_E_8_1: fputc(modbus.trama[i],E81); break;
                  case B19200_N_8_1: fputc(modbus.trama[i],N81); break;
                  case B19200_O_8_1: fputc(modbus.trama[i],O81); break;
                  case B38400_E_8_1: fputc(modbus.trama[i],E81); break;
                  case B38400_N_8_1: fputc(modbus.trama[i],N81); break;
                  case B38400_O_8_1: fputc(modbus.trama[i],O81); break;
                  case B57600_E_8_1: fputc(modbus.trama[i],E81); break;
                  case B57600_N_8_1: fputc(modbus.trama[i],N81); break;
                  case B57600_O_8_1: fputc(modbus.trama[i],O81); break;
               }
         }
         break;

Facil, no ?? :-/ :-/ :-/
Título: Re: Problemas con #use rs232()
Publicado por: martin_r en 07 de Septiembre de 2010, 16:48:29
Hola, saludos desde México.

Tengo un problema similar que no logro resolver, ojalá y me puedan orientar. Se trata de un PIC16F877

Tengo conectado un AHRS (Serial 232) en C6 y C7, envia cadenas ASCII de 3 datos p.e. 125.5,55.7,-0.9 <cr> <lf>

#use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=HMR3400)

Y un GPS en A4 y A5 que me da cadenas NMEA

#use rs232(baud=115200,parity=N,xmit=PIN_A4,rcv=PIN_A5,bits=8,stream=GPS)

Estas dos lineas están en un archivo .h, y los leo o acceso de la siguiente forma:

...
...
...
   set_uart_speed(115200,GPS);
   delay_ms(5);
      Do{ //sincroniza
         cadena[0]=fgetc(GPS);     
      } While(cadena[0]!='$');
      i=0;
      Do{ //carga la cadena
         i++;
         cadena=fgetc(GPS);       
      } While(cadena!='*' && i<=88);
      cadena[i+1]=0;
      reads++;
   }While(cadena[4]!='G' && reads<3); //Busca hasta encontrar RMC o 3 lecturas
.
.
.
   set_uart_speed(19200,HMR3400);
   delay_ms(5);
   reads=0; //Contador de lecturas para que no se cicle si no puede leer el HMR
   Do{
      temp=fgets(cadena,HMR3400);       
      i=strlen(cadena);
      cc=0;
      for(j=0;j<=i;j++){
         if(cadena[j]==','){cc++;}
      }     
      cadena[i+1]=0;
      reads++;
   }While(cc!=2 && reads<3); //Busca hasta encontrar 3 comas o 3 lecturas
...

Esto se hace infinitamente en un ciclo, o al menos era la intención, el problema es que se queda colgado el PIC en la lectura de menos bps  temp=fgets(cadena,HMR3400) Ya intenté cambiar a fgetc, poner un retardo, con el set_uart_speed, con kbhit antes, y siempre se queda colgado en este punto ya sea fgetc o fgets. En ocasiones lo hace la primera vez pero al segundo ciclo se cuelga.

Por sí solas ambas secuencias funcionan sin problema, el problema creo es al bajar el baud rate, se pierde por completo.

Alguna idea?

Gracias.
Título: Re: Problemas con #use rs232()
Publicado por: MGLSOFT en 09 de Septiembre de 2010, 16:55:44
Para que usar la instruccion set_uart_speed() cuando antes ya se selecciono la velocidad en ambos puertos??
Es mas, esa instruccion es para la uart, mientras que el gps lo tienes en un puerto por software, eso es lo que te cuelga la comunicacion...

Creo que esta dos lineas sobran y ademas son incongruentes...

Código: C
  1. set_uart_speed(115200,GPS);
Código: C
  1. set_uart_speed(19200,HMR3400);
Título: Re: Problemas con #use rs232()
Publicado por: martin_r en 10 de Septiembre de 2010, 18:00:41
Para que usar la instruccion set_uart_speed() cuando antes ya se selecciono la velocidad en ambos puertos??
Es mas, esa instruccion es para la uart, mientras que el gps lo tienes en un puerto por software, eso es lo que te cuelga la comunicacion...

Creo que esta dos lineas sobran y ademas son incongruentes...

Código: C
  1. set_uart_speed(115200,GPS);
Código: C
  1. set_uart_speed(19200,HMR3400);

Hola, gracias por responder, esas lineas las puse después, en realidad la primera prueba fue con gets(), luego con getch(), luego probé colocando un kbhit pero nunca se hace true, entonces por eso puse esas set_uart para ver si se desatontaba.
Fijate que el debugger me aparece un overrun error, ¿Que significa?

RCIF       0C.5            0    USART receive buffer empty
TXIF       0C.4            1    USART transmit buffer empty
RCIE       8C.5            0    USART receive interrupt disabled
TXIE       8C.4            0    USART transmit interrupt disabled
SPEN       18.7            1    serial port enabled
RX9        18.6,18.0       0    8-bit reception
SREN       18.5            0    single receive disabled
CREN       18.4            1    continuous receive enabled
ADDEN      18.3            0    Disables address detection
FERR       18.2            0    no framing error
OERR       18.1            1    overrun error
CSRC       98.7            1    master mode
TX9        98.6,98.0       0    8-bit transmission
TXEN       98.5            1    transmit enabled
SYNC       98.4            0    asynchronous mode
BRGH       98.2            1    high speed
TRMT       98.1            1    TSR empty
GIE        0B.7            0    all interrupts disabled
RCIDL                      0    Receive operation is active
SCKP                       0    IDLE state for clock (CK) is a low level
BRG16                      0    8-bit baud rate generator - SPBRG only (Compatible mode), SPBRGH value ignored
WUE                        0    RX pin not monitored or rising edge detected
ABDEN                      0    Baud rate measurement

Gracias.
Título: Re: Problemas con #use rs232()
Publicado por: MGLSOFT en 10 de Septiembre de 2010, 18:06:38
Hay un ejemplo de CCS que utiliza una comunicacion por hardware y otra por software, lo has probado??
O al menos lo has mirado??
Título: Re: Problemas con #use rs232()
Publicado por: martin_r en 10 de Septiembre de 2010, 18:28:48
Hay un ejemplo de CCS que utiliza una comunicacion por hardware y otra por software, lo has probado??
O al menos lo has mirado??

Sip, mira encontré una opción de la directiva #use, es ERRORS, se la agregué a ambos streams y parece ser que resetea los registros de error si es el caso, parece ser que funciona ya, gracias por contestar amigo.

Saludos.
Título: Re: Problemas con #use rs232()
Publicado por: MGLSOFT en 10 de Septiembre de 2010, 21:02:12
Te me adelantaste, eso quiere decir que estas andando Sancho...
Felicidades!!

Estaba por sugerirte eso, que en mi caso es aun una deuda colocarlo ya que al estar el PIC transmitiendo y cambiar la velocidad, el nuevo baudrate debe entrar luego de terminar la transmicion o recepcion.
Por eso voy a usar errors, aunque aun no lo puse... :mrgreen: :mrgreen:
Título: Re: Problemas con #use rs232()
Publicado por: Esteban7 en 21 de Abril de 2011, 17:36:57
tengo un problema velocidades también, por favor si me pueden ayudar.

tengo datos de entrada a 4800 baudios desde un gps, mi programa debe elegir la sentencia "$GPGLL",
guardar los datos de latitud y longitud que entrega dicha sentencia y finalmente sacar esos datos
a una velocidad de 1200 baudios.

saludos
Título: Re: Problemas con #use rs232()
Publicado por: Suky en 21 de Abril de 2011, 20:51:54
tengo un problema velocidades también, por favor si me pueden ayudar.

tengo datos de entrada a 4800 baudios desde un gps, mi programa debe elegir la sentencia "$GPGLL",
guardar los datos de latitud y longitud que entrega dicha sentencia y finalmente sacar esos datos
a una velocidad de 1200 baudios.

saludos

Seguramente podes configurar el GPS para que solamente envie la trama GPGLL cada cierto tiempo (Disminuis la cantidad de datos transferidos entre dispositivos), y también la velocidad de puerto serial. Ahora, recibis por un canal RS232 y enviar por otro, así que los configuras con las velocidades que quieras a cada uno  :rolleyes:


Saludos!