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

Hola Ya he probado instalando el dll en syswow64 y tampoco anda, si alguien los solucionó sería fantástico saber la solución



Hola, olvide comentar que en windows xp funciona correctamente

Vaya no se que paso con mi mensaje lo había publicado hace mas de 1 mes, había comentado que en windows 8 funciona perfectamente ya que opte por comprarme una laptop nueva y lo primero que hice fue probar la dll.
 
Buenas a todos compañeros, una pregunta hay una función llamada leer dispositivo que por lo que leí intercepta los mensajes de windows tengo una duda esa función puede ser llamada en un botón para que si al presionar un botón, lea el adc, una ves que lo leí haga una función de enviar un dato pero siempre dentro de la misma funcion del boton??
 
Hola como estás.

Fijate si no es un error de hardware/configuración del cristal/cables D+ D- invertidos, etc. Mirá bien como están configurados los fusibles.

Saludos !


Hola a todos, estoy intentando que me funcione la comunicación CDC con el pic18f4550 y el problema es que en el administrador de dispositivos se reconoce como "Dispositivo USB desconocido (Error de solicitud de descriptor de dispositivo)" por lo que no puedo actualizarle el mchpcdc.inf ...

¿Dónde puede estar el problema?

Gracias!
 

Adjuntos

  • va8hbta.jpg
    va8hbta.jpg
    44.5 KB · Visitas: 30
Hola a todos, estoy intentando que me funcione la comunicación CDC con el pic18f4550 y el problema es que en el administrador de dispositivos se reconoce como "Dispositivo USB desconocido (Error de solicitud de descriptor de dispositivo)" por lo que no puedo actualizarle el mchpcdc.inf ...

¿Dónde puede estar el problema?

Gracias!

Asegurate de usar el cristal correcto o la configuracion correcta con la pll y el usbdiv
 
Última edición:
Asegurate de usar el cristal correcto o la configuracion correcta con la pll y el usbdiv

Gracias por la respuesta, pero el problema ahora sé que está en el hardware... el problema es que no lo encuentro.

Voy a revisar el circuito a ver si cambiando algún condensador o lo que sea, si a alguien se le ocurre algo lo agradezco.

Un saludo y gracias!
 
Gracias por la respuesta, pero el problema ahora sé que está en el hardware... el problema es que no lo encuentro.

Voy a revisar el circuito a ver si cambiando algún condensador o lo que sea, si a alguien se le ocurre algo lo agradezco.

Un saludo y gracias!

Mira verifica el conector usb, que este correctamente conectado, mira viendolo por abajo es asi
rrusb_complete_minimal_hardware.gif


aparte de eso solo es el cristal de 20mhz y el capacitor a tierra en el pin 18, yo puse uno de 104nf ceramico, y debe funcionar saludos.
 
Que Windows estas usando, para probar. esos problemas por lo general son de driver.
La verdad depende de la versión de windows que uses, molestan bastante en windows 7 y windows 8.

Te sugiero si quieres y te sirve, que trabajes con XP en máquina virtual ahí estos circuitos trabajan muy bien, y los driver de XP son muy estables.

Esto es si no solucionaste y es urgente..:apreton:
 
Que Windows estas usando, para probar. esos problemas por lo general son de driver.
La verdad depende de la versión de windows que uses, molestan bastante en windows 7 y windows 8.

Te sugiero si quieres y te sirve, que trabajes con XP en máquina virtual ahí estos circuitos trabajan muy bien, y los driver de XP son muy estables.

Esto es si no solucionaste y es urgente..:apreton:

Tienes razon en cierto punto, yo estube trabajando con el usb y batalle ya que depende de la version de ccs que uses por ejemplo estos ejemplos hay que modificar el vid y pid del driver de microchip mas reciente para que funcione en ccs 5.048, si instalas la version anterior de ccs 4.104 creo que funciona bien, ahora el problema que el tiene es hardware ya que windows siquiera reconoce el dispositivo, puede ser el conector usb mal conectado o el cristal, solo hay que verificarlo bien ya que es hardware.

PD: windows deberia reconocerlo minimo.
PD1: intenta con este ejemplo yo lo uso para ccs 5.048 esta funcionando
PD2: olvide adjuntar la libreria usb_desc_cdc.h hay que modificarla en el vi y pid

