desktop

PIC18F4550 no es detectado por PC

Buenas compañeros del foro de electronica, vengo con una nueva duda.

En estos momentos me encuentro trabajadno con el pic 18f4550 por el usb, estoy haciendo un semaforo controlado por pc, dependiendo del boton que se presione en el programa es la accion. Pero bueno el problema no es eso, mas que nada una introduccion.

El problema es este, estoy usando picusb para la comunicacion, este es el programa del semaforo:

Código:
/////////////////////////////////////////////////////////////////////////
////                            PicUSB.c                             ////
////                                                                 ////
//// Este ejemplo muestra como desarrollar un sencillo dispositivo   ////
//// USB con el PIC18F2550, aunque puede ser facilmente adaptado     ////
//// para la serie 18Fxx5x. Se suministra el PicUSB.exe, así como    ////
//// su código fuente para Visual C# 2005, podréis encontrar tb      ////
//// los drivers para el dispositivo. No se suministra esquema de    ////
//// conexión puesto que está pensado para ser usado en el GTP USB,  ////
//// cualquiera de las tres versiones disponibles, si aun no teneis  ////
//// el programador, podeis utilizar el esquema de ese proyecto.     ////
////                                                                 ////
//// Cuando el dispositivo sea conectado al PC, saldrá el asistente  ////
//// para la instalación del driver. Instala el suministrado junto   ////
//// a este ejemplo, lo encontrareis dentro de la carpeta Driver.    ////
//// Una vez instalado podreis usar el PicUSB.exe para encender o    ////
//// apagar el led bicolor del GTP USB, y para realizar la suma de   ////
//// dos números introducidos.                                       ////
////                                                                 ////
//// Realizado con el compilador CCS PCWH 3.227                      ////
////                                                                 ////
//// Por: Jaime Fernández-Caro Belmonte        [EMAIL="SinCorreo@hotmail.com"]SinCorreo@hotmail.com[/EMAIL]  ////
////                                                                 ////
//// [url]http://www.hobbypic.com[/url]                                         ////
/////////////////////////////////////////////////////////////////////////
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=12000000)
 
 
/////////////////////////////////////////////////////////////////////////////
//
// CCS Library dynamic defines.  For dynamic configuration of the CCS Library
// for your application several defines need to be made.  See the comments
// at usb.h for more information
//
/////////////////////////////////////////////////////////////////////////////
#define USB_HID_DEVICE     FALSE             //deshabilitamos el uso de las directivas 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    1                 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE    3                 //size to allocate for the rx endpoint 1 buffer
 
 
/////////////////////////////////////////////////////////////////////////////
//
// If you are using a USB connection sense pin, define it here.  If you are
// not using connection sense, comment out this line.  Without connection
// sense you will not know if the device gets disconnected.
//       (connection sense should look like this:
//                             100k
//            VBUS-----+----/\/\/\/\/\----- (I/O PIN ON PIC)
//                     |
//                     +----/\/\/\/\/\-----GND
//                             100k
//        (where VBUS is pin1 of the USB connector)
//
/////////////////////////////////////////////////////////////////////////////
//#define USB_CON_SENSE_PIN PIN_B2  //CCS 18F4550 development kit has optional conection sense pin
 
/////////////////////////////////////////////////////////////////////////////
//
// Include the CCS USB Libraries.  See the comments at the top of these
// files for more information
//
/////////////////////////////////////////////////////////////////////////////
#define use_portb_lcd TRUE         //definir portb lcd
#include<lcd.c>
 
#include <pic18_usb.h>     //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <PicUSB.h>         //Configuración del USB y los descriptores para este dispositivo
#include <usb.c>           //handles usb setup tokens and get descriptor reports
 
 
/////////////////////////////////////////////////////////////////////////////
//
// Al conectar el PicUSB al PC encendemos el Led Rojo hasta que el dispositivo
// halla sido configurado por el PC, en ese momento encederemos el Led Verde.
// Esperaremos hasta que se reciba un paquete proveniente del PC. Comprobaremos
// el primer byte del paquete recibido para comprobar si queremos entrar en el
// modo Suma, donde se realizará una suma de dos operandos, que corresponderan
// con los dos bytes restantes del paquete recibido; una vez realizada la suma
// enviaremos el paquete con el resultado de vuelta al PC. Si entramos en el
// modo Led comprobaremos el segundo byte del paquete recibido para comprobar
// si deberemos apagar los leds, encender el verder o el rojo.
//
/////////////////////////////////////////////////////////////////////////////
 
 
 
