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

Lo acabo de ver , está muy buena la idea de usar una placa de red ........nos ahorramos todo el hardware necesario para ETHERNET.
 
¿Te siente capaz de hacerlo con tarjeta de red?

Hay que darse cuenta que con el tiempo ya no se fabricarán tarjetas de red, ya que vienen integradas.
 
La verdad capaz soy pero me faltan muchisimos conocimientos. Igual si estudiamos el protocolo TCP/IP seria mejor implementarlo directamente con los PIC que tienen ethernet incluido.
 
Hola,

Tengo un proyecto con un 18f4550, con el cuál trato de comunicar vía USB con el PC. Al simular el proyecto con el Proteus, todo funciona correctamente, pero al intentar conectar el circuito real al PC, Windows muestra un error en el que indica que el dispositivo no ha sido reconocido, y no permite que instalemos el driver que deberíamos instalar para que funcione el proyecto.
El código CCS de nuestro proyecto es:
Código:
#include <18F4550.h>
#DEVICE ADC=8 // CAD con 8 bits de resolución , justificación a la derecha.
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL12,CPUDIV1,VREGEN
#use delay(clock=48000000)


#define USB_HID_DEVICE     FALSE             //deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    4                 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE    3                 //size to allocate for the rx endpoint 1 buffer


#include <pic18_usb.h>     //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <PicUSB.h>         //Configuración del USB y los descriptores para este dispositivo
#include <usb.c>           //handles usb setup tokens and get descriptor reports


#define LEDV    PIN_B6
#define LEDR    PIN_B7
#define SERVO1    PIN_D7
#define SERVO2    PIN_D6

#define LED_ON  output_high
#define LED_OFF output_low

#define SERVO_ON  output_high
#define SERVO_OFF output_low

#define modo      recibe[0]
#define param1    recibe[1]
#define param2    recibe[2]
#define resultado0 envia[0]
#define resultado1 envia[1]
#define resultado2 envia[2]
#define resultado3 envia[3]





