Autor Tema: Houston, Houston: Tenemos una USART y dos Baudajes distintos.  (Leído 8015 veces)

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

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Houston, Houston: Tenemos una USART y dos Baudajes distintos.
« en: 20 de Octubre de 2007, 09:24:30 »
Situación:

Tengo una USART, la única disponible, en un 18F4550, transmitiendo y recibiendo alegre a 115200 "braulios", hablando hasta por los codos con un módulo EM202 que acepta este baudaje feliz y contento como niño con zapatos nuevos.

Las líneas TX RX pasan a través de un conmutador analógico, un CD4053, que me permiten seleccionar si dichas TX RX irán destinadas a una llamémosle TX1 RX1 que es donde tengo el EM202, o por el contrario iran destinadas a otras TX2 RX2 donde tengo un MAX485.

Con un pin de control conmuto al EM202 o al MAX485 según me haga falta.

Hasta ahí todo bien. Emito y Recibo mensajes perfectamente por ambos canales .... peeeeeeroooooo ... siempre y cuando ambos canales hablen a la misma velocidad.

Problema:

Tengo que conectar un dispositivo RS485 que funciona con un 16F628A con oscilador interno a 4Mhz y su correspondiente MAX485. Pero ¡Oh Dioses Electrónicos que me maltratáis! Cuando intento ponerlo a 115200 "braulios" me dice aquello de "Baud out of range". El paupérrimo 16F628A no alcanza a hablar con la velocidad, prestancia y prepotencia del querido 18F4550 a 48 Mhz. Lógico por otro lado, no me quejo.

Pero hete aquí que intento reducir la velocidad del 18F4550 cuando hable o escuche el canal RS485 y volver a aumentarla para el canal EM202.

Así por defecto pongo aquello de:

#use rs232(baud=115200, xmit=EM202_RX, rcv=EM202_TX)


y cuando tengo que oir el otro canal escribo:

#use rs232(baud=9600)
task_rs485();
#use rs232(baud=115200)

y me como un maguño como un puño.  :?

Todo deja de funcionar, ni habla a 9600 ni a 115200, ni a unos tristes 1200 que eran los "braulios" a los que hablaban los antiguos módemes analógicos en los que se ponía el auricular del teléfono en una cama con dos orejas.

El programa está realizado en CCS C ... y ya no sé cómo usan los uses RS232, ni qué hace con ellos el CSS C, ni si soy de aquí o soy de allá ... me he perdido como un Neoyorkino en el amazonas.

Pregunta:

En fin, ¿algún consejo? ¿alguna idea? ¿ :roll:?



 
« Última modificación: 20 de Octubre de 2007, 09:30:02 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Houston, Houston: Tenemos una USART y dos Baudajes distintos.
« Respuesta #1 en: 20 de Octubre de 2007, 10:04:30 »
Que tal Redpic,

Efectivamente la idea que intentas hacer es correcta. Lo que no es correcto es que uses la directiva "#use rs232" para cambiar los baudios. Lo que tiene que hacer es scribir directamente en los registros del microcontrolador para modificar el baud rate. Es decir, tienes que modificar los siguientes registros de configuracion del USART.
TXSTA
RCSTA
BAUDCON

Estos son los mas importantes ya que estos registros son los que te permiten configurar el baud rate.
SPBRG
SPBRGH

En el datasheet encontraras la mejor explicacion de modulo USART del microcontrolador y hasta encontraras algunas tablas que te dan los valores para diferentes baud rates y si el que necesitas no esta, simplemente aplicas la formula que tambien viene ahi.

Este microcontrolador tiene mejores caracteristicas que los de la familia 16 (PIC16FXXX).

Saludos y espero haberte ayudado en algo.

Elreypic

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Houston, Houston: Tenemos una USART y dos Baudajes distintos.
« Respuesta #2 en: 20 de Octubre de 2007, 10:11:51 »
Que tal Redpic,

