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

Adjunto esquema en proteus para simular el codigo de los ejemplos.
Realizado con la version 7.4 sp3.
 

Adjuntos

  • Entrenadora Moyano.zip
    15.2 KB · Visitas: 161
Buenisimo, en cuanto tenga tiempo reviso el esquema y subo las fotos del montaje terminado.

Muchas gracias por la colaboración mantenilsa !
 
hola a todos

muchas gracias Moyano, efectivamente los cable de d+ y d- estaban invertidos, me di cuenta del error y ahora lo tengo andando a perfección gracias!!!
 
Como esta todo por alla MOYANO??? he estado un poco alejado del foro por razones universitarias! escribo en esta oportunidad solo para saber si si puede pasar un FLOAT via USB-CDC?? como lo haria?? es decir como hago para enviar datos REALES y mayores a 8 bit?? MIl Gracias...
 
Hola albermillan , como estás ?.

Mirá las funciones dentro del modo CDC son muy similares a las RS232 standar...por lo tanto tendrías que usar la función Printf() en conjunto con la función cdc_putc()....printf(cdc_putc, "valor float: %f", x) o algo similar...tendrías que investigar en los foros de CCS.

@natouio menos mal que te funcionó !
 
Alguien puede decirme en este LARGO tema donde puedo ubicar un ejemplo completo (codigo vb.net + codigo pic) sobre comunicacion usb para el 18f2550, ya que el unico codigo que consigo para pic es el que esta en la pagina 1 y los ejemplos que veo para descargar hechos en vb.net estan solos, sin el codigo para el micro... por favor cualqueir informacion la agradeceria...
 
Hola a todos, ando un poco perdido desde el primer ejemplo jejeje, quisiera saber si me pueden colaborar para lograr poner a funcionar el ejemplo de los 8 leds controlados desde usb... o sea realizo el esquema que aparece en el dibujo, pongo a correr el programa??? cuando es llamado el programa vb, se que ando muy perdido, pero la verdad necesito como salir de esas dudas para seguir adelante en este tema tan interesante.
de antemano les agradezco su atencion
 
Gracias MOYANO!!

Ahora necesito una ayuda para modificar unas cosas en los driver del usb_cdc! aqui te mando una imagen de lo q necesito!!

necesito q diga algo personalizado y colocarle un icono!!

Gracias por tu gran ayuda!

OK ya solucione lo de la descripcion!!
Cambie el VID!! No usé el de Microchip
Ahora solo me falta colocarle el icono!! como hago??

Gracias...
 

Adjuntos

  • Ayuda.gif
    Ayuda.gif
    49.2 KB · Visitas: 31
  • Ayuda2.gif
    Ayuda2.gif
    47.1 KB · Visitas: 28
Última edición:
Lo de la solución que me decís la tenés modificando los descriptores USB del proyecto. En hojas más atras se muestra como.

PD: Para todos los que me pedían el manual de aplicaciones mediante USB, lo tendré en unos días más pero no será a gran detalle sino una explicación de como pueden crear sus propias aplicaciones. Lo mejor de todo es que termine de hacer las pruebas con el firmware - software por lo que ya está en funcionamiento la 1° aplicación ejemplo.

El proyecto consta de las siguientes especificaciones:

- Escrito en CCS para el PIC y Visual C# 2008 para la PC.
- Interfaz intuitiva.
- Control mediante HID e interrupciones.

- Los controles incluidos (probados):
- PWM.
- entradas digitales.
- entradas analógicas.
- salidas digitales.

Proximamente añadiré más controles pero será más adelante asi como también el pasaje a otros lenguajes de programación.

 
Lo de la solución que me decís la tenés modificando los descriptores USB del proyecto. En hojas más atras se muestra como.

Gracias!!! pero sin mentira alguna revise hoja por hoja y no lo encontre!!! solo necesito agregar un icono para q aparezca en la ventana de instalacion del driver y tratar de cambiar el q trea por defector para el puerto com virtual!!

Dame una manito plis!!!
 
UNA PREGUNTA ADICIONAL: El metodo usb Bulk tiene interrupciones?? es q ya de tanta informacion confundo los metodos!
Osea q el micro sepa cuando se le esta enviando un dato, sin necesidad de estar siempre leyendo el buffer!!