void main(void) {

   int8 recibe[3];                  //declaramos variables
   int8 envia[4];
   int8 valorleidorom;
   int8 valor1;                      //aqui se almacena el resultado del conversor A/D
   int8 valor2;
   int8 valor3;
   int8 valor4;
   int8 panel1;                    
   int8 panel2;
   int8 posmemw;                     //posicion de la memoria eeprom para escribir

   //LED_OFF(LEDV);                   //encendemos led rojo (en el de alberto)
   //LED_OFF(LEDR);                    (en el de alberto)
   LED_ON(LEDV);
   LED_ON(LEDR);
   delay_ms(1000);

   
   usb_init();                      //inicializamos el USB
   usb_task();                      //habilita periferico usb e interrupciones
   while (usb_enumerated()== 0);
   


   //usb_wait_for_enumeration();      //esperamos hasta que el PicUSB sea configurado por el host
      //LED_ON(LEDV);                   //encendemos led rojo (en el de alberto)
   //LED_ON(LEDR);                     (en el de alberto)
   LED_OFF(LEDV);
   LED_OFF(LEDR);
   delay_ms(1000);

   
   //setup_adc_ports(AN0 || VSS_VDD);
   setup_adc_ports( AN0_TO_AN11 ); //ponemos estas entradas analogicas
   setup_adc(ADC_CLOCK_INTERNAL);
   //set_adc_channel(0); // Selecciono el canal de conversión.   
   
   // configuro adcon2
   #asm
   movlw 0b00111110 ;justificacion_izquierda,20Tad,Fosc/64
   iorwf 0xFC0,1    ; direccion de ADCON2
   movlw 0b00111110 ;tensiones de referencia vref- y vrefmas (para leer del conversor valores de hasta 12v) y an0 es analogico
   iorwf 0XFC1,1    ;
   
   #endasm


   while (TRUE)
   {
      LED_ON(LEDR);
      LED_OFF(LEDV); 
      delay_ms(1000);
      if(usb_enumerated())          //si el PicUSB está configurado
      {
         if (usb_kbhit(1))          //si el endpoint de salida contiene datos del host
         {
            usb_get_packet(1, recibe, 3); //cojemos el paquete de tamaño 3bytes del EP1 y almacenamos en recibe


            if (modo == 0) // El ordenador me manda capturar datos y almacenarlos
            
               {
                  LED_OFF(LEDV); 
                  LED_OFF(LEDR);
                  delay_ms(1000);
                  set_adc_channel(0); // Selecciono el canal de conversión 0
                  delay_ms( 100 );
                  valor1 = read_adc(); // El resultado de la conversión lo guarda en la variable valor.
                  delay_us(2000);
                  valor1 = read_adc(); // El resultado de la conversión lo guarda en la variable valor.
                  delay_us(2000);
                  
                  set_adc_channel(1); // Selecciono el canal de conversión 1
                  delay_ms( 100 );
                  valor2 = read_adc(); // El resultado de la conversión lo guarda en la variable valor.
                  delay_us(2000);
                  valor2 = read_adc(); // El resultado de la conversión lo guarda en la variable valor.
                  delay_us(2000);                 
                  
                  set_adc_channel(4); // Selecciono el canal de conversión 4 
                  delay_ms( 100 );
                  valor3 = read_adc(); // El resultado de la conversión lo guarda en la variable valor.
                  delay_us(2000);
                  valor3 = read_adc(); // El resultado de la conversión lo guarda en la variable valor.
                  delay_us(2000);
                  
                  set_adc_channel(11); // Selecciono el canal de conversión 5
                  delay_ms( 100 );
                  valor4 = read_adc(); // El resultado de la conversión lo guarda en la variable valor.
                  delay_us(2000);
                  valor4 = read_adc(); // El resultado de la conversión lo guarda en la variable valor.
                  delay_us(2000);
                  
                  set_adc_channel(5); // Selecciono el canal de conversión 5
                  delay_ms( 100 );
                  panel1 = read_adc(); // El resultado de la conversión lo guarda en la variable panel1.
                  delay_us(2000);
                  panel1 = read_adc(); // El resultado de la conversión lo guarda en la variable panel1.
                  delay_us(2000);
                  
                  set_adc_channel(6); // Selecciono el canal de conversión 6
                  delay_ms( 100 );
                  panel2 = read_adc(); // El resultado de la conversión lo guarda en la variable panel2.
                  delay_us(2000);
                  panel2 = read_adc(); // El resultado de la conversión lo guarda en la variable panel2.
                  delay_us(2000);
                  
                  write_eeprom(posmemw, panel1);
                  posmemw++; //siguiente campo en la eeprom para no sobreescribir datos
                 
                  write_eeprom(posmemw, panel2);
                  posmemw++; //siguiente campo en la eeprom para no sobreescribir datos
                  
                  write_eeprom(posmemw, valor1);
                  posmemw++; //siguiente campo en la eeprom para no sobreescribir datos
                 
                  write_eeprom(posmemw, valor2);
                  posmemw++; //siguiente campo en la eeprom para no sobreescribir datos
                  
                  write_eeprom(posmemw, valor3);
                  posmemw++; //siguiente campo en la eeprom para no sobreescribir datos
                 
                  write_eeprom(posmemw, valor4);
                  posmemw++; //siguiente campo en la eeprom para no sobreescribir datos                  
               }   
               if (modo == 1) //led verde on y movemos servo
               {
                  LED_ON(LEDV); 
                  LED_OFF(LEDR);
                  SERVO_ON(SERVO1);
                  delay_us(2000);
                  SERVO_OFF(SERVO1);
                  delay_us(18000);
                  SERVO_ON(SERVO2);
                  delay_us(4000);
                  SERVO_OFF(SERVO2);
                  delay_us(16000);
                  
               } //encendemos led verde y movemos el servo
               
               if (modo == 2) 
               {
                  LED_OFF(LEDV); LED_ON(LEDR);
                  SERVO_ON(SERVO2);
                  delay_us(2000);
                  SERVO_OFF(SERVO2);
                  delay_us(18000);
                  SERVO_ON(SERVO1);
                  delay_us(4000);
                  SERVO_OFF(SERVO1);
                  delay_us(16000);
               } //encendemos led rojo,movemos servo y leemos eeprom
               
               if (modo == 3) //leemos de la rom y le pasamos los 4 primeros valores al ordenador
               {
                  LED_OFF(LEDV); 
                  LED_OFF(LEDR);
                  valorleidorom = read_eeprom (0);
                  resultado0 = valorleidorom;
                  valorleidorom = read_eeprom (1);
                  resultado1 = valorleidorom;
                  valorleidorom = read_eeprom (2);
                  resultado2 = valorleidorom;  
                  valorleidorom = read_eeprom (3);
                  resultado3 = valorleidorom;
                  usb_put_packet(1, envia, 4, USB_DTS_TOGGLE); //enviamos el paquete de tamaño 4byte del EP1 al PC                  
               }
         }
      }
   }
}
También adjunto el circuito para simular en Proteus.
Hemos visto varias soluciones a problemas parecidos en muchos foros, pero con ninguno se arregla este problema. A ver si nos podeis echar una mano...
Gracias!
 

