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

Hola!!!,

Disculpen por la molestia pero... no se como crear la interface en VB 2008 con el archivo mpusbapi.dll, me lo podrían explicar paso a paso por favor de antemano GRACIAS!!!!
 
Hola señores,
tengo buenas nuevas descubri que es muy requerido el Vusb para el pic18F2450 ya le habilite el regulador y funciono de maravilla, la PC me lo reconoce como CCS RS-232 DEMO. Sin embargo mis problemas no acaban aca, estoy utilizando el enumer_picusb pero no lobro instalar el mchpcdc he seguido el manual al pie de la letra y tambien prove dando click derecho "instalar", pero igual no logro que se instale el driver, la PC me tira el siguiente mensaje "la carpeta seleccionada no contiene informacion relacionada con el hardware"... alguien sabra a que se debe esto?... de nuevo gracias por la ayuda suministrada....
 
hola cosmico,
gracias por el tip, pero resulta que era una mala coneccion entre los pines del pic, ya la pc me reconce el pic como cdc com 3... aunque si me pasa algo muy rato el pic esta conectado y reconocido como puerto serial, pero no me funciona con hyperterminal o con visual basic 2010, aun estoy trabajando en esto... pero si tuvieras alguna idea de por donde va ese error... me ayudarias mucho... o si alguien mas tiene una idea de esto....
 
hola cosmico,
gracias por el tip, pero resulta que era una mala coneccion entre los pines del pic, ya la pc me reconce el pic como cdc com 3... aunque si me pasa algo muy rato el pic esta conectado y reconocido como puerto serial, pero no me funciona con hyperterminal o con visual basic 2010, aun estoy trabajando en esto... pero si tuvieras alguna idea de por donde va ese error... me ayudarias mucho... o si alguien mas tiene una idea de esto....

Puede ser varias cosas, lo primero que debes revisar es que tus conexiones en el PIC sean las adecuadas, puede ser que estén invertidas D+ y D-, y después de eso revisa la velocidad en la cual estas trabajando con el PIC, también tiene que coincidir con la velocidad de las hiperterminales, puedes sufrir desconexiones seguidas, también puede ser que el controlador que estas utilizando no sea compatible, en este caso revisa tu programa para ver que si sea el correcto, cámbialo a otra conexión del USB, te pudiste echar ese puerto... revisa todo estas opciones una por una
 
mirá lo que pedís es complejo y vas a tener que buscar más info de lo que querés para que te ayudemos.
1º que nada los descriptores de dispositivo para que la PC los detecte como un puerto paralelo y después leerte bien todas las caracteristicas y especificaciones del mismo para poder implementar un firmware que emule dicho puerto.
 
Hola Moyano, que tal.
Tengo una duda importante, estoy en el trabajo y necesito hacer una conexion con USB, utilizo el PIC18F13K50, pero para las simulaciones en Proteus, para simplificar, utilizo el 2550. Con los ejemplos del Proteus me anda muy bien cuando conecto el simulador de USB, pero con los ejemplos que posteaste no me funciona. Probe con los de la pagina 1 y nada.
Sabes que puede ser?
Muchas gracias de ante mano,
Saludos
Daniel

Moyano, vi en la pagina 39 que COSMICO pregunto lo mismo que yo y le contestaste.. es dificil leer todo.... Cambio la pregunta: las librerias que posteaste en la primera pagina son un poco distintas a las que provee CCS, eso afecta en algo?
Otra pregunta si no te molesto... puedo adaptar tu codigo para el 13K50?
Muchas gracias
 
Última edición:
Moyano, vi en la pagina 39 que COSMICO pregunto lo mismo que yo y le contestaste.. es dificil leer todo.... Cambio la pregunta: las librerias que posteaste en la primera pagina son un poco distintas a las que provee CCS, eso afecta en algo?

Hola kuropatula las librerias que utiliza Moyano tanto la usb_desc_scope.h como usb_desc_cdc.h son diferentes ya que la que el utiliza tiene algunos descriptores distintos se han cambiado tanto el los nombres con los que se muestra el dispositivo así como también el VID y el PID tendrías que o remplazarlas así como dice Moyano o cambiar el PID y el VID en las librerías para ponerle las de tus driver o en las de tu driver para ponerles las de librerías que deseas si estos valores no coinciden el PID y el VID no se reconoce el driver que se utiliza disculpa si no fui claro
saludos
 