void main(void) {
   int8 semaforo[2];
         output_high(PIN_B7);    //enciende el led al conectar el pic
   usb_init();                      //inicializamos el USB
 
   usb_task();                      //habilita periferico usb e interrupciones
 
   usb_wait_for_enumeration();      //esperamos hasta que el PicUSB sea configurado por el host
   output_low(PIN_B7);         // se apaga el led al existir comunicación usb
  while (TRUE)
   {
      if(usb_enumerated())          //si el PicUSB está configurado
      {
         if (usb_kbhit(1))          //si el endpoint de salida contiene datos del host
         {
            usb_get_packet(1, semaforo, 1);
 
 
            if (semaforo[0] == 1)
            {
            do
            {
            output_high(PIN_D7);   // Apaga led
            output_low(PIN_D6);
            output_low(PIN_D5);
            output_low(PIN_D4);
            output_low(PIN_D3);
            output_high(PIN_D2);
            delay_ms(55000);
            output_low(PIN_D7);   // Apaga led
            output_high(PIN_D6);
            output_low(PIN_D5);
            output_low(PIN_D4);
            output_low(PIN_D3);
            output_high(PIN_D2);
            delay_ms(1000);
            output_low(PIN_D7);   // Apaga led
            output_low(PIN_D6);
            output_low(PIN_D5);
            output_low(PIN_D4);
            output_low(PIN_D3);
            output_high(PIN_D2);
            delay_ms(1000);
            output_low(PIN_D7);   // Apaga led
            output_high(PIN_D6);
            output_low(PIN_D5);
            output_low(PIN_D4);
            output_low(PIN_D3);
            output_high(PIN_D2);
            delay_ms(1000);
            output_low(PIN_D7);   // Apaga led
            output_low(PIN_D6);
            output_low(PIN_D5);
            output_low(PIN_D4);
            output_low(PIN_D3);
            output_high(PIN_D2);
            delay_ms(1000);
            output_low(PIN_D7);   // Apaga led
            output_high(PIN_D6);
            output_low(PIN_D5);
            output_low(PIN_D4);
            output_low(PIN_D3);
            output_high(PIN_D2);
            delay_ms(1000);
            output_low(PIN_D7);   // Apaga led
            output_low(PIN_D6);
            output_low(PIN_D5);
            output_low(PIN_D4);
            output_low(PIN_D3);
            output_high(PIN_D2);
            delay_ms(1000);
            output_low(PIN_D7);   // Apaga led
            output_low(PIN_D6);
            output_high(PIN_D5);
            output_high(PIN_D4);
            output_low(PIN_D3);
            output_low(PIN_D2);
            delay_ms(55000);
            output_low(PIN_D7);   // Apaga led
            output_low(PIN_D6);
            output_high(PIN_D5);
            output_low(PIN_D4);
            output_high(PIN_D3);
            output_low(PIN_D2);
            delay_ms(1000);
            output_low(PIN_D7);   // Apaga led
            output_low(PIN_D6);
            output_high(PIN_D5);
            output_low(PIN_D4);
            output_low(PIN_D3);
            output_low(PIN_D2);
            delay_ms(1000);
            output_low(PIN_D7);   // Apaga led
            output_low(PIN_D6);
            output_high(PIN_D5);
            output_low(PIN_D4);
            output_high(PIN_D3);
            output_low(PIN_D2);
            delay_ms(1000);
            output_low(PIN_D7);   // Apaga led
            output_low(PIN_D6);
            output_high(PIN_D5);
            output_low(PIN_D4);
            output_low(PIN_D3);
            output_low(PIN_D2);
            delay_ms(1000);
            output_low(PIN_D7);   // Apaga led
            output_low(PIN_D6);
            output_high(PIN_D5);
            output_low(PIN_D4);
            output_high(PIN_D3);
            output_low(PIN_D2);
            delay_ms(1000);
            output_low(PIN_D7);   // Apaga led
            output_low(PIN_D6);
            output_high(PIN_D5);
            output_low(PIN_D4);
            output_low(PIN_D3);
            output_low(PIN_D2);
            delay_ms(1000);
             usb_get_packet(1, semaforo, 1);
            }while(semaforo[0]==1);
            }
            if (semaforo[0] == 2) // Modo_Led
            {
 
               output_low(PIN_D7);   //// Enciende led
               output_low(PIN_D6);
               output_low(PIN_D5);
               output_low(PIN_D4);
               output_low(PIN_D3);
              output_low(PIN_D2);
 
            }
            if (semaforo[0] == 3) // Modo_Led
            {
 
               output_high(PIN_D7);   //// Enciende led
               output_low(PIN_D6);
               output_low(PIN_D5);
               output_low(PIN_D4);
               output_low(PIN_D3);
              output_high(PIN_D2);
 
            }
 
            if (semaforo[0] == 4) // Modo_Led
            {
 
               output_low(PIN_D7);   //// Enciende led
               output_high(PIN_D6);
               output_low(PIN_D5);
               output_low(PIN_D4);
               output_high(PIN_D3);
              output_low(PIN_D2);
 
            }
 
            if (semaforo[0] == 5) // Modo_Led
            {
 
               output_low(PIN_D7);   //// Enciende led
               output_low(PIN_D6);
               output_high(PIN_D5);
               output_high(PIN_D4);
               output_low(PIN_D3);
              output_low(PIN_D2);
 
            }
 
 
            }
         }
      }
   }