... tienes que modificar los siguientes registros de configuracion del USART.
TXSTA
RCSTA
BAUDCON
...
SPBRG
SPBRGH


Cierto, muy cierto. Voy a hacerlo con #asm y #endasm tal como lo hacía cuando comencé en esto directamente en ensamblador y sin que el CCS C se entere de nada de lo que estoy haciendo.

Muchas gracias por la ide, ElReyPic.  :mrgreen: :mrgreen: :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: Houston, Houston: Tenemos una USART y dos Baudajes distintos.
« Respuesta #3 en: 20 de Octubre de 2007, 10:38:28 »
Esto no va a ser, pero, lo comento de todos modos.

Ahora estoy trabajando con una comunicación RS485 entre varios dispositivos.

Tengo 2 PC´s. Con uno programo la pba y en el otro tengo enganchado el cable para monitorizar las tramas que envío ERROR!!!

Se produce un bucle de masas que no veas y la comunicación se queda KO cuando le da la gana.

El PC con el que programo lo tengo enganchado a la pba por medio del programador (GTP-USB+) y el cable de comunicación lo tengo enganchado al otro PC.

Solución?? Quitamos el cable de programación ICSP y ya está, ya no hay bucle de masas. Parece una idiotez, pero, me ha dado muchos quebraderos de cabeza esta tontería.

Otra cosa que también recomiendo es la directiva RS232_ERRORS. Cuando en la comunicación se produce un 'framing error' o un 'overun error' la comunicación se queda totalmente parada y hay que rearmarla de nuevo. A ver si lo que obtienes es algún tipo de error que te congela la comunicación. Recomendaría que trataras estos posibles errores y que cuando se produzca alguno la rearmes para que no se quede parado (esto que comento también me dió muchos quebraderos de cabeza jeje).


Un saludo desde Alicante.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Houston, Houston: Tenemos una USART y dos Baudajes distintos.
« Respuesta #4 en: 20 de Octubre de 2007, 10:41:22 »
Otra cosa que también recomiendo es la directiva RS232_ERRORS. Cuando en la comunicación se produce un 'framing error' o un 'overun error' la comunicación se queda totalmente parada y hay que rearmarla de nuevo. A ver si lo que obtienes es algún tipo de error que te congela la comunicación. Recomendaría que trataras estos posibles errores y que cuando se produzca alguno la rearmes para que no se quede parado (esto que comento también me dió muchos quebraderos de cabeza jeje).

eeeeeeh .... y ezo qué é lo que é  :shock: :shock: :shock:

¿Autodesbloqueo o notificación del Bloqueo y búscate la vida?

Quiero más, quiero más ... ja ja ja  :D :D :D

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Houston, Houston: Tenemos una USART y dos Baudajes distintos.
« Respuesta #5 en: 20 de Octubre de 2007, 11:25:12 »
Diego:
Yo abri un tema aqui mismo, preguntando algo similar a lo tuyo.
Me tiraron varias ideas,hasta que pude solucionarlo y en el mismo tema puse como lo solucione, busco el tema y te pongo aqui el link... :mrgreen:

Aqui esta!!
http://www.todopic.com.ar/foros/index.php?topic=16369.0
« Última modificación: 20 de Octubre de 2007, 11:39:04 por MGLSOFT »
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: Houston, Houston: Tenemos una USART y dos Baudajes distintos.
« Respuesta #6 en: 20 de Octubre de 2007, 11:28:49 »
Yo tengo un proyecto donde establezco los baudios directamente en los registros que te ha dicho elreypic, pero no hay que irse al ASM para hacerlo, Don Diego:

#byte BAUDCON=0xFB8
#byte SPBRGH=0xFB0
#byte SPBRG=0xFAF

BAUDCON=BAUDCON | 8;
SPBRGH=0x04;
SPBRG=0XDC;

Por cierto, que he probado a modificar la velocidad en tiempo de ejecución y funciona perfectamente.

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: Houston, Houston: Tenemos una USART y dos Baudajes distintos.
« Respuesta #7 en: 20 de Octubre de 2007, 15:14:52 »
Jejeje... me explico un poco mejor  :mrgreen:

Al principio lo que ponemos es lo típico pero fíjate en la palabra en negrita:

#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7, ERRORS)

En la ayuda del CCS tenemos:

ERRORS
 Used to cause the compiler to keep receive errors in the variable RS232_ERRORS and to reset errors when they occur.
 
If a baud rate cannot be achieved within 3% of the desired value using the current clock rate, an error will be generated. The definition of the RS232_ERRORS is as follows:
 

No UART:

·   Bit 7 is 9th bit for 9 bit data mode (get and put).

·   Bit 6 set to one indicates a put failed in float high mode.
 

With a UART:

·   Used only by get:

·   Copy of RCSTA register except:

·   Bit 0 is used to indicate a parity error.

Es decir:

Código: [Seleccionar]
#int_rda
void serial_isr()
{
   if ( rs232_errors & 0x04 )  // get framing error bit from Rx status reg
   {
      cRxErrorFlag=1;
   }

   if(kbhit())
   {

      Keypress=getc();

      buffer_char(Keypress);                       // lo recibo y lo añado al Buffer de Recepcion
  }
}

Y despues en el main puedes hacer el control del flag cRxErrorFlag

Código: [Seleccionar]
if(cRxErrorFlag==1)
   {
      printf("ERROR*ERROR#");
      cRxErrorFlag=0;
   }

Todo esto lo copié de un tio y me funcionó bien. Por el hecho de poner en el #use rs232 lo de ERRORS la comunicación ya se reestablece sola y además... puedes descubrir que tipo de error se ha producido comprobando rs232_errors.

0x04 para detectar el framing error y 0x02 para detectar el overrun error. Estos valores los puedes ver en el registro RCSTA. Se podría decir que es como si se copiara en la variable rs232_errors.

Este programa lo hice hace tiempo, en los que estoy haciendo ahora me gusta hacerlo a pelo con el registro RCSTA:

Los bits 0, 1 y 2 se encargan de la paridad, overrun y framing respectivamente.

Como dice Manolo lo más fácil es:

#byte RCSTA=0xFAB

Y después comprobar los bits 1 y 2 para ver el tipo de fallo.

Un cliente me volvió loco con que varios equipos se le colgaban. Hasta que no hice ese tratamiento de errores sufrí bastante. Por cierto, es muy fácil simular esos errores y comprobar como el PIC se queda KO (y como conseguimos rearmarlo, claro)

Haz un programa y en el bucle infinito estate continuamente mandando un caracter al ordenador, sin retardos y sin nada. Después pulsa una tecla del ordenador para mandarle un comando al PIC (y mantenla pulsada). Cuando los datos empiezan a colisionar se arma la marimorena jejeje (aunque con un buen control de flujo creas que eso no puede suceder... mas vale prevenir que escuchar al cliente cabreao  :D)

Bueno, ya nos comentas.


Un saludo desde Alicante.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Houston, Houston: Tenemos una USART y dos Baudajes distintos.
« Respuesta #8 en: 20 de Octubre de 2007, 19:35:56 »
La verdad es que no sé qué haría sin vosotros.  :oops:

Os amo, a todos.  :mrgreen:

Mañana por la mañana pondré en práctica vuestros consejos. Muchísimas gracias.  :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Houston, Houston: Tenemos una USART y dos Baudajes distintos.
« Respuesta #9 en: 20 de Octubre de 2007, 20:22:20 »
En realidad mis cambios los hago desde un menu de usuario, no desde lineas de programa, pero puede adaptarse.
Igual lo que puso Manolo y Azicuetano, creo que te serviran!! :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Houston, Houston: Tenemos una USART y dos Baudajes distintos.
« Respuesta #10 en: 21 de Octubre de 2007, 14:49:28 »
¿Cómo decía aquella canción ... ? Ah, si ... "Con un poco de ayuda de mis amigos ..."