Última edición:
Hola FRYCK, muchas gracias por la respuesta. Entendi bien lo que dijiste, fuiste claro.
Te pregunto otra cosa, utilice el ejempli que esta en la primera pagina en donde si recibe el ASCII 'a' hace un toggle. Modifique un poco el codigo para que me haga el toggle en un pin luego del kbhit y otro luego de la deteccion de la 'a'. Lo que me ocurre es que en kbhit lo detecta bien pero el caracter 'a' no. Me podrias ayudar?

Este es el codigo:

if (usb_enumerated()){ // Si el puerto ya fue enumerado por el host :
if(usb_cdc_kbhit()){ // en espera de nuevo(s) caracter(es) en el buffer.
output_toggle(PIN_C3);
if(usb_cdc_getc()== 'a'){ // ¿lo que llegף fuי el caracter a?
printf(usb_cdc_putc, "OK!.\n\r");
output_toggle(PIN_C4);
}
}

Gracias desde ahora.

Saludos

Daniel
}
 
Hola kuropatula este programa me esta haciendo lo que dices compara y ve cual era tu error. revisa en dispositivos que com estas utilizando en administrador de dispositivos Puertos( com & lpt) y lo comunicas con el programa que estas utilizando para enviar en mi caso es COM4 y utilizo Hércules para comunicacion. busco COM4 abro puerto y escribo "a" me devuelve ok .
saludos
PHP:
// Ejercicio Nº1: Genera un COM virtual y se comunica bidireccionalmente con el a través del PIC18F2550.

#include <18F4550.h> // Definición de registros internos.

#fuses HSPLL,NOMCLR,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.
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.

void main() {
   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).
   do{
      usb_task();
      if (usb_enumerated()){  // Espera a que el dispositivo sea enumerado por el host.
         if(usb_cdc_kbhit()){ // En espera de nuevos caracteres en el buffer de recepción.
         output_toggle(PIN_C3);         
            if(usb_cdc_getc()=='a'){ //¿lo que llegó fué el caracter a?
               printf(usb_cdc_putc, "OK\n\r");
            output_toggle(PIN_C4); 
               //si, entonces envía una cadena hacia el PC               
             }
         }
        }
       }while (TRUE); // bucle infinito.
}
 
Gracias FRYCK, lo voy a probar pero el lunes ya que sali del trabajo y hasta el lunes no vuelvo. Te aviso como funciono, de todas formas me parece similar, creo que mi problema puede estar en otro lado. A cuantos baudios transmite? Creo que es 9600 8 N 1 verdad?

Gracias y saludos!
 
Gracias FRYCK, lo voy a probar pero el lunes ya que sali del trabajo y hasta el lunes no vuelvo. Te aviso como funciono, de todas formas me parece similar, creo que mi problema puede estar en otro lado. A cuantos baudios transmite? Creo que es 9600 8 N 1 verdad?

Gracias y saludos!

Hola kuropatula si esa es la velocidad de transmisión depronto tu problema es el driver o el COMx que tratas de utilizar
 
Buenas caballeros,
Esta vez tengo un problemita similiar al que esta aqui arriba posteado por el compañero kuropatula, que dice que no puede recibir informacion del PC a el PIC, mi programa es muy parecido al que esta ahi pero no logro por ningun medio que el pic diferencie si resibe un 1 o un 2 o cualquier otro caracter.
#include <18F2450.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN,MCLR,PUT
#use delay(clock=48000000)

#define led (pin_c0)
#define led2 (pin_c1)
#define led3 (pin_c2)
#define on output_high
#define off output_low

#include <usb_cdc.h>
#include "usb_desc_cdc.h"