Bueno ya investigue!!! y en CDC no se puede cambiar el icono!! :(
 
Última edición:
hola a todos,,, muy bueno este post,,,

he tenido inconvenientes con una comunicacion cdc con lcd, no funciona si dejo la lcd, es decir si no inicio y muestro nada en la lcd funciona perfecto, cuando conecto reconoce y todo, y muestra en la interfaz, vb.net,, y realiza todo muy bn, pero si no mas pongo lcd_init(); ya se traba, esto en funcionamiento real, por que en simulacion funciona perfecto,,, la verdad no se uqe sera y he trabajado todo el dia en eso pero nada que encuentro el error,,, utilizo cristal d 4mhz,, los fuses los tengo asi

#fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN

y cambie la lcd al portb ,,,, pero nada la verdad no se que sera,,, yo recuerdo haber hecho hace un tiempo una comunicacion col lcd de tipo cdc y me funciono, pero la verdad es que el disco se dano y no logre recuperar nada, y la verdad no recuerdo que estare haciendo mal,, le agradesco de antemano su ayuda
 
hola a todos,,, muy bueno este post,,,

he tenido inconvenientes con una comunicacion cdc con lcd, no funciona si dejo la lcd, es decir si no inicio y muestro nada en la lcd funciona perfecto, cuando conecto reconoce y todo, y muestra en la interfaz, vb.net,, y realiza todo muy bn, pero si no mas pongo lcd_init(); ya se traba, esto en funcionamiento real, por que en simulacion funciona perfecto,,, la verdad no se uqe sera y he trabajado todo el dia en eso pero nada que encuentro el error,,, utilizo cristal d 4mhz,, los fuses los tengo asi

#fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN

y cambie la lcd al portb ,,,, pero nada la verdad no se que sera,,, yo recuerdo haber hecho hace un tiempo una comunicacion col lcd de tipo cdc y me funciono, pero la verdad es que el disco se dano y no logre recuperar nada, y la verdad no recuerdo que estare haciendo mal,, le agradesco de antemano su ayuda

Coloca tu codigo!! asi te podremos ayudar mejor!!
 
hola Gracias por responder, este es el codigo, esta comentado lo de la lcd y trabaja perfecto, pero si dejo lo de la lcd en simulacion sirve pero en real no,,,,,


#include <18F2550.h>
#DEVICE ADC=10
#fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)

#define use_portb_lcd TRUE
//#define USB_CON_SENSE_PIN PIN_A4

#include <lcd.c>
#include "usb_cdc.h"

float luxsd;
long temper,luxs;
unsigned int temp,lux[2],recib,modo=0,hini=0,hini1=0,warning=0x0f;
signed int enc=0xff;

void usb_com()
{
if(usb_cdc_connected())
{
output_high(pin_c6);
output_low(pin_c7);
if (usb_enumerated())
{ warning=0;
if(usb_cdc_kbhit())
{
recib=usb_cdc_getc();
if(recib==0x31)
{
usb_cdc_putc(temp);
usb_cdc_putc(lux[0]);
usb_cdc_putc(lux[1]);
}
if(recib==0x32)
{
output_HIGH(pin_A3);
//lcd_putc("\fInt Luz");
//lcd_putc("\n Temp: C lux");
enc=1;
}
if(recib==0x33)
{
output_low(pin_A3);
lcd_putc("\f");
enc=0xff;
}
if(recib==0x34)
{
usb_cdc_putc(0x0f);
usb_cdc_putc(0x0f);
usb_cdc_putc(0x0f);
}
if(recib==0x35)
{
output_high(pin_c7);
output_low(pin_c6);
}
if(recib==0x36)
{
/*lcd_putc("\f Inicio de Insp");
lcd_putc("\nen Base de Datos");
delay_ms(200);
lcd_putc("\fInt Luz");
lcd_putc("\n Temp: C lux");*/
}
if(recib==0x37)
{
/*lcd_putc("\f Termino Insp");
lcd_putc("\nen Base de Datos");
delay_ms(2000);
lcd_putc("\fInt Luz");
lcd_putc("\n Temp: C lux");*/
}
}
}
}
}

void adquisicion()
{
set_adc_channel(0);
delay_us(10);
luxs = read_adc();
delay_us(60);
set_adc_channel(1);
delay_us(10);
temper = read_adc();
delay_us(60);

luxsd = (((0.00000000000006) * (luxs ^ 6)) - ((0.0000000002) * (luxs ^ 5)) + ((0.0000004) * (luxs ^ 4)) - ((0.0003) * (luxs ^ 3)) + ((0.119) * (luxs ^ 2)) - (26.409 * luxs) + 2632);
temp= temper*0.48828125;

lux[0]=make8(luxs,0);
lux[1]=make8(luxs,1);
/*
if (temp>=100)
{
lcd_gotoxy(7,2);
printf(lcd_putc,"%d",temp);
}

if (temp>=10)
{
lcd_gotoxy(7,2);
printf(lcd_putc," %d ",temp);
}
else
{
lcd_gotoxy(7,2);
printf(lcd_putc," %d ",temp);
}

//if (luxs>=100000)
// {lcd_gotoxy(9,1);
//printf(lcd_putc,"%ld",luxs);}

if (luxs>=10000)
{
lcd_gotoxy(9,1);
printf(lcd_putc," %f",luxsd);
}

if (luxs>=1000)
{
lcd_gotoxy(9,1);
printf(lcd_putc," %f ",luxsd);
}

if (luxs>=100)
{
lcd_gotoxy(9,1);
printf(lcd_putc," %f ",luxsd);
}

if (luxs>=10)
{
lcd_gotoxy(9,1);
printf(lcd_putc," %f ",luxsd);
}
else
{
lcd_gotoxy(9,1);
printf(lcd_putc," %f ",luxsd);
} */
}

void main()
{
set_tris_a(0x03);
setup_adc_ports(AN0_TO_AN1);
setup_adc(ADC_CLOCK_INTERNAL );

output_high(pin_c7);
output_low(pin_c6);
output_low(pin_A3);

/*lcd_init();//inicializamos el USB
lcd_putc("\fLuxometroDigital");
lcd_putc("\n Mesalud Ltda");*/

while(true)
{
if (input(pin_c0) == 1)
{

if (input(pin_c1) == 1)
{
if(warning==0 && hini1==1)
{
usb_cdc_putc(0xff);
usb_cdc_putc(0x36);
usb_cdc_putc(0x36);
warning=1;
}
/*lcd_putc("\f Desconecte USB");
lcd_putc("\n o La Bateria");*/
delay_ms(2000);
/*lcd_putc("\fEl Equipo Puede");
lcd_putc("\n Sufrir Danos");*/
delay_ms(2000);
hini=0;
enc=0xff;
}
else
{
warning=0;
if(hini==0)
{
//lcd_putc("\fLuxometroDigital");
//lcd_putc("\n Mesalud Ltda");
}
hini=1;
modo=0x0f;
}
}
else
{
modo=0xf0;
warning=0;
output_low(pin_a2);
if(hini==0)
{
//lcd_putc("\fLuxometroDigital");
//lcd_putc("\n Mesalud Ltda");
}
hini=1;
if(hini1==0)
{
usb_cdc_init();
usb_init_cs();
hini1=1;

}
}

if (hini==1)
{
if(input(pin_c2))
{
delay_ms(200);
enc=enc*-1;
if(enc==1)
{
output_HIGH(pin_A3);
//lcd_putc("\fInt Luz");
//lcd_putc("\n Temp: C lux");

usb_cdc_putc(0xff);
usb_cdc_putc(0x32);
usb_cdc_putc(11);

}
else
{output_LOW(pin_A3);

usb_cdc_putc(0xff);
usb_cdc_putc(0x33);
usb_cdc_putc(11);

//lcd_putc("\f");
}
}
}

if(enc==1)
{
if (modo==0x0f)
{
output_high(pin_a2);
adquisicion();
}
if(modo==0xf0)
{
usb_task();
adquisicion();
usb_com();
}
}
else
{
output_low(pin_a2);
if(modo==0xf0)
{
usb_task();
usb_com();
}
}
}
}


con solo lcd_init() ya se bloquea....

gracias y espero su ayuda............
 
hola a todos,,,

problema solucionado,,, era la lcd, estaba danada, no habia probado con otra por que no tenia a la mano, ya la cambia y funciona perfecto,,,,,,,,,,,
 
UNA PREGUNTA ADICIONAL: El metodo usb Bulk tiene interrupciones?? es q ya de tanta informacion confundo los metodos!
Osea q el micro sepa cuando se le esta enviando un dato, sin necesidad de estar siempre leyendo el buffer!!

Bueno ya investigue!!! y en CDC no se puede cambiar el icono!! :(

Si el USB tiene interrupciones ....pero no están disponibles para el usuario a no ser que armes tus propias funciones de control para obtener los datos...
Lo mejor es usar la función Usb_Kbhit()....con eso vos te fijas en un momento determinado si hay o no datos...

Ahora con el tema del ícono de CDC no se puede personalizar por que windows lo reconoce como un puerto serie y le pone el icono correspondiente a ese puerto.

Un saludo !
 
Si el USB tiene interrupciones ....pero no están disponibles para el usuario a no ser que armes tus propias funciones de control para obtener los datos...
Lo mejor es usar la función Usb_Kbhit()....con eso vos te fijas en un momento determinado si hay o no datos...

Ahora con el tema del ícono de CDC no se puede personalizar por que windows lo reconoce como un puerto serie y le pone el icono correspondiente a ese puerto.

Un saludo !

Ok Gracias Moyano!!! Cualquier cosa estamos en contaco!!
 
Otra vez yo!!! Jejejejeje como puedo hacer para aumentar la velocidad de transferencia de datos en USB_CDC?? osea superior a 9600 Baudios!!! que o donde debo modificar??? Gracias!!!
 
Atrás
Arriba