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

Feliz año nuevo a todas.

Quizás ya lo sepan, pongo un enlace que a lo mejor pueda ayudar para hacer la interfaz de USB.

http://www.migsantiago.com/index.php?option=com_content&view=article&id=9&Itemid=10




Estoy deseando crear una Interfaz similar a esta (que es RS232) para puerto USB con el 18Fx550.

Ver el archivo adjunto 27225

Ver detalles.

Eso si, lo quiero hacer como mínimo 8 entradas y salidas digitales, entradas analógicas, etc. Similar a lo que hizo Moyano.



Anda con buen pie. A ver si avansamos un poquito más.




Fuente:
http://www.unpocodelectronica.netau.net/generador-de-inf-para-los-drivers-usb-de-microchip

http://www.youtube.com/watch?v=Q7IXtXklhOo

Saludo.





Edito:

He encontrado enlaces sobre
mpusbapi.dll



Fuente original:
http://www.unpocodelectronica.netau.net/mis-primeros-pasos-con-el-18f4550

Saludo.
 
Última edición:
Viendo cosas como estas de USB que es lo que quiero hacer, todavía no he aprendido.
usb1188a.jpg

http://www.micropik.com/pag_puertos_usb.htm

Aunque tampoco anda mal en puerto serie.
ps3x8.jpg

http://www.micropik.com/pag_puertos.htm

Que es lo que estoy haciendo.
 
hola que tal; bueno, la verdad este tema está bastante bueno:aplauso:, yo he estado trabajando un poco con usb cdc, seguido de algunos manuales que han hecho.
pero por alguna razón que desconozco, no se si sea por mi compu o el pic, la comunicacion por usb cdc ya no me funciona, y quería ver si me podrían ayudar, pues creo que también les podría pasar a otros. Resumo mi PROBLEMA:
uso un pic 18f4550, interfaz usb cdc, y los programas que hago para la comunicación están hechos en visual basic .net.
Cuando conecto el pic a la PC, instalo el controlador (.inf), y todo perfecto. si windows le asigna el COM3, ese puerto uso para mi programa, y no pueden entablar comunicación. Y lo que es extraño: todos los programas que he probado, siempre pueden abrir ese puerto COM3, aún aunque ya haya desconectado mi dispositivo, (y haya desaparecido del administrador de dispositivos de windows), como si windows lo mantuviera activo ocultamente. el problema no es al abrir ni cerrar el puerto en los programas, sino al enviar datos.

por cierto: aquí escribo los codigos de mis programas (en PICC y VB.net), ambos están compilados sin errores.
El pic siempre se queda en la pantalla "Iniciando...", y de ahí no pasa.
los codigos son simples, basandome en ejemplos que encontré aquí.
Lo que es mas cuirioso todavía: antes si me funcionaba, hasta un dia en la mañana que la encendí, ya no (como por arte de magia) . es algo de windows?

Código:
///////////////////////////////////////////////////////////////////////////////////
#include <18F4550.h> // Definición de registros internos.
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
// Fuses utilizados:
/*
HSPLL: utilizamos un cristal HS de alta velocidad, en conjunto con el PLL para generar los 48Mhz.
-eliminado-NOMCLR: Utilizamos reset por software, y dejamos el pin 1 del micro como entrada/salida digital.
NOWDT: No utilizamos el perro guardían.
NOPROTECT: Desactivamos la protección de código.
NOLVP: Desactivamos la programación a bajo voltaje.
NODEBUG: No entramos al modo debug.
USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
PLL5: significa que el PLL prescaler dividirá en 5 la frecuencia del cristal. para HS = 20Mhz/5 = 4Mhz.
CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB
*/
#use delay(clock=48000000)          // Frecuencia máxima de trabajo.
#include "usb_cdc.h"                // Descripción de funciones del USB.
#include "usb_desc_cdc.h"           // Descriptores del dispositivo USB.
#define LCD_ENABLE_PIN  PIN_D2
#define LCD_RS_PIN      PIN_B2
#define LCD_RW_PIN      PIN_B3
#define LCD_DATA0       PIN_B4
#define LCD_DATA1       PIN_B5
#define LCD_DATA2       PIN_B6
#define LCD_DATA3       PIN_B7
#include <lcd.c>
void main() {
   char codigo;
 
   lcd_init();
   lcd_putc("Iniciando...");
 
   ////////////////////////////////////////////////////////////////////////////
   //CONEXION Y HABILITACION DEL USB CON LA PC
   ////////////////////////////////////////////////////////////////////////////
   usb_cdc_init();                  // Configuramos al puerto virtual.
   usb_init();                      // Inicializamos el stack USB.
   while(!usb_cdc_connected()) {}   // espera a detectar una transmisión de la PC (Set_Line_Coding).
   usb_task();
   usb_wait_for_enumeration();      // Espera a que el dispositivo sea enumerado por el host.
 
   while(TRUE){    // bucle infinito.
 
      lcd_putc("\fEsperando codigo");
      codigo=usb_cdc_getc();            //esperar codigo de la PC
      lcd_putc("\fCodigo recibido");
   }  
}

