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

para empezar con los ejemplos en pic basic y easyHId, en VB60, etc

Nunca dije que hiba a poner una guía para pic basic y easyHID, en VB 6.0. En la primera página del hilo está un tutorial de como armar aplicaciones con Visual C# y CCS.
El manual es probable que lo termine para fin de año, pero nunca he dicho que lo voy a hacer para una fecha específica, tengo demasiadas cosas para hacer.

Saludos !
 
Hola estoy haciendo un proyecto fin de carrera, el cual consiste en mover dos servos y ver una web cam mediante labview, con un 18f2550 y por el momento tengo la placa montada similar a esta:
C27Dx590y590.jpg




Este es el programa:

#include <18F2550.h>#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CP UDIV1,VREGEN
#use delay(clock=48000000)//frecuencia del reloj
#include ".\libreria\usb_cdc.h"
#rom int 0xf00000={1,2,3,4}


void main() {
int8 x;// declra una variable tipo numeros enteros dentro de la foncion main.
set_tris_b(0x00);//pone como salida todo el puerto b
set_tris_a(0xfd); //configura varios pines del puerto a como entrada ( los del usb y otros mas)
output_b(0x00);//
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) por el usb
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.
x=usb_cdc_getc();// guarda en una variable 'X' el valos que manda el pc
output_b(x);//envia por el puerto b (el puerto b no va al usb,va a los motores.
}
}

}while (TRUE); //

}

Igualmente he editado los archivos necesarios


[SourceDisksNames]


[DeviceList]
%DESCRIPTION%=DriverInstall, USB\VID_04D8&PID_0001 /// se edita : vendor : 04D8 y el id 0001 " yo quise el 0001"[/b]


;------------------------------------------------------------------------------
; Windows 2000/XP Sections
;------------------------------------------------------------------------------


;------------------------------------------------------------------------------
; String Definitions
;------------------------------------------------------------------------------


[Strings]
MCHP="Prueba CDC" // modificable
MFGNAME="Prueba CDC"// modificable
DESCRIPTION="DISPOSITIVO USB_CDC" // nombre
SERVICE="driver de emulacion de puerto serial// modificable"
y el picUSB_CDC.h


0x10,0x01, //usb version in bcd ==2,3
0x02, //class code. 0x02=Communication Device Class ==4
0x00, //subclass code ==5
0x00, //protocol code ==6
USB_MAX_EP0_PACKET_LENGTH, //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8) ==7


08,0x04, //vendor id (0x04D8 is Microchip)
0x01,0x00, //product id yo quise el 0001 nota : es el mismo vendor y id de el driver que modificaron


// RR2 cambiado para 0x61,0x04, //vendor id (0x04D8 is Microchip, or is it 0x0461 ?) ==8,9
// compatibilidad con .inf 0x33,0x00, //product id ==10,11
// de Microchip
y


8, //length of string index
USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
'C',0,
'D',0, // modificable
'C',0,[/b]
//string 2 --> nombre del dispositivo
14, //length of string index
USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
'P',0,
'R',0,
'U',0,
'E',0,
'B',0,
'A',0, // modificable

};

Esto es lo que ocurre
La compilación no da ningun error, la programacion es correcta.
A partir de este momento debería iniciarse el administrador de dispositivos cada vez que conectemos el pic a cualquier ordenador, sin embargo no ocurre.

Muchas Gracias, estoy desesperado.
 
Última edición:
Hola, estoy preparando mi proyecto de grado y en el diseño necesito trabajar con comunicación serial a 9600 baudios,N,8,1, etc. Emulando el puerto serial por USB (CDC) con el pic 18F2550. Buscando en la WEB, encontré a http://www.muchotrasto.com/EmulacionCDCRS-232USB.phpEl problema es que no puedo modificar nada de su firmware, necesito bajar su velocidad de 19200 a 9600 baudios, tengo el CCScompiler 4,104. Cada vez que intento cambiarle algo, el driver ya no instala.Por favor ayúdenme.
 
Buena tarde para todos, bueno aquí ya es tarde, soy nuvo preguntando en el foro (ya habia visto muchos aportes interesantes), tengo una pregunta que la verdad no se si el el hilo para hacerla y adicionalmente por tiempo no he podido chekar mas el foro, entiendo bastantes coas de la comunicación usb para pic pero me falta lo mas importante, quiero hacer la comunicación virtual para visualizar en proteus pero me encuentro con un problema del driver, he tratado de buscar en la web y la verdad enuentro muchas cosas hechas pero quiero entenderla.