Adjuntos

  • 18f4550.zip
    19.1 KB · Visitas: 299
Gracias por tu respuesta Moyano. Hemos comprobado todas las conexiones bastantes veces, pero todo está bien conectado.
1. ¿El problema puede ser incompatibilidad entre el USB 2.0 del 18f4550 y el USB 1.0 de nuestro PC?
2. ¿Puede ser que el PC no lo reconozca por tener USB 1.0?
 
Gracias por contestar. Lo hemos probado en una maquina nueva con puertos usb 2.0 y sigue el mismo problema.
Al meter el usb se instala un driver generico en vez del que nosotros queremos, y no nos deja instalar nuestro driver. ¿puede ser por eso?
 
Buenas. He verificado el cableado muchas veces y nada, incluso he vuelto a soldar una conexion hembra usb distinta y realiza lo mismo.

¿puede ser un problema de corrientes?
¿problema de masas?

Gracias.l
 
Puede ser problema de drivers....a mi ahora que me acuerdo me pasó. Otra cosa vos estás usando el picUSB.h por lo que tendrías que usar el driver que creó J1M. Si vos usas el driver que proporciona microchip no te va a funcionar.
 
Bueno pues por fin solucione el problema. Para el que le pueda ayudar el problema estaba en el oscilador. Tenia puesto uno de 48mhz y puede ser que estuviese mal, porque he puesto uno de 20 y otro de 12 y funciona bien.

Gracias a los que habeis contestado.

Un saludo
 
Jonatan ya te escribi una vez un amensaje privado y me contaste que publicara mis dudas aqui .
aqui tengo varias dudas
1- No se como configurar el pic 18f44550 para hace transferencias por el puerto USB
2- A la SIE del PIC segun el datasheet le entra una senal de reloj , no se como configurar el pic para que esa senal de reloj este activa
3- yo tengo el proteus 7.2 sp6 pero no si el conector USB que trae me funciona Bien , porque el proteus que tengo esta crakeado , necesito por favor un segmento de codigo que me permita comprobar su funcionamiento. si pudieras publicar un codigo en lenguaje ensamblador porque es lo que se , ya que aunque he programado en C no tengo conocimiento de algunas funciones que se utilizan para manejar el puerto usb

MUCHAS GRACIAS por todo
 
Hola a todos, los felicito por su foro, está muy bueno. Yo soy algo nuevo en esto del USB, pero programo en CCS, PBP y se algo de Visual Basic. Bueno, la cuestión es que estuve probando uno de sus primeros ejemplos simulando con el proteus... va bien el primer tiro, pero luego me saca un error y me deja el socket abierto y no puedo volverlo a correr... me toca reiniciar el equipo y nuevamente lo mismo.

Bueno, yo sé que en el foro hay muchos aportes, pero no escontré o tal vez no entendí lo que decían, algo acerca de lo que pretendo... pero bueno, estoy en camino de iniciar un proyecto en el que recibo unos 250 Bytes desde un programa VB y debo verificar que haya llegado bien, luego desconecto el USB y me debe pasar a realizar otra tarea distinta al USB. AH! me parecería muy interesante hacerlo directamente sobre USB, no VIRTUAL COM, ojalá PnP .... ya tengo algunas ideas, basándome en lo leido en el foro así:

Utilizaré un ejemplo que hay en HOBBYPIC, sólo que con PIN SENSE para poder hacer otras cosas cuando el USB no esté conectado, pienso que debería iniciar USB con usb_init_cs y además el usb_task (debo hacerle una pasada periódicamente para que esté alerta cuando conecten el USB)........ en fin, si alguno de ustedes me puede echar una manito le agradecería y publicaría los resultados a medida que vaya avanzando para que nos nutramos.

NUEVAMENTE FELICIATACIONES

Espero poder aportar algo de mis conocimientos a este gran foro

