# PIC18F4550 no es detectado por PC



## quevon24 (Abr 30, 2012)

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:


```
/////////////////////////////////////////////////////////////////////////
////                            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.







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.


----------



## Basalto (May 1, 2012)

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


----------



## quevon24 (May 1, 2012)

Basalto dijo:


> 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



Lo siento, subi la foto que tiene las resistencias, originalmente no las lleva, pero ni asi detecta el pc ni me muestra algun mensaje.


----------



## Basalto (May 2, 2012)

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


----------



## quevon24 (May 2, 2012)

Basalto dijo:


> 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


----------



## Randy (May 2, 2012)

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


----------



## quevon24 (May 2, 2012)

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.


----------



## D@rkbytes (May 3, 2012)

quevon24 dijo:


> 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.


----------



## quevon24 (May 3, 2012)

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.


----------



## popeyems (Jun 17, 2012)

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:

```
#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


----------



## quevon24 (Jun 17, 2012)

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.


----------



## popeyems (Jun 17, 2012)

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?


----------



## quevon24 (Jun 18, 2012)

yo la unica forma de comprobar que los pines no servian fue comprar uno nuevo y lo monte exactamente igual en mi circuito y si lo detectaba y todo.


----------



## popeyems (Jun 18, 2012)

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


----------



## Kamil (May 30, 2014)

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 p*or* q*ué* no lo detecta?

Un saludo.


----------



## D@rkbytes (May 30, 2014)

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.


----------



## TRILO-BYTE (May 30, 2014)

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


----------



## ivancoronel9 (Jun 22, 2014)

quevon24 dijo:


> 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.


----------



## D@rkbytes (Jun 22, 2014)

ivancoronel9 dijo:


> ¿Cual es entonces la conexión correcta de D+ y D-?
> Yo estoy conectando el cable verde al pin 23 y el blanco al pin 24.
> Espero no haberlo quemado.


Es mejor que te orientes con estas imágenes para que verifiques si lo conectaste bien.









​


----------



## naranjo_jose (Mar 11, 2022)

*T*uve 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 *W*indows en detalles de controlador me sale la informacion del vid 4550 correcto, pero todav*í*a sigo teniendo problema con las firmas no digitales en *W*indows 10. *G*racias por la imagen de las conexiones*,* me ayudaron mucho.


----------



## naranjo_jose (Mar 11, 2022)

Ya corregí todo gracias a Dios, encontré información que me ayudo a solucionar el tema de firmas digitales en windows 10 x 64.

*E*ste es el comando que tienen que ejecutar en cmd en modo administrador.

bcdedit /set testsigning on

*E*ste es video que está en youtube.


----------



## Ghozt143 (May 6, 2022)

Hola*, *buenas tardes a todos*,* electrónicos*.
E*sta última semana estuve realizando pruebas para la comunicación con el *PIC18F4550* y el *PC, *el cual les dejo el código en CCS versión 5 que mide las entradas analógicas para pasarlas por *USB* a la *PC *y visualizarlas*.
S*in embargo*,* al momento de hacer la transmisión me dice que el dispositivo no se reconoce, tanto la implementación como en simulación en proteus, por lo cual sospecho que debe ser por los *controladores,* por ello hago uso de los *controladores* que me ofrece Microchip*, *pero al instalarlo no me deja*,* debido a mi sistema operativo que es *W*indow*s *10 de 64 bits, cosa que tiene que ser necesariamente en este sistema operativo.
*Y*a intent*é* cambiar la instalación de *controladores* no firmados y aún así no me deja instalar.
Si alguien encontró una solución del problema o similar, para que me pueda ayudar*,* por favor*.*

