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

FIjate en las primeras páginas del hilo creo que aparece...sino en mi manual ...en la última version tambien aparece.

Q tal si colocas la ultima version del manual en el primer post del foro!! asi no estariamos buscando por todo el foro cual es el ultima version y donde esta!!!

Espero q tomes mi sugerencia y gracias!!! pronto dare mis aportes!!
 
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!!!


mira en el archivo usb_cdc.h donde se encuentra toda la configuracion del puerto...

void usb_cdc_init(void) {
//usb_cdc_line_coding.dwDTERrate=9600;//ORIGINAL
usb_cdc_line_coding.dwDTERrate=57600;
usb_cdc_line_coding.bCharFormat=0;
usb_cdc_line_coding.bParityType=0;
usb_cdc_line_coding.bDataBits=8;
(int8)usb_cdc_carrier=0;
usb_cdc_got_set_line_coding=FALSE;
usb_cdc_break=0;
usb_cdc_put_buffer_nextin=0;
usb_cdc_get_buffer_status.got=0;
usb_cdc_put_buffer_free=TRUE;

alli modificas guardas y compilas y listo,,, tambn cuando se intale tu dispositivo en el pc, debes ir a administrador de dispositivos y ver configuracion del puerto del com generado,,,

alli puedes indicar el com que quieras aasignar y la velocidad que este maneja,,, e

espero te sirva, cualquier duda, con gusto..............

en cuanto a lo del manual, estoy de acuerdo Moyano, ojala publiques la ultima version
 
Última edición:
mira en el archivo usb_cdc.h donde se encuentra toda la configuracion del puerto...

Cual seria la asignacion del com??? y gracias ya me habia puesto a ver todas las librerias y me di cuenta q tendria q crear una variable para lo de la velocidad!!

Ah ok ya entendi!!! habia leido mal!! si esa parte de la configuracion del pc lo se! pense q me hablabas q podia asignar de una vez el COM desdes el pic!! jejejeje

Gracias por tu ayuda! la sabre valoras!!! pronto doy mis aportes!!
 
Última edición:
Con el tema del libro del USB ...voy a tardar bastante en terminarlo. En cuanto al manual de aplicaciones con el USB referido a HID va avanzado y proto van a tenerlo listo para la descarga.
 
Hola! aestuve leyendo un poco ya que son bastantes paginas...y me gustaria saber si es posible llegar un poco mas alla de 1Mbit/s ya que necesito leer 1kByte desde un conversor AD (que muestrea a 400kHz) y enviarlo a la pc en menos de 7ms...si alguien me puede ayudar u orientarme les estare agradecido!
 
Moyano tengo un problemita haciendo una comunicacion USB_CDC!!!

Tengo tres led que me deberian indicar cuando el PIC:
1.No esta Conectado al PC (ROJO)
2.Cuando esta Conectado al PC (Amarillo)
3.Cuando esta Enumerado (VERDE)

el programa principal en CCS es:
void main() {
set_tris_b(0x0F); // Nibble bajo entradas, el alto salidas
LED_OFF(VERDE);
LED_OFF(AMARILLO);
LED_OFF(ROJO);
usb_cdc_init(); // llamadas necesarias para iniciar el módulo USB.
usb_init_cs(); // inicia el USB y sale. Va de la mano con usb_task().
WHILE(true){
usb_task(); // configura el USB.
while(usb_cdc_connected()){ // Si está conectado entonces....
// Espera a detectar una transmisión de la PC (Set_Line_Coding).
WHILE (usb_enumerated()){ // aquí se enumera el dispositivo por el host y despúes sale.
//WHILE(usb_cdc_kbhit()){ //en espera de nuevo(s) caracter(es) en el buffer.
//}
TITILA(VERDE);
DELAY_MS(100);
}
TITILA(AMARILLO);
DELAY_MS(100);
}
TITILA(ROJO);
delay_ms(100);
}
}

Estoy usando proteus para simular esto! resuta ser q cuando arranco la simulacion el led rojo titila (me da a entender q esta trabajando correcto), al hacer el sonido de windows (se conecto un USB, en este el virtual de proteus), supongo que ya el led rojo debe dejar de titilar y comenzar a titilar el amarillo (no?) (pues no lo hace). una vez que hago la conexion desde VB comienza a titilar el verde (si se apaga el rojo).

Ahora cuando cierro el puerto el puerto en VB el led verde sigue titilando y los demas siguen apagados.

Preguntas:
Por que el led amarillo no enciende al conectar el dispositivo?
Por que el led rojo no titila ni se apaga el verde al cerrar el puerto en VB?

Ademas: como puedo saber en VB que se a conectado el dispositivo al puerto?

Muchas Gracias. Estare esperando tu respuesta!! OJO ra revise los ejercios anteriores!!

otra pregunta como utilizo el get_string_usb() en el ccs (para recibir cadena de caracteres)??? Gracias...
 
Última edición:
Moyano tengo un problemita haciendo una comunicacion USB_CDC!!!

Tengo tres led que me deberian indicar cuando el PIC:
1.No esta Conectado al PC (ROJO)
2.Cuando esta Conectado al PC (Amarillo)
3.Cuando esta Enumerado (VERDE)

Punto 1: Conecta el led al Vusb con una resistencia de 470R , con esto sabrás cuando estás conectado a la alimentación. (led amarillo).
Punto 2: Usa la función usb_wait_enumeration(){} de la siguiente manera:

enciende led rojo // Conección de alimentación pero no está enumerado.
apaga led verde // no esta enumerado.
usb_wait_enumeration(){} ....espera que se enumere.
enciende led verde // dispositivo enumerado.
apaga led rojo // USB oK....no hay error.

El código va dentro del main pero fuera del bucle infinito...

Para el código que no te funciona, mirá el post #28 de la página 2 del foro. Ahí muestra como usar la función: usb_cdc_connected()

get_string_usb() , nunca lo utilicé tendría que ver como es la función. :unsure:

Por que el led amarillo no enciende al conectar el dispositivo?

Mal programada la función...la solución: Usar usb_wait_enumeration(){} o fijarse como usar el usb_cdc_coneccted() en la pagina 2.

Por que el led rojo no titila ni se apaga el verde al cerrar el puerto en VB?

El host no le avisa al dispositivo cuando se cierran las comunicaciones. Uno mismo tiene que fijarse cuando no hay comunicaciones.

Cuando vos conectas el dispositivo el host lo enumera. Luego conectas el COM a la aplicación ( El dispositivo no interviene) y por último cerras la comunicación con el COM (el dispositivo no interviene)...por que digo que el dispositivo no interviene: La aplicación en VB cierra el controlador que se comunica con el dispositivo ....el dispositivo ni se mosquea cuando cerras la comunicación....por que sigue conectado a la PC y enumerado.

Ademas: como puedo saber en VB que se a conectado el dispositivo al puerto?

Si hacemos de cuenta que el dispositivo genera un COM4 y la aplicación trata de conectarse con el controlador de dicho dispositivo. El controlador responderá de manera adecuada y nos enlazará.

Ahora si desconectamos nuestro dispositivo y la aplicación trata de conectarse al mismo puerto (inexistente ya que hemos desconectado el dispositivo), mostrará un error que podemos procesar para mostrar "dispositivo no conectado"

También podemos hacer un pequeño subprograma en un timer que se ejecute cada 100ms aprox....o menos... enviando un comando al dispositivo al cual se tenga que hacer eco....si la aplicación no obtiene respuesta del comando...se tomo que se ha desconectado y para la comunicación....

En fin son ideas...


PD: HE TERMINADO DE ESCRIBIR EL MANUAL DE APLICACIONES HID POR LO TANTO PROXIMAMENTE SUBIRÉ TODO PARA QUE LO VEAN.
 
También podemos hacer un pequeño subprograma en un timer que se ejecute cada 100ms aprox....o menos... enviando un comando al dispositivo al cual se tenga que hacer eco....si la aplicación no obtiene respuesta del comando...se tomo que se ha desconectado y para la comunicación....

PD: HE TERMINADO DE ESCRIBIR EL MANUAL DE APLICACIONES HID POR LO TANTO PROXIMAMENTE SUBIRÉ TODO PARA QUE LO VEAN.

Era lo que estaba pensando hacer! Que bueno por lo del manual y Muchas gracias por tu gran ayuda!!
 
Hola, estoy usando el programa de visual c# que proporciona microchip, la conexion con el usb me funciona, lo que no se como hacer es como enviar datos al pic desde el pc, por lo que veo en el programa tienes un boton toggleleds que este pone a true un boleano y desde el ReadWriteThread envia el dato, en este caso encender un led; mi problema principalmente es que no me entra en el ReadWriteThread, solo entra la primera vez que ejecuto el codigo, ya que si mando la orden de encendido desde el ReadWriteThread despues de la comprobacion de la conexion si que me lo enciende.
Saludos
 
Hola, estoy usando el programa de visual c# que proporciona microchip, la conexion con el usb me funciona, lo que no se como hacer es como enviar datos al pic desde el pc, por lo que veo en el programa tienes un boton toggleleds que este pone a true un boleano y desde el ReadWriteThread envia el dato, en este caso encender un led; mi problema principalmente es que no me entra en el ReadWriteThread, solo entra la primera vez que ejecuto el codigo, ya que si mando la orden de encendido desde el ReadWriteThread despues de la comprobacion de la conexion si que me lo enciende.
Saludos

Estás haciendo la aplicación con CCS o C18 ? El ReadWriteThread es solo por seguridad....no hace falta que lo uses...como dice en la misma aplicación solo estás por "si se llega a colgar la aplicación principal " o por si las comunicaciones necesitan de más velocidad de ejecución del programa...
 
Gracias por contestar ya logre hacer titilar el led, el problema que tenia era una tonteria, por no fijarme jeje, ahora intentaré recibir datos desde el pic. El programa del pic lo hago en C18 y sobre el enlace ahora no me acuerdo de que parte de la pagina lo saque pero lo que hice fue descargarme un ejecutable y me instalo una carpeta llamada Microchip Solutions v2010-10-19 y ahi es donde esta el programa.
Saludos
 
Moyano necesito de tu ayuda nuevamente:p
Dato = Left$(InBuff, 3)

Con esa instruccion leo el buffer y lo limito a 4 caracteres! bien!!
Pero la cadena que manda el PIC es "Ver1.0", que es lo que quiero? comparar los tres primeros caracteres de cada cadena y luego ubicar el resto en sus respectivos lugares de la ventana del VB.

Osea:
Dato = Left$(InBuff, 3)
if Dato="Ver" then
Dato = Left$(InBuff, 3)
label1.caption= Dato
end if

Pero resulta q cuando leo el buffer y lo limito a 3 caracteres, el resto de los datos se borran!
o los estoy pidiendo mal? porque lo que muestra en el label1 es "Ver" y no "1.0"

De estar mal programado, como tendria que hacerlo??

hay alguna forma de pedir byte a byte?
como lo hice en CCS para armar el string (porque get_string_usb() no lo supe usar)

for (i=0;i<3;i++){
recibo=usb_cdc_getc();
}

y luego comparo la cadena para saber que dato es el que se va a mandar al PC

Espero de tu ayuda.... MIL GRACIAS.....
 
Hola albermillán, como estás.

Mirá no conozco como trata las cadenas el Visual Basic ...pero te puedo dar alguna ayuda.

Primero tendrías que usar la función usb_cdc_khbit() en caso de tener datos en el buffer lo añadís al arreglo "recibo".

Algo como lo siguiente:

if(usb_cdc_khbit()){

int x=0;

if(x==8) {

x=0;
} else { x++ recibe[x]=usb_cdc_getc();}
}

Es muy básico pero lo tendrías que probar...en este caso guarda 8 datos...luego reinicia la variable x y comienza nuevamente con el guardado de datos en cuanto se reciben datos...


Con respecto a los string en VB no te hagas mucho drama:

Deja que el programa reciba datos....pero ponele un condicional.....

Como sería esto:

Leo datos del puerto serie..... (pongamosle 8).

Si por alguna casualidad recibo el caracter por ejem "s"....

Para de recibir datos y los muestra en la ventana de VB


Con esto vos no necesitarías en realidad cortar la cadena sino que recibirias los datos hasta adonde vos le decís y no más (usando un caracter de parada).

Igual si querés saber más sobre el uso de cadenas y CCS te recomiendo el siguiente enlace: http://picmania.garcia-cuervo.net/picc.php#COMBUF232

PD: Mejor usar VB.net ...el VB6.0 presenta muchos problemas de compatibilidad con los nuevos sistemas operativos.

Un saludo !

tablet dijo:
Hola, estoy usando el programa de visual c# que proporciona microchip...​

¿En qué enlace viste eso de [URL="http://www.microchip.com?"]www.microchip.com?http://www.microchip.com?[/URL]

Hablaba del C18 (aplicación para el PIC)

PD: Espero subir el manual este fin de semana. Lo que pasa es que estoy sin internet por que TELEFONICA no me arregla el telefono y dependo del internet ajeno.

Un saludo !
 
Última edición:
Hola albermillán, como estás.

if(usb_cdc_khbit()){

int x=0;

if(x==8) {

x=0;
} else { x++ recibe[x]=usb_cdc_getc();}
}

Por aca todo bien!!

Algo asi como lo q dices es lo que tengo en el PIC.

Ahora en VB:
Supongo que lo que me dices es usando:

Puerto_OutBufferSize = 1 'tamaño del dato a transmitir.
Puerto.InBufferSize = 6 '6 caracteres
Puerto.InputLen = 6 ' Buffer de entrada.
Puerto.RThreshold = 3

Pero como tal no entiendo sus funcionamientos

si me los explicas rapidamente porfa!!!

MIL GRACIAS.......... Saludos....
 
Atrás
Arriba