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

Hola, lo de 48 megas esta bien, si te fijas en las hojas del datasheet ahi te explica bien porque es asi (pero son por los fuse), ya que esta activo el prescaler, postcaler, plls y todo un folcklore... :LOL: :LOL: :LOL: esto lo permiten los micros que soportan usb, ya que esa es la frecuencia que deben tener par trabajar con dicho protocolo.
por otra parte yo lo que probaria es
1- si tenes bien conectado el d+ y d-
2- Fijate si tenes bien conectado el capacitor del regulador (el que nececita el pic para cuando trabaja con usb) la pata del micro es Vusb.
3- si la ficha hace bien contacto (la usb) porque en argentina venden una fichas que son chinas y muchas veces no hacen bien contacto (aunque parece raro pasa muy seguido).
 
El circuito deber de tener alguna falla de montaje , me tendrías que mostrar una foto del mismo para ver donde está el error. A mi me pasó que los montajes en protoboard no funcionan bien, entonces me hice una mini targeta de pruebas para probar los montajes. Lo que dice nutriax es correcto, por favor revisá que haya continuidad en las conexiones y despúes si no funciona decime porque yo lo he probado un millón de veces y funciona muy bien.
 
Como ya volví de mis queridas vacaciones voy a ponerme con los proyectos que deje atrás como por ejemplo el pickit2 que tanto me han pedido y otros que voy a ir desarrollando durante el año.
Los ejemplos de usb también los voy a seguir posteando para los amantes del pic18f2550.

PD: Espero sepan disculpar mis demoras , pero las vacaciones son sagradas. :cool:
 
Sludos
Muchas gracias nutriax y moyano, y pues si efectivamente lo unico que me faltaba era el capacitor en el vusb :LOL: , lo conecte y funciono a la perfección

Aunque si, como dices moyano con el protoboard hay algunos inconvenientes, sobre todo con el conector usb tipo B, asi que el siguiente paso es hacer una tarjeta de pruebas.

¿Tendran por ahi una que me recomienden para el 18f2550?

Muchas Gracias!
 
