Control de dispositivos a través del módulo USB del PIC18F45/2550

Kuropatula, yo estoy haciendo armas con la versión 2.3 del framework USB para C18 (aunque ya salió el 2.4 ) y si bien en algun momento probe algunas cosas con versiones anteriores, no me acuerdo mucho.

A ver que pasa con ésto:

En hardwareprofile.h levantá sacá este comentario:

Código:
/*#if !defined(DEMO_BOARD)
    #if defined(__C30__)
        #if defined(__PIC24FJ256GB110__)
            #define DEMO_BOARD PIC24FJ256GB110_PIM
            #define EXPLORER_16
			#define PIC24FJ256GB110_PIM
            #define CLOCK_FREQ 32000000
        #endif
    #endif

    #if defined(__18CXX)
        #if defined(__18F4550)
            #define DEMO_BOARD PICDEM_FS_USB
            #define PICDEM_FS_USB
            #define GetSystemClock()        48000000
        #elif defined(__18F87J50)
            #define DEMO_BOARD PIC18F87J50_PIM
            #define PIC18F87J50_PIM
            #define GetSystemClock()        48000000
        #elif defined(__18F14K50)
            #define DEMO_BOARD LOW_PIN_COUNT_USB_DEVELOPMENT_KIT
            #define LOW_PIN_COUNT_USB_DEVELOPMENT_KIT
            #define GetSystemClock()        48000000
        #endif
    #endif
#endif*/
La parte que interesa es que quede el #define PICDEM_FS_USB porque a partir de eso se configuran pines de entrada/salida más abajo, a partir de #if defined(PICDEM_FS_USB).

También te diría que, por las dudas, saques estos comentarios:
Código:
   #endif
    /*aca comente esto*/
    // External Transceiver Interface
   // #define tris_usb_vpo        TRISBbits.TRISB3    // Output
   // #define tris_usb_vmo        TRISBbits.TRISB2    // Output
   // #define tris_usb_rcv        TRISAbits.TRISA4    // Input
    #define tris_usb_vp         TRISCbits.TRISC5    // Input
    #define tris_usb_vm         TRISCbits.TRISC4    // Input
   // #define tris_usb_oe         TRISCbits.TRISC1    // Output
    
    #define tris_usb_suspnd     TRISAbits.TRISA3    // Output
Porque eso no va a importar siempre y cuando en usb_config.h esté la línea #define USB_TRANSCEIVER_OPTION USB_INTERNAL_TRANSCEIVER sin comentar. Es decir, ahí uno ya le está diciendo que se usa en el transceiver usb interno.

Y si con eso no anda, probá comentando la línea (en hardwareprofile.h):

#define PROGRAMMABLE_WITH_USB_MCHPUSB_BOOTLOADER

para que no meta un bootloader en el código del pic. Así nos quedamos tranquilos de que no sea un error de bootloader (improbable, pero....).

Bueno, de las correcciones que marqué la más crítica es la primera, comenzá por ahí.

Saludos
 
Estaba viendo los #includes, veo que el procesador definido en el proyecto es el p18f2550, sin embargo usás el p18f4550.h
A ver si poniendo el p18f2550.h y sacando el p18f4550.h cambia algo...
Ahh!, y el linker script también
 
Hola Moyano Jonathan, ya no habia escrito nada en este foro, pero te informaciónrmo que para el primer ejercicio que hiciste de HID (el de alternar el estado de un led) pude ya controlarlo con labView sin usar conversion a puerto serie, lo manejo directo como USB de HID.

Ahora, el firmware del pic dice que checa el data[0] y si es igual a 1, el led cambia de estado, eso no es problema, pero si le mandas un dato distinto de 1, el led sigue alternando. Por ejemplo, en labView le mando un "0" o un "2" o cualquier otra cosa y sigue cambiando el led.

¿Que debo hacer para que cuando el dato sea distinto de 1, ya no haga nada?

te dejo la parte del codigo donde me queda la duda

Código:
:usb_get_packet(1, data, 8);
                        if(data[0] == 1) { // Si el paquete contiene el dato "1"
                         output_toggle(PIN_B1); // Cambiamos el valor del PIN_B1.
 
Bueno, no se que problema tenía pero empecé todo desde cero y funcionó.
Agradezco a todos por haberme ayudado.
Lo que hice fue tomar la carpeta de Microchip y ejecutar "CDC - Basic Demo - Firmware"
Saludos
 
Hola albert :)

