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

En el documento adjunto es lo he hecho hasta el momento deseo realizar algo parecido a esto:


Pero he tenido problemas con la comunicación Pc a pic en velocidad muy lento
 

Adjuntos

  • hid usb.rar
    38.9 KB · Visitas: 176
de recepcion del pic puesto que el programa de control de pc esta en visual C++ te dejo el codigo del pic:
#include <18F4550.h>
#device ADC=10
#fuses HSPLL,USBDIV,PLL5,PUT,CPUDIV1,VREGEN,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOMCLR
#use delay(clock=48000000)

#define use_portb_lcd True
#define USB_HID_DEVICE TRUE
#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT //
#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT
#define USB_EP1_TX_SIZE 64 //
#define USB_EP1_RX_SIZE 64 //

#include <lcd.c>
#include <pic18_usb.h>
#include <USB_Konfigurasyon.h> //
#include <usb.c>


#define UcNokta1 1
#define Komut gelen_paket[0]

//
#define surum_no1 0x00 //
#define surum_no2 0x01

//Komutlar
#define LED_Kontrol 0x04
#define LCD_Yaz 0x05


void user_init(void)
{
set_tris_a(0xFF);
set_tris_b(0x00);
set_tris_d(0x00);
output_d(0);
setup_adc_ports(NO_ANALOGS );
lcd_init();

}
void LCD_MetinYaz(char yazi[])
{
unsigned char i;
unsigned char k=0;
char harf;

printf(lcd_putc,"\f");

++yazi;
i=*yazi++;
harf=*yazi++;

for(;i!=0;i--)
{
printf(lcd_putc,"%c",harf);
delay_us(5);

if(k==15)
printf(lcd_putc,"\n");

harf=*yazi++;
k++;
}
}

void main(void)
{
byte sayac=0;
byte gelen_paket[65]; //
byte gond_paket[65]; //

//Sistemi baþlat
user_init();
usb_init();
usb_task();
usb_wait_for_enumeration(); //

if(usb_enumerated())
printf(lcd_putc,"\USB HID \n VISUAL C++");//

for (;;)
{
while(usb_enumerated())
{

if (usb_kbhit(1)) //
{

usb_get_packet(UcNokta1, gelen_paket, 65); //

switch(Komut) //
{
case LED_Kontrol:
gond_paket[0]=0;
output_d(gelen_paket[1]);
printf(lcd_putc,"\f 0x%X",gelen_paket[1]);
sayac = 0x01;
Komut = 0;
break;

case LCD_Yaz:
LCD_MetinYaz(gelen_paket);
sayac = 0x00;
break;

default: ; break;

}
}
if(sayac!=0)
{
if(usb_put_packet(UcNokta1, gond_paket, 65, USB_DTS_TOGGLE))
{
sayac = 0;
Komut = 0;
}
}

}

}
}

perdón ya encontré la falla en los descriptores del include <USB_Konfigurasyon.h>, lo había configurado mal.
 
Última edición:
hola moyano que tal, espero q me puedas ayudar, he revisado todo el contenido de usb en el foro, quisiera saber si tal ves tiene un programa hecho en visualbasi 6.0 para la comunicacion usb bulk usando api, tengo hecho uno en C# pero me baso desde ahi para poder hacer los modulos en basic 6.0 pero me salen errores a la final no encuentro nada jejeje... espero q me puedas ayudar, de ante mano agradesco la ayuda..
 
saludos, me gustaria que me ayudaras a lograr funcionar un programa hecho en visual basic para puerto paralelo con el puerto usb con el pic 18f4550 .Es un proyecto ya viejito pero bueno de unos estudiantes

Te podrías guiar de mi manual para hacer tu aplicación. Lo descargas de la primera página del hilo.

hola moyano que tal, espero q me puedas ayudar, he revisado todo el contenido de usb en el foro, quisiera saber si tal ves tiene un programa hecho en visualbasi 6.0 para la comunicacion usb bulk usando api, tengo hecho uno en C# pero me baso desde ahi para poder hacer los modulos en basic 6.0 pero me salen errores a la final no encuentro nada jejeje... espero q me puedas ayudar, de ante mano agradesco la ayuda..

Todavía no me pongo a experimentar con el puerto USB usando Bulk , además todas las pruebas las he hecho con C#. Más adelante quizás haga ejemplos en VB.net y C# con el protocolo Bulk, pero será luego de que termine el manual con HID.

Un saludo !
 
Hola, bueno les planteo mi problema...resulta que estaba haciendo el 2do ejemplo de la primera pagina, pero me aparece dispositivo desconocido...No se si es problema circuital o que puede ser...por un momento pense que tenia los cables d+ y d- cambiados, pero no era asi...

les dejo una foto de la Protoboard con el circuito armado.

http://imageshack.us/f/851/dsc00800m.jpg/

PD:Tengo una duda tambien, si el cristal externo es de 20MHZ el firmware tambien debe tener 20MHZ?
 

Adjuntos

  • DSC00800.rar
    420.8 KB · Visitas: 122
Última edición:
Gracias por tu pronta respuesta!

Mira te cuento, uso el quemador ART2003 (anda bien) y winpic800 .... Como tendria que configurarlo para poder el 2do ejemplo.

desde ya muchas gracias.
 
