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

Hola Moyano, por fin pude concluir la lectura de todas las paginas, y lo que pude notar con las disculpas del caso es que muchos ven la ultima pagina y ni siquiera se toman la molestia de leer desde la primera o simplemente leer algun manual publicado para comprender mejor bueno hasta ahi..
Esto para los que quieren mas, mas, mas y mas informacion.
Como mencione en un comentario anterior, la comunicacion usb discutimos tambien
en http://www.dynamoelectronics.com/ con algunas caracteristicas importantes como:
libreria: mcHID.dll
aplicacion pc: visual basic 6
codigo fuente micro: asm
transferencia por interrupcion HID
velocidad de transmision 12 Mbps
interface: USB 2.0
micro: pic18F2550
Todo esto con el fin de aprender un poco mas sobre interfaces usb y no tratar de desviar el tema, a codigo fuente asm, sin embargo tiene mucha razon Moyano y Meta cuando dicen que se tiene que quemar pestañas para aprender mas, sin mencionar el
tiempo invertido para leer todo el protocolo de transmision usb, que se supone que se debe tener conocimientos para la programacion en asm y desde ya les cuento que el codigo es de muchas lineas que marea y esta desarrollado sin uso de registros de interrupciones para la transmision usb.
Lo que recomiendo para comprender mejor es:
1 Leer este hilo desde la primera pagina detenidamente y los manuales.
2 Leer manual que redacto Moyano (muy bueno y resumido por cierto)
3 Leer datasheet pic18fX550 protocolo usb(terminal del extremo de la interfaz pic para programar codigo fuente)
4 Leer protocolo transmision usb (terminal pc, para uso mcHID.dll)
5 Mucha suerte de no tostar en pruebas el pic (jejeje)
Por cierto hay error en simulacion asi que tienen que armarlo en placa
Espero no haberme alargado demasiado...
Por cierto Moyano y Meta porque no vamos paso a paso como mencionaron en paginas anteriores, primero un proyecto limpio que funcione en CDC, otro en HID y otro en Bulk transfer.

Pd. Como haces para sacar tiempo al tiempo? Moyano
 
Alguien por favor que me pueda ayudar a mandar 8 bits por el puerto USB pero sin utilizar el PIC :S les agradeceria mucho
 
Bueno gracias por sus alagos...el tiempo sinceramente es algo que me juega en contra siempre no por la electrónica en si sino en todo ...por que siempre estoy hasta la nuca de cosas que hacer ..y cuando me canso definitivamente tengo que dejar algo de lado...todo lo que a USB se referiere lo he estudiado bastante...aprendiendo de otros usuarios en otros foros....aprendiendo de libros y manuales en inglés....y por sobre todo mucha ....mucha practica y horas de sueño perdidas....de ahi es donde saco mi tiempo de las horas de sueño jajajaj pero siempre valen la pena....no solo para mi ..sino también para todos los que se meten al mundo de la electrónica y no entienden ...tratar de abrirles el camino y pegarles una mano....y como siempre el objetivo mas importante , que es el que todos aprendamos.
 
Muy buenas:
Felicitaciones por el hilo y el trabajo realizado, se hecha de menos alguna actualizacion del tutorial de Moyano Jonathan pero esta claro que el tiempo no es infinito.

Tengo un serio problema, cuando estoy trabajando con el 18F2550 configurado para usb con un cristal de 8Mhz y usando #use delay(clock=48000000) las funciones Delay_us y Delay_ms no me estan funcionando correctamente.

El funcionamiento de la comunicacion usb es correcto pero estoy intentando mover un servo y las temporizaciones no las hace correctas, incluso sin usar la comunicacion solo estando configurado el pic para hacerlo y localmente teniendo que mover el servo me hace temporizaciones bastante mas largas.

Espero que alguien me pueda hechar un mano.
Hecho de menos algun post de META hace tiempo que no lo oigo.

Salu2.
 
Tu problema es que el pic esta programado para trabajar a 48MHz, y le en realidad esta trabajando a 8MHz, los delay, por ende, no son correctos y un servo necesita mucha precision en los tiempos. Cambia la cofiguracion o el Xtal.
saludos
 
Gracias por la respuesta.
Entonces como puedo hacer un hardware que funcionase por si mismo a 8Mhz y eventualmente pudiera conectarlo al usb para configurarlo o monitorizarlo.
Osea como se hace para funcionar tanto conectado como sin conectar y usar los Delay.
 
cambia a esto:

#use delay(clock=8000000) //la frecuencia se escribe en Hertz por lo tanto 8MHz= 8000000Hz

Pero nose si te va a andar el usb, posiblemente no trabaje a tan bajas velocidades, proba y contanos.
 
La comunicacion usb no funciona si no es con #use delay(clock=48000000) asi que mi duda continua, ¿no se puede utilizar la comunicacion usb con las funciones Delay_us o Delay_ms en ccs?
 