Código:
///////// config options, although it's best to leave alone for this demo /////
#ifndef  USB_CONFIG_PID
   #define  USB_CONFIG_PID       0x000a
#endif
#ifndef  USB_CONFIG_VID
   #define  USB_CONFIG_VID       0x04D8
#endif
#ifndef  USB_CONFIG_BUS_POWER
   #define  USB_CONFIG_BUS_POWER 100   //100mA  (range is 0..500)
#endif
#ifndef  USB_CONFIG_VERSION
   #define  USB_CONFIG_VERSION   0x0100      //01.00  //range is 00.00 to 99.99
#endif
saludos!
 

Adjuntos

  • driver.rar
    6.6 KB · Visitas: 63
Última edición:

Hola!

Ahora he vuelto a retomar el tema y la conexión ya si que funciona... creo que no me daba cuenta de que estaba usando los usb_cdc.h y usb_desc_cdc.h que vienen por defecto en el programa (al principio cambié éstos pero parece que no se guardaban bien) . Así que los modificados los definí con
Código:
#include ".\Librerias\usb_cdc.h"
#include ".\Librerias\usb_desc_cdc.h"
y así evito confusiones.

El problema viene ahora que quiero hacer la detección del host por hardware. He seguido los pasos de las primeras páginas, usando el pic18_usb_MODIFICADO.h de Moyano, pero me salen 100 errores, de sintaxis casi todos, simplemente usando su .h en lugar de modificar del mío (algunos errores son del archivo modificado y otros del usb.h, el cual no da errores cuando uso el pic_18.h normal). También decir que el archivo que él cambió en su día tiene 1000 líneas de código más que el que viene por defecto en el css (sin contar con sus variaciones del sense pin y los leds rojo y verde) asi que no se...

De momento a ver si me podéis echar una mano para entender esto me conformo. Gracias!!:D
 
Hola!

Ahora he vuelto a retomar el tema y la conexión ya si que funciona... creo que no me daba cuenta de que estaba usando los usb_cdc.h y usb_desc_cdc.h que vienen por defecto en el programa (al principio cambié éstos pero parece que no se guardaban bien) . Así que los modificados los definí con
Código:
#include ".\Librerias\usb_cdc.h"
#include ".\Librerias\usb_desc_cdc.h"
y así evito confusiones.

El problema viene ahora que quiero hacer la detección del host por hardware. He seguido los pasos de las primeras páginas, usando el pic18_usb_MODIFICADO.h de Moyano, pero me salen 100 errores, de sintaxis casi todos, simplemente usando su .h en lugar de modificar del mío (algunos errores son del archivo modificado y otros del usb.h, el cual no da errores cuando uso el pic_18.h normal). También decir que el archivo que él cambió en su día tiene 1000 líneas de código más que el que viene por defecto en el css (sin contar con sus variaciones del sense pin y los leds rojo y verde) asi que no se...

De momento a ver si me podéis echar una mano para entender esto me conformo. Gracias!!:D

No entiendo muy bien tu pregunta, no se a cual libreria te refieres, pero probablemente sea cuestion de los includes, como cambiaste la ruta de las librerias, deberias modificar dentro de cada libreria la ruta, si es que las tienes en una carpeta o las pusiste directo en la carpeta del programa, tal como hiciste con la usb_desc_cdc.h.

PD: si estoy mal cuelga tu codigo para ver, ya que no se a que libreria te refieres saludos.
 
No entiendo muy bien tu pregunta, no se a cual libreria te refieres, pero probablemente sea cuestion de los includes, como cambiaste la ruta de las librerias, deberias modificar dentro de cada libreria la ruta, si es que las tienes en una carpeta o las pusiste directo en la carpeta del programa, tal como hiciste con la usb_desc_cdc.h.

PD: si estoy mal cuelga tu codigo para ver, ya que no se a que libreria te refieres saludos.

El fallo era que estaba modificando el pic18_usb.h en lugar del pic18_usb.c ... :facepalm:

Pero bueno, me he quitado los errores pero no los problemas. Ahora el código que tengo es éste:
Código:
// Programa: Realiza procesos secundarios mientras el dispositivo está desconectado del HOST.
// Programador: Moyano Jonathan.
// 15/12/08
/********************************************************************************************/

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

