Autor Tema: UART no funciona en Pic con USB 18f1xK50 SOLUCIONADO  (Leído 1992 veces)

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

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
UART no funciona en Pic con USB 18f1xK50 SOLUCIONADO
« en: 15 de Julio de 2009, 07:21:31 »
Hola compañeros:

Estoy intentando que el pic me reciba datos y luego envie algo. Por el momento me envia perfectamente un string poniento un printf en el main, pero no logro que reciba nada. Lo he simulado con proteus y tampoco funciona...Es algo muy raro que creo que tendrá que ver con los fuses (bits de configuración), si ha alguien se le ocurre que puede ser o cualquier idea tonta que pueda servir lo pruebo in-situ.

Código: [Seleccionar]
#include <18F13K50.h>
#fuses HS, NOWDT, NOPROTECT, NOLVP, CPUDIV1, USBDIV1
#use delay(clock=12000000)
#use rs232(baud=57600, xmit=PIN_B7, rcv=PIN_B5, stream=PC)

#define LEDV         PIN_C0

#define LED_ON  output_high
#define LED_OFF output_low


void main(void) {
  
    printf("Hola");
    LED_ON(LEDV);
  
   while(1)
   {

if (kbhit(PC))
{
printf("HOLA");
LED_OFF(LEDV);
}
   }
}


Les adjunto un dibujo del esquemático.

Muchas gracias compañeros.
« Última modificación: 15 de Julio de 2009, 11:20:35 por c4_esp_VR »

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: UART no funciona en Pic con USB
« Respuesta #1 en: 15 de Julio de 2009, 07:54:08 »
Hola de nuevo  :):

He visto en el documento de erratas del pic 18F13k50 la siguiente errata que sinceramente no sé que significa y si me podria afectar para el manejo de la UART...

Citar
Module: EUSART – RCIDL bit
In Asynchronous Receive mode, the RCIDL bit of
the BAUDCON register will properly go low when
the RX input goes low at the leading edge of a Start
bit. If the RX input stays low for less than 1/8th of
a bit time then the Start bit is invalid and the RCIDL
should go high. However, the RCIDL bit will stay
low improperly until a valid Start bit is received.
Work around
When monitoring the RCIDL bit, measure the
length of time between the RCIDL going low and
the RCIF flag going high. If this time is greater than
one character time then restore the RCIDL bit by
resetting the EUSART module. The EUSART
module is reset when the SPEN bit of the RCSTA
register is cleared.

Como siempre, estaré por aqui a ver si lo puedo solucionar.

He intentado tambien hacer la UART por SW ya que CCS lo permite pero no para de enviarme HOLA todo el rato al PC nada más encender el pic...es decir, es como si siempre tuviese algo en la UART, por tanto esto tampoco es una solución  :? :? :?

Código de UART por SW

Código: [Seleccionar]
#include <18F13K50.h>
#fuses HS, NOWDT, NOPROTECT, NOLVP, CPUDIV1, USBDIV1
#use delay(clock=12000000)
//#use rs232(baud=57600, xmit=PIN_B7, rcv=PIN_B5, stream=PC)//Por HW
#use rs232(baud=57600, xmit=PIN_C1, rcv=PIN_C2, stream=PC)//Por SW, tambien lo he intentado con FORCE_SW y tampoco

#define LEDV         PIN_C0

#define LED_ON  output_high
#define LED_OFF output_low

void main(void) {
  
delay_ms(500);
    printf("Hola");
    LED_ON(LEDV);
  
   while(1)
   {
if (kbhit(PC))
{
fprintf(PC,"HOLA");
LED_OFF(LEDV);
}
   }
}

Seguimos investigando.
« Última modificación: 15 de Julio de 2009, 08:29:39 por c4_esp_VR »

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: UART no funciona en Pic con USB 18f1xK50 SOLUCIONADO
« Respuesta #2 en: 15 de Julio de 2009, 11:13:36 »
Esta vez ha sido más dificil solventarlo ya que es un bug del compilador CCS.

Resulta que este al tener la patilla de recepción de la UART en la misma que la entrada analógica 11, no pone el pin como entrada digital, sino como entrada analógica que en este caso no nos interesa y encima la función setup_adc_ports() de esta versión de CCS no es capaz de hacerlo aunque le pongamos NO_ANALOGS, ya que como comenté es un bug del compilador, para hacerlo funcionar hay que acceder a la dirección de memoria de dicha entrada analógica y ponerla a cero de la siguiente forma.

Código: [Seleccionar]
#include <18F13K50.h>
#fuses HS, NOWDT, NOPROTECT, NOLVP, USBDIV1, CPUDIV1
#use delay(clock=12000000)
#use rs232(baud=57600, parity=N, xmit=PIN_B7, rcv=PIN_B5, stream=PC, bits=8)//Por HW

#byte ANSEL = 0xF7E  //Dirección de memoria del byte ANSEL
#byte ANSELH = 0xF7F //Dirección de memoria del byte ANSELH
...
...

void main(void) {
  
ANSEL = 0;  //La ponemos digital
ANSELH = 0;//La ponemos digital

  while(true)
  {
     ...
     ...
  }
}

Bueno espero que esto no le vuelva a ocurrir a nadie ya que he estado a punto de tirar el ordenador por la ventana. Por cierto la versión que estoy actualmente usando es la 4.084

Un saludete.
« Última modificación: 15 de Julio de 2009, 11:20:18 por c4_esp_VR »


 

anything