que tal amigos esta vez les muestro una aplicacion con usb y labview que consiste en enviar los datos desde el pc al micro ( 8 botones y se veran refjejados en o leds o salidas en el micro les envio el video


usby labview
 
Hola a todos, quisiera preguntar algunas cosas, estoy intentando hacer una aplicacion con el pic18f4550
en la cual quiero leer algun canal del ADC y en viar el dato via USB a la PC, en la PC tendre un programa hecho con python y la libreria pyusb, el problema o duda que tengo es el siguiente.

la aplicacion para el micro "firmware" lo ocupo de los ejemplos que estan en este post. al inicio, es decir agarro el ejemplo y se lo meto al micro, "copio las librerias, alli esta el pid y el vid "

al conectar el micro al USB me aparece dispositivio no reconocido, instalo el driver y listo.

el problema surge en python cuando quiero enumerar el PID y el VID de este dispositivo, sera que el firmware que tiene el micro no envia esta información al PC, si es asi como puedo hacer para que el micro me envie el pid y el VID,

yo corro una aplicacion para enumerar los dispositivos USB, todos los dispositivos usb aparecen enumerados (VID,PID), solo el de el micro pic18f4550 no aparece, porque es esto...? gracias
 
I are new in the foro no se mucho de lenguaje c para pic pero si assembrer tenfre que seguir aprendiendo dell foro
Para yonatan si me podes enviar al igual que picman la información te lo agradeceria o como conseguirlo

muy interesantes los host pero tengo unas dudas
cual es la diferencia entre usb con CDC y con bulk estas son librerias verdad
y cual es la libreria Usb que brinda la micrichip

gracias por su atensión
 
hola amigos de foro, yo he trabajado con el pic16f877, y maneje el pwm, adc y el rs232, y otros modulos, hoy he decidido migrar al 18f en especial los que tienen USB, y a programarlos con C CCS, y para las interfases graficas utilizo python.

He observado que en los ejemplos de comunicacion USB, en los ejemplos se habla de un puerto virtua "serial", como se hace para crear un puerto usb, para que la pc lo detecte como USB y no como com virtual.

tambien observo que en bisual Vasic abren un com "puerto serial de comunicacion" y utilizan las funciones de una libreria que es para comunicacion serial.

yo he probado los ejemplos y los he podido correr y ejecutar y me funcionan. pero lo que quiero hacer es lo siguiente

Quiero hacer una Interface grafica con python, utilizando la una libreria que se llama pyusb la cual sirve para comunicacion USB, "esta no es para comunicacion serial" , aca pondre un codigo en python para enlistar o enumerar todos los dispositivos USB que estan conectados al PUERTO USB

import usb ##importa la libreria pyusb y susu funciones

for bus in usb.busses(): #se hace un ciclo for en todos los objetos usb que encontro la funcion usb.busses()
for dev in bus.devices: #se hace otro for en todos los dispositivos udb encontrados
print "Bus %s Device %s: ID %04x:%04x %s" % (bus.dir # se imprimen las caracteristicas

yo ejecuto este codigo en python y obtengo lo siguienete " ojo en el puerto usb de mi maquina solo tengo conectado el programador de pic PICKIT2 " lo que me devuelve la funcion es esto.


Bus bus-0 Device \\.\libusb0-0001--0x04d8-0x0033: ID 04d8:0033 Microchip Technology Inc.

eso es la información del dispositivo el PID y el VID, es decir python puede con esa información crear un
objeto USB con el cual comunicarse. es decir puede abrir el puerto USB identificado con el PID y el VID para poderse comunicar con el via USB

ahora desconecto el dispositivo PICKIT2 y conectare mi PIC18f4550 programado con el codigo de los ejemplos
y al ejecutar el programa de python no devuelve nada, es decir no podre crear un objeto USB para comunicarme con el.

yo lo que quiero saber es que si me pueden ayudar a realizar un codigo para el PIC18f4550, el cual me devuelva los identificadores PID y VID sin utilizar un puerto comvirtual sino que sea comunicacion USB USB, gracias amigos
 
hola amigos de foro, yo he trabajado con el pic16f877, y maneje el pwm, adc y el rs232, y otros modulos, hoy he decidido migrar al 18f en especial los que tienen USB, y a programarlos con C CCS, y para las interfases graficas utilizo python.

He observado que en los ejemplos de comunicacion USB, en los ejemplos se habla de un puerto virtua "serial", como se hace para crear un puerto usb, para que la pc lo detecte como USB y no como com virtual.

tambien observo que en bisual Vasic abren un com "puerto serial de comunicacion" y utilizan las funciones de una libreria que es para comunicacion serial.

yo he probado los ejemplos y los he podido correr y ejecutar y me funcionan. pero lo que quiero hacer es lo siguiente

Quiero hacer una Interface grafica con python, utilizando la una libreria que se llama pyusb la cual sirve para comunicacion USB, "esta no es para comunicacion serial" , aca pondre un codigo en python para enlistar o enumerar todos los dispositivos USB que estan conectados al PUERTO USB

import usb ##importa la libreria pyusb y susu funciones

for bus in usb.busses(): #se hace un ciclo for en todos los objetos usb que encontro la funcion usb.busses()
for dev in bus.devices: #se hace otro for en todos los dispositivos udb encontrados
print "Bus %s Device %s: ID %04x:%04x %s" % (bus.dir # se imprimen las caracteristicas

yo ejecuto este codigo en python y obtengo lo siguienete " ojo en el puerto usb de mi maquina solo tengo conectado el programador de pic PICKIT2 " lo que me devuelve la funcion es esto.


Bus bus-0 Device \\.\libusb0-0001--0x04d8-0x0033: ID 04d8:0033 Microchip Technology Inc.

eso es la información del dispositivo el PID y el VID, es decir python puede con esa información crear un
objeto USB con el cual comunicarse. es decir puede abrir el puerto USB identificado con el PID y el VID para poderse comunicar con el via USB

ahora desconecto el dispositivo PICKIT2 y conectare mi PIC18f4550 programado con el codigo de los ejemplos
y al ejecutar el programa de python no devuelve nada, es decir no podre crear un objeto USB para comunicarme con el.

yo lo que quiero saber es que si me pueden ayudar a realizar un codigo para el PIC18f4550, el cual me devuelva los identificadores PID y VID sin utilizar un puerto comvirtual sino que sea comunicacion USB USB, gracias amigos
 
Lo que vos buscas lo tenés que hacer que hacer a través de bulk transfer, usando la librería mpusbapi.dll
haciendo las llamadas a la correspondiente librería vas a poder comunicarte con el pic sin usar el puerto serie virtual.
Si recién empezas te recomiendo que uses los ejemplos que postee usando el puerto serie virtual. Además es más facil de utilizar (hablando de programación) que haciendolo por el método de comunicación directa.
 
Hola a todos

Acá les traigo el último ejemplo de control del puerto USB del PIC18F2550 usando la clase CDC. Este ejemplo lo que hace es mandar el valor del conversor ADC por USB y muestra dicho valor en hyperterminal siempre y cuando se presione la tecla "a". En el archivo comprimido está todo para poder probar el ejercicio.

Ahora comenzaré a explicar la comunicación USB PIC - PC usando la famosa librería mpusbapi.dll y Visual Basic 2006.
 

Adjuntos

  • ejercicio_n7_731.rar
    64.9 KB · Visitas: 1,659
Hola a todos... tanto tiempo deje este tema.

Ahora vamos a ver: Control del puerto USB del PIC18F2550 a través de la librería mpusbapi.dll y VB2006.

Pero antes que nada quiero que veamos una nota donde se explican mitos y verdades hacerca de la transmisión de datos por usb a full speed (12 Mb/seg).

- MITO: El puerto USB del PIC puede comunicarse a una velocidad máxima de 12 Mb/seg (1.5MB/seg).

- Realidad: El puerto USB no puede comunicarse a esa velocidad ya que es el total del ancho de banda del bus.

- Otras cosas que no le permite conectarse al USB a esa velocidad es que comparte el ancho de banda con otros dispositivos usb, restricciones del protocolo, etc.

- En realidad el bus puede conectarse en el mejor de los casos a 1MB/seg. (64Kb/seg) en la mayoría de las aplicaciones.

Al protocolo de transmisión USB lo llaman la PILA USB, donde muestran como son las diferentes capas de comunicación. (Figura n°1)

primera capa(superior): programación básica en C.
segunda capa(intermedio): llamados a los drivers que trae el compilador de C.
tercera capa(inferior): llamados a los drivers que trae el compilador de C (procesos dentro de los drivers) y conexión del módulo USB al HOST.

En el proximo post veremos el estudio de la comunicación por el lado del PIC.
 

Adjuntos

  • capas_del_protolo_usb_figura_1_731.jpg
    capas_del_protolo_usb_figura_1_731.jpg
    24.4 KB · Visitas: 1,116
buen aporte amigo en lo que podamos ayudar esta bien , yo he hecho la comunicacion pero todavia hay unos conceptos volando que seria mejor aclararlos
 
Hola a todos
Bueno después de ver las capas de comunicación del puerto USB, vamos a ver la comunicación estudiando el dispositivo USB o función (PIC con USB).

Lo que hay que hacer mientras tanto es estudiar los drivers que trae el CCS (que es el compilador de C que uso), estos son:

Código:
- pic18_usb.h
- PicUSB.h
- usb.c
- usb.h

Para poder entender la comunicación , vamos a analizar un ejemplo en C de CCS escrito por J1M , participante activo del foro todopic.

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

#include <18F4550.h>
//#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN // el fuse 
// modificado para USB -> VREGEN
#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 informaciónrmation
//
/////////////////////////////////////////////////////////////////////////////
#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 informaciónrmation
//
/////////////////////////////////////////////////////////////////////////////
#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.
//
/////////////////////////////////////////////////////////////////////////////
#define LEDV    PIN_B6
#define LEDR    PIN_B7
#define LED_ON  output_high
#define LED_OFF output_low
 
#define modo      recibe[0]
#define param1    recibe[1]
#define param2    recibe[2]
#define resultado envia[0]
 
 
void main(void) {
 
   int8 recibe[3];                  //declaramos variables
   int8 envia[1];
 
   LED_OFF(LEDV);                   //encendemos led rojo
   LED_ON(LEDR);
 
   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
 
   LED_OFF(LEDR);
   LED_ON(LEDV);                    //encendemos led verde
 
   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, 3); //cojemos el paquete de tamaño 3bytes del EP1 y almacenamos en recibe
 
            if (modo == 0) // Modo_Suma
            {
               resultado = param1 + param2;  //hacemos la suma
 
               usb_put_packet(1, envia, 1, USB_DTS_TOGGLE); //enviamos el paquete de tamaño 1byte del EP1 al PC
            }
 
            if (modo == 1) // Modo_Led
            {
               if (param1 == 0) {LED_OFF(LEDV); LED_OFF(LEDR);} //apagamos los leds
               if (param1 == 1) {LED_ON(LEDV); LED_OFF(LEDR);} //encendemos led verde
               if (param1 == 2) {LED_OFF(LEDV); LED_ON(LEDR);} //encendemos led rojo
            }
         }
      }
   }
}