#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL6,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: Desac tivamos 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
NOPBADEN: Deshabilitamos el módulo de conversión ADC del puerto B.
*/

#use delay(clock=48000000) // Frecuencia máxima de trabajo 48 Mhz.
short estado_usb;   // boolean global, se debe declarar antes de llamar a usb_cdc.h
#define USB_CON_SENSE_PIN PIN_B5 // Definiendo este pin , detectamos si el host está conectado o no por hardware.
#include "usb_cdc.h" // Descripción de funciones del USB.
#include "usb_desc_cdc.h" // Descriptores del dispositivo USB.

// Declaramos las funciones utilizadas.
void estado_conexion_usb(short bandera);

void main() {
estado_usb=false;
   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.
     estado_conexion_usb(estado_usb); // Se fija en el estado de la conexión usb.
     if(usb_cdc_connected()){ // Si está conectado entonces....
   // Espera a detectar una transmisión de la PC (Set_Line_Coding).
       if (usb_enumerated()){ // aquí se enumera el dispositivo por el host y despúes sale.
          if(usb_cdc_kbhit()){ //en espera de nuevo(s) caracter(es) en el buffer.
             if(usb_cdc_getc()=='m'){ //¿lo que llegó fué el caracter m?

                printf(usb_cdc_putc, "Llegó la letra m.\n\r"); // Envia una respuesta al HOST.
                output_high(PIN_B7); // Indica que ha llegado un caracter.
                delay_ms(1000); // Espera 1 seg.
                output_low(PIN_B7); // Apaga el indicador de llegada de caracteres.
             }  
          }
       }
     }
//*************** aquí se ejecutan otros procesos*********************//
// Estos procesos son independientes de la conexión por usb.
output_high(PIN_C2); // enciende el LED, conectado al pin RC2.
delay_ms(500); // Espera 500 mseg.
output_low(PIN_C2); // Apaga el LED, conectado al pin RC2.
delay_ms(500); // Espera 500 mseg.
}
}
//***********************************************
// Esta función, nos indica mediante 2 diodos LED conectados al 
// puerto RB0 y RB3 respectivamente. El estado de conexión del puerto usb.
// Conectado: Enciende LED VERDE.
// Desconectado: Enciende LED ROJO.
//***********************************************
void estado_conexion_usb(short bandera){
 if(bandera){
 output_high(PIN_B3); // Enciende LED VERDE.
 output_low(PIN_B0);  // Apaga LED ROJO.
 }else{
 output_high(PIN_B0); // Enciende LED ROJO.
 output_low(PIN_B3);  // Apaga LED VERDE.
 }
}

que es el ejemplo5 de Moyano. El caso es que el led amarillo (de la parte del code * aquí se ejecutan otros procesos*)sí parpadea, el pc sí me reconoce al PIC sin problemas, peero se queda la luz fija del led rojo que indicaría que el USB está desconectado, aún cuando sí esta conectado al pc.

Cuando compilo me aparecen algunos warnings, que se ven en la imagen adjuntada, y que por lo que sea deshabilitan las interrupciones... no se si es eso, pero no se donde sino puede estar el fallo.

saludos y Gracias!!
 

Adjuntos

  • Captura.JPG
    Captura.JPG
    37.2 KB · Visitas: 26
El segundo ejemplo establece una comunicación bidireccional con la PC, a través de la clase CDC. La diferencia con respecto al ejemplo anterior es que esta véz se controla un LED conectado al puerto B del PIC y también se detecta si el puerto usb está conectado o no indicándolo con un led.
También detecta cuando el host (pc) enumera al dispositivo (pic) encendiendo un LED verde , cuando el host no ha enumerado al pic prende un led rojo.


El firmware del PIC, lo he programado en C de CCS. (está lo más explicado posible)
el código es el siguiente:
Código:
// Programa: 
/* Detecta si el host envía datos al PIC, mediante las 
   funciones:
    usb_enumerated()
    usb_cdc_kbhit()
    usb_cdc_getc()
    usb_cdc_connected()
*/

#include <18F2550.h> // Definición de registros internos.
#fuses HSPLL,MCLR,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.
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.
NOPBADEN: No utilizamos las entradas analógicas del puerto B.
*/
#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.

// Programa principal.