Regards,

RASAAM
 
Jonatan ya te escribi una vez un amensaje privado y me contaste que publicara mis dudas aqui .
aqui tengo varias dudas
1- No se como configurar el pic 18f44550 para hace transferencias por el puerto USB
2- A la SIE del PIC segun el datasheet le entra una senal de reloj , no se como configurar el pic para que esa senal de reloj este activa
3- yo tengo el proteus 7.2 sp6 pero no si el conector USB que trae me funciona Bien , porque el proteus que tengo esta crakeado , necesito por favor un segmento de codigo que me permita comprobar su funcionamiento. si pudieras publicar un codigo en lenguaje ensamblador porque es lo que se , ya que aunque he programado en C no tengo conocimiento de algunas funciones que se utilizan para manejar el puerto usb

MUCHAS GRACIAS por todo
Toda la información que necesitas está en el hilo del foro...lee y se te van a aclarar todas las dudas.

Hola a todos, los felicito por su foro, está muy bueno. Yo soy algo nuevo en esto del USB, pero programo en CCS, PBP y se algo de Visual Basic. Bueno, la cuestión es que estuve probando uno de sus primeros ejemplos simulando con el proteus... va bien el primer tiro, pero luego me saca un error y me deja el socket abierto y no puedo volverlo a correr... me toca reiniciar el equipo y nuevamente lo mismo.

Bueno, yo sé que en el foro hay muchos aportes, pero no escontré o tal vez no entendí lo que decían, algo acerca de lo que pretendo... pero bueno, estoy en camino de iniciar un proyecto en el que recibo unos 250 Bytes desde un programa VB y debo verificar que haya llegado bien, luego desconecto el USB y me debe pasar a realizar otra tarea distinta al USB. AH! me parecería muy interesante hacerlo directamente sobre USB, no VIRTUAL COM, ojalá PnP .... ya tengo algunas ideas, basándome en lo leido en el foro así:

Utilizaré un ejemplo que hay en HOBBYPIC, sólo que con PIN SENSE para poder hacer otras cosas cuando el USB no esté conectado, pienso que debería iniciar USB con usb_init_cs y además el usb_task (debo hacerle una pasada periódicamente para que esté alerta cuando conecten el USB)........ en fin, si alguno de ustedes me puede echar una manito le agradecería y publicaría los resultados a medida que vaya avanzando para que nos nutramos.

NUEVAMENTE FELICIATACIONES

Espero poder aportar algo de mis conocimientos a este gran foro

Regards,

RASAAM

Todos los programas funcionan correctamente y creo que están suficientemente documentados. Igual de a poco estoy escribiendo todos los ejemplos nuevamente porque conjuntamente con mi nuevo manual sobre USB va ir incluido un archivo con todos los ejemplos mas algunos nuevos.

Por favor a todos tengame paciencia por que mis estudios me están tomando todo el tiempo posible y este año me recibo :rolleyes:
 
Un usuario en el foro todopic hizo que el compilador se ahorrara un 25% de la memoria RAM en programas que involucran el puerto USB........La verdad impresionante por lo que aplicaré sus mejoras en mis programas también. Por otro lado también me conseguí el libro USB complete donde se explica todo o casi todo de este puerto , por lo que me sacaré varias dudas.
En este momento estoy creando una controladora USB para poder manejar 127 motores PAP que en cuanto la termine la voy a postear.
 
Jonathan Gracias por ese monton de aportes!!!

Estuve viendo a traves de los post el interes que tienen en implementar estas soluciones USB en Visual Basic 2008, quiero decirles que el primer codigo que usaba el MSCOMM puede funcionar en Visual Basic 2008 agregando el componente MSCOMM.
MSCOMM me parece bastante atractivo debido a que la programacion del mismo es bastante sencilla, aunque no he indagado HID en Visual Basic. NET.
Les comento que Windows 7 no soporta el IDE de Visual Basic 6 pero las aplicaciones son soportadas por el sistema operativo.

Veo tambien que desean aplicar algo de ethernet, la forma mas facil es comprar un xport que vende lantronix con un max232 y usar la comunicacion UART (serial) del microcontrolador.

http://www.lantronix.com/device-networking/embedded-device-servers/xport.html

Existen tambien muchos ejemplos para utilizar el ENC28J60, sin embargo ese no lo he utilizado aun...
 
Atrás
Arriba