Al iniciar el USB el pic se queda colgado!

Hola a todos, estoy con el proyecto de final de carrera en el que quiero utilizar una comunicación USB de tipo Bulk, y como no me ayude alguien creo que me voy a quedar por el camino :rolleyes:

Me he basado plenamente en el ejemplo de "Hobby pic", con el que comunican el Pic y el PC por USB (Bulk) y a través del visual C#. El cual ha funcionado a la perfección simulado.

Ahora he añadido la conexión USB a un circuito que tengo montado sobre una placa de topos el cual tiene una serie de pulsadores y un LCD.

Para hacerlo sencillo, he hecho un programita muy tonto para combinar el LCD con la configuración del USB (de momento no quiero transmitir ni recibir) y la sorpresa es que el PIC se queda colgado, el LCD no llega a escribir nada.

si comento las líneas de inicialización de USB y vuelvo a probar el programa, funciona perfectamente, si pulso el botón cambia el texto del LCD.

A continuación os pongo el código...

Código:
#include <18f4550.h>

#device adc=10 

#fuses HSPLL                  //High Speed Crystal/Resonator con PLL habilitado
#fuses NOWDT                  //No hay Wach Dog Timer
#fuses NOPROTECT              //No hay protección contra lectura
#fuses NOLVP                  //No se habilita el Low Voltage ICSP Programing
#fuses NODEBUG
#fuses USBDIV
#fuses PLL5
#fuses CPUDIV1
#fuses VREGEN

#use delay (clock = 48000000)

#define USB_HID_DEVICE     FALSE                      //disabled HID
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    2                 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE    2                 //size to allocate for the rx endpoint 1 buffer

#include <pic18_usb.h>      //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <PicWinUSB.h>     //Descriptors and USB configuration
#include <usb.c>              //handles usb setup tokens and get descriptor reports

#use standard_io(B)
#use standard_io(D)

#include "flex_lcd.c"                                     //#include <LCD.C> 

#int_TIMER1
/*función de la interrupción del TIMER1; 
cada vez que se desborde el TIMER1, hará esta función y volverá al punto 
donde estaba.*/
void temp1s(void)
{
            //Aquí irá una interrupción para controlar servos
}  

void servoArriba()
{
   printf(lcd_putc, "\f    SERVO");
   printf(lcd_putc, "\n    ARRIBA");
   delay_ms(1000);
}

void main()
{
   int8 iBuff[2];                               //Array de entrada
   int8 oBuff[2];                               //Array de salida
   
   port_b_pullups(TRUE);                        //Pullups del PORTB activadas, nos interesa ya que utilizamos muchos pulsadores.
   setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8);   
   enable_interrupts(INT_TIMER1);               //habilita interrupción TIMER1
   enable_interrupts(global);                   //habilita interrupción general
    
   setup_adc_ports(AN0);                        //Se configura A0 como en canal 0 del ADC.
   setup_adc(ADC_CLOCK_DIV_64);                 //Utilizo esta configuración, es la indicada en el datasheet. 

   lcd_init();                                  //Se inicializa el LCD.

   usb_init();                                  //Se inicializa el USB (SI COMENTO ESTAS LÍNEAS EL PROGRAMA FUNCIONA!)
   usb_task();
   usb_wait_for_enumeration();
   
  
   for(;;)
   {         
         if (input(PIN_B4)==0)                     //Si se pulsa el botón del pin B4
            servoArriba();                            //Aparece el texto Servo Arriba en el LCD
            
         printf(lcd_putc, "\f    SERVO");        //Si no aparece el texto Servo parado en el LCD
         printf(lcd_putc, "\n    PARADO");
         delay_ms(100);
            
   }
}

Hay puestos condensadores de 100nF cerca de las alimentaciones, y también he puesto el dichoso condensador de 470nF en el pin Vusb :)

Os adjunto el proyecto junto con la simulación en Proteus.

Un saludo y gracias de antemano!!!
 

Adjuntos

  • 0.0.rar
    113.4 KB · Visitas: 29
Comprobando el circuito me he dado cuenta de que el PIC no está generando la tensión de 3.3V (Vusb) en la pata18 que es donde está conectado un condensador de 470nf a masa.

No veo por donde está el fallo, el mismo circuito montado sobre un 18f2550 sí funciona y genera correctamente la tensión Vusb.

ninguna sugerencia?

Solucionado!!

He programado otro 18f4550 y ha funcionado!! USB con transmisión tipo Bulk funcionando en Win7 64

Es curioso porque en el de antes falla la parte USB pero hasta ahora lo tenía funcionando con varias cosas.

MORALEJA: Cuidado cuando compreis PICs por Ebay :)
 
Última edición:
Atrás
Arriba