1°) como hago para el driver?? tengo que hacerlo??
2°) hay que modificar los descriptos y he probado varias versiones de CCS y la verdad hay variaciones y no se en donde modificarlo ¡¿que gano l modificarlo? y donde encuentro la lista de los códigos por fabricante??
3°)hablan de muchas cosas como por ejemplo un archivo .inf para que sirve???

La verdad quiero entender muy bien esto pero requiero de su ayuda.:confused:
 
Muchas gracias Mushito por el enlace, excelente aporte.

1°) como hago para el driver?? tengo que hacerlo??
2°) hay que modificar los descriptos y he probado varias versiones de CCS y la verdad hay variaciones y no se en donde modificarlo ¡¿que gano l modificarlo? y donde encuentro la lista de los códigos por fabricante??
3°)hablan de muchas cosas como por ejemplo un archivo .inf para que sirve???

La verdad quiero entender muy bien esto pero requiero de su ayuda

pero me encuentro con un problema del driver, he tratado de buscar en la web y la verdad enuentro muchas cosas hechas pero quiero entenderla.

El driver depende del modo de comunicación que uses. Vos no especificas nada del protocolo que estás usando.

1°) como hago para el driver?? tengo que hacerlo??
Por lo general el driver está hecho para la mayoría de las aplicaciones...ahora si tu dispositivo es muy específico..quizás necesites un driver personalizado...pero no creo que sea el caso.

hay que modificar los descriptos y he probado varias versiones de CCS y la verdad hay variaciones y no se en donde modificarlo ¡¿que gano l modificarlo? y donde encuentro la lista de los códigos por fabricante??

Tenés que seguir los códigos de ejemplo de CCS que vienen en la carpeta examples. Ahora si querés entender a fondo...cuestión de que te pongas con el driver USB para PIC18F que te da el fabricante de CCS y la hoja de datos del PIC18F2550...para poder entender cada función...

hablan de muchas cosas como por ejemplo un archivo .inf para que sirve

El archivo .inf es el driver para la PC. Es lo que te pide al conectar el dispositivo USB.

Hola, estoy preparando mi proyecto de grado y en el diseño necesito trabajar con comunicación serial a 9600 baudios,N,8,1, etc. Emulando el puerto serial por USB (CDC) con el pic 18F2550. Buscando en la WEB, encontré a http://www.muchotrasto.com/EmulacionCDCRS-232USB.php
El problema es que no puedo modificar nada de su firmware, necesito bajar su velocidad de 19200 a 9600 baudios, tengo el CCScompiler 4,104. Cada vez que intento cambiarle algo, el driver ya no instala.
Por favor ayúdenme.

Si lees desde la primer página del hilo, te vas a dar cuenta de lo que necesitas.
 
Gracias Moyano, pero ya he intentado modificar los archivos de descarga modificando el descriptor, hasta ahi todo ok, pero cuando recompilo el programa en C modificando el baud rate, recompila todo, pero cuando lo conecto a mi maquina e instalo del driver ya no lo reconoce al pic. Porfavor podrias intentar y subir el los archivos para un baud rate de 9600 bps.
Gracias nuevamente
 
Hola me gustaría hacer algo parecido a lo tuyo, tengo una UVkit con un pic18f2550 y tengo este programa:

Código:
/********************************************************************
Ejemplo. Conversión A/D. Sin interrupciones. Consulta de estado.
Realizar un programa para el UVkit muestree la tensión en el potenciometro
conectado a la entrada AN2 y muestre el valor del mismo en la barra de leds 
usando 8 bits (se ajustará el conversor para utilizar los bits de mayor peso) 
y que avise cuando el valor de éste sea superior a 134 activando el bit de alarma
que corresponderá con el bit RC2. 
Recordar que el reloj del sistema es de 48Mhz y que utilizaremos el 
reloj interno de 1 MHz del conversor A/D.
********************************************************************/

