Autor Tema: Problema con interfaz USB-UART  (Leído 2132 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado zivit

  • PIC10
  • *
  • Mensajes: 22
Problema con interfaz USB-UART
« en: 30 de Julio de 2015, 12:46:33 »
Buenos dias,

Tengo un problema al intentar comunicar dos ordenadores, por una parte por USB y por la otra RS-232. La interfaz que los une está formada por un PIC24FJ32gb002, que se conecta directamente al USB (en modo CDC) y luego un MAX232 que conecta la UART del PIC a un conector RS-232.

La parte de USB funciona correctamente.

El problema es el siguiente: por una parte el baudrate se descontrola, no se rige por las ecuaciones que proporciona el data sheet. Al extraer la señal CLKO y medirla en el osciloscopio, me dá 16 MHz, que no concuerda con la configuración del oscilador, los DIV y PLLs, y al introducir en el registro BRG el numero calculado con las ecuaciones se reciben caracteres "raros" (culpa del baud incorrecto).

Por otra parte, el UART solo se inicia en recepción, por lo cual no puedo enviar caracteres por UART del PIC y así medir el baudrate configurado.

Alguien ha tenido algún problema parecido? y si es así algún consejo?

Muchisimas gracias por la ayuda.

Adjunto algunas partes de configuración, por si veis algo que pueda estar mal:

Citar
//Bits de configuración

_CONFIG2(IESO_OFF & PLLDIV_NODIV & PLL96MHZ_ON & FNOSC_FRCPLL & FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMOD_NONE)
_CONFIG1(JTAGEN_ON & GCP_OFF & GWRP_OFF & ICS_PGx1 & FWDTEN_OFF & WINDIS_OFF & FWPSA_PR128 & WDTPS_PS32768)


//Config del oscilador

   ODCBbits.ODB8 = 1;       //indicamos salidas configuracion open drain

   CLKDIVbits.RCDIV = 0b001;
   CLKDIVbits.PLLEN = 1;      //Activación del PLL del USB
//   CLKDIVbits.CPDIV = 0b10;           //Fclk a 8MHz    (SI ACTIVO ESTA INSTRUCCION NO FUNCIONA EL UART NI EN RX NI EN TX)


//Configuración de la UART

   RPINR18bits.U1RXR = 9;    //seteamos como RX
   RPOR4bits.RP8R = 3;      //seteamos como TX

   
   unsigned int U1MODEvalue;
   unsigned int U1STAvalue;
   
   ConfigIntUART1(UART_RX_INT_DIS & UART_RX_INT_PR0 & UART_TX_INT_DIS & UART_TX_INT_PR0);
   U1MODEvalue = 0b1000100000000000;
   U1STAvalue  = 0b1010010000001000;
    U1STAbits.UTXEN = 1;

   baud = 207;  //19200   antes 103
   OpenUART1(0b1000100000000000, 0b1010010000000000, baud);


//Instrucción de escritura en la UART: (Envía cada vez que pasa por esta instr. un caracter 'a', en el pc no recibo nada)
       
        WriteUART1('a');


Muchisimas gracias!! llevo ya 3 dias atascado con esto y no consigo dar con el clavo!

un saludo!!

Desconectado zivit

  • PIC10
  • *
  • Mensajes: 22
Re: Problema con interfaz USB-UART
« Respuesta #1 en: 30 de Julio de 2015, 21:09:19 »
El UART ya transmite.

El problema estaba en, por una parte el JTAG que estaba activado y por otra parte, cuando se quiere cambiar las funciones de los pines reprogramables del microcontrolador (PIC24F) se debe seguir este procedimiento:

*Escribir en los 8 bits de menos peso de OSCCON 46h y a continuación 57h, una vez hecho esto se puede modificar IOLOCK que se encarga de bloquear los cambios de las funciones de los pines reprogramables, a continuación ya se puede modificar los RP's.
Citar
   
//Modificación de IOLOCK
   OSCCON = 0x1146;
   OSCCON = 0x1157;
   OSCCONbits.IOLOCK = 0;

   RPINR18bits.U1RXR = 9;    //seteamos como RX (RP9)
   RPOR4bits.RP8R = 3;      //seteamos como TX (RP8)

En teoría esto no es necesario (el reset pone IOLOCK a 0 pero en mi caso no ocurre esto).

El problema de configurar el baudrate aun persiste, es como si algo no vaya bien en el microcontrolador, o eso o es que ya estoy de los nervios.

Desconectado zivit

  • PIC10
  • *
  • Mensajes: 22
Re: Problema con interfaz USB-UART
« Respuesta #2 en: 31 de Julio de 2015, 08:24:12 »
Al modificar este registro: CLKDIVbits.CPDIV = 0b10; , el modulo USB deja de funcionar. Es raro porque el registro modifica un postscaler de la señal de reloj después del modulo PLL que utiliza el USB. Asi que no tengo ni idea de porque esto ocurre.

Data sheet (pagina 114):
http://ww1.microchip.com/downloads/en/DeviceDoc/39940d.pdf

Como podeis ver CPDIV no tiene porque afectar al USB.

Alguien sabe que está pasando? O es que el modulo USB solo lo puedo hacer funcionar utilizando un system clk de 32MHz?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Problema con interfaz USB-UART
« Respuesta #3 en: 31 de Julio de 2015, 09:19:53 »
Con respecto a cambiar los bits de OSCCON, cuando estan bloqueados asi y se necesita un procedimiento para desbloquearlos, XC provee algunas funciones como:

Código: C
  1. void __builtin_write_OSCCONH(unsigned char value);
  2. void __builtin_write_OSCCONL(unsigned char value);

Ya estan incorporados al compilador, asi que si por ejemplo quisiera poner el primer byte con el valor 0x01 haria simplemente:

Código: C
  1. __builtin_write_OSCCONL(0x01);

O si quisieras que hacer un OSCCON = 0xF82C

Código: C
  1. __builtin_write_OSCCONH(0xF8);
  2. __builtin_write_OSCCONL(0x2C);

Esto lo podes ver en:
http://ww1.microchip.com/downloads/en/DeviceDoc/50002071E.pdf
XC16 User Manual, en la seccion de Built-in functions

---------------------------

Ahora con respecto a CPDIV te tengo la solucion:

PIC24F Family Reference Manual”, Section 6. “Oscillator”- Pagina 6-20
http://ww1.microchip.com/downloads/en/DeviceDoc/39700c.pdf

Citar
Note 1: These options are not compatible with USB operation. They may be used whenever the PLL branch is selected and the USB module is disabled.

Se refiere a las opciones para cuando el clock es de 8Mhz y 4 Mhz, es decir CPDIV en 10 y 11 , deberas seleccionar una velocidad mayor, es decir 16Mhz (01) o 32Mhz (00). El cual no veo inconveniente al seleccionar estas velocidades.

----------------------------

Una cosa para aprender de microchip:
Saliendo de los PIC16 y PIC18, es decir:

dsPIC , PIC24, PIC32, el datasheet es un "resumen" del PIC, y cada modulo posee su propio PDF, odio cuando ocurre asi, pero es asi.
« Última modificación: 31 de Julio de 2015, 13:23:34 por KILLERJC »

Desconectado zivit

  • PIC10
  • *
  • Mensajes: 22
Re: Problema con interfaz USB-UART
« Respuesta #4 en: 31 de Julio de 2015, 19:15:47 »
Muchas gracias por tu respuesta!

Utilizo MPLAB 8.92 compilador C30. Creo que este compilador no incluye ninguna función para modificar el registro solo los últimos 8 bits, mi manera de modificarlo ha sido a palo seco conociendo el valor de los bits de mas peso.

Citar
Ahora con respecto a CPDIV te tengo la solucion:

PIC24F Family Reference Manual”, Section 6. “Oscillator”- Pagina 6-20
http://ww1.microchip.com/downloads/en/DeviceDoc/39700c.pdf

Citar
Note 1: These options are not compatible with USB operation. They may be used whenever the PLL branch is selected and the USB module is disabled.

Se refiere a las opciones para cuando el clock es de 8Mhz y 4 Mhz, es decir CPDIV en 10 y 11 , deberas seleccionar una velocidad mayor, es decir 16Mhz (01) o 32Mhz (00). El cual no veo inconveniente al seleccionar estas velocidades.

Ostras lo leí muy por encima y pensé que era lo mismo que tenia el datasheet pero más general (para toda la família de PIC24F), igualmente después de muchas pruebas he decidido dejarlo en 16 MHz.

Muchas gracias ahora me lo leeré más a fondo.


Citar
Una cosa para aprender de microchip:
Saliendo de los PIC16 y PIC18, es decir:

dsPIC , PIC24, PIC32, el datasheet es un "resumen" del PIC, y cada modulo posee su propio PDF, odio cuando ocurre asi, pero es asi.

Cuando decidí hacerlo con PIC24 y me dijeron que era un lío, yo pensaba si el datasheet es como otro cualquiera. Ahora veo que tenían razon, hay mil manuales de uso! jaja Que liada!

Muchas gracias por la información, de verdad! Desconocía que fuese tan complejo este micro.

Un saludo!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Problema con interfaz USB-UART
« Respuesta #5 en: 01 de Agosto de 2015, 00:11:27 »
Citar
Muchas gracias por la información, de verdad! Desconocía que fuese tan complejo este micro.

En si no es tan complejo, el tema es la decision de la empresa de realizar muchos PDF (de 300, 40,30 hojas), en ves de un solo PDF de 1300 hojas por ejemplo y alli tener todo.
Eso hace que la explicacion del modulo es muy general para todos los PIC24F, y por ahi a alguno le falta un par de cosas pero que el PDF del modulo asume que lo tiene, y tenes que constrastar con el PDF del micro.
Es lo que realmente odie de eso (especialmente por tener que estar viajando entre 2 PDF para configurar un modulo) :P , pero hay que acostumbrarse a todo y no quedarse con un formato,

Citar
Utilizo MPLAB 8.92 compilador C30

Disculpa no lo sabia, pero lo podes usar igual:

C30 User Manual - Pagina 154:
http://ww1.microchip.com/downloads/en/devicedoc/c30_users_guide_51284f.pdf
« Última modificación: 01 de Agosto de 2015, 00:14:06 por KILLERJC »

Desconectado zivit

  • PIC10
  • *
  • Mensajes: 22
Re: Problema con interfaz USB-UART
« Respuesta #6 en: 01 de Agosto de 2015, 11:31:20 »
Citar
Disculpa no lo sabia, pero lo podes usar igual:

C30 User Manual - Pagina 154:
http://ww1.microchip.com/downloads/en/devicedoc/c30_users_guide_51284f.pdf

Gracias, no me había fijado. De hecho pensaba que asignándolo directamente ej OSCCON = 0x1146; o lo que sea era lo suficientemente rápido.

Pero he recordado esto:
Citar
If the bulk of the application is written in C or
another high-level language, the unlock sequence
should be performed by writing in-line assembly.
Entonces se necesitaría o trabajar en ensamblador esa parte del código o aplicar las funciones Built-in. Había entendido mal lo de in-line assembly, pensaba que se refería a asignar directamente un valor al registro completo (en una linea, "in-line") y no ir asignando uno a uno los bits del registro.

Vale pues entonces me queda un poco mas claro todo.

Muchas Gracias!!   :)