```
///////////////////////////////////////////////////////////////////////////////

///                              PROGRAMA v2.0                              ///

///////////////////////////////////////////////////////////////////////////////

#INCLUDE <18F4550.h>
///////////////////////////////////////////////////////////////////////////////
///                          CONFIGURACION DEL PIC                          ///
///////////////////////////////////////////////////////////////////////////////
#DEVICE ADC=10  // 10 bits de conversion
#FUSES HSPLL      // Oscilador de cristal: >4MHz (20MHz)
#FUSES NOWDT      // Watch Dog Timer deshabilitado
#FUSES NOPROTECT  // Proteccion contra la lectura de la memoria

                                        // FLASH deshabilitada
#FUSES NOLVP      // Programacion en baja tension deshabilitado
#FUSES NODEBUG    // Modo DEBUG para ICD deshabilitado
#FUSES USBDIV     // Clock del modulo USB: PLL/2 (48MHz)
#FUSES PLL5       // Divisor de PLL: 1 (4MHz)
#FUSES CPUDIV1    // Clock del procesador: PLL/2 (48MHz)
#FUSES VREGEN     // Regulador interno de 3.3v habilitado
#FUSES NOPBADEN   // Configura el puerto B como E/S digitales
#FUSES MCLR       // Pin Master Clear habilitado

#USE delay (clock=48MHZ)   // Frecuencia del oscilador: 48MHz
#INCLUDE <usb_cdc.h>       // Libreria de funciones para USB-CDC

int16 Canal1,Canal2,Canal3,canal4;     // Variable de lectura del ADC
float v1,v2,v3,v4,muestra=5;           // Variable de tension de y de
                                       // cantidad de lecturas por canal
int i;                                 // Variable contador
char dato;                             // Variable de dato recibido

///////////////////////////////////////////////////////////////////////////////

///                                 FIRMWARE                                ///

///////////////////////////////////////////////////////////////////////////////
void main() {              // Menu principal
   // Configuracion conversor AD
   setup_adc_ports(AN0_TO_AN3);        // Canal AN0 analogico
   setup_adc(ADC_CLOCK_DIV_64);        // Fuente de reloj para la conversion
   // Inicializacion puerto USB-CDC
   usb_cdc_init();                     // Inicializa puerto virtual COM
   usb_init();                         // Inicializa el hardware USB
   usb_wait_for_enumeration();         // Espera hasta que sea enumerado
   while(!usb_cdc_connected()){
   }
   do{                                 // Blucle infinito
      usb_task();                       //
      if (usb_enumerated()){           // ¿El dispositivo esta enumerado?
         if (usb_cdc_kbhit()){
            dato=usb_cdc_getc();
            if (dato=='A'){
               v1=0;
               v2=0;
               v3=0;
               v4=0;
               // Lectura de v1
               for (i=1; i<=muestra; i++){
                  set_adc_channel(0);        // Habilita canal 0
                  delay_us(20);                  // Retardo de tiempo de 20us
                  Canal1=read_adc();         // Canal 1 igual a lectura en AN0
                  v1=v1+5.0*Canal1/1023.0;   // Calculo para v1
               }
               v1=v1/muestra;                // Promedio de v1
               // Lectura de v2
               for (i=1; i<=muestra; i++){
                  set_adc_channel(1);        // Habilita canal 1
                  delay_us(20);              // Retardo de tiempo de 20us
                  Canal2=read_adc();         // Canal 1 igual a lectura en AN1
                  v2=v2+5.0*Canal2/1023.0;   // Calculo para v2
               }
               v2=v2/muestra;                // Promedio de v2
               // Lectura de v3
               for (i=1; i<=muestra; i++){
                  set_adc_channel(2);        // Habilita canal 2
                  delay_us(20);                // Retardo de tiempo de 20us
                  Canal3=read_adc();         // Canal 1 igual a lectura en AN2
                  v3=v3+5.0*Canal3/1023.0;   // Calculo para v3
               }
               v3=v3/muestra;                // Promedio de v3
               // Lectura de v4
               for (i=1; i<=muestra; i++){
                  set_adc_channel(3);        // Habilita canal 3
                  delay_us(20);              // Retardo de tiempo de 20us
                  Canal4=read_adc();         // Canal 1 igual a lectura en AN3
                  v4=v4+5.0*Canal4/1023.0;   // Calculo para v4
               }
               v4=v4/muestra;                // Promedio de v4
               // Transmision de datos
               printf(usb_cdc_putc,"%2.2f%2.2f%2.2f%2.2f",v1,v2,v3,v4);
            }
            else if (dato=='B'){
               printf(usb_cdc_putc,"B");
            }
         }
      }
   }while(TRUE);
```

}


----------



## D@rkbytes (May 6, 2022)

Ghozt143 dijo:


> *E*sta última semana estuve realizando pruebas para la comunicación con el *PIC18F4550* y el *PC, *el cual les dejo el código en CCS versión 5


Este compilador tiene muchas versiones 5.XXX
Actualmente debe de ir por la versión 5.109 o superior, y entre todo ese rango de versiones siempre hay cosas que no funcionan.
Sobre todo cuando se trata de los controladores para comunicación por USB.
Prueba con la versión 5.081, esa va bien en este aspecto y todo lo demás.
Si eres usuario registrado puedes hacer el downgrade desde la página de descargas o recuperar tus instalaciones con el instalador.
Incluso puedes comentar directamente a CCS Info sobre tus problemas y te resuelven de inmediato.


----------