void main() {
usb_cdc_init(); // Funciones necesarias para iniciar el módulo USB.
usb_init(); // Funciones necesarias para iniciar el módulo USB.
while(!usb_cdc_connected()) { // Mientras el USB no esté conectado.
output_high(PIN_B0); // Función USB no detectada. (Enciende LED rojo)
output_low(PIN_B1);  // (Apaga LED verde)
}
output_high(PIN_B1); // Función USB detectada.    (Enciende LED verde)
output_low(PIN_B0); //  (Apaga LED rojo)
do{
      usb_task();
      if (usb_enumerated()){ // Si el puerto ya fue enumerado por el host :
      output_high(PIN_B2); // Enciende led de enumeración_OK.
      if(usb_cdc_kbhit()){ // en espera de nuevo(s) caracter(es) en el buffer.
            if(usb_cdc_getc()=='a'){ // ¿lo que llegó fué el caracter a?
              output_toggle(PIN_B3); // bascula T implementada con la función output_toggle()
                   }
         }
      }
   }while (TRUE); // bucle eterno
}

Las librerías y el driver para el pic son las mismas que para el ejemplo anterior.

el código fuente del ejecutable para la pc:

Código:
Option Explicit
Dim value As Long
Dim bandera As Boolean
Private Sub enviar_Click()
    Timer1.Enabled = False
    If MSComm1.PortOpen = True Then
      MSComm1.Output = "a"
    End If
    Timer1.Enabled = True
End Sub
Private Sub conectar_Click()
'comprueva que el puerto este cerrado para poder abrirlo
    If MSComm1.PortOpen = False Then
        'determina el puerto que hemos seleccionado.
        If puerto.ListIndex = 0 Then
            MSComm1.CommPort = 1
            End If
        If puerto.ListIndex = 1 Then
            MSComm1.CommPort = 2
            End If
        If puerto.ListIndex = 2 Then
            MSComm1.CommPort = 3
            End If
        If puerto.ListIndex = 3 Then
            MSComm1.CommPort = 4
            End If
        If puerto.ListIndex = 4 Then
            MSComm1.CommPort = 5
            End If
        If puerto.ListIndex = 5 Then
            MSComm1.CommPort = 6
            End If
        If puerto.ListIndex = 6 Then
            MSComm1.CommPort = 7
            End If
        If puerto.ListIndex = 7 Then
            MSComm1.CommPort = 8
            End If
        If puerto.ListIndex = 8 Then
            MSComm1.CommPort = 9
            End If
        If puerto.ListIndex = 9 Then
            MSComm1.CommPort = 10
            End If
        If puerto.ListIndex = 10 Then
            MSComm1.CommPort = 11
            End If
            End If
            
MSComm1.OutBufferSize = 1 'tamaño del dato a transmitir.
    MSComm1.PortOpen = True
End Sub

Private Sub Form_Load()
puerto.AddItem "COM1" ' Añadimos diferentes numeraciones para el puerto serie.
puerto.AddItem "COM2"
puerto.AddItem "COM3"
puerto.AddItem "COM4"
puerto.AddItem "COM5"
puerto.AddItem "COM6"
puerto.AddItem "COM7"
puerto.AddItem "COM8"
puerto.AddItem "COM9"
puerto.AddItem "COM10"
puerto.AddItem "COM11"
puerto.ListIndex = 0   ' Configuramos COM1, como predeterminado.
Timer1.Interval = 50
Timer1.Enabled = True 'activamos el ciclo de escan.
End Sub
Private Sub Timer1_Timer()
On Error GoTo Tratamiento_errores
DoEvents
If MSComm1.PortOpen = True Then
    DoEvents
    estado.BackColor = &HFF00&
    Debug.Print "Conectado"
    MSComm1.PortOpen = False
    Exit Sub
Else
    DoEvents
    MSComm1.PortOpen = True
    Exit Sub
End If
Tratamiento_errores:  Debug.Print Err.Number & ": " & Err.Description
     Select Case Err.Number
        Case 8002   'Número de puerto no válido
            DoEvents
           estado.BackColor = &HFF&
        Case 8005 'el puerto ya está abierto
            DoEvents
            estado.BackColor = &HFF0000
        Case 8012 '8012 el dispositivo no está abierto
            DoEvents
            estado.BackColor = &HFF&
        Case 8015
            DoEvents    ' para evitar retardos en bucles
            estado.BackColor = &HFF&
    End Select