Última edición:
Muchisimas gracias meta voy a revisar tu código. A ver como es la nueva forma de programar de vb.net ya que nunca lo he utilizado al igual que visual c (sharp).

pd: Estoy preparando una explicación más detallada de lo que hacen las librerías de CDC (comunication device class) para que se le saque más provecho y ahora que estoy de vacaciones , le voy a meter mano a esto del USB. Tambíen estoy terminando con los toques finales al clon del pickit2 y a la placa de desarrollo para micros de 28 pines , que me parece que al final va estar enfocada más al PIC18F2550 que a otra cosa.


este programa tambien se puedo ocupar para el pic 18f4550 y 16f877A,,espero tu repuesta gracias1!!
 
Te podrías guiar de mi manual para hacer tu aplicación. Lo descargas de la primera página del hilo.



Todavía no me pongo a experimentar con el puerto USB usando Bulk , además todas las pruebas las he hecho con C#. Más adelante quizás haga ejemplos en VB.net y C# con el protocolo Bulk, pero será luego de que termine el manual con HID.

Un saludo !

Moyano:

Mejor centrarse en una cosa y completar el manual con HID cargado de detalles, que hacer dos manuales con falta de información y no bien explicado.

Por cierto, sobre el manual que hiciste de C#, muy impresionante.

El otro:

Caballero, ya se pasará a VB .net, por ahora no lo he hecho porque me queda menos de un mes de clase con JAVA y redes. Es sólo intentar adaptar de un lenguaje a otro, se hace poco a poco, ten paciencia.

Saludo.
 
Hola de nuevo...Ya logre hacer andar todo..pero ahora tengo otro problemita, no se si es por problema de masa o algun capacitor de filtro, pero se me conecta y desconecta solo a cada rato. (2do ejercicio cdc)
 
Hola a todos

Despues de una torticolis que me hizo desmayar del dolor , me puse las pilas para terminar un pequeño pero funcional ejemplo de comunicación bajo el protocolo HID.

El lenguaje que utilizé para la programación del PIC es el C de CCS. Este el código fuente.
Código:
// Programa de prueba del protocolo HID (Human interface device).
// Programa: Prende o apaga un led según reciba una señal desde el software del host.
// Programador: Moyano Jonathan.
// Fecha: 13/02/09


#include <18F2550.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 // Definición del tamaño del buffer de salida.
#define USB_EP1_TX_SIZE 64

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

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

// Definición de las librerías utilizadas.
#include <pic18_usb.h>    // Drivers's USB del PIC18F2550.
#include <usb_desc_hid.h> // Descriptores USB.
#include <usb.c> // Funciones del USB.

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

int8 data[64];
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, 64);
                        if(data[0] == 1) {
                         output_toggle(PIN_B0);
                        } 
                     }                                
                  }
   }

}

El estudio del código fuente como de las librerías que son necesarias serán objeto de estudio más adelante cuando termine con el protocolo bulk transfer.

El programa del host fue escrito en Visual Basic 2005, ya que Visual C# lo tengo como objeto de estudio al igual que visual Basic 2008.

Cabe mencionar que la comunicación con HID es muy útil y rápida. Este tipo de comunicación no precisa driver ya que el driver en si es nativo de windows desde la versión Win 98se.


Hola antes que nada quiero agradecerles ya que este foro y los temas me han sido de gran ayuda se que estoy regresando mucho pero me he quedado con una duda muy grande y es por la cual no he podido avanzar.

Porque el 1 que se envía desde el pc al pic se compara con la posición 0 del array data???

Si quisiera encender mas leds como lo haria?? Saludos.

Estoy trabajando con el pic 18f4550 y la interfaz del pc en java.
 
Hola como estás.

Porque el 1 que se envía desde el pc al pic se compara con la posición 0 del array data???

Por que es el primer byte de datos....el host usa el byte 0 como byte de control y comienza la trama de datos a partir del byte 1. En el pic....el arreglo comienza en 0....por lo tanto recibe el byte y lo guarda allí....

Si quisiera encender mas leds como lo haria?? Saludos.
Lee el manual que está en la primera página...el capítulo del firmware para el PIC...y te vas a dar cuenta.
 
Acabo de leer tu respuesta mientras me encontraba analizando ejemplos de aqui y por alla y he hallado una solucion tal vez no lo suficiente buena para un programador pero lo he solucionado y les quiero dar las gracias porque gracias a este foro se aclararon muchas dudas. Seguire leyendo y descargando los manuales para continuar en este mundo de los pic´s que en lo personal me interesa mucho. Saludos moyano jhonatan por tomarte la molestia de contestar y sigan asi que ayudan bastante. Saludos
 
Estamos para ayudarte, en las vacaciones de invierno pienso que voy a terminar con el manual de HID...y seguiré con Bulk....entre otras cosas interesante que tengo para mostrar.

Un saludo !
 
Muchas gracias, tengo otra pregunta estoy haciendo el trabajo en pcwh v4.088, a la hora de compilar lo hace todo bien pero al generar los archivos de salida, el .hex lo pone como ICD, y a la hora de programar en el pickit2 me muestra este mensaje "Warning: No configuration words in hex file in MPLAB use File-Export to save hex with config", y el pic no quema bien, que podra ser??, De antemano muchas gracias
 
Atrás
Arriba