Funcionando el doble BaudRateaje  :mrgreen:

Aplicada la pócima de Manolo Nocturno, que he tenido que aliñar ya que no me funcionaba directamente porque los dos baudajes eran tan extremos, 9600 y 115200, que he tenido que tocar también el bit BRGH del registro TXSTA, pero ahí queda constancia del asunto:

Código: C++
  1. void set_baudrate(int8 rate){
  2.  
  3.    switch(rate){
  4.       case  baudrate_standard:   // 115200 bauds
  5.             BAUDCON &= 0b11110111;
  6.             TXSTA=0x26;
  7.             SPBRG=0X00;
  8.             SPBRG=0X19;
  9.             break;
  10.       case  baudrate_rs485:      //   9600 bauds
  11.             BAUDCON &= 0b11110111;
  12.             TXSTA=0x22;
  13.             SPBRG=0X00;
  14.             SPBRG=0X4D;
  15.             break;
  16.    }
  17. }


También he implementado el control de errores Made In Azicuetano. Exactamente tal y como él lo ha posteado.  :mrgreen:

Gracias a todos.
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Houston, Houston: Tenemos una USART y dos Baudajes distintos.
« Respuesta #11 en: 21 de Octubre de 2007, 15:24:17 »
M'alegro que lo consiguieras.

¿Porqué reinicias el byte SPBRG antes de cargarle un valor?, ¿te falla si no lo haces?

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Houston, Houston: Tenemos una USART y dos Baudajes distintos.
« Respuesta #12 en: 21 de Octubre de 2007, 15:40:18 »
M'alegro que lo consiguieras.

¿Porqué reinicias el byte SPBRG antes de cargarle un valor?, ¿te falla si no lo haces?

Ja, ja ja  :D :D :D  Es un doble fallo que no sirve para nada.

Doble fallo porque:

1º.- BAUDCON &= 0b11110111; establece que voy a trabajar con SBPRG 8 bits luego SPBRGH no hace falta cargarlo.
2º.- Quería poner SPBRGH=0x00; era necesario si hubiese utilizado 16 bits, pero lo copié y pegué y se me olvidó ponerle la H.

Con lo cual esa línea no sirve absolutamente para nada, aún cuando la hubiese escrito bien.  :D :D :D

O sea que debería ser:

Código: C++
  1. void set_baudrate(int8 rate){
  2.  
  3.   switch(rate){
  4.      case  baudrate_standard:   // 115200 bauds
  5.            BAUDCON &= 0b11110111;
  6.            TXSTA=0x26;
  7.            SPBRG=0X19;
  8.            break;
  9.      case  baudrate_rs485:      //   9600 bauds
  10.            BAUDCON &= 0b11110111;
  11.            TXSTA=0x22;
  12.            SPBRG=0X4D;
  13.            break;
  14.   }
  15. }
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Houston, Houston: Tenemos una USART y dos Baudajes distintos.
« Respuesta #13 en: 21 de Octubre de 2007, 15:43:35 »
Jeje, pues puestos a optimizar, también te puedes ahorrar el BAUDCON &= 0b11110111; y dejarlo en el arranque  :mrgreen:

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Houston, Houston: Tenemos una USART y dos Baudajes distintos.
« Respuesta #14 en: 21 de Octubre de 2007, 16:18:15 »
Joé, a que me quedo sin función. Lo quito todo y todo funciona ... ja, ja, ja, ja ,ja  :D :D :D :D :D

Cierto, muy cierto, maestro Nocturno.

Código: C++
  1. void set_baudrate(int8 rate){
  2.  
  3.   switch(rate){
  4.      case  baudrate_standard:   // 115200 bauds
  5.            TXSTA=0x26;
  6.            SPBRG=0X19;
  7.            break;
  8.      case  baudrate_rs485:      //   9600 bauds
  9.            TXSTA=0x22;
  10.            SPBRG=0X4D;
  11.            break;
  12.   }
  13. }
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania


 

anything