End Sub
Private Sub Form_Unload(Cancel As Integer)
If MSComm1.PortOpen = True Then
    MSComm1.PortOpen = False
End If 
End Sub

Hola que tal, quiero preguntar acerca de la aplicacion que creaste en el ejercicio 2, "USB_CDC Detección del host.exe" me gustaria saber si esa aplicación funciona sin depender de los otros componentes...es decir, en mi caso que aun no he instalado el controlador ni conectado el circuito...porque probé iniciandolo en una pc nueva y marca este error: Component 'MSCOMM32.OCX' or one of its dependencies not correctly registered: a file is missing or invalid

PD: El controlador basta con copiarlo a la carpeta de drivers de windows?
De antemano gracias.
 
Última edición:
Verifica que ese control ActiveX se encuentre en la carpeta de sistema de Windows.
Aunque lo dudo, ya que ese componente es de Visual Basic 6 y viene con la instalación.
Si no lo tienes, lo puedes descargar desde aquí: MSCOMM32.OCX (Original)

Después lo tendrás que registrar en el sistema con el ejecutable REGSVR32.EXE (Está en la carpeta de sistema)
Con tal solo arrastrar y soltar el archivo MSCOMM32.OCX hacia el ejecutable REGSVR32.EXE, se debe registrar mostrando un aviso.
Por si acaso, también copia el archivo adjunto: "MSCOMM32.DEP"
Ese es el archivo de dependencias del control MSCOMM32.OXC

Si el control es correctamente registrado, se mostrará un mensaje similar a éste:

DllRegisterServer.jpg

Suerte.
 
Última edición:
Hola, pude arreglar el problema del control que no se podia registrar, en todo caso, lo que hice fue registrar con la ventana de comando con permisos de administrador
Por cierto, ya llevo algunas paginas leyendo y busco una forma en la que el pic reciba 5 datos y los almacene en 5 variables (x,y,r,g,b) donde X puede ser entre 0-7, Y entre 0-7, r entre 0-255, g entre 0-255, b entre 0-255...luego a su vez el pic las envia a cualquiera de los otros 8 pic que están conectados a el via i2c
 
Cualquier cosa que necesites , acá estamos. Si necesitas ayuda con algo de programación para el pic y para la pc lo vemos juntos y a ver que sale de todo esto.

aludos, el pprograma que estoy haciendo trabaja de la siguiente forma: se envia un dato desde la compuadora al pic, este es procesado en el pic, y en dependencia del dato, se muven uno motores paso a paso, el problema es que cuando el micro está en el ciclo que permite moverse a los motores le puede llegar un dato de control y este puede ser o pausar o parar, atendiendo a lo que se esto se puede hacer o por interrucion o por encuesta, pero en mi carrera no soportan el segundo metodo y necesito hacerlo por el primero, disculpa que no te halla contactado por uno de los foro, solo q por aqui es mas rapido y necesito ahorar tiempo. bueno, cuando me respondas te doy mas detalles.
SlyferPIC
 
Aún sigo teniendo problemas con el SENSE PIN y su configuración con las funciones que explica Moyano en las primeras páginas... pero bueno al margen de eso, me gustaría preguntaros si la comunicación puerto serie virtual que hacemos, es posible usarla como si fuera una función. Quiero decir que si estoy en un bucle puedo consultar si se esta recibiendo algo?

En definitiva quiero poder controlar variables tanto manualmente con un rotary, como por una interfaz gráfica a través del pc, pero que en todo momento pueda utilizar ambos recursos...

Gracias!
 
Hola! Una pregunta, ¿qué tipo de interrupción puedo usar que se active cuando se recibe un dato por el puerto serie virtual? Usando la clase CDC por USB.

Gracias!
 
La interrupción por recepción del módulo EUSART y no importa que clase uses, o que el puerto sea virtual.

Te refieres a #INT_RDA? Es que viendo los posts #1251 y la respuesta a continuación de Moyano o no es la misma pregunta o no lo he entendido bien.

Según he entendido no me hace falta ninguna conexión con el RX y TX del PIC.
Estoy buscando por todos lados y no termino de aclararme...

Saludos y gracias
 
Atrás
Arriba