Hola, hace días que vengo renegando con este problema sin lograr encontrar la solución. Estoy tratando de comunicar un pic 18f4550 con la pc por medio del puerto usb. Mientras esperaba que me llegara el pic fui desarrollando algunos programas de prueba que funcionan perfectamente en el Isis pero al implementarlos físicamente solo obtengo el mensaje de que no se reconoce el dispositivo.
El tema es que descubrí que si le cargo al pic los archivos .hex ya compilados que descargué de varios sitios web, la pc los reconoce y funcionan perfectamente. Pero si compilo ese mismo código que viene con el archivo hex entonces no funciona. Y al comparar los datos en hexa se ve que son distintos a pesar de que el ccs los compila sin errores.
Uso la versión 4.093. Estoy al límite de paciencia porque por más que lo pienso no le encuentro la solución. La conexión física evidentemente está bien porque con los .hex descargados no hay problema. Se podría decir que los archivos que descargué consisten en archivos compilados que sí funcionan y códigos que no, pero eso no explica que sí funcionen al simularlos.
Bueno, desde ya les agradezco cualquier ayuda que puedan aportar.
Saludos..
Les adjunto el código:
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)
/////////////////////////////////////////////////////////////////////////////
//
// 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 5 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE 5 //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
//
/////////////////////////////////////////////////////////////////////////////
#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
#define LED PIN_D2
#define LED_ON output_high
#define LED_OFF output_low
#define comando recibe[0]
#define param1 recibe[1]
#define param2 recibe[2]
#define param3 recibe[3]
#define param4 recibe[4]
#define eco envia[0]// Hace un eco del comando recibido
#define result1 envia[1]
#define result2 envia[2]
#define result3 envia[3]
#define result4 envia[4]
void main(void) {
int8 recibe[5]; //declaramos variables
int8 envia[5];
LED_OFF(LED); //Apagamos el LED
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
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, recibe, 5); //cojemos el paquete de tamaño 5 bytes del EP1 y almacenamos en recibe
eco = comando; //Regresa el comando recibido
result1 = param1*2;
result2 = param2*2;
result3 = param3*2;
result4 = param4*2;
switch (comando)
{
case 1:// Enciende LED
LED_ON(LED);
break;
case 2:// Apaga LED
LED_OFF(LED);
break;
}
usb_put_packet(1, envia, 5, USB_DTS_TOGGLE); //enviamos el paquete de tamaño 5 bytes del EP1 al PC
}// Fin if (usb_kbhit(1))
}// Fin if(usb_enumerated())
}// Fin while (TRUE)
}