Autor Tema: Problemas con #use rs232()  (Leído 9519 veces)

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

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Problemas con #use rs232()
« 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!!
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Problemas con #use rs232()
« Respuesta #1 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".

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Problemas con #use rs232()
« Respuesta #2 en: 09 de Marzo de 2007, 15:01:09 »
Me temia esto!! :( :(
Gracias por contestar Manolo!! :mrgreen: :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Problemas con #use rs232()
« Respuesta #3 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!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Problemas con #use rs232()
« Respuesta #4 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)
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Problemas con #use rs232()
« Respuesta #5 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!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Problemas con #use rs232()
« Respuesta #6 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.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Problemas con #use rs232()
« Respuesta #7 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
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
SOLUCIONADO!! Problemas con #use rs232()
« Respuesta #8 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:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Problemas con #use rs232()
« Respuesta #9 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 ?? :-/ :-/ :-/
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado martin_r

  • PIC10
  • *
  • Mensajes: 3
Re: Problemas con #use rs232()
« Respuesta #10 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.
« Última modificación: 07 de Septiembre de 2010, 16:50:49 por martin_r »

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Problemas con #use rs232()
« Respuesta #11 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);
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado martin_r

  • PIC10
  • *
  • Mensajes: 3
Re: Problemas con #use rs232()
« Respuesta #12 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.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Problemas con #use rs232()
« Respuesta #13 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??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado martin_r

  • PIC10
  • *
  • Mensajes: 3
Re: Problemas con #use rs232()
« Respuesta #14 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.