Allí están las funciones usb_task(), usb_init() que ya las vimos por encimita, la novedad son las funciones: usb_wait_for_enumeration(), usb_get_packet y usb_put_packet

También están las definiciones USB_EP1_TX_ENABLE USB_ENABLE_BULK ...

Comenzando desde un principio vemos:


Código:
#define USB_HID_DEVICE     FALSE             //deshabilitamos el uso de las directivas HID.

¿que significa HID?

HID es acrónimo en español de Dispositivo de Interfaz Humana. (El mouse usb, por ejemplo utiliza este protocolo)

En los drivers de CCS, viene activado por defecto:

Código:
// Del driver usb.h
...
//// USB_HID_DEVICE (TRUE) - HID devices require extra code to handle  ////
////                         HID requests.  You can disable to save    ////
////                         ROM space if you are not using a HID      ////
////                         device.  If you are not using a HID       ////
////                         device you must provide your own O/S      ////
////                         (Windows) driver.                         ////
...
 
...
//should the compiler add the extra HID handler code?  Defaults to yes.
#IFNDEF USB_HID_DEVICE
   #DEFINE USB_HID_DEVICE TRUE
#ENDIF
...

Si lo vamos a usar, no colocamos nada. si NO lo usaremos, lo negamos en el define.

#define USB_EP1_TX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for IN bulk/interrupt transfers