el PIC tiene un divisor interno para que la CPU trabaje de manera independiente al modulo USB, esto se configura en los Fuses, estos serian los mas comunes


#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV4,VREGEN

donde:

HSPLL: utilizamos un cristal HS de alta velocidad, en conjunto con el PLL para generar los 48Mhz.

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.

PLL1: significa que el PLL prescaler dividirá en 1 la frecuencia del cristal. para HS = 4Mhz/1 = 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


en tu caso, si estas trabajando con un cristal de 8Mhz y quieres que tu programa corra con esa frecuencia pero que ala vez funcione el modulo USB, debes prestar atencion a los FUSES PLL y CPUDIV, que para tu caso seria PLL2 (por que como sabes se requieren 4Mhz a la entradaa del PLL para asi poder obtener los 96Mhz) y CPUDIV4 para dividir los 48Mhz sobre 6 (parece confuso pero las librerias del CCS estan configuradas para que cpudiv4 sea division sobre 6) y asi obtener los 8Mhz necesarios para que tu programa trabaje.

yo te recomendaria que en lugar de retardos hagas uso del modulo timer o del PWM, pues los delays no son muy exactos (esto dependiendo del codigo que tengas), solo doy ideas al aire...

te recomiendo tmbn que leas el datasheet en la partede las opciones en el oscilador del 18f..espero no confundirte mas mantenilsa jaja, ahi me comentas como te fue con ese enredo te paso esta pagina de red pic depronto te queda mas clara la idea

http://picmania.garcia-cuervo.net/conceptos.php#USB4Mhz
 
Última edición:
Quiero dar aviso de que estoy reescribiendo los ejemplos de USB para CDC HID y BULK. Esto me llevará un buen tiempo pero de a poco los voy a ir haciendo...en cuanto los tenga a todos listos los postearé aquí en el foro.
Con respecto al manual de USB...he aprendido muchas cosas nuevas del USB asi que voy a tener que empezarlo casi desde 0 para que esté bien completo y explicado con detalle para que todos entiendan de que se trata.

Un saludo !
 
Que tal realice el primer ejercicio de la pagina pero al compilarlo me aparece estas advertencias.

>>>Warning 203''C:\Program Files(x86)\picc\drivers\pic18_usb.h"Line523(1,1):Condition always TRUE
>>>Warning 216''USB1.c"Line48(0,1):Interrupts disable during call to prevent re-entrancy:(usb_token_reset)
>>>Warning 216''USB1.c"Line48(0,1):Interrupts disable during call to prevent re-entrancy:(usb_flush_out)
>>>Warning 216''USB1.c"Line48(0,1):Interrupts disable during call to prevent re-entrancy:(usb_cdc_flush-out-buffer)
>>>Warning 202''C:\Program Files(x86)\PICC\drivers\usb_desc_cdc.h"Line154(16,37):variable never used:USB_CLASS_DESCRIPTORS

copie las librerias de USB modificadas del proyecto por nuestro amigo moyano en la carpeta de PICC y driver como lo dice el archivo adjunto "leeme", no aparece error pero si 5 advertencias que sera.
 
la verdad esas lineas de advertencias no te van a traer dramas....te dicen que las interrupciones son deshabilitadas según se llaman a algunas funciones ....la que te dice condition always true ...te dice que ese bucle de programa se desarrolla de forma infinita..seguro es un while(true) o un for(;;)...y la de variable never used...inteta borrando la variable...aunque no te lo recomiendo...es una variable que al parecer no tiene uso pero ese warning no te va a traer drama alguno.
 
Gracias por reponder lei el hilo completo y me parecio muy interesante, tengo pic18f4550 para realizar las practicas creo que servira, estoy migrando del BASIC al CCs Compiler, hasta el momento no me ha presentado problemas cuando me coloque a tono con el hilo vere como subir algun aporte.
 
Hola,

Bueno ya lo tengo casi todo funcionando para mi proyecto USB! :D
Se trata de leer las entradas RB2:RB6 del PIC y cuando una de ellas está a 0 voltios, le debe mandar un mensaje al PC. Por ejemplo, cuando el pic detecta que la pata RB5 está a 0 Voltios, le manda el valor 0x31 al PC. El software del PIC es este:

void main()