Código:
Imports MSCommLib
 
Public Class Form1
Public WithEvents PuertoCom As MSComm
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
PuertoCom = New MSComm
PuertoCom.CommPort = 3
PuertoCom.Settings = "9600,N,8,1"
PuertoCom.InBufferSize = 30
PuertoCom.InputLen = 1
PuertoCom.OutBufferSize = 30
While Not PuertoCom.PortOpen
Try
PuertoCom.PortOpen = True
Catch ex As Exception
End Try
End While
PuertoCom.Output = "p"
End Sub
End Class

gracias, sé que ustedes sabran cual es el problema, porque yo lo noto un tanto confuso. si no lo dejé claro, por favor pregunten

gracias
salu2
 
Última edición:
Hola a todos, soy nuevo el foro. Me llamo Edu.
Primero de todo felicitar a todo el mundo por las aportaciones que estan haciendo, me interesan muchisimo y creo que estan muy bien explicadas.

Ahora si, tengo una duda, la diferencia que existe entre el protocolo HID y el bulk transfer, donde está? en el software de control?? porque no veo ninguna diferencia entre el programa escrito en CCS de un pic con el protocolo bulk transfer y el protocolo HID.

Muchas gracias de antebraso.
 
Ahora si, tengo una duda, la diferencia que existe entre el protocolo HID y el bulk transfer, donde está? en el software de control?? porque no veo ninguna diferencia entre el programa escrito en CCS de un pic con el protocolo bulk transfer y el protocolo HID.

Pues mira la diferencia es precisamente el tipo de transferencia que utiliza. Las transferencias pueden ser de cuatro tipos: Control, Bulk, Interrupt e Isochronous. El protocolo HID utiliza transferencias de tipo Control e Interrupt, mientras que para el protocolo bulk transfer que comentas utiliza de tipo Control y Bulk. Para el caso de transferencias tipo Interrupt está asegurado la integridad de los datos que se envían así como el tiempo que tardan en llegar, en tipo Bulk solo está asegurado la integridad de los datos.

Otra diferencia que tiene es que el tipo Bulk no puede utilizarse en dispositivos Low-Speed, Interrupt se encuentra permitida en todas las velocidades.

Una más es el driver que se utiliza para la comunicación. Usando para Bulk un driver específico que comunmente es proporcionado por el fabricante, en este caso la mpusbapi.dll de microchip, o bien puedes desarrollar tu propio driver. En la transferencia Interrupt para un dispositivo de la clase HID se utilizan los drivers que trae Windows.

Diferencias existen muchas más pero considero que estas son las más importantes, espero te ayude en algo. Saludos.
 
oigan, yo tengo una dudototota. Con un amigo estamos haciendo un dispositivo que, a parte de hacer otras cosas con las que obtiene datos, se puede conectar a la PC por USB y comunicarse con un programa (para que el usuario vea ahi los datos y los pueda guardar). Si queremos venderlo, ¿qué lenguaje debemos usar para el programa de la PC, con el cual no tengamos que pagar licencia (como con Visual Basic) y que no nos metamos en problemas legales al venderlo? ¿La licencia de Java te lo permite?

salu2
 
gracias meta; y por simplicidad en el código para la comunicación USB, cuál de los tres anteriores me recomiendas???
por cierto, si voy a empezar una aplicación para usb desde 0, me conviene más usar la clase CDC que la transmisión Bulk???