Y la imagen es mi circuito, se los describo.

fdzgv7.jpg


El el pin 1, el mclr, tiene una resistencia de 1 K, en la 11 Vdd, en 12 GND, 13 y 14 cristal de 12 Mhz, y 2 capacitores de 15pF, y en la 18 un capacitor de 47uF, en 23 D- y 24 D+ que vienen desde el usb, y los leds de el semaforo, y en el pin 40 unos leds para saber si la conexion es correcta.

El problema es este, al momento de compilar el programa y despues de grabarlo en el pic, lo monto y conecto mi usb al pc pero esta no detecta el dispositivo y no me deja instalarlo , he probado el pic con un programa que no requiera usb y funciona bien.

Este circuito me lo dio mi profesor de programacion y anteriormente funcionaba en otro pc, el pc me detectaba bien el pc y podria hacer bien la comunicacion con el programa para controlar el semaforo, pero hace unos dias se desconecto mi usb del protoboard, y lo volvi a conectar pero ahora ya no lo detecta. Me gustaria saber si tienen alguna idea de por que el pc no detecta el pic.

Si requieren mas detalles, procurare darselos lo mejor posible.
 
Última edición por un moderador:
Hola, viendo un poco por encima el dibujo no entiendo el porque de las resistencias que van al D+ y D-, yo lo conecto directamente. Un saludo
 
Cambia el condensador del pin 18 por un valor mas bajo como por ejemplo 1uF y tambien revisa que en los fuses actives el PLLx4. Un saludo
 
Cambia el condensador del pin 18 por un valor mas bajo como por ejemplo 1uF y tambien revisa que en los fuses actives el PLLx4. Un saludo

Ya lo intente y nada de nada u.u

Aunque algo paso, se desconecto la tierra del usb, y me aparecio un mensaje que decia "No se ha reconocido dispositivo" y en el administrador de dispositivos aparece como "Unknown Device" pero no aparece en la seccion COM
 
no será el descriptor?

y otra cosa el divisor debe ser X3, no?

y el capacitor de Vusb (que yo uso) son 2 de 100n en paralelo.

Saludos
 
Última edición:
en los fuses me equivoque en esta parte PLL5, supongo que debe de ser PLL3 ya que el cristal es de 12 pero tampoco, realmente ya me quede sin ideas de que puede ser.
 
en los fuses me equivoque en esta parte PLL5, supongo que debe de ser PLL3 ya que el cristal es de 12 pero tampoco, realmente ya me quede sin ideas de que puede ser.
No se pero me supongo que esos PIC tienen que tener un controlador instalado no?
Nunca he probado este tipo de comunicación más que en simulaciones,
y hay que instalar los drivers para que la pc detecte correctamente el dispositivo.

Ósea que si los tiene instalados, posiblemente una reinstalación reparara el conflicto.
Bueno, esa es mi sugerencia, si estoy mal me sirve para aprender. ;)

Saludos.
 