void main() {
char valor;
char comparador1;
char comparador2;
comparador1 = "1";
comparador2 = "2";
on (led);-----------------------------------------------------------------------------------------------------
delay_ms (1000); // esta seccion enciende los tres leds que estoy usando para probar
off (led); //que si enciendan
on (led2);
delay_ms (1000);
off (led2);
on (led3);
delay_ms (1000);
off (led3);------------------------------------------------------------------------------------------------------
usb_cdc_init(); //inicio el USB como CDC COM3
usb_init();-----------------------------------------------------------------------------------------------------
do{
if (usb_cdc_connected()){-------------------------------------------------------------------------------
on (led); //cuando el PIC esta conectado al USB enciende el led 1
if (usb_enumerated()){-----------------------------------------------------------------------------
on (led2); //cuando el PIC esta enumerado enciende el PIC enciende el led 2
do{-----------------------------------------------------------------------------------------------
usb_task();
if (usb_cdc_kbhit()) { //si se recibe un dato en el buffer envia al hyperteminal
printf (usb_cdc_putc, "caracter recibido\n\r"); //esta frase
if (usb_cdc_getc() =='1'){//si el dato es un 1 entonces enciende el led 3 y
on (led3); // espera 1 segundo
delay_ms (1000);}
else if (usb_cdc_getc() =='2'){ //si el dato recibido es un 2 entonces
off (led3);}} //entonces apaga el led 3
else if (usb_cdc_kbhit() == false){------------------------------------------------------
printf (usb_cdc_putc, "no hay caracter\n\r"); //si no se recibe datos entonces
delay_ms (1000);} //envia esta frace y espera un segundo para volver a
}while(true);} // chequear si se ha recibido algo
else{
off (led2);}} // si no esta el USB enumerado apaga el led 2
else{
off (led);} //si no esta conectado el USB apaga el led 1
}while (TRUE);
}

como podran notar el el enumerador y el conector estan configurados para encender un par de leds cuando se conectan a la PC, esto pasa sin ningun problema, el pic envia informacion al PC la cual puedo ver en el hyperteminal. Y lo que veo es lo siguiente; cuando envio un dato recibo en el hyperterminal "caracter recibido" pero no me enciende el led igual cuando no envio datos me da un "no caracter rebido" pero no veo respuesta por parte del led, lo que me indica que el pic no esta distinguiendo los caracteres, ya he probado usando '1' y '2', y con constantes fijas pero aun asi no logro obtener respuesta... si alguien tiene un idea de esto o si puede guiarme le estare agradecido.... y gracias a cualquiera por sus opiniones...
 
Última edición:
Hola RALD seria mas cómodo para todos si editaras tu mensaje y colocaras tu código en medio de las instrucciones code o php se hace mas legible
saludos
 
Última edición:
hola FRYCK no se como hacer para que el codigo quede en un formato mas legible pero creo que lo que hice les puede ayudar, cualquier cosa si no me puedes decir como corregir el problema? gracias
 
Hola RALD en avanzados esta la occion code (#) y php es mas comodo para leerlo y se entiende mejor la idea y por otro lado si te queremos ayudar asi se facilita las cosas

probé tu código y me funciono el único cambio fue el micro los descriptores y los driver si quieres te paso los que utilice .

saludos

PHP:
#include <18F4550.h> // Definición de registros internos.
#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN

#define led (pin_c0)
#define led2 (pin_c1)
#define led3 (pin_c2)
#define on output_high
#define off output_low

#use delay(clock=48000000) // Frecuencia máxima de trabajo.

#include <usb_cdc.h>
#include "usb_desc_cdc.h"

void main() {   
   on (led);
   delay_ms (1000);
   off (led);
   on (led2);
   delay_ms (1000);
   off (led2);
   on (led3);
   delay_ms (1000);
   off (led3);
   
   
   usb_cdc_init();
   usb_init();
   
   do{ 
      if (usb_cdc_connected()){
         on (led);
         if (usb_enumerated()){
         on (led2);
         do{
            usb_task(); 
            if (usb_cdc_kbhit()) {
               printf (usb_cdc_putc, "caracter recibido\n\r");
               if (usb_cdc_getc() =='1'){
                  on (led3);
                  delay_ms (1000);
               }
               else if (usb_cdc_getc() =='2'){
                  off (led3);
               }
            }
            else if (usb_cdc_kbhit() == false){
               printf (usb_cdc_putc, "no hay caracter\n\r");
               delay_ms (1000);
            }
         }while(true);
         }
         else{
         off (led2);
         }
      }
      else{
      off (led);
      }
   }while (TRUE);
}
 
Atrás
Arriba