Mirá el código:

Código:
:usb_get_packet(1, data, 8);
                        if(data[0] == 1) { // Si el paquete contiene el dato "1"
                         output_toggle(PIN_B1); }  // Cambiamos el valor del PIN_B1.
Ok en esta parte si le pones
Código:
 if(data[0] == 1
o
Código:
   if(data[0] == 2)
Va a hacer lo mismo.

Vos tendrías que organizar el código de la siguiente manera para hacer cualquier cosa:

Código:
usb_get_packet(1, data, 8);
                        if(data[0] == 1)  // Si el paquete contiene el dato "1"
                              
                                  {
                         
                       // Acá ponemos el código que quiera si recibe 1 o cualquier dato.

                                       }
Ahi está la solución a lo que vos planteas.
 
ops: Disculpa que insista Moyano jonathan pero creo que no me he explicado muy bien. Entiendo bien que es lo que el codigo hace, es decir si lo defino como:

Código:
usb_get_packet(1, data, 8); 
                       if(data[0] == 1) // Si el paquete contiene el dato "1" 
                                  {                           
                                      //haz algo
                                  }
el programa hará lo que esta entre las llaves cuando recibe un 1

o si lo defino como:

Código:
usb_get_packet(1, data, 8); 
                        if(data[0] == 2)  // Si el paquete contiene el dato "2" 
                                  {                           
                                      //haz otra cosa
                                  }
el programa hará lo que esta entre las llaves cuando reciba el dato 2.

Pero a lo que me refiero es, si yo defino la condición como if(data[0]==1){acción} y desde el software de control le envio un dato diferente de 1, no entiendo por qué me sigue haciendo la acción entre llaves, si la condición no se cumple

y una disculpa nuevamente, pero espero que ahora si me de a enteder
 
Haaaaaaaa ahora si entendi , mirá vos que raro lo que te está pasando......

Fijate utilizando la sentencia switch(dato) y le vas poniendo case's segun el dato que valla entrando.
 
Ok, lo checo y te aviso, porque si se me hizo algo extraño eso que pasa, ya que la condicion no se cumple...:)

Y disculpa la interrupción por este problemilla, pero necesitaba saber si eso era normal...
 
Proximamente manual de usuario del PIC18F2550: USB aplicaciones prácticas programando en VB.net y VC# 2008.

Este manual lo ire desarrollando de a poco conjuntamente con usuarios de este y otros foros y lo pondré aqui para que se pueda consultar todo lo referente al puerto USB de la linea de microcontroladores PIC18Fxx5x con lo que se contará con una guia práctica con ejercicios desarrollados y explicados utilizando las clases más conocidad CDC , HID y Bulck transfer.
 
Ya estoy detectando conexión, ecribiendo datoy y leyendolos desde VB.net

En este momento voy a ver que ejercicicios va a incorporar la guia del manual, luego lo voy a ir posteando de a poco hasta que termine. El manual sospecho que va a llevar su tiempo pero quiero que sea entendible y quede bien.

Los temas principales que se van a tocar son (al principio):

- Principios básicos para programar en VB.net
- Entorno de desarrollo de Visual Basic dentro del entorno IDE de visual studio.
- Crear un formulario donde se van aplicando diferentes controles..

En fin meta al principio sería algo como lo que creaste vos con la misma forma de introducción.

Luego de la parte de programación básica con el PC se va a tomar la teoría de programación del PIC en C para crear nuestras aplicaciones con USB de igual modo que lo hemos hecho en el foro.

Y por último se va a mezclar la programación del PIC con lo de la PC para que vallamos entendiendo como se comunica.

Todo esto es a grandes rasgos ya que van muchas cosas más incluidas que ya se me irán ocurriendo durante el desarrollo del trabajo.

Me he decidido a hacerlo en Power Point y luego lo portare a PDF
 
hola amigos, una pregunta, ¿esto funciona tambien con el Pic basic Pro? ¿tienen los codigos para pic basic pro? esta super interesante lo de comunicar el pic con el pc por usb sin tener necesidad de colocar hardware extra .