Ya esta solucionado, por alguna razon los pines D+ y D- dejaron de funcionar y por eso no detecta la conexion, el pic si sirve, pero no la parte de usb.

La unica solucion fue comprar otro pic y ese ya fue detectado correctamente.
 
Hola, soy nuevo en el foro, espero mi pregunta no sea tan basica jeje
El problema que tengo es que estoy armando un circuito que usa el PIC 18f4550 para hacer una comunicacion entre el PIC y la PC por medio del puerto usb recogiendo y enviando datos con un programa en C#, en la simulación me funciona todo perfecto, me detecta el dispositivo perfectamente y puedo manejar el pic desde el programa en C# sin problemas, mi problema es cuando lo hago real, ya revise las conexiones mil veces y todo se ve en orden, pero al conectar el pic no me lo detecta la pc, puedo ver empieza a funcionar el pic pues se queda exactamente igual a como aparece en la simulación antes de instalar el driver, pero windows no me lo detecta, lei otro post de otro usuario que tenia un problema igual que menciono que cambio el pic porque no le funcionaba, pero ya probé con dos pics nuevos y con los dos me pasa exactamente lo mismo, sospecho que se debe a un problema con los FUSES del programa que hace que no se sincronice bien pero no estoy seguro (solo había trabajado en ensamblador y el pic 16f84A y 16f877A, ahora estoy con CCS y el 18f4550), adjunto una copia del código que estoy usando:
Código:
#include <18F4550.h>
#device adc=8

#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,PLL5,CPUDIV1
#use delay(clock=48000000)

#define USB_HID_DEVICE     FALSE             //deshabilitamos el uso de las directivas 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    1                 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE    3                 //size to allocate for the rx endpoint 1 buffer

#include <pic18_usb.h>     //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include "usb_desc_scope.h" //Configuración del USB por Enumerador Palitroquez
#include <usb.c>           //handles usb setup tokens and get descriptor reports

#use fast_io(b) //Hay que configurar manualmente el trisb

void main(void) {

   int8 recibe[2];                  //declaramos variables
   int8 envia[1];
   
   set_tris_b(0x00); //Todo salidas
   set_tris_a(0xff); //Todo entradas
   output_b(0x00);
   
   output_low(PIN_B7); //Apaga led para indicar que no ha sido detectado por pc
   
   setup_adc (adc_clock_div_32); //Enciende ADC
   setup_adc_ports (AN0_ANALOG); //Elige terminales análogicas
   set_adc_channel (0); //Elige canal a medir
   
   usb_init();                      //inicializamos el USB
   usb_task();                      //habilita periferico usb e interrupciones
   usb_wait_for_enumeration();      //esperamos hasta que el PicUSB sea configurado por el host
   
   output_high(PIN_B7); //Ya fue detectado por PC
   delay_ms(500);
   output_low(PIN_B7); //Ya fue detectado por PC
   delay_ms(500);
   output_high(PIN_B7); //Ya fue detectado por PC
   delay_ms(500);
   output_low(PIN_B7); //Ya fue detectado por PC
   delay_ms(500);
   output_high(PIN_B7); //Ya fue detectado por PC
   delay_ms(500);
   output_low(PIN_B7); //Ya fue detectado por PC
   delay_ms(500);
   
   while (1)
   {
      if(usb_enumerated())          //si el PicUSB está configurado
      {
         if (usb_kbhit(1))          //si el endpoint de salida contiene datos del host
         {
            usb_get_packet(1, recibe, 2);
            if(recibe[0] == 0xff) // Debe activar BCD
               output_b(~recibe[1]); //display ánodo común
            if(recibe[0]==0x00)
               {
               envia[0]=read_adc (); //Hace conversión AD
               usb_put_packet(1, envia, 1, USB_DTS_TOGGLE);
               }
         }
      }
   }
}