#include <delays.h>
#include <p18f2550.h>


	//These are your actual interrupt handling routines.
	#pragma interrupt YourHighPriorityISRCode
	void YourHighPriorityISRCode()
	{

	}	//This return will be a "retfie fast", since this is in a #pragma interrupt section 
	#pragma interruptlow YourLowPriorityISRCode
	void YourLowPriorityISRCode()
	{
	}	//This return will be a "retfie", since this is in a #pragma interruptlow section

/** VECTOR REMAPPING ***********************************************/
	#define REMAPPED_RESET_VECTOR_ADDRESS			0x1000
	#define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS	0x1008
	#define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS	0x1018

	
	extern void _startup (void);        // See c018i.c in your C18 compiler dir
	#pragma code REMAPPED_RESET_VECTOR = REMAPPED_RESET_VECTOR_ADDRESS
	void _reset (void)
	{
	    _asm goto _startup _endasm
	}

	#pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS
	void Remapped_High_ISR (void)
	{
	     _asm goto YourHighPriorityISRCode _endasm
	}
	#pragma code REMAPPED_LOW_INTERRUPT_VECTOR = REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS
	void Remapped_Low_ISR (void)
	{
	     _asm goto YourLowPriorityISRCode _endasm
	}

#pragma udata

volatile unsigned char valor, Umbral; 


void leds(unsigned char c); // Declaración de procedimiento

#pragma code

void main()
{
    Umbral= 134;
	valor=0;
	ADCON0=0b0001001;		// Enciende A/D ADON=1 y selecciona el canal 2
	ADCON1=0x0A;		// Todos los bits de A son analógicos y los de B digitales
	ADCON2=0b00100011;	// ADFM=0; justificación izquierda
						// ACQT2:ACQT0=100 => 8TAD	tiempo de adquisicion (8 us)
						// ADCS2:ADS0=011  => TAD= Trc (1/1Mhz)= 1 us
	TRISA|=0x0F;		// Porta A(3:0) de entrada y resto de salida
    TRISCbits.TRISC2=0; // RC2 de salida
 	while (1)
 	{
		ADCON0bits.GO_DONE=1;		//Inicio
		while (ADCON0bits.GO_DONE); //Consulta de estado 
		valor=ADRESH;				//Lectura del valor descargado
		if (valor > Umbral) PORTCbits.RC2=1; else PORTCbits.RC2=0; // Alarma
		leds(valor);				// Visualización
	}
	

}//end main
/*Procedimiento de visualización en la barra de LEDs*/
void leds(unsigned char c)
 {
  ADCON1=0x0f; 
  TRISA&=0b11001111;
  TRISB&=0b11000011;
  TRISC&=0b11111000;
  PORTAbits.RA4= (c&0b00000001)?1:0;
  PORTAbits.RA5= (c&0b00000010)?1:0;
  PORTBbits.RB2= (c&0b00000100)?1:0;
  PORTBbits.RB3= (c&0b00001000)?1:0;
  PORTBbits.RB4= (c&0b00010000)?1:0;
  PORTBbits.RB5= (c&0b00100000)?1:0;
  PORTCbits.RC0= (c&0b01000000)?1:0;
  PORTCbits.RC1= (c&0b10000000)?1:0;
 }

/**********************************************
Ejercicios: 
Ejercicio 1 (dificultad: media): Modificar el programa para que utilice interrupciones 
en vez de consulta de estado.
Ejercicio 2 (dificultat: media): Modificar el programa para que utilice el sensor de temperatura
 y que el bit de alarma se active cuando la temperatura supere los 30 ºC. Utilizar consulta de 
estado.
Los grupos pares haran el Ej.1 y los impares el Ej.2
Finalmente combinar las dos parte para que cimplan las dos condiciones.

***********************************************/

Los ejercicios y lo que dice el ejercicio me da lo mismo. Teniendo esto me gustaría saber que es lo que debo de hacer para poder utilizar el sensor de temperatura y mandar la información a través de un R232 a un terminal del putty y que me aparezca en él, los datos que recoje el sensor de temperatura. ¿Cómo puedo hacer esto? ¿Qué debo añadir a este programa?

Muchas gracias de antemano!
 
Hola:

Por curiosidad, para eso la parte del código usas Swicth, ¿no?
Código:
/*Procedimiento de visualización en la barra de LEDs*/ void leds(unsigned char c)  {   ADCON1=0x0f;    TRISA&=0b11001111;   TRISB&=0b11000011;   TRISC&=0b11111000;   PORTAbits.RA4= (c&0b00000001)?1:0;   PORTAbits.RA5= (c&0b00000010)?1:0;   PORTBbits.RB2= (c&0b00000100)?1:0;   PORTBbits.RB3= (c&0b00001000)?1:0;   PORTBbits.RB4= (c&0b00010000)?1:0;   PORTBbits.RB5= (c&0b00100000)?1:0;   PORTCbits.RC0= (c&0b01000000)?1:0;   PORTCbits.RC1= (c&0b10000000)?1:0;  }
 
Al instalar el driver me da este error...
8gghq.jpg


Alguna idea?

Y un par de dudas:
1.- que valor de BaudRate usais?
En usb:cdc.h
void usb_cdc_init(void) {
usb_cdc_line_coding.dwDTERrate=19200; //BaudRate que vamos a usar
usb_cdc_line_coding.bCharFormat=0;
usb_cdc_line_coding.bParityType=0;
usb_cdc_line_coding.bDataBits=8;

2 el final nuestro es 0001 en mchpcdc.inf
[DeviceList]
%DESCRIPTION%=DriverInstall, USB\VID_04D8&PID_000A
ó
%DESCRIPTION%=DriverInstall, USB\VID_04D8&PID_0001
 
Última edición:
Disculpen si me salgo un poco del tema, pero hay alguien que me pueda orientar sobre como enviar un numero entero mayor de 255 por USART de MikroC, estoy haciendo una trasmision PIC a PIC con un 16f877a y un 18f4620. Lo que busco es enviar un numero de 16bits por Tx y que lo reciba en Rx, se que hay forma de enviarlo en dos Bytes de 8bits y unirlos despues en el pic receptor para formar nuevamente el numero de 16bits.

El plan original era enviar el dato por USART a un PIC18F4550 para despues comunicarlo por USB a una PC, pero presente problemas con la transmision, solo recibia el numero 254 y el 255 siempre sin importar el numero que enviara, cambie el mismo programa al 18f4620 y no tuvo ningu problema, segun yo solo es una mala configuracion de los fuses del f4550. Pero ya despues me encargo de buscar la forma de solucionar eso, de momento ya tengo comunicacion con el 16f877a y el 18f4620 pero quiero enviar un numero mayor de 255.

Alguien lo ha realizado en MikroC o algun otro compilador de C, o sabe las bases para conseguir los dos grupos de 8 bits? y cual seria el metodo para volver a unirlos en el PIC receptor?

Gracias
 
Jona, Meta, estoy un poco confundido con el 18F2550, es decir, quiero leer 4 entradas analógicas simultáneamente con una resolución de 10 bits a la máxima velocidad de operación del pic, el problema es que analizé todos los ejemplos, pero como en C todavía no estoy empapado me cuesta algo, en VB6 no tengo problemas, si pueden orientarme en algo les voy a agradecer, todo a traves del USB.

Respecto del conector ICSP, ya hice la placa y momentaneamente quedará así hasta que termine esta parte por la cual le hago las consultas.

Cordiales Saludos.



Como para que vayan mirando algo les paso unas capturas del software balanceador, por ahora probado enviando y leyendo señales ingresadas y leidas por la tarjeta de sonido.

Cordiales Saludos
 

Adjuntos

  • VibraMec_Capturas.rar
    1.5 MB · Visitas: 173
Última edición:
se trata de un frecuencimetro.. esta funcionando perfecto utilizando la clase CDC... lo que quiero es pasarlo para que funcione con HID..

el lenguaje de programacion que uilice es CCS... el cristal del microcontrolador es de 20MHz y la senal de frecuencia entra por pin RC0...

gracias de antemano amigos foreros
 

Adjuntos

  • FREQusb.rar
    219.1 KB · Visitas: 212
Como puedo hacer un Tacometro con el 18F4550 trabajando a 48Mhz. No he encontrado la manera de hacerlo ya que no puedo configurarbien el timer1 para contar un segundo exacto como base de tiempo. AYYYUUUUDAAAAA!!!!
 
Como puedo hacer un Tacometro con el 18F4550 trabajando a 48Mhz. No he encontrado la manera de hacerlo ya que no puedo configurarbien el timer1 para contar un segundo exacto como base de tiempo. AYYYUUUUDAAAAA!!!!

Utiliza una fraccion de segundo y luego multiplicas los pulsos contados o acumulados por la cantidad necesaria para que te de RPS y luego por 60 para q te de RPM y listo.... No necesariamente debe ser un segundo, ademas los saltos de unidades cada segundo serian muy bruscos, por lo tanto se verian feos a la vista.... Espero haberte ayudado.... Saludos desde VENEZUELA...
 
Voy a responder por partes:

Como puedo hacer un Tacometro con el 18F4550 trabajando a 48Mhz. No he encontrado la manera de hacerlo ya que no puedo configurarbien el timer1 para contar un segundo exacto como base de tiempo. AYYYUUUUDAAAAA!!!!

No es el hilo correcto para preguntar eso. El mismo trata solamente sobre el puerto USB y los problemas que surgen con los desarrollos relacionados.

se trata de un frecuencimetro.. esta funcionando perfecto utilizando la clase CDC... lo que quiero es pasarlo para que funcione con HID..

el lenguaje de programacion que uilice es CCS... el cristal del microcontrolador es de 20MHz y la senal de frecuencia entra por pin RC0...

gracias de antemano amigos foreros

Que problemas específicos tenés al tratar con HID ? Para saber la estructura del programa para realizar una comunicación mediante HID, está el manual que puse en la primer página del foro.

Jona, Meta, estoy un poco confundido con el 18F2550, es decir, quiero leer 4 entradas analógicas simultáneamente con una resolución de 10 bits a la máxima velocidad de operación del pic, el problema es que analizé todos los ejemplos, pero como en C todavía no estoy empapado me cuesta algo, en VB6 no tengo problemas, si pueden orientarme en algo les voy a agradecer, todo a traves del USB.

Respecto del conector ICSP, ya hice la placa y momentaneamente quedará así hasta que termine esta parte por la cual le hago las consultas.

Cordiales Saludos.

Al no tener experiencia en lenguaje C, la verdad no te recomiendo que encares de una el tema de USB...hay que hacer algunos proyectos en C, antes de ponerse a tono.

Disculpen si me salgo un poco del tema, pero hay alguien que me pueda orientar sobre como enviar un numero entero mayor de 255 por USART de MikroC, estoy haciendo una trasmision PIC a PIC con un 16f877a y un 18f4620. Lo que busco es enviar un numero de 16bits por Tx y que lo reciba en Rx, se que hay forma de enviarlo en dos Bytes de 8bits y unirlos despues en el pic receptor para formar nuevamente el numero de 16bits.

El plan original era enviar el dato por USART a un PIC18F4550 para despues comunicarlo por USB a una PC, pero presente problemas con la transmision, solo recibia el numero 254 y el 255 siempre sin importar el numero que enviara, cambie el mismo programa al 18f4620 y no tuvo ningu problema, segun yo solo es una mala configuracion de los fuses del f4550. Pero ya despues me encargo de buscar la forma de solucionar eso, de momento ya tengo comunicacion con el 16f877a y el 18f4620 pero quiero enviar un numero mayor de 255.

Alguien lo ha realizado en MikroC o algun otro compilador de C, o sabe las bases para conseguir los dos grupos de 8 bits? y cual seria el metodo para volver a unirlos en el PIC receptor?

Gracias

Lo que vos planteas es un problema de programación. En el hilo no se manejan las comunicaciones usando MikroC, sinó CCS.
Como al parecer no has podido hacerlo con el puerto serie...te recomiendo que investigues del tema, soluciones la comunicación serie con la PC y luego te embarques al USB.
Una de las primeras vías por la cuál podrías investigar es la guía de aplicaciones con MikroC que viene en la ayuda del compilador. Ahí viene explicado como hacer las conexiones y un programa de ejemplo que podés modificar a tus necesidades, sinó, meterte en los foros de MikroElectrónica y ver como podés solucionar tu problema.
 
hola moyano... el problema es que el valor de la frecuencia que envia al microcontrolador hasta el PC es un numero de 32 bits.. pero utilizando HID solo puedo enviar datos de 8 bits

gracias moyano por interesarte.. saludos cordiales.

PD; para hacer este frecuencimetro me base en el ejemplo FREQC que viene con CCS
 
Atrás
Arriba