Salu2
 
El mejor que sepas, si no sabes ningujo, empieza por el más fácil que es el VB y C#. Para Driver se recomienda el C++. usted elige. Personalmente me gusta más el C#, no por ello significa el mejor.
 
Antes que nada gracias a Moyano y a toda la gente que ha aportado a este foro donde he aprendido lo suficiente como para poder realizar mis primeras aventuras con el USB de los pic, por el momento estoy atorado con la comunicacion del pic y la pc usando labview, hasta ahora sólo logro que sea reconocido pero no tengo control alguno del mismo, estoy usando el ejemplo de Moyano de prender y apagar el led por medio de HID, les agradecería su ayuda.
 
Moyano Jonathan...Meta
Gran labor la de ustedes, los felicito
Me le pegare para aprender y depronto hacer preguntas un poco torpes, de prinsipiante..
 
Hola Moyano, tengo una serie de preguntas, espero puedas ayudarme.

He tomado el ejemplo que desarrollaste para encender y apagar un led, lo he modificado un poco para que realice lo siguiente:

1. que cuando llegue un paquete de datos al buffer de entrada del usb, lo tome y lo almacene en la variable data.
2. que el dato recibido lo muestre en el puerto b del pic.

El programa de control lo estoy haciendo en labview en el cual he visto que no tienes mucha experiencia (en eso puedo ayudarte) y hace lo siguiente:

1. envío un paquete de datos de 8 bits, el pic lo detecta pero no lo muestra en el puerto b como se supone lo he programado.

Este es el código del pic (tomado de tu diseño), podrías revisar si hay algo mal¿?

// Programa de prueba del protocolo HID (Human interface device).
// Programa: Recibe un byte del EP1, si byte = 1 prende LED.
// Programador: Moyano Jonathan.
// Fecha: 6/03/09


#include <18F4550.h> // Definición de registros internos del PIC18F2550.
#fuses NOMCLR,XTPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
// NOMCLR: No vamos ha usar el PIN MCLR, el reset se hará por soft.
// XTPLL: Vamos a usar un cristal de 4.00Mhz.
// NOWDT: No vamos a usar el perro guardian.
// NOPROTECT: Memoria no protejida contra lecturas.
// NODEBUG: No utilizamos código para debugear.
// NOLVP: No utilizamos el modo de programación con bajo voltaje.
// USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
// PLL1: significa que el PLL prescaler no dividirá la frecuencia del cristal. para XT = 4Mhz.
// CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
// VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB.
// NOPBADEN: Deshabilitamos el módulo conversor ADC del puerto B.
#use delay(clock=48000000)


#DEFINE USB_HID_DEVICE TRUE // Vamos a utilizar el protocolo HID.

#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT
#define USB_EP1_TX_SIZE 8 // Definición del tamaño del buffer de salida.

#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT
#define USB_EP1_RX_SIZE 8 // Definición del tamaño del buffer de entrada.

/*********************************************************************************************************/

// Definición de las librerías utilizadas.
#include <pic18_usb.h> // Drivers's USB del PIC18F2550.
#include <USB_easyHID_descriptores.h> // Descriptores USB para la placa MoyaPIC_USB28 y easyHID.
#include <usb.c> // Funciones del USB.

/*********************************************************************************************************/

// Variables globales.
int8 data[8]; // Variable de 8 bytes que guardan el valor del EP1_RX.
set_trisb(0x00);
void main()
{
usb_init_cs(); // Iniciamos el puerto USB y salimos.
while(1)
{
usb_task(); // Configuramos el puerto USB.
if (usb_enumerated()) // Si el puerto es enumerado y configurado por el host..
{
if (usb_kbhit(1)) // Si hay un paquete de datos en el buffer lo tomamos y guardamos en la variable data.
{
usb_get_packet(1, data, 8);
output_b(data);
}
}
}

}

Gracias
 
mi ejemplo está funcionando correctamente , en una de esas tu problema está en el driver....lo que tenés que hacer es ver como tu programa se comunica con el driver HID llamado easyHID.dll. esta librería contiene todas las funciones de control que necesitas pero no tengo ni idea de como enlazarla con labview.
 
Atrás
Arriba