bueno, aqui yo tengo varios enredos:
1. la velocidad del micro no esta bn, debido a que las rutinas delays no tardan lo que deberian pese a que el reloj esta en 4.000.000 y el cristal fisicamente sta bn
2. no entendi tu subrutina datosenpoit(en) por tanto no pude implementar algo parecido para sacar los datos directamente del buffer (porfa si puedes explicarla seria exelente)
3. consegui bn conexion con el usb, pero esta se pierde luego de recibir del pc los primeros 64 bytes (no se vuelven a producir interrupciones pero el codigo del main sigue ejecutandose) y entonces me di cuenta q conectando y desconectando podia restablecerse la conexion, entonces lo hice por los comandos usb_detach (); usb_attach (); usb_init(); usb_task(); usb_wait_for_enumeration(); despues de recibir cada paquete de 64bytes
4. funcionando esta parte, a mi me sirve porq solo necesito enviar comando a unas targetas por i2c pero aparecio otro problema, el usb deja de funcionar, ya probe con la misma tactica del usb_detach (); usb_attach (); (conectando y desconectando por comandos) pero nada ya no funciona, como q no pueden coexistir estos 2 protocolos, ¿se necesitara algo mas?.
aqui esta el codigo:
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,MCLR,NOPBADEN
// No olvide que PLL1 = Para un Xtal de 4Mhz
// PLL2 = Para un Xtal de 8Mhz
// PLL3 = Para un Xtal de 12Mhz
// PLL4 = Para un Xtal de 20Mhz , etc.
#use delay(clock=4000000)
#use i2c(Master,Fast,sda=PIN_B0,scl=PIN_B1,restart_wdt,force_hw)
#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 64 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE 64 //size to allocate for the rx endpoint 1 buffer
//#define USB_CON_SENSE_PIN PIN_B2 //CCS 18F4550 development kit has optional conection sense pin
#include <pic18_usb.h> //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <usb_desc_scope.h> //descriptors del Pic USB
#include <usb.c> //handles usb setup tokens and get descriptor reports
/*////////////////////////////////////////////////////////////////////
0xD8,0x04, //vendor id (0x04D8 is Microchip)
0x0B,0x00, //product id
0x01,0x00, //device release number
*/////////////////////////////////////////////////////////////////////
#BYTE ADCON1 = 0x0FC1
#BYTE CMCON = 0x0FB4
int8 dato[64];
int8 dato2[64];
void main(void) {
set_tris_a(0);
set_tris_b(0);
dato2[1]=123;
output_a(0);
delay_ms(1000);
output_bit (pin_B0,1);
output_bit (pin_B1,0);
delay_ms(1000);
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_bit (pin_B0,0);
output_bit (pin_B1,1);
delay_ms(1000);
ADCON1 = 0x0F;
CMCON = 0x07;
set_tris_a(0);
//disable_interrupts(GLOBAL);
while (TRUE)
{
if(usb_enumerated()) // si el Pic está configurado via USB
{
if (usb_kbhit(1)) // si el endpoint de salida contiene datos del host
{
// disable_interrupts(GLOBAL);
delay_ms(10000);
output_toggle(PIN_B7);
delay_ms(10000);
output_toggle(PIN_B7);
delay_ms(2000);
usb_get_packet(1, dato, 64);
output_a(dato[0]);
delay_ms(1000);
dato[0] =142;// input_c();
usb_put_packet(1, dato, 64, USB_DTS_TOGGLE); //leer q es dts toggle
delay_ms(1000);
usb_detach ();
/* delay_ms(100);
i2c_start();
i2c_write(2); // Device address
i2c_write(2); // Device address
delay_ms(1000);
i2c_write(dato[0]); // Data to device
delay_ms(1000);
i2c_stop();
*/
//enable_interrupts(GLOBAL);
delay_ms(100);
usb_attach ();
usb_init(); // inicializamos el USB
usb_task(); // habilita periferico usb e interrupciones
usb_wait_for_enumeration();
}
}
}
}