Nota, para simular estoy usando proteus, el cristal que tengo es de 20Mhz, en el pic puse la frecuencia del procesador en 48Mhz (pero note que me marca un warning por la carga del procesador y si lo cambio a 4Mz me responde mas rápido el programa en C# y desaparece el warning)

Adjunto una imagen de como tengo la simulación en proteus
Ver el archivo adjunto 74620

por si afecta en algo, la pc donde los estoy probando tiene windows 7 de 64 bits y puertos usb 3.0 pero se supone que el usb 3.0 es completamente compatible con usb 2.0 (ningun dispositivo me da problemas) y una duda mas, saben como generar el driver para 64bits? los que he hecho me generan un error al intentar instalar, solo he podrido generar el correcto para 32 bits (estoy simulando sobre un xp de 32 bits en maquina virtual)

Gracias por la ayuda
 
Checa que esten bien el D+ y D- bien conectados, ya que si los conectas mal puedes dañar los pines del usb del pic, yo eche a perder dos pics asi, ya en el tercero conecte bien y detecta perfecto y todo, esa fue la solucion del problema que plantee en este tema.
 
segun yo esta todo bien conectado, estoy usando un conector usb B hembra, visto desde abajo lo conecte asi:
______
| |
| 3 4 |
|_2_1_|

de frente quedan asi los pines:

| 2 1 |
| 3 4 |

(comprobé el voltaje con un multimetro para evitar conectar mal e identificar los pines)
donde 1 es VCC, 2 D-, 3 D+ y 4 ground, esto es correcto?
el D- lo conecte en el pin 23 y el D+ en el 24 como dice el datasheet
alguna otra sugerencia?



o existe alguna manera de comprobar su esos pines aun funcionan correctamente?
 
Última edición:
ok, gracias, voy a probar con uno nuevo entonces... pero una duda, la configuración de los fuses si esta bien? estoy usando un cristal de 20Mhz, podria cambiarlo por uno de 4MHz o de 10Mhz, según el datasheet si puedo usarlos, pero no me queda del todo claro como configurar los fuses
 
Tengo un problema similar, recién terminé una placa usando un 18f2550 y comunico por usb.
El hecho es que cuando conecto por usb, alimenta perfectamente al pic y todo, pero no me lo reconoce la pc, en ocasiones me da el error de Unknown Device.
¿Alguien podría enumerar aquí las posibles causas del por q no lo detecta?

Un saludo.
 
Última edición por un moderador:
Las causas principales son:
.- Tener mal la palabra de configuración para alcanzar los 48MHz requeridos para trabajar con USB.
.- Capacitor del pin vUSB con un valor no adecuado. (Yo uso uno de 0.47µF)
.- Lo que se ha mencionado anteriormente.
 
si lo conectas y no pasa nada

estar seguros de que el micro tiene algo grabado como:
el programa para hacer conexion USB.
un bootloader USB

el capacitor no es forzoso que sea de 0.47uf pude ser de 1uf hasta los ridiculos 4.7uf
esto fue por que me equivoque lo solde a mi proyecto y cuando me di cuenta 1 mes despues era de 4.7uf y funcionaba perfecto

sobre todo recordar revisar no cruzar D+ con D-
este error es muy comun cuando uno usa el USB, muchos se equivocan los ponen alrevez y batallan por encontrar la falla

solo revisa esos detalles

otra cosa ten cuidado con los fuses PLL
si el programa que le cargaste ".HEX" fue escrito para un cristal de 4MHZ debes usar ese cristal si fue para 20 Mhz debes usar el cristal.

en el codigo fuente si puedes cambiar los fuses PLL y CPUDiv que uno es para hacer trabajar el puerto usb a 48Mhz y el otro fuse indica a que velocidad trabaja el CPU

por que se comportan como 2 osciladores independientes partiendo de 1 solo oscilador de cuarzo
 
Checa que esten bien el D+ y D- bien conectados, ya que si los conectas mal puedes dañar los pines del usb del pic, yo eche a perder dos pics asi, ya en el tercero conecte bien y detecta perfecto y todo, esa fue la solucion del problema que plantee en este tema.

Cual es entonces la coneccion correcta de D+ y D-? yo estoy conectando el cable verde al pin 23 y el blanco al pin 24.. Espero no haberlo quemado.
 
Tuve el mismo problema, tenía el v+ y v- al revés, los intercambié y conté con suerte que el pic no se dañara, al momento de conectarlo a mi portátil me lo detecto enseguida y en el administrador de Windows en detalles de controlador me sale la informacion del vid 4550 correcto, pero todavía sigo teniendo problema con las firmas no digitales en Windows 10. Gracias por la imagen de las conexiones, me ayudaron mucho.
 

Adjuntos

  • Detalles del driver 18f4550.jpg
    Detalles del driver 18f4550.jpg
    746.4 KB · Visitas: 7
Atrás
Arriba