{
int entrada;
int confirmacion[1];
int recibe[1];
LED_ON(led_rojo); //encendemos led rojo
LED_OFF(led_verde);

usb_init(); //inicializamos usb

usb_task(); //habilita periferico usb e interrupciones
usb_wait_for_enumeration(); //


LED_OFF(led_rojo);
delay_ms(100);
LED_ON(led_rojo);
delay_ms(100);
LED_OFF(led_rojo);
LED_ON(led_verde);

confirmacion[0]=0x31;
inicializaciones();

if(usb_enumerated()) //si el PicUSB está configurado
{
while(true)
{

if(input(PIN_B6)==false)
{
entrada=1;
LED_ON(PIN_B7);
}
if(input(PIN_B5)==false)
{
entrada=1;
LED_ON(PIN_B7);
}
if(input(PIN_B4)==false)
{
entrada=1;
LED_ON(PIN_B7);
}
if(input(PIN_B3)==false)
{
entrada=1;
LED_ON(PIN_B7);
}
if(input(PIN_B2)==false)
{
entrada=1;
LED_ON(PIN_B7);
}
delay_ms(100);
LED_OFF(PIN_B7);
if(entrada==1)
{
entrada=0;
usb_put_packet(1, confirmacion, 1, USB_DTS_TOGGLE);
}
}
}

}

Ahora bién, para el software de control, estoy usando visual c# 2008, usando mpusbapi.dll .. Que instrucción es la que me permite saber cuando esta enviando información el PIC? Por ejemplo, cuando desde el PC enviamos información al PIC, usamos esta sentencia if (usb_kbhit(1)), para saber que el PC ha enviado datos al PIC. Pues me gustaria saber si existe la misma instruccion pero para saber que el PIC ha enviado datos al PC.
Porque sino, cuando pongo esta instruccion ReceivePacket(receive_buf, &RecvLength)?
Espero que se haya entendido, sino hacedmelo saber. Muchas gracias
 
Hola Moyano, estoy realizando un proyecto con el pic18f4550 para interactuar con matlab, el problema que tengo es con la conexion del dispositivo. Encontre un archivo para la comunicacion daqc (el cual te adjunto). Modifique el archivo como ponia y grabe este archivo en el pic18f4550. Despues me descargue el driver mchpusb, que venia con el archivo.inf y .sys.

Conecte el dispositivo y mande con la direccion del driver al administrador, pero me sale un error que dice: el sistema no encuentra informacion sobre el software.

¿A que se debe esto? Te paso tambien el esquema del circuito por si te sirve para ayudarme.

He estado leyendo en el foro sobre las librerias de usb_cdc.h y usb_desc_cdc.h, no se donde se encuentra el VID y PID para modificarlos y no se si esta ahi el problema. ¿Estas librerias deben estar en la misma carpeta que el driver?


Gracias de antemano.

Perdón, me faltaba el esquema.
 

Adjuntos

  • daqc.txt
    7.2 KB · Visitas: 84
  • Esquema.GIF
    Esquema.GIF
    43.9 KB · Visitas: 159
Última edición:
Moyano disculpa, una pregunta se puede utilizar interrupcion por timer 0 usando el usb?

por ejemplo quiere que etse parpadeando cada 500 mS un led pero a la vez el PIC este conectado a la compu?

ahh otra pregunta se puede usar el CCP1 y 2 para generadores de frecuencia,...pero no afecta la conexion USB?
 
que tal los ejemplos estan geniales y muy bien explicador, solo tengo una pregunta: ¿Es posible que este pic detecte que lo que se envia por el puerto usb de un psp?

concretamente ¿puede este pic funcionar como maestro y el psp como esclavo?, el psp no puede ser maestro por obvias razones.
 
en unos dias les respondo las preguntas...me he quedado sin pc pero pronto remontaré

Hola a todos.....tengo algo que decirles:
En mis primeros post donde puse programas hechos en VB 6.0 ..hay códigos que no son de mi autoría dentro del fuente del programa y que pertenecen al usuario Palitroquez de todopic. Esto lo digo no para decir que todo lo que he puesto es una mentira ..sino que es a partir de leer cosas de este usuario. El mismo se quejo personalmente hace unos meses ..por email...pero como nunca los leo no sabia que habia una queja presente hace 3 meses..:S quería decir esto por que no me gusta para nada que me acusen de plagio...es más muchas de las cosas que hay circulando por la red son de plagio...y aunque esto no justifica nada es una forma de decir que lo que está en la red está para utilizarse.
Otra cosa queda explicito que nada de lo que está acá es para usos comerciales..sino puramente educativos.

Mis saludos ...
atte. Moyano Jonathan
 
Última edición:
Hola a todos, tengo una duda con los buffers, lo que quiero hacer es enviar datos de 8 bits por 2 buffers o mas desde el programa en VB hacia el micro, intente en VB usar
ejemplo:
dato = 2
BufferOut(3) = Val(dato)
Call WriteSomeData()
para usar el otro buffer, se que ese correponderia al Buffer 2 del micro, el problema lo tengo en el micro estoy seguro pero no logro encontrar por ninguna parte donde expliquen como usar y configurar 2 o mas buffers en ccs usando HID, agradeceria si alguien sabe algo si me puede explicar, gracias
 
Atrás
Arriba