¿que es eso de endpoint? ¿bulk/interrup transfers?

Bueno acá les cuelgo una explicación tomada desde la página http://pablohoffman.com/oscusb/doc/.

"Los dispositivos (o mejor dicho, las funcionas) tienen asociados unos canales
lógicos unidireccionales (llamados pipes) que conectan al host controlador con
una entidad lógica en el dispositivo llamada endpoint. Los datos son enviados
en paquetes de largo variable (potencia de 2). Típicamente estos paquetes son
de 64, 128 o más bytes.
Estos endpoints (y sus respectivos pipes) son numerados del 0 al 15 en cada
dirección, por lo cual un dispositivo puede tener hasta 32 endpoints (16 de
entrada y 16 de salida). La dirección se considera siempre desde el punto de
vista del host controlador. Así un endpoint de salida será un canal que
transmite datos desde el host controlador al dispositivo. Un endpoint solo
puede tener una única dirección. El endpoint 0 (en ambas direcciones) está
reservado para el control del bus."


Se puede decir que los endpoint son buffer temporales de datos de entrada/salida en cada tipo. En el módulo USB existen 16 de salida (OUT) y 16 de entrada (IN) pero agrupados en forma bidirecional, de acuerdo a un par de bits de configuración. Ojo un endpoint es unidireccional.

Les dejo una inmagen a modo representativo de lo que es un PIPE.
 

Adjuntos

  • usb__pipes_691.jpg
    usb__pipes_691.jpg
    25.8 KB · Visitas: 1,054
Si sabes C, sabrás usar el Visual C++ en el cual estoy haciendo el manual.

El código para enviar tramas por fin me salió. Ahora me falta el Visual Basic 2008.
 
Atrás
Arriba