PD: Ya me funciona perfectamente! al fín!
« Última modificación: 01 de Agosto de 2015, 11:34:24 por zivit »

Desconectado zivit

  • PIC10
  • *
  • Mensajes: 22
Re: Problema con interfaz USB-UART
« Respuesta #7 en: 06 de Agosto de 2015, 09:48:48 »
Buenas!

Ahora estoy intentando hacer la recepción de la UART por interrupción, pero no funciona. Creo que lo estoy haciendo bien pero lo de los vectores de interrupción es nuevo para mi y no me acabo de aclarar del todo.

Aqui la configuración:
Citar
   //UART
   RPINR18bits.U1RXR = 9;    //TX de pic18 seteamos como RX
   RPOR4bits.RP8R = 3;      //RX de pic18 seteamos como TX
                  
   U1BRG = 207;  //19200   antes 51
   ConfigIntUART1(UART_RX_INT_EN & UART_RX_INT_PR4 & UART_TX_INT_DIS & UART_TX_INT_PR0);

   U1MODEbits.RTSMD = 1;
   U1MODEbits.LPBACK = 0;       //LOOPBACK mode
   U1MODEbits.BRGH = 1;

   U1MODEbits.UARTEN = 1;      //Enable UART
   U1STAbits.UTXEN = 1;      //Enable TX

El ConfigIntUART simplemente carga los registros IPC y IEC con los valores escogidos.

y esta es la función ISR:

Citar
void __attribute__((interrupt, no_auto_psv)) _U1RXInterrupt(void) {
    if(IFS0bits.U1RXIF){
      guardaByte();
      if(LEDON == 1)LEDON = 0;
      else LEDON = 1;
      IFS0bits.U1RXIF = 0;
   }
}

No se si tengo que instanciar esta función en el principio del programa, no lo he hecho, o la cabecera está mal, pero solamente entra a la función cuando activo el UART.

Gracias!! un saludo


 

anything