# Controlador MIDI por USB con PIC para Virtual Dj



## rachelies (Jun 30, 2010)

Estoy tratando de construir un controlador Midi para controlar el Virtual Dj (para los que no entiendan, un software para mezclar música). Todo ello lo hago con un pic, el cual tiene que hacer 2 funciones: enviar datos y recibir datos. 

La parte de enviar los datos ya funciona perfectamente, es decir, las teclas y todo lo que controla al software.

Pero lo que quiero hacer, es que el software envíe datos hacia el pic, como por ejemplo, los leds, el display con el nombre de las canciones, etc... Esto segundo se puede hacer utilizando el VDJscript  

http://www.virtualdj.com/wiki/ControllerDefinitionHID.html 

Si alguien se quiere animar a unirse al proyecto estaría muy agradecido. Todavía no se como utilizar el VDJscript ni como enviar los datos hacia el pic. 

Un saludo y muchas gracias.


----------



## rachelies (Jul 3, 2010)

¿Nadie se anima?


----------



## drnarfro (Jul 10, 2010)

muy buenas, soy de sevilla , me llamo narciso, y estoy interesado en eso que quieres hacer porque yo quiero hacer lo mismo , pero utilizando un teclado, utilizo mucho ultimamente el virtual dj, y quiero fabricar mi propia consola,
 un saludo y espero noticas, gracias


----------



## Eclip-se (Jul 10, 2010)

Hola interezante el proyecto, ya que de vez en cuando hago mezclas usando el Virtual DJ. Si en algo les puedo ayudar estare por aca para comentar:
Con todo he visto algo parecido que lo hacen con el PCDJ, te dejo un enlace....

http://www.codeproject.com/KB/cpp/HardwareSupport.aspx


----------



## rachelies (Jul 11, 2010)

Ahora he cambiado la forma de comunicarse, y en vez de HID, estoy utilizando midi por usb, pero ahora tengo el problema que el virtual dj no me reconoce el controlador, sin embargo el traktor si que lo reconoce y lo puedo configurar.
habra que seguir investigando


----------



## fernandoae (Jul 11, 2010)

Buenas, a mi me interesa el tema, me gustaria ver que tenes hecho para darte una mano en lo que pueda...


----------



## rachelies (Jul 12, 2010)

De momento sigo haciendo pruebas, solamente tengo una protoboard con un circuito para hacer pruebas de comunicación y botones y demás. De momento lo tengo todo hecho por partes: la comunicación con el pc, el control de botones, la comunicación con el otro pic que es el plato B...Te puedo enseñar el programa que cargo en el pic con el que envio un botón por ejemplo para el play, pero lo dicho, en formato MIDI, el virtual dj no me lo reconoce. Sin embargo, el traktor lo reconoce y funcionan los botones, e incluso me envía hacia el pic el estado de leds. 

este programa que subo, envia un botón que simula on/off cada 1500ms.
Empezamos con esto y luego ya vamos trabajando sobre ello.
Saludos.

Pongo también el .hex del programa anterior para un PIC18F2455. si alguien lo carga y consigue hacerlo funcionar en Virtual Dj que avise, porque se agradeceria mucho el avance.
Saludos.


----------



## djxero (Jul 14, 2010)

k fantastico yo me sumo   ,hace tiempo atraz hise un control para el pc dj  pero solo emulaba las teclas del teclado.que buena me intereza  yo te apoyo  tienes info de el protocolo midi
saludos,,


----------



## bladdy88 (Ago 3, 2010)

Muy buenas pana,
mira estoy tratando de hacer el control para Virtual dj pero no se como empezar, he visto otros foros y veo que utilizan los "jostick" pero me intereza hacer con un pic y que sea usb, no se si me podria ayudar con lo que tienes hecho??,


----------



## rachelies (Ago 6, 2010)

No se si esto se puede hacer, pero en otro foro estamos con el mismo tema.
Pongo aqui el enlace:
http://www.todopic.com.ar/foros/index.php?topic=31194.0


----------



## josb86 (Jun 21, 2011)

rachelies dijo:


> No se si esto se puede hacer, pero en otro foro estamos con el mismo tema.
> Pongo aqui el enlace:
> http://www.todopic.com.ar/foros/index.php?topic=31194.0



hola como estas mira tengo una regunta vi tu archivo descriptor pero tambien veo o mas bien no veo donde colocas el numero de botones cuantos son analogos y ese tipo de cosas me podrías ayudar? es que hay otro tema en el cual mas o menos explican ero para hacer un joystick normal usb y cuando se hace un joystick hay que colocar una parte donde se coloca el numero de botones y todo eso


----------



## Fortivo (Jun 21, 2011)

Otro que se apunta, también me interesa, aunque  ya hay temas muy parecidos por el foro realizados con arduino.

saludoss


----------



## Dario (Jun 21, 2011)

bueno, yo no se mucho de dj`s pero ¿han probado el fl studio? sin teclado, miren lo que se puede hacer... incluso yo pude hacer mi propia version de mision imposible y todo sin teclado. solo miren  






y mi version de mision imposible 





saludosss


----------



## rachelies (Jun 22, 2011)

Lo estoy construyendo poco a poco y lo del otro foro fue quedando parado. Últimamente no tengo demasiado tiempo y lo tengo que ir haciendo en ratillos libres, jejeje. Lo que tengo hecho es lo de la foto. Se comunica por USB, lo utilizo con el Traktor, y el protocolo para la comunicación es Midi. 
Como por la web hay cosas parecidas, y ninguno me convencía, al final decidí hacerlo a mi manera, por lo que habrá cosas buenas y cosas malas, pero de momento va funcionando lo que hago.
Saludos


----------



## josb86 (Jun 22, 2011)

D@rio dijo:


> bueno, yo no se mucho de dj`s pero ¿han probado el fl studio? sin teclado, miren lo que se puede hacer... incluso yo pude hacer mi propia version de mision imposible y todo sin teclado. solo miren
> 
> http://www.youtube.com/watch?v=0uk7GcVKcsM
> 
> ...




hola dario que mas, mira si es verdad lo que dices tu pero por lo menos yo quiero utilizar esto es para hacer una pedalera que funcione con guitar rig y este solo permite entradas midi hay programas según para adaptar la señal ero mi idea es poderlo conectar directamente



rachelies dijo:


> Lo estoy construyendo poco a poco y lo del otro foro fue quedando parado. Últimamente no tengo demasiado tiempo y lo tengo que ir haciendo en ratillos libres, jejeje. Lo que tengo hecho es lo de la foto. Se comunica por USB, lo utilizo con el Traktor, y el protocolo para la comunicación es Midi.
> Como por la web hay cosas parecidas, y ninguno me convencía, al final decidí hacerlo a mi manera, por lo que habrá cosas buenas y cosas malas, pero de momento va funcionando lo que hago.
> Saludos



hola rachelies una pregunta el codigo que estas utilizando es el mismo que colocaste en el "prueba MIDI"? la cosa es que no logro entender en que parte del descriptor esta el "const char USB_CLASS_SPECIFIC_DESC[] = {" que hasta donde se es el que dice cuantas teclas tiene cuales son analogas y todo eso.

he estado tratando de entender el pdf "Universal Serial Bus Device Class Definition for MIDI Devices" ero no entiendo casi nada


----------



## rachelies (Jun 22, 2011)

El código no es el mismo, pero el descriptor Midi si. Yo en ningún sitio digo cuantas teclas son analogicas o digitales, eso no importa. Yo solamente envío por el USB los comandos de las notas como nota_on, nota_off y los cc, pordonde envío los valores analogicos.


----------



## josb86 (Jun 23, 2011)

rachelies podrias pasarme el archivo '.c' que estas utilizando es que estoy utilizando algo asi

if (bit_test(PORTD,0)==0){
      out_data[1] = 0x90;          //Note on
      out_data[0]= out_data[1]>>4;
      out_data[2] = 0x00;         // Nota 0
      out_data[3] = 0x7F;         // Volumen 127
      usb_put_packet(1,out_data,4,USB_DTS_TOGGLE);      
      bit_set(PORTA,3);
      delay_ms(1500);
      bit_clear(PORTA,3);
      out_data[1] = 0x80;         //Note off
      out_data[0]=out_data[1]>>4;
      out_data[2] = 0x00;         //Nota 0
      out_data[3] = 0x00;         // Volumen 0
      usb_put_packet(1,out_data,4,USB_DTS_TOGGLE);      
               }
            /*else{
      bit_clear(PORTA,3);
      out_data[1] = 0x80;         //Note off
      out_data[0]=out_data[1]>>4;
      out_data[2] = 0x00;         //Nota 0
      out_data[3] = 0x00;         // Volumen 0
      usb_put_packet(1,out_data,4,USB_DTS_TOGGLE);      
               }*/ 

con el mismo descriptor que colocaste aquí pero no tengo ninguna respuesta


----------



## rachelies (Jun 25, 2011)

Lo siento mucho, pero el código entero no quiero darlo. Lo que pretendo es ayudar a que cada uno lo haga a su manera, no hacer una copia del mio, jejjej
Yo no utilizo el Note_ON, y Note_Off. Sólo utilizo Note_On, y lo que cambio es el volumen: Lo pongo a 0x7F para activar, y 0x00 para desactivar.
Donde tú utilizas out_data[1]=0x80, cambialo por 0x90 y me comentas, ok?
Un saludo a todos


----------



## josb86 (Jun 25, 2011)

no hay problema jejej anoche despues de mucho darle y darle funciono solo le tengo conectado 8 pulsadores y 2 potenciometros muchas gracias por el descritor por alli encontre otro que que parece muy pedagogico lo adjunto

```
/* Name: usbconfig.h
 * Project: AVR USB driver
 * Author: Christian Starkjohann
 * Creation Date: 2005-04-01
 * Tabsize: 4
 * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
 * License: Proprietary, free under certain conditions. See Documentation.
 * This Revision: $Id: usbconfig-prototype.h 216 2006-07-14 21:51:00Z cs $
 */

#ifndef __usbconfig_h_included__
#define __usbconfig_h_included__

/*
General Description:
This file is an example configuration (with inline documentation) for the USB
driver. It configures AVR-USB for an ATMega8 with USB D+ connected to Port D
bit 2 (which is also hardware interrupt 0) and USB D- to Port D bit 0. You may
wire the lines to any other port, as long as D- is on bit 0 and D+ is also
wired to INT0.
To create your own usbconfig.h file, copy this file to the directory
containing "usbdrv" (that is your project firmware source directory) and
rename it to "usbconfig.h". Then edit it accordingly.
*/

/* ---------------------------- Hardware Config ---------------------------- */

#define USB_CFG_IOPORTNAME      D
/* This is the port where the USB bus is connected. When you configure it to
 * "B", the registers PORTB, PINB and DDRB will be used.
 */
#define USB_CFG_DMINUS_BIT      3
/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
 * This may be any bit in the port.
 */
#define USB_CFG_DPLUS_BIT       2
/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
 * This may be any bit in the port. Please note that D+ must also be connected
 * to interrupt pin INT0!
 */

/* ----------------------- Optional Hardware Config ------------------------ */

#define USB_CFG_PULLUP_IOPORTNAME   D
/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
 * V+, you can connect and disconnect the device from firmware by calling
 * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
 * This constant defines the port on which the pullup resistor is connected.
 */
#define USB_CFG_PULLUP_BIT          4
/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
 * above) where the 1.5k pullup resistor is connected. See description
 * above for details.
 */
/* #define  USB_BUFFER_SECTION         ".bss" */
/* The USB receive buffer (variable "usbRxBuf") with a length of 22 bytes
 * MUST NOT cross a 256 byte boundary. We have introduced this configuration
 * option to allow you to change the data segment where this buffer is
 * allocated. If you have problems with the default segment (start of .bss),
 * you may change this setting. See the comment in usbdrv.h for details.
 * On IAR C, the default is the TINY_Z segment (first 256 bytes). You must
 * change this default for devices which don't have RAM below 0x100.
 */

/* --------------------------- Functional Range ---------------------------- */

#define USB_CFG_HAVE_INTRIN_ENDPOINT    1
/* Define this to 1 if you want to compile a version with two endpoints: The
 * default control endpoint 0 and an interrupt-in endpoint 1.
 */
#define USB_CFG_HAVE_INTRIN_ENDPOINT3   0
/* Define this to 1 if you want to compile a version with three endpoints: The
 * default control endpoint 0, an interrupt-in endpoint 1 and an interrupt-in
 * endpoint 3. You must also enable endpoint 1 above.
 */
#define USB_CFG_IMPLEMENT_HALT          1
/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
 * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
 * it is required by the standard. We have made it a config option because it
 * bloats the code considerably.
 */
#define USB_CFG_INTR_POLL_INTERVAL      10
/* If you compile a version with endpoint 1 (interrupt-in), this is the poll
 * interval. The value is in milliseconds and must not be less than 10 ms for
 * low speed devices.
 */
#define USB_CFG_IS_SELF_POWERED         0
/* Define this to 1 if the device has its own power supply. Set it to 0 if the
 * device is powered from the USB bus.
 */
#define USB_CFG_MAX_BUS_POWER           100
/* Set this variable to the maximum USB bus power consumption of your device.
 * The value is in milliamperes. [It will be divided by two since USB
 * communicates power requirements in units of 2 mA.]
 */
#define USB_CFG_SAMPLE_EXACT            1
/* This variable affects Sampling Jitter for USB receiving. When it is 0, the
 * driver guarantees a sampling window of 1/2 bit. The USB spec requires
 * that the receiver has at most 1/4 bit sampling window. The 1/2 bit window
 * should still work reliably enough because we work at low speed. If you want
 * to meet the spec, set this value to 1. This will unroll a loop which
 * results in bigger code size.
 * If you have problems with long cables, try setting this value to 1.
 */
#define USB_CFG_IMPLEMENT_FN_WRITE      1
/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
 * transfers. Set it to 0 if you don't need it and want to save a couple of
 * bytes.
 */
#define USB_CFG_IMPLEMENT_FN_READ       1
/* Set this to 1 if you need to send control replies which are generated
 * "on the fly" when usbFunctionRead() is called. If you only want to send
 * data from a static buffer, set it to 0 and return the data from
 * usbFunctionSetup(). This saves a couple of bytes.
 */
#define USB_CFG_IMPLEMENT_FN_WRITEOUT   1
/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoint 1.
 * You must implement the function usbFunctionWriteOut() which receives all
 * interrupt/bulk data sent to endpoint 1.
 */
#define USB_CFG_HAVE_FLOWCONTROL        0
/* Define this to 1 if you want flowcontrol over USB data. See the definition
 * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
 * usbdrv.h.
 */

/* -------------------------- Device Description --------------------------- */

#define  USB_CFG_VENDOR_ID       0xc0, 0x16	/* VOTI / obdev subrange */
/* USB vendor ID for the device, low byte first. If you have registered your
 * own Vendor ID, define it here. Otherwise you use obdev's free shared
 * VID/PID pair. Be sure to read USBID-License.txt for rules!
 * This template uses obdev's shared VID/PID pair: 0x16c0/0x5e4.
 * Use this VID/PID pair ONLY if you understand the implications!
 */
#define  USB_CFG_DEVICE_ID       0xe4, 0x05	/* 0x05e4 = 1508, obdev MIDI */
/* This is the ID of the product, low byte first. It is interpreted in the
 * scope of the vendor ID. If you have registered your own VID with usb.org
 * or if you have licensed a PID from somebody else, define it here. Otherwise
 * you use obdev's free shared VID/PID pair. Be sure to read the rules in
 * USBID-License.txt!
 */
#define USB_CFG_DEVICE_VERSION  0x01, 0x00
/* Version number of the device: Minor number first, then major number.
 */
#define USB_CFG_VENDOR_NAME     'w', 'w', 'w', '.', 'c', 'r', 'y', 'p', 't', 'o', 'm', 'y', 's', '.', 'd', 'e'
#define USB_CFG_VENDOR_NAME_LEN 16
/* These two values define the vendor name returned by the USB device. The name
 * must be given as a list of characters under single quotes. The characters
 * are interpreted as Unicode (UTF-16) entities.
 * If you don't want a vendor name string, undefine these macros.
 * ALWAYS define a vendor name containing your Internet domain name if you use
 * obdev's free shared VID/PID pair. See the file USBID-License.txt for
 * details.
 */
#ifdef DEBUG_LEVEL
#	define USB_CFG_DEVICE_NAME     'V', '-', 'U', 'S', 'B', '-', 'M', 'I', 'D', 'I', '-', 'D', 'B', 'G'
#	define USB_CFG_DEVICE_NAME_LEN 14
#else
#	define USB_CFG_DEVICE_NAME     'V', '-', 'U', 'S', 'B', '-', 'M', 'I', 'D', 'I'
#	define USB_CFG_DEVICE_NAME_LEN 10
#endif
/* Same as above for the device name. If you don't want a device name, undefine
 * the macros. See the file USBID-License.txt before you assign a name if you
 * use a shared VID/PID.
 */
/*#define USB_CFG_SERIAL_NUMBER   'N', 'o', 'n', 'e' */
/*#define USB_CFG_SERIAL_NUMBER_LEN   0 */
/* Same as above for the serial number. If you don't want a serial number,
 * undefine the macros.
 * It may be useful to provide the serial number through other means than at
 * compile time. See the section about descriptor properties below for how
 * to fine tune control over USB descriptors such as the string descriptor
 * for the serial number.
 */
#define USB_CFG_DEVICE_CLASS        0	/* Defined at interface level */
#define USB_CFG_DEVICE_SUBCLASS     0	/* Defined at interface level */
/* See USB specification if you want to conform to an existing device class.
 */
#define USB_CFG_INTERFACE_CLASS     1	/* AUDIO class */
#define USB_CFG_INTERFACE_SUBCLASS  3	/* MIDI streaming */
#define USB_CFG_INTERFACE_PROTOCOL  0	/*  */
/* See USB specification if you want to conform to an existing device class or
 * protocol.
 * This template defines a HID class device. If you implement a vendor class
 * device, set USB_CFG_INTERFACE_CLASS to 0 and USB_CFG_DEVICE_CLASS to 0xff.
 */
#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH    0	/* total length of report descriptor */
/* Define this to the length of the HID report descriptor, if you implement
 * an HID device. Otherwise don't define it or define it to 0.
 * Since this template defines a HID device, it must also specify a HID
 * report descriptor length. You must add a PROGMEM character array named
 * "usbHidReportDescriptor" to your code which contains the report descriptor.
 * Don't forget to keep the array and this define in sync!
 */

/* ------------------- Fine Control over USB Descriptors ------------------- */
/* If you don't want to use the driver's default USB descriptors, you can
 * provide our own. These can be provided as (1) fixed length static data in
 * flash memory, (2) fixed length static data in RAM or (3) dynamically at
 * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
 * information about this function.
 * Descriptor handling is configured through the descriptor's properties. If
 * no properties are defined or if they are 0, the default descriptor is used.
 * Possible properties are:
 *   + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
 *     at runtime via usbFunctionDescriptor().
 *   + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
 *     in static memory is in RAM, not in flash memory.
 *   + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
 *     the driver must know the descriptor's length. The descriptor itself is
 *     found at the address of a well known identifier (see below).
 * List of static descriptor names (must be declared PROGMEM if in flash):
 *   char usbDescriptorDevice[];
 *   char usbDescriptorConfiguration[];
 *   char usbDescriptorHidReport[];
 *   char usbDescriptorString0[];
 *   int usbDescriptorStringVendor[];
 *   int usbDescriptorStringDevice[];
 *   int usbDescriptorStringSerialNumber[];
 * Other descriptors can't be provided statically, they must be provided
 * dynamically at runtime.
 *
 * Descriptor properties are or-ed or added together, e.g.:
 * #define USB_CFG_DESCR_PROPS_DEVICE   (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
 *
 * The following descriptors are defined:
 *   USB_CFG_DESCR_PROPS_DEVICE
 *   USB_CFG_DESCR_PROPS_CONFIGURATION
 *   USB_CFG_DESCR_PROPS_STRINGS
 *   USB_CFG_DESCR_PROPS_STRING_0
 *   USB_CFG_DESCR_PROPS_STRING_VENDOR
 *   USB_CFG_DESCR_PROPS_STRING_PRODUCT
 *   USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
 *   USB_CFG_DESCR_PROPS_HID
 *   USB_CFG_DESCR_PROPS_HID_REPORT
 *   USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
 *
 */

#define USB_CFG_DESCR_PROPS_DEVICE                  USB_PROP_IS_DYNAMIC
#define USB_CFG_DESCR_PROPS_CONFIGURATION           USB_PROP_IS_DYNAMIC
#define USB_CFG_DESCR_PROPS_STRINGS                 0
#define USB_CFG_DESCR_PROPS_STRING_0                0
#define USB_CFG_DESCR_PROPS_STRING_VENDOR           0
#define USB_CFG_DESCR_PROPS_STRING_PRODUCT          0
#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER    0
#define USB_CFG_DESCR_PROPS_HID                     0	// USB_PROP_IS_DYNAMIC
#define USB_CFG_DESCR_PROPS_HID_REPORT              0
#define USB_CFG_DESCR_PROPS_UNKNOWN                 0

/* ----------------------- Optional MCU Description ------------------------ */

/* The following configurations have working defaults in usbdrv.h. You
 * usually don't need to set them explicitly. Only if you want to run
 * the driver on a device which is not yet supported or with a compiler
 * which is not fully supported (such as IAR C) or if you use a differnt
 * interrupt than INT0, you may have to define some of these.
 */
/* #define USB_INTR_CFG            MCUCR */
/* #define USB_INTR_CFG_SET        ((1 << ISC00) | (1 << ISC01)) */
/* #define USB_INTR_CFG_CLR        0 */
/* #define USB_INTR_ENABLE         GIMSK */
/* #define USB_INTR_ENABLE_BIT     INT0 */
/* #define USB_INTR_PENDING        GIFR */
/* #define USB_INTR_PENDING_BIT    INTF0 */

#endif				/* __usbconfig_h_included__ */
```


hay cosas que no entiendo pero este codigo sigue las explicaciones precisas y en orden del midi10.pdf


----------



## rachelies (Jun 26, 2011)

Está muy bien tu descriptor, muy bien explicado, gracias


----------



## crooin (Jul 14, 2011)

josb86 dijo:


> no hay problema jejej anoche despues de mucho darle y darle funciono solo le tengo conectado 8 pulsadores y 2 potenciometros muchas gracias por el descritor por alli encontre otro que que parece muy pedagogico lo adjunto
> 
> ```
> /* Name: usbconfig.h
> ...



Josb86 vi  que lograste armar un dispositivo con PIC que mandaba señales midi por usb, con 8 botones y 2 potes. ¿Serías tan amable de pasarme el codigo que estas utilizando? No he logrado enumerar mi dispositivo, y estoy tratando de armar algo similar a lo que mencionas.
Desde ya te agradezco.
Saludos


----------



## rachelies (Jul 15, 2011)

Con este descriptor, y acordandote de hacer la llamada desde el programa

*#include <midi7.h>*   //USB Configuration and Device descriptors for this UBS device

tiene que funcionar. No cambies nada, y haz solo un programa que haga llamda a esto, y al conectarlo te lo tiene que reconocer como dispositivo midi. En cuanto te lo reconozca como midi, empieza a hacer lo de los botones y todo lo que quieras.
Pero el descriptor no lo hay que cambiar ni adaptar a los potenciometros. Vale tal como está.

Saludos y suerte


----------



## josb86 (Jul 15, 2011)

hola rachelies como andas, mira no se si a ti se te ha presentado un problema que se me sucede a mi. el controlador funciona perfectamente en mi pc de escritorio pero en mi portátil algunas veces se cuelga, el pic sigue trabajando pero el programa en este caso guitar rig no me recibe los datos que manda el pic y ya he probado en varios portátiles y pasa lo mismo.


crooin mira el archivo que coloca rachelies es el mas importante ahoramismo no estoy en el pc donde tengo el archivo de ccs primero que todo si has manejado usb de pic?


----------



## crooin (Jul 15, 2011)

Pasa lo siguiente, he usado el descriptor que me esta en midi7.h pero parece que se enumera y se me cuelga la maquina. cuando reinicio aparece como dispositivo de audio usb, pero ningún programa lo ve como controlador midi. Por eso quería ver como era que lo enumerabas vos josb86. 
Conocen algún programa para ver los descriptores de los dispositivos que se conectan, para ver que esta mandando el pic.
No sé porque no quieren compartir código que ya este probado que funciona, no creo que tenga sentido re-inventar la rueda. La parte de la enumeración y conexión usb es solo una parte de otros proyectos que si se quieren son mas personales, pero tanto la conexión usb, como cualquier otra interfaz, que solo son una parte de algo deberían compartirse. Igual es mi humilde opinion y respeto la forma de pensar de cada uno.
Desde ya mis saludos...


----------



## rachelies (Jul 16, 2011)

Para ver lo que está enviando y recibiendo el USB utilizo el USBTrace. 
Por lo de los problemas de colgarse...yo no tengo portatiles, y en mi pc lo utilizo en Windows 7 64bits, y en Windows XP, en los dos sin problemas, y lo utilizo con el Traktor de Native Instruments. No he probado con otros, por lo que no sabria ayudar en eso.
Y *crooin, *no te enfades, ahora no tengo tiempo, pero nada más que pueda pongo aquí un código funcionando al 100% para que lo pruebes. Déjame uno o dos días, que este finde ando bastante liado.
Un saludo a todos

Bueno, aquí pongo un código que junto con el midi7.h, sirve para enviar 32 botones y 2 potenciometros. Está probado y a mi me funciona. Los botones están conectados en una matriz. Ahora si que no tengo mas tiempo para explicar más, pero solucionaré las dudas que vayan saliendo.


----------



## josb86 (Jul 17, 2011)

crooin dijo:


> Pasa lo siguiente, he usado el descriptor que me esta en midi7.h pero parece que se enumera y se me cuelga la maquina. cuando reinicio aparece como dispositivo de audio usb, pero ningún programa lo ve como controlador midi. Por eso quería ver como era que lo enumerabas vos josb86.
> Conocen algún programa para ver los descriptores de los dispositivos que se conectan, para ver que esta mandando el pic.
> No sé porque no quieren compartir código que ya este probado que funciona, no creo que tenga sentido re-inventar la rueda. La parte de la enumeración y conexión usb es solo una parte de otros proyectos que si se quieren son mas personales, pero tanto la conexión usb, como cualquier otra interfaz, que solo son una parte de algo deberían compartirse. Igual es mi humilde opinion y respeto la forma de pensar de cada uno.
> Desde ya mis saludos...




jejeje por pasarlo no hay problema te cuento que es lo que pasa a mi notebook que es donde tengo todo me toco mandarle a hacer reballing  no te preocupes que yo posteo el codigo


----------



## Baruc (Jul 26, 2011)

> hola rachelies como andas, mira no se si a ti se te ha presentado un problema que se me sucede a mi. el controlador funciona perfectamente en mi pc de escritorio pero en mi portátil algunas veces se cuelga, el pic sigue trabajando pero el programa en este caso guitar rig no me recibe los datos que manda el pic y ya he probado en varios portátiles y pasa lo mismo.



Te cuento josb86 yo tengo un controlador comprado BCD2000 y me pasaba lo mismo que a vos. Averiguando por todos lados encontré que desactivando la placa LAN funciona, igual prueba con las 2 desactiva las 2 placas de red y verás. Espero eso te solucione el problema.


----------



## Deme (Sep 13, 2011)

Hola He intentado con el descriptor de @rachelies pero como ya habian mencionado no lo logro en mi notebook, al simularlo con proteus primero empieza a instalar el software de controlador pero justo despues de eso me sale pantallaso azul y se reinicia mi notebook, al reiniciarse vuelvo a probar y ya nno me sale pantallaso azul pero aunque me reconoce como dispositivo Audio USB no lo puede utilizar (sale signo de admiracion amarillo en el controlador). ¿Que puedo hacer? la verdad me estoy trabando mucho con el descriptor, no tengo idea de como se configura, he leido el documento "Universal Serial Bus Device Class Definition for MIDI Devices" pero no se como pasar a código. (Tengo Windows 7 x64 professional).


----------



## rachelies (Sep 16, 2011)

Deme dijo:


> Hola He intentado con el descriptor de @rachelies pero como ya habian mencionado no lo logro en mi notebook, al simularlo con proteus primero empieza a instalar el software de controlador pero justo despues de eso me sale pantallaso azul y se reinicia mi notebook, al reiniciarse vuelvo a probar y ya nno me sale pantallaso azul pero aunque me reconoce como dispositivo Audio USB no lo puede utilizar (sale signo de admiracion amarillo en el controlador). ¿Que puedo hacer? la verdad me estoy trabando mucho con el descriptor, no tengo idea de como se configura, he leido el documento "Universal Serial Bus Device Class Definition for MIDI Devices" pero no se como pasar a código. (Tengo Windows 7 x64 professional).



¿No tienes ningún pc con otro windows? El controlador que utiliza es de windows, no hace falta instalar nada. Yo tengo un pc con windows 7 x64 y me funciona correctamente todo. Si puedes trata de probarlo con otro windows para saber de donde viene el problema.
Saludos


----------



## francojaliff (Nov 19, 2011)

hola la verdad me interesaria mucho poder crear un controlador midi ya qe me estoy llendo mucho por la rama de la musica electronica si podrian subir esqemas diagramas circuitos o fotos estaria muy agradecido


----------



## rachelies (Nov 21, 2011)

Hola Deme. Aquí puedes ver el esquema que tengo hecho a mano y una foto de como va el invento, jejeje. No tengo demasiado tiempo ahora para seguir con él. Espero que te sirva para empezar con el tuyo, y ya sabes, comenta lo que no sepas. Un saludo.


----------



## fernandoae (Mar 2, 2012)

Muy bueno, y funcionó a la primera en un pic 18F2550, lo único que tuve que hacer desde el pickit fué cambiar las palabras de configuración porque tenia cristal de 4 mhz solamente.
Lo que si nunca programé en CCS y no puedo compilar nada desde el MpLab, me explicarias como crear un proyecto y compilarlo utilizando los dos archivos que están en el rar? porque al querer compilarlo me dice que faltan archivos, los tengo que buscar en la carpeta del mplab no? dame una manito asi arranco con el proyecto.
Ah y las jogwheels como las envias? como notas?


----------



## rachelies (Mar 2, 2012)

Con los  jogwheels sólo hice pruebas antes de tener el programa completo, y no lo tengo aún probado en el controlador montado. Creo que lo enviaba como comandos CC, y enviaba 7F cuando giraba a derecha y 01 cuando giraba a izquierda, un envío por cada pulso.
Luego estos pulsos se configuran en el software (Traktor o Virtual Dj) para que los interprete como jogwheel.

Hace tiempo que probé esto y ahora no lo tengo muy claro. A ver si un día de estos tengo tiempo y lo vuelvo a probar y comento.

Sobre lo de integrar el CCS en el Mplab, buscando en google encontrarás ayudas más fáciles que lo que yo te podría explicar. No es dificil.

¿¿¿Te funciona con el cristal de 4Mhz???

Un saludo.


----------



## fernandoae (Mar 2, 2012)

Si, me funcionó con un pic 18f2550 y cristal de 4MHz porque antes de grabarlo con el Pickit 2 le cambie la palabra de configuración para acomodar el divisor y adecuarlo a los 4Mhz, esto me ha funcionado varias veces. El tema es que por ahi no tengo un determinado cristal y el autor del proyecto no da el código fuente, solo el hex para tal frecuencia 
Tenés algún otro código más completo? con note on-off, cc... etc.. la verdad que soy de tomarme las cosas con calma, leer mucho hasta evacuar mis dudas y conseguir las cosas por mi cuenta...pero este proyecto me tiene medio ansioso y hace tiempo quiero hacerlo,  hace un tiempo nomás me puse con el usb.
Todavia tengo que aprender a programar en CCS 
Gracias por compartir tu proyecto, ojalá todos fuesemos así...


----------



## fernandoae (Mar 3, 2012)

Acá vengo con novedades, estuve leyendo un poco en la página del vdj y me enteré que se puede crear un controlador  HID creando un archivo con la configuración (en la  pc) de lo que hace cada byte enviado desde el pic... según lo que decia tiene menor latencia que el midi y lo recomiendan para las jogwheels. Pero la desventaja que le veo es que seria un poco mas incomodo asignar las funciones de cada boton o fader...
http://www.virtualdj.com/wiki/ControllerDefinitionHID.html
http://www.virtualdj.com/wiki/HIDImplementation.html

Que opinan? midi o hid?
Otro tema a tener en cuenta seria la compatibilidad entre programas


----------



## tecniloco80 (Mar 3, 2012)

fernandoae dijo:


> Acá vengo con novedades, estuve leyendo un poco en la página del vdj y me enteré que se puede crear un controlador HID creando un archivo con la configuración (en la pc) de lo que hace cada byte enviado desde el pic... según lo que decia tiene menor latencia que el midi y lo recomiendan para las jogwheels. Pero la desventaja que le veo es que seria un poco mas incomodo asignar las funciones de cada boton o fader...
> http://www.virtualdj.com/wiki/ControllerDefinitionHID.html
> http://www.virtualdj.com/wiki/HIDImplementation.html
> 
> ...


 
es verdad si funciona lo que dice vdj prueba con un control de videojuego hid crea una configuracion en el virtualdj yo hice un controlador con 12 botones y 4 slider y funciona perfecto


----------



## fernandoae (Mar 3, 2012)

No me conformo con 4 sliders jeje  quiero 20 minimo... igual es facil leer muchos analogicos con un pic... se podrian usar los modulos ain de midibox por ejemplo.
Tenés a mano el ejemplo de tu controlador?


----------



## rachelies (Mar 3, 2012)

El hid tiene eso, que no puedes poner muchos analógicos. Por otra parte, lo de la latencia no lo veo como problema, porque por lo menos en el mío funciona bien, no noto retardo.
Y en cuanto a la compatibilidad, el midi funciona en Virtual dj y en Traktor, que son 2 de los más conocidos. 

En su día no me acuerdo porqué opté por el midi, pero sé que topé con algún impedimento en el hid que me hizo tirar hacia el midi. Pero bueno, también irá en gustos.

Por otra parte, en cuanto a una pregunta anterior sobre el note on/off, no lo utilizo, lo que empleo es el volumen de la nota, es decir, la pongo a 7F para botón activo, y a 00 para inactivo.
La subrutina que utilizo es esta:


```
void envianota()
{	
	envia[1]=0x90;
	envia[0]=envia[1]>>4;
	
	usb_put_packet(1,envia,4,USB_DTS_TOGGLE);
}
```

en ella, se envía una matriz de 4 bytes. El 0 y el 1 son los que dicen que se envía nota, que si no me equivoco, hay que enviar 0x90 y 0x09
En el byte 3 se envía el número de nota, y en el byte 4 el volumen.





fernandoae dijo:


> Acá vengo con novedades, estuve leyendo un poco en la página del vdj y me enteré que se puede crear un controlador  HID creando un archivo con la configuración (en la  pc) de lo que hace cada byte enviado desde el pic... según lo que decia tiene menor latencia que el midi y lo recomiendan para las jogwheels. Pero la desventaja que le veo es que seria un poco mas incomodo asignar las funciones de cada boton o fader...
> http://www.virtualdj.com/wiki/ControllerDefinitionHID.html
> http://www.virtualdj.com/wiki/HIDImplementation.html
> 
> ...



Leyendo en los enlaces esos, parece que hay bastante información sobre el HID, que hace un par de años cuando yo empecé con esto no existían. Todo sería estudiarlo e implementar un programa para el pic, ya que el hardware sirve el mismo no me perjudicaría en nada.

Saludos


----------



## dinoelectro (Mar 3, 2012)

no sabia que se puede hacer esto con USB... la informacion me ha caido de pelicula... siempre tuve la ilusion de hacerme un dispositivo que funcione con musica!!!... voy a leerlo :estudiando::estudiando:con detenimiento para ver en que puedo colaborar!!!


----------



## fernandoae (Mar 3, 2012)

> El hid tiene eso, que no puedes poner muchos analógicos


Por que no? si se pueden enviar reportes hid de 256 bytes... y ahi se acomodarian todos los datos necesarios....

Esto es lo que tengo hecho, y todavia no funciona :enfadado:

Primero hice un descriptor para el dispositivo, usando el VID y PID de mi joystick usb casero:



Acá surge la primer duda, en tamaño del reporte pongo 12 o pongo 13? esto es lo que me tira el hidtrace que es un soft para ver los reportes hid.



El byte 8 es el que varia al mover el pote, en el descriptor iria un 7 o un 8? porque depende de como arranque la numeración... 0 a 7 o 1 a 8, no se si se entiende 

Por lo visto va bien, porque cuando inicio el VDJ me sale el mensaje este:



Asi que por lo menos dice que ahi está el invento  conectado a la pc.
Pero cuando voy a los dispositivos no se como configurarlo porque no aparece 



Por mas que le ponga que muestre los dspositivos desconectados...
Hasta ahora eso es todo, a seguir probando! vamos que va a salir algo bueno de acá... y al alcance de cualquier bolsillo, las consolas comerciales son muy costosas


----------



## rachelies (Mar 3, 2012)

Yo comenzaría probando con un solo botón digital, hacerlo funcionar en VDj para saber que "ve" el controlador, y después seguiría probando con los sliders.
En cuanto al "report size", ahora mismo no recuerdo muy bien el HID, tendría que volver a mirarlo.
Animo y sigue comentando!!


----------



## ruben_dj (Mar 3, 2012)

Amigo fernando, una vez me ayudaste, asi que ahora te echo una mano. Me parece que lo que te falta hacer para que lo reconozca es el mapper que va en la carpeta ...\Mis documnetos\Mappers y darle rescan for new devices.

Saludos
Rubén


----------



## fernandoae (Mar 3, 2012)

Después de haber leido los links me di cuenta lo del mapper, gracias ruben igual 
Hace unos dias despues de haber terminado de desarrollar mi gamepad usb, lo conecté y lo configure para que envie midi con el programa glovepie, quedo algo similar al mjoy, joy to midi y similares pero sin las limitaciones que estos traen...




Pero bueno, esto es mucho mejor y no me limita a 8 canales analogicos... vamos a seguir a ver que sale!


----------



## tecniloco80 (Mar 3, 2012)

se parece al que trae los teclados casio muy buno les subi el maper de mi controlador por si le sirve 
http://www.4shared.com/file/xB3drVPI/VirtualDJmaperjostic.html

se me olvido decir que segun vdj es mejor hid responde mas rapido dice aca 

http://www.virtualdj.com/wiki/HIDvsMIDI.html


----------



## fernandoae (Mar 3, 2012)

Si y no se te cuelga la maquina cuando el dispositivo manda muchos mensajes como con midi


----------



## rachelies (Mar 4, 2012)

Bueno, pues os haré caso y pasaré mi proyecto al HID


----------



## fernandoae (Mar 4, 2012)

Como te comenté por mensaje privado estaria bueno tener un firmware HID y otro MIDI. y cargarlos con un bootloader.
Acá les adjunto los dos archivos necesarios para hacer funcionar la consola y el programa HIDTRACE, que sirve para analizar los datos que envia un dispositivo HID.

En el archivo de configuración tienen que colocar el VID y el PID de su dispositivo


----------



## fernandoae (Mar 5, 2012)

Bueno gente acá traigo más cosas interesantes para que puedan hacer su consola y una fotos de lo que hice.
Lo que está bueno es el circuito con el 4051, permite multiplexar 32 entradas analogicas utilizando solamente 7 pines del pic (3 digitales y 4 analogicos).
También les muestro una idea de como hacer un botón touch con luz utilizando un led, una arandela y una "chinche".
La mayoria de los componentes son reciclados de viejos equipos electronicos, los faders por ejemplo son de un ecualizador de un equipos de música. Asi que bueno, vayan a alguna casa de reparación electronica y pidan los aparatos que tengan para desechar  hay muchos componentes útiles!
Los integrados 4051 y 4052 son de un equipo Aiwa, del cual además rescate dos potes motorizados y un amplificador stk4142II de 2x 70W.
Es cuestión de buscar nomás, se pueden hacer su consola sin gastar mucho dinero. Y con resultados excelentes.
Despues hay una foto con dos encoders, estos los saqué de la rueda de scroll de unos mouses de pc... ingenio compañeros!


----------



## fernandoae (Mar 5, 2012)

Miren todo lo que se consigue de equipos viejos https://skydrive.live.com/redir.asp...14D74898C0ED78!800&parid=1314D74898C0ED78!788


----------



## zeta_bola_1 (Mar 5, 2012)

veo unas piezas de joy analogico tipo play?


----------



## fernandoae (Mar 5, 2012)

Asi es, tengo 3 de esos... tenia cuatro pero le tuve que arreglar un joy a un amigo 
A uno de esos le saqué la base para que, al no apoyar el resorte, no vuelva automaticamente al centro y permanezca en la posición que uno lo deja.
Mañana seguro que me pongo a probar el tema de la comunicación desde la pc al pic para poder implementar vumetros, indicadores de beat en cada deck y cosas asi...


----------



## rachelies (Mar 6, 2012)

Muy bueno el almacén que tienes!! jejeje

¿Alguien puede poner el principio del descriptor HID? En el apartado "Usage" ¿lo declarais como Joystick, Keypad...o como lo poneis? El que utilizo para pruebas lo tengo como Joystick.


----------



## rachelies (Mar 6, 2012)

De momento no soy capaz de que el Virtual Dj envíe los leds al pic. ¿Alguna ayuda?


----------



## fernandoae (Mar 6, 2012)

En mi ejemplo es un gamepad usb, cuando tenga tiempo lo voy a convertir a GENERIC HID y lo voy a tener con 64 bytes de entrada y 64 de salida... con eso por ahora es suficiente.
Todavia no domino completamente el tema Usb pero me defiendo un poco  una vez que lo tenga funcionando subo el código fuente para Proton Ide...
Esta tarde posiblemente arme las placas para los multiplexores analógicos, el cd4051 está bueno porque con 3 pines de control podemos introducir 8 señales analogicas a un solo pin analogico del pic.


----------



## fernandoae (Mar 6, 2012)

Rachelies, ya instale el compilador ccs para comenzar a probar, pero no logro compilar el hex... en una parte me dice "clean: midiusb.hex" y varios mas, seguro es alguna pavada... pero cuales son los pasos a seguir para compilar tu código?



--- Estuve viendo y parece que es que no me deja seleccionar la familia del pic para poder indicarle que me genere el hex correspondiente, al seleccionar la adecuada y aceptar no lo toma


----------



## rachelies (Mar 6, 2012)

¿Pero lo compilas con el MPlab? Hay que integrar el CCS en el Mplab y hacerlo todo desde este último.


----------



## fernandoae (Mar 6, 2012)

Si eso lo hice, y prefiero no comentar el error jaja... resulta que cuando instalé el compilador ccs me asignó todos los archivos al ccs, y el hex me aparecia como c source o algo asi, no como hex 
Ahi lo compilé pero no se que pasa, si lo conecto lo detecta y todo pero el vdj se cuelga cuando dice "detectando dispositivos" al iniciar... sugerencias??


----------



## rachelies (Mar 7, 2012)

Supongo que sin tenerlo conectado no se cuelga al iniciar, ¿no? Si es así, prueba a abrirlo y luego conectarlo a ver que pasa. O cambia de puerto usb.
¿Has hecho ya los archivos que van en las carpetas Devices y en Mappers? Otra idea sería crear un archivo solo para un botón y ampliarlo poco a poco.

Esto es lo que se me ocurre así de pronto. Prueba y suerte. Ya nos comentas.

Yo sigo peleado con los leds, pero hoy no tengo tiempo a hacer pruebas.
Saludos


----------



## fernandoae (Mar 7, 2012)

> Supongo que sin tenerlo conectado no se cuelga al iniciar, ¿no? Si es así, prueba a abrirlo y luego conectarlo a ver que pasa.


Exacto, si no lo conecto inicia sin problemas... vamos a ver en otro puerto.



> ¿Has hecho ya los archivos que van en las carpetas Devices y en Mappers?  Otra idea sería crear un archivo solo para un botón y ampliarlo poco a  poco.


NO! :cabezon: posiblemente sea eso, ahora pruebo... vos tenes hechos esos archivos?



> Yo sigo peleado con los leds, pero hoy no tengo tiempo a hacer pruebas.


Lo de los leds utilizando HID no se ve muy dificil... tenes que agregar esto en el "device"





> :
> <page type="out">
> <led bit="0x aca va tu bit" name="LED_PLAY" default="PLAY" deck="1" />
> </page>
> </device>





> *LEDs*
> a LED is defined by a <led> element, with the following properties:
> - value: (optional) the value to set this element to when the LED is on
> -  default: (optional) gives the name of the corresponding <button>  element. If the mapper doesn't specifically provide an action for this  LED, the action of the button will automatically be used to get the  state of the LED.


Según eso dice que si no lo queres configurar desde el MAPPER lo podes hacer desde ahi.
A mi para probar lo de los leds me queda hacer un nuevo firm para el pic, porque el que tengo es de un gamepad y solo envia datos a la pc, no recibe...



Ya hice el DEVICE y el MAPPER pero no hay caso, ya aparece en la lista de dispositivos pero se cuelga mientras el dispositivo está conectado, si lo desconecto vuelve a la normalidad.
Acá adjunto los archivos para que prueben, puede ser algun problema de mi Windows 7 x64 
Pero es raro porque con el miditrace parece todo correcto y el pic envia notas...

Será por eso que aparece como FFFF/FFFF spv midi dj? que significa eso?


----------



## fernandoae (Mar 7, 2012)

> Pero es raro porque con el miditrace parece todo correcto y el pic envia notas...


Y definitivamente lo hace,hace unos minutos lo probé en Fruity Loops y anda perfecto. Asi que el problema es el VDJ, el device o el mapper


----------



## rachelies (Mar 7, 2012)

Hola!!

Lo de "spv midi dj" es el nombre que le di yo, que son mis iniciales y demás. Yo creo que el problema está en el Virtual dj. No tendría porque colgarse. Yo tambien utilizo Windows 7 64bits, y anda perfecto. Si tienes mal los archivos DEVICE y MAPPER, simplemente no te lo reconoce el Virtual Dj, pero no tendría porque colgarse. 
No puedo enviarte estos archivos porque supongo que no estaré en mi casa hasta el sábado... nada más que esté te los envio para que pruebes.

Si que es raro que con el midi trace lo veas enviando notas...

Lo de mis leds, creo que tengo mal los endpoints de recibir en el pic, pero lo mismo, hasta el sábado no podré probar. Tengo ganas de estar allí para eso, jajajaja


----------



## fernandoae (Mar 7, 2012)

En realidad no era justamente eso lo que no entendia del nombre, sinó el hecho de que aparezca FFFF/FFFF delante del nombre en el midi trace, porque en otras interfaces que tengo me sale 1/67, 1/66, 1/1b... etc.



Y está comprobado que tu código funciona y se comporta como una interfaz midi, en fruity loops me marca claramente el note on/off...
Ahora capaz que lo pruebo en ableton live a ver si lo toma bien, que es muy probable que si.
Pongamonos las pilas y diseñemos algo, que con el mismo hardware se pueda comportar como hid o como midi... yo mas atrás subi unos esquemas de los modulos de entrada y demas, son los de midibox.
Yo quise hacer lo de midibox pero como no consigo ese pic me incline por hacer mi propio diseño, y ademas a mi me gusta saber el por qué de las cosas


----------



## rachelies (Mar 8, 2012)

Para que funcione como midi y hid habría que implementar los dos tipos de comunicación en un mismo pic, y de algún modo seleccionar el tipo al arrancar, bien sea con un selector o algo.
No creo que sea muy dificil, salvo que había que tener en cuenta la memoria que podría ocupar...


----------



## fernandoae (Mar 8, 2012)

Vos que manejas mejor el CCS podrias ver de hacer algo que dependiendo de una entrada del pic ejecute un código para hid y sino salte a un código midi... seria cuestión de indicarle que descriptor cargar... o tener el pic con bootloader y dos hex diferentes. Esta última seria la mas sencilla.
Existe la posibilidad si mientras se está cargando un hex por bootloader y se desconecta el usb no se pueda volver a realizar la carga? o no pasa nada?... porque suponé que uno quiera vender la consola y el usuario hace mal algo.. se queda sin posibilidad de actualizarla por usb?


----------



## rachelies (Mar 9, 2012)

Hola:

¿El hex se puede guardar en el pic para que lo cargue? Yo lo tengo con bootloader, pero el hex se lo mando desde el pc. Muchas veces se para la transferencia y lo tengo que volver a mandar, pero nunca se ha estropeado el bootloader.

Pongo aquí el DEVICE y el MAPPER que tengo hecho para probar y funciona con midi y el virtual dj.

A ver si esta tarde hago funcionar lo de los leds...y en otro momento me pongo con lo de los 2 protocolos.

Un saludo


----------



## rachelies (Mar 9, 2012)

Soy imcapaz de enviar leds desde el Virtual dj!!! Alto tengo mal en el Device, en el Mapper o en el descriptor HID, pero no se que. En el analizador de USB no veo que en Virtual dj envíe nada hacia el pic.
Si alguien lo consigue que me explique como, que me estoy desesperando, jajajaja
Con el midi ya lo tenia funcionando.


----------



## fernandoae (Mar 9, 2012)

En el nombre del dispositivo va "SPV" o "spv midi dj"? porque a mi con en código que subiste me aparece de la segunda forma en todos lados...


----------



## tecniloco80 (Mar 9, 2012)

rachelies dijo:


> Soy imcapaz de enviar leds desde el Virtual dj!!! Alto tengo mal en el Device, en el Mapper o en el descriptor HID, pero no se que. En el analizador de USB no veo que en Virtual dj envíe nada hacia el pic.
> Si alguien lo consigue que me explique como, que me estoy desesperando, jajajaja
> Con el midi ya lo tenia funcionando.


 
Para enviar en el xxxdevice.xml tiene que poner algo como esto

```
<page type="out">
  <constant text="ECA" />
  <led bit="0x1B" name="LED_JOG" default="JOG_TOUCH" />
  <led bit="0x1C" name="LED_PLAY" default="PLAY" />
  <led bit="0x1D" name="LED_CUE" default="CUE" />
  <led bit="0x1E" name="LED_SCRATCH" default="SCRATCH" />
  <led bit="0x1F" name="LED_REVERSE" default="REV" />
  <led bit="0x20" name="LED_RELAY" default="RELAY" />
  <led bit="0x21" name="LED_JOG2" />
  <led bit="0x22" name="LED_JOG3" />
  <led bit="0x23" name="LED_CUE3" default="CUE3" />
  <led bit="0x24" name="LED_CUE2" default="CUE2" />
  <led bit="0x25" name="LED_CUE1" default="CUE1" />
  <led bit="0x26" name="LED_MEMO" default="MEMO" />
  <led bit="0x27" name="LED_DUMP" default="DUMP" />
  <led bit="0x28" name="LED_LOOPA" default="LOOPA" />
  <led bit="0x29" name="LED_LOOPB" default="LOOPB" />
  <led bit="0x2A" name="LED_RELOOP" default="RELOOP" />
  <led bit="0x2B" name="LED_NEXT" default="NEXTTRACK" />
  <led bit="0x2C" name="LED_JOG4" />
  <led bit="0x2D" name="LED_EDIT" default="EDIT" />
  <led bit="0x2E" name="LED_ONOFF" default="ONOFF" />
  <led bit="0x2F" name="LED_KEY" default="KEY" />
  <led bit="0x30" name="LCD_PC" />
  <led bit="0x31" name="LCD_TOTALREMAIN" />
  <led bit="0x32" name="LCD_REMAIN" />
  <led bit="0x33" name="LCD_ELAPSED" />
  <led bit="0x34" name="LCD_CONTINUE" />
  <led bit="0x35" name="LCD_SINGLE" />
  <led bit="0x36" name="LCD_SINGLEREPLAY" />
  <led bit="0x39" name="LCD_MT" />
  <led bit="0x3A" name="LCD_PLAY" />
  <led bit="0x3B" name="LCD_PAUSE" />
  <led bit="0x3C" name="LCD_LOOP" />
  <led bit="0x3D" name="LCD_CUE" />
  <led bit="0x3E" name="LCD_SEARCH" />
  <led bit="0x45" name="LCD_SEARCH-" />
  <led bit="0x46" name="LCD_SEARCH+" />
  <digit byte="11" size="word" endian="little" enablebit="0xDD" plusbit="0x37" minusbit="0x38" dotbit2="0x44" name="DIGIT_KEY" />
  <digit byte="13" enablebit="0xDE" name="DIGIT_MINUTES" />
  <digit byte="14" enablebit="0xDE" enablebit2="0x42" name="DIGIT_SECONDS" />
  <digit byte="15" enablebit="0xDE" enablebit2="0x43" name="DIGIT_FRAMES" />
  <digit byte="16" size="word" endian="little" enablebit="0xDF" dotbit="0x41" name="DIGIT_BPM" />
  <digit byte="18" enablebit="0x3F" name="DIGIT_START" />
  <digit byte="19" enablebit="0x40" name="DIGIT_BRAKE" />
  <digit byte="20" size="word" endian="little" enablebit="0xDB" name="DIGIT_TOTALTRACK" />
  <digit byte="22" size="word" endian="little" enablebit="0xDC" name="DIGIT_NOWTRACK" />
  <bar bit="0xC1" nbbits="7" max="80" enablebit="0xDA" minusbit="0xC0" name="PROGRESSBAR" />
 </page>
```
 
y en el xxxmaper.xml  

```
<map value="LED_JOG2" action="off" />
  <map value="LED_JOG3" action="off" />
  <map value="LED_JOG4" action="off" />
  <map value="LED_EDIT" action="deck 2 select" />
  <map value="TEXT1" action="get text 1" />
  <map value="TEXT2" action="get text 2" />
  <map value="DIGIT_KEY" action="get pitch" />
  <map value="DIGIT_MINUTES" action="get time_min" />
  <map value="DIGIT_SECONDS" action="get time_sec" />
  <map value="DIGIT_FRAMES" action="get time_ms" />
  <map value="DIGIT_BPM" action="get bpm" />
  <map value="DIGIT_START" action="off" />
  <map value="DIGIT_BRAKE" action="off" />
  <map value="DIGIT_TOTALTRACK" action="off" />
  <map value="DIGIT_NOWTRACK" action="off" />
  <map value="PROGRESSBAR" action="song_pos" />
  <map value="LCD_PC" action="true" />
  <map value="LCD_TOTALREMAIN" action="off" />
  <map value="LCD_REMAIN" action="display_time &apos;remain&apos;" />
  <map value="LCD_ELAPSED" action="display_time &apos;elapsed&apos;" />
  <map value="LCD_CONTINUE" action="off" />
  <map value="LCD_SINGLE" action="off" />
  <map value="LCD_SINGLEREPLAY" action="off" />
  <map value="LCD_MT" action="key_lock" />
  <map value="LCD_PLAY" action="play" />
  <map value="LCD_PAUSE" action="play ? false : true" />
  <map value="LCD_LOOP" action="loop" />
  <map value="LCD_CUE" action="cue" />
  <map value="LCD_SEARCH" action="off" />
  <map value="LCD_SEARCH-" action="off" />
  <map value="LCD_SEARCH+" action="off" />
```
 
eso es lo que trae un controlador comercial que tengo es hid prueba talvez funcione


----------



## fernandoae (Mar 9, 2012)

Está interesante, me sirvió para aclarar unas cosas del vdjscript


----------



## rachelies (Mar 9, 2012)

fernandoae dijo:


> En el nombre del dispositivo va "SPV" o "spv midi dj"? porque a mi con en código que subiste me aparece de la segunda forma en todos lados...



Es "spv midi dj".

Tecniloco80, muchas gracias, lo probaré cuando esté en casa. Si eso es de uno comercial hid, ?sería mucho pedir que subas los archivos completos?

Gracias y un saludo


----------



## fernandoae (Mar 9, 2012)

Ah bueno, me habia surgido esa duda... 
Como haces para recibir los datos de los leds en el pic? serias tan amable de hacer un minitutorial sobre el tema?


----------



## rachelies (Mar 10, 2012)

Para los leds, el Virtual dj me tendría que enviar 8 bytes (de los que al final solo utilizo 2 en mi controlador). En el pic detecto que me llegan mediante:

```
if (usb_kbhit(1)) 
{
  usb_get_packet(1,recibe,8);
detecta_led();
}
```

Previamente habría que mappear lo que va en cada bit de esos bytes en el Virtual dj (que creo que es lo que tengo mal), y una vez recibidos en el pic, gestionar cada led con la información recibida.

Así es como yo lo tengo hecho y no me funciona, jajajaja. En modo midi funciona, por lo que el error tiene que estar en el archivo DEVICE o MAPPER del Virtual dj, o en el descriptor hid, no se.


----------



## tecniloco80 (Mar 10, 2012)

rachelies dijo:


> Es "spv midi dj".
> 
> Tecniloco80, muchas gracias, lo probaré cuando esté en casa. Si eso es de uno comercial hid, ?sería mucho pedir que subas los archivos completos?
> 
> Gracias y un saludo


 
El controlador es turro no es muy bueno no tiene muchas funciones y solo tengo uno
este es el codigo completo del xxdevice.xml

```
<?xml version="1.0" encoding="UTF-8"?>
<device name="CDMP700" author="Atomix Productions" type="HID" vid="0x190f" pid="0x0700" reportsize="32" decks="1">
 <page type="init">
  <constant buffer="45430102030405060708090A0B0C0D0E0F101112131415161718191A1B1C0229" />
 </page>
 <page type="wait">
  <constant text="MP" />
  <constant byte="29" value="0x1C" />
 </page>
 <page type="exit">
  <constant text="ECA" />
  <constant byte="29" value="0xFF" />
 </page>
 <page type="in">
  <constant text="MP" />
  <button byte="2" value="1" name="TRACK_ENTER" />
  <button byte="2" value="2" name="BACK" />
  <button byte="2" value="3" name="PROG" />
  <button byte="2" value="4" name="FAST+" />
  <button byte="2" value="5" name="FAST-" />
  <button byte="2" value="6" name="KEY" />
  <button byte="2" value="7" name="ONOFF" />
  <button byte="2" value="8" name="RANGE" />
  <button byte="2" value="9" name="PITCHBEND-" />
  <button byte="2" value="10" name="PITCHBEND+" />
  <button byte="3" value="1" name="NEXTTRACK" />
  <button byte="3" value="2" name="EDIT" />
  <button byte="3" value="3" name="RELOOP" />
  <button byte="3" value="4" name="LOOPB" />
  <button byte="3" value="5" name="LOOPA" />
  <button byte="3" value="6" name="CUE3" />
  <button byte="3" value="7" name="TIME" />
  <button byte="3" value="8" name="CONT" />
  <button byte="3" value="9" name="TITLE" />
  <button byte="3" value="10" name="MENU" />
  <button byte="4" value="1" name="CUE2" />
  <button byte="4" value="2" name="CUE1" />
  <button byte="4" value="3" name="MEMO" />
  <button byte="4" value="4" name="RELAY" />
  <button byte="4" value="5" name="DUMP" />
  <button byte="4" value="6" name="REV" />
  <button byte="4" value="7" name="SCRATCH" />
  <button byte="4" value="8" name="BOP" />
  <button byte="4" value="9" name="CUE" />
  <button byte="4" value="10" name="PLAY" />
  <button byte="5" value="1" name="TAP" />
  <button byte="6" value="1" name="JOG_TOUCH" />
  <jog bit="57" nbbits="15" max="589" name="JOG" />
  <encoder byte="12" max="19" name="TRACK" />
  <slider byte="15" size="word" max="511" inverted="true" name="PITCH" />
  <slider byte="17" size="word" max="511" name="START" />
  <slider byte="19" size="word" max="511" name="BRAKE" />
 </page>
 <page type="out">
  <constant text="ECA" />
  <led bit="0x1B" name="LED_JOG" default="JOG_TOUCH" />
  <led bit="0x1C" name="LED_PLAY" default="PLAY" />
  <led bit="0x1D" name="LED_CUE" default="CUE" />
  <led bit="0x1E" name="LED_SCRATCH" default="SCRATCH" />
  <led bit="0x1F" name="LED_REVERSE" default="REV" />
  <led bit="0x20" name="LED_RELAY" default="RELAY" />
  <led bit="0x21" name="LED_JOG2" />
  <led bit="0x22" name="LED_JOG3" />
  <led bit="0x23" name="LED_CUE3" default="CUE3" />
  <led bit="0x24" name="LED_CUE2" default="CUE2" />
  <led bit="0x25" name="LED_CUE1" default="CUE1" />
  <led bit="0x26" name="LED_MEMO" default="MEMO" />
  <led bit="0x27" name="LED_DUMP" default="DUMP" />
  <led bit="0x28" name="LED_LOOPA" default="LOOPA" />
  <led bit="0x29" name="LED_LOOPB" default="LOOPB" />
  <led bit="0x2A" name="LED_RELOOP" default="RELOOP" />
  <led bit="0x2B" name="LED_NEXT" default="NEXTTRACK" />
  <led bit="0x2C" name="LED_JOG4" />
  <led bit="0x2D" name="LED_EDIT" default="EDIT" />
  <led bit="0x2E" name="LED_ONOFF" default="ONOFF" />
  <led bit="0x2F" name="LED_KEY" default="KEY" />
  <led bit="0x30" name="LCD_PC" />
  <led bit="0x31" name="LCD_TOTALREMAIN" />
  <led bit="0x32" name="LCD_REMAIN" />
  <led bit="0x33" name="LCD_ELAPSED" />
  <led bit="0x34" name="LCD_CONTINUE" />
  <led bit="0x35" name="LCD_SINGLE" />
  <led bit="0x36" name="LCD_SINGLEREPLAY" />
  <led bit="0x39" name="LCD_MT" />
  <led bit="0x3A" name="LCD_PLAY" />
  <led bit="0x3B" name="LCD_PAUSE" />
  <led bit="0x3C" name="LCD_LOOP" />
  <led bit="0x3D" name="LCD_CUE" />
  <led bit="0x3E" name="LCD_SEARCH" />
  <led bit="0x45" name="LCD_SEARCH-" />
  <led bit="0x46" name="LCD_SEARCH+" />
  <digit byte="11" size="word" endian="little" enablebit="0xDD" plusbit="0x37" minusbit="0x38" dotbit2="0x44" name="DIGIT_KEY" />
  <digit byte="13" enablebit="0xDE" name="DIGIT_MINUTES" />
  <digit byte="14" enablebit="0xDE" enablebit2="0x42" name="DIGIT_SECONDS" />
  <digit byte="15" enablebit="0xDE" enablebit2="0x43" name="DIGIT_FRAMES" />
  <digit byte="16" size="word" endian="little" enablebit="0xDF" dotbit="0x41" name="DIGIT_BPM" />
  <digit byte="18" enablebit="0x3F" name="DIGIT_START" />
  <digit byte="19" enablebit="0x40" name="DIGIT_BRAKE" />
  <digit byte="20" size="word" endian="little" enablebit="0xDB" name="DIGIT_TOTALTRACK" />
  <digit byte="22" size="word" endian="little" enablebit="0xDC" name="DIGIT_NOWTRACK" />
  <bar bit="0xC1" nbbits="7" max="80" enablebit="0xDA" minusbit="0xC0" name="PROGRESSBAR" />
 </page>
 <page type="out">
  <constant text="7SA" />
  <text byte="3" nbchars="14" name="TEXT1" />
  <text byte="17" nbchars="14" name="TEXT2" />
 </page>
</device>
```
este es del xxmaper.xml

```
<?xml version="1.0" encoding="UTF-8"?>
<mapper device="CDMP700" description="Audiophony PLAY" author="Atomix Productions" version="600" date="16/02/2009">
  <map value="JOG" action="touchwheel" />
  <map value="PLAY" action="play_pause" />
  <map value="CUE" action="cue_stop" />
  <map value="PITCH" action="pitch_slider" />
  <map value="JOG_TOUCH" action="touchwheel_touch" />
  <map value="SCRATCH" action="vinyl_mode" />
  <map value="REV" action="reverse" />
  <map value="DUMP" action="dump" />
  <map value="PITCHBEND-" action="pitch_bend -2% 500ms" />
  <map value="PITCHBEND+" action="pitch_bend +2% 500ms" />
  <map value="RANGE" action="pitch_range" />
  <map value="ONOFF" action="pitch_reset" />
  <map value="KEY" action="key_lock" />
  <map value="FAST-" action="seek -4" />
  <map value="FAST+" action="seek +4" />
  <map value="RELAY" action="relay_play" />
  <map value="LOOPA" action="loop_in" />
  <map value="LOOPB" action="loop_out" />
  <map value="RELOOP" action="reloop" />
  <map value="TRACK" action="browser_scroll" />
  <map value="TRACK_ENTER" action="browser_enter" />
  <map value="BACK" action="browser_folder" />
  <map value="EDIT" action="deck active select" />
  <map value="NEXTTRACK" action="automix" />
  <map value="BOP" action="sync" />
  <map value="TAP" action="sync" />
  <map value="MEMO" action="menu" />
  <map value="TIME" action="display_time 'elapsed,remain'" />
  <map value="CUE1" action="menu_button 1 'hotcue,sampler,effect'" />
  <map value="CUE2" action="menu_button 2 'hotcue,sampler,effect'" />
  <map value="CUE3" action="menu_button 3 'hotcue,sampler,effect'" />
  <map value="TIME" action="display_time 'elapsed,remain'" />
  <map value="START" action="effect slider 1" />
  <map value="BRAKE" action="effect slider 2" />
  <map value="LED_JOG2" action="off" />
  <map value="LED_JOG3" action="off" />
  <map value="LED_JOG4" action="off" />
  <map value="LED_EDIT" action="deck 2 select" />
  <map value="TEXT1" action="get text 1" />
  <map value="TEXT2" action="get text 2" />
  <map value="DIGIT_KEY" action="get pitch" />
  <map value="DIGIT_MINUTES" action="get time_min" />
  <map value="DIGIT_SECONDS" action="get time_sec" />
  <map value="DIGIT_FRAMES" action="get time_ms" />
  <map value="DIGIT_BPM" action="get bpm" />
  <map value="DIGIT_START" action="off" />
  <map value="DIGIT_BRAKE" action="off" />
  <map value="DIGIT_TOTALTRACK" action="off" />
  <map value="DIGIT_NOWTRACK" action="off" />
  <map value="PROGRESSBAR" action="song_pos" />
  <map value="LCD_PC" action="true" />
  <map value="LCD_TOTALREMAIN" action="off" />
  <map value="LCD_REMAIN" action="display_time &apos;remain&apos;" />
  <map value="LCD_ELAPSED" action="display_time &apos;elapsed&apos;" />
  <map value="LCD_CONTINUE" action="off" />
  <map value="LCD_SINGLE" action="off" />
  <map value="LCD_SINGLEREPLAY" action="off" />
  <map value="LCD_MT" action="key_lock" />
  <map value="LCD_PLAY" action="play" />
  <map value="LCD_PAUSE" action="play ? false : true" />
  <map value="LCD_LOOP" action="loop" />
  <map value="LCD_CUE" action="cue" />
  <map value="LCD_SEARCH" action="off" />
  <map value="LCD_SEARCH-" action="off" />
  <map value="LCD_SEARCH+" action="off" />
  <map value="MENU" action="reinit_controller 'CDMP700' 200" />
</mapper>
```
Bueno ahora les tengo una pregunta si me pueden ayudar 
cuantos potes se le pueden poner aun pic con codigo para hid ya que estoy escribiendo un codigo y solo le puedo hacer funcionar 7 vi por ahi que se puede poner mas poniendo mas "paginas" no se nada de estas paginas alguien que sepa de esto


----------



## fernandoae (Mar 10, 2012)

No estoy del todo seguro, pero en una "pagina" podes enviar 256 bytes... con eso mandás la cantidad de potes y botones que desees.
Novedades con el tema de los leds? hasta ahora yo tampoco puedo! tengo un dispositivo sencillito con 8 bytes de entrada y 8 de salida, el hidtrace me pone 8/8 asi que parece que esta bien... pero de ahi no paso. Vamos a seguir mañana! cuando haya novedades vuelvo. Ya medio que me puso loco el tema


----------



## fernandoae (Mar 10, 2012)

Se borró el mensaje de rachelies: 


> Para los leds, el Virtual dj me tendría que enviar 8 bytes (de los que al final  solo utilizo 2 en mi controlador). En el pic detecto que me llegan  mediante:
> 
> Código:
> ---------
> ...


La verdad que a mi me funciona enviandole bytes desde visual basic en xp... o sea que la base está funcionando, el pic recibe y saca esos datos por el PORTB del pic 18F2550. Pero lo que no se es si el vdj envia los datos al lugar incorrecto por problemas en el mapper o el device, o, simplemente no envia nada.
En este caso, con 8 Bytes de entrada y 8 de salida... en el tamaño del reporte va un 8 o un 16? o hay que usar la definición "outreportsize"? vamos viendo de aclarar dudas...


----------



## fernandoae (Mar 10, 2012)

Ya funciona, acá les dejo un videito.
http://www.youtube.com/watch?v=ewdl4GucaUg&feature=youtu.be
Lo que sigo sin entender es lo de los bits en el mapeo, ni idea porque arranca en el bit 10 cuando yo le indique al pic que lea el tercer o el segundo byte del reporte :enfadado:


----------



## rachelies (Mar 11, 2012)

Hola fernandoae. En el archivo adjunto has puesto dos veces el DEVICE, falta el mapper, jejejje. 
¿Para leer los bits empleas mi código? yo tengo esto:

```
recibe[2]=recibe[2]-32;
```
Porque en el midi, en este byte enviaba las notas, que enviaba desde la 0x20, y le resto 32 para que el pic la entienda como nota cero en este caso.

Tecniloco80, muchas gracias por los archivos, a ver si saco algo en claro para que me envíe leds el mío. En cuanto al numero máximo de datos analógicos a enviar por hid no lo sé, pero en este foro se que vi un día un post sobre dispositivos hid para juegos y fue lo que me animó a empezar con el pic y el USB. Seguro que ahí hay gente que sabe la respuesta.
Saludos


----------



## fernandoae (Mar 11, 2012)

Ah pequeño error  ahora lo adjunto.
Para recibir hice un pequeño codigo con el easy hid para proton, le especifique 8 bytes de entrada y ocho de salida, pero es raro es como si trabajara con los dos unidos... todavia no termino de entenderlo bien, posiblemente tenga que ver con los endpoints y esas cosas.
PERO LO BUENO ES QUE FUNCIONA!


----------



## rachelies (Mar 11, 2012)

Que desesperación, sigue sin funcionar. ¿Podeis enviarme el descriptor hid que utilizais? Sólo ahí me queda el fallo.


----------



## fernandoae (Mar 11, 2012)

Yo tengo el descriptor hecho para proton, y es el de dispositivo hid generico...busca algo asi para ccs, que te de un par de bytes de entrada y otros de salida... y en base a eso empeza a probar con el device y el mapper que adjunté. Suerte!


----------



## tecniloco80 (Mar 11, 2012)

rachelies dijo:


> Que desesperación, sigue sin funcionar. ¿Podeis enviarme el descriptor hid que utilizais? Sólo ahí me queda el fallo.


 
yo utilizo este 

```
-------------------------------------------------------------------
The look-up table scheme also applies to the configuration
descriptor. A USB device may have multiple configuration
descriptors, i.e. CFG01, CFG02, etc. To add a configuration
descriptor, user must implement a structure similar to CFG01.
The next step is to add the configuration descriptor name, i.e.
cfg01, cfg02,.., to the look-up table USB_CD_Ptr. USB_CD_Ptr[0]
is a dummy place holder since configuration 0 is the un-configured
state according to the definition in the USB specification.
********************************************************************/
 
/*********************************************************************
 * Descriptor specific type definitions are defined in:
 * usb_device.h
 *
 * Configuration options are defined in:
 * usb_config.h
 ********************************************************************/
#ifndef __USB_DESCRIPTORS_C
#define __USB_DESCRIPTORS_C
/** INCLUDES *******************************************************/
#include "GenericTypeDefs.h"
#include "Compiler.h"
#include "usb_config.h"
#include "usb_device.h"
#include "usb_function_hid.h"
/** CONSTANTS ******************************************************/
#if defined(__18CXX)
#pragma romdata
#endif
/* Device Descriptor */
ROM USB_DEVICE_DESCRIPTOR device_dsc=
{
    0x12,    // Size of this descriptor in bytes
    USB_DESCRIPTOR_DEVICE,                // DEVICE descriptor type
    0x0200,                 // USB Spec Release Number in BCD format
    0x00,                   // Class Code
    0x00,                   // Subclass code
    0x00,                   // Protocol code
    USB_EP0_BUFF_SIZE,          // Max packet size for EP0, see usb_config.h
    MY_VID,                 // Vendor ID
    MY_PID,                 // Product ID: Mouse in a circle fw demo
    0x0107,//0x0003,                 // Device release number in BCD format
    0x01,                   // Manufacturer string index
    0x02,                   // Product string index
    0x00,                   // Device serial number string index
    0x01                    // Number of possible configurations
};
/* Configuration 1 Descriptor */
ROM BYTE configDescriptor1[]={
    /* Configuration Descriptor */
    0x09,//sizeof(USB_CFG_DSC),    // Size of this descriptor in bytes
    USB_DESCRIPTOR_CONFIGURATION,                // CONFIGURATION descriptor type
    DESC_CONFIG_WORD(0x0026),   // Total length of data for this cfg
    1,                      // Number of interfaces in this cfg
    1,                      // Index value of this configuration
    0,                      // Configuration string index
    0x80,//_DEFAULT | _SELF,               // Attributes, see usb_device.h
    250,                     // Max power consumption (2X mA)
    /* Interface Descriptor */
    0x09,//sizeof(USB_INTF_DSC),   // Size of this descriptor in bytes
    USB_DESCRIPTOR_INTERFACE,               // INTERFACE descriptor type
    0,                      // Interface Number
    0,                      // Alternate Setting Number
    1,                      // Number of endpoints in this intf
    HID_INTF,               // Class code
    BOOT_INTF_SUBCLASS,     // Subclass code
    HID_PROTOCOL_NONE,     // Protocol code
    0,                      // Interface string index
    /* HID Class-Specific Descriptor */
    0x09,//sizeof(USB_HID_DSC)+3,    // Size of this descriptor in bytes RRoj hack
    DSC_HID,                // HID descriptor type
    DESC_CONFIG_WORD(0x0110),                 // HID Spec Release Number in BCD format (1.11)
    0x21,                   // Country Code (0x00 for Not supported)
    HID_NUM_OF_DSC,         // Number of class descriptors, see usbcfg.h
    DSC_RPT,                // Report descriptor type
    DESC_CONFIG_WORD(67),   //sizeof(hid_rpt01),      // Size of the report descriptor
 
    /* Endpoint Descriptor */
    0x07,/*sizeof(USB_EP_DSC)*/
    USB_DESCRIPTOR_ENDPOINT,    //Endpoint Descriptor
    HID_EP | _EP_IN,            //EndpointAddress
    _INTERRUPT,                       //Attributes
    DESC_CONFIG_WORD(8),                  //size
    0x0A                        //Interval
};
 
//Language code string descriptor
ROM struct{BYTE bLength;BYTE bDscType;WORD string[1];}sd000={
sizeof(sd000),USB_DESCRIPTOR_STRING,{0x0409
}};
//Manufacturer string descriptor
ROM struct{BYTE bLength;BYTE bDscType;WORD string[25];}sd001={
sizeof(sd001),USB_DESCRIPTOR_STRING,
{'M','i','c','r','o','c','h','i','p',' ',
'T','e','c','h','n','o','l','o','g','y',' ','I','n','c','.'
}};
//Product string descriptor
ROM struct{BYTE bLength;BYTE bDscType;WORD string[22];}sd002={
sizeof(sd002),USB_DESCRIPTOR_STRING,
{'V','i','r','t','u','a','l',' ','D','j','s',' ','C','o','n','t','r','o','l','l','e','r'
}};
//Class specific descriptor - HID mouse
ROM struct{BYTE report[HID_RPT01_SIZE];}hid_rpt01={
//    {0x05, 0x01, /* Usage Page (Generic Desktop)             */
//    0x09, 0x02, /* Usage (Mouse)                            */
//    0xA1, 0x01, /* Collection (Application)                 */
//    0x09, 0x01, /*  Usage (Pointer)                         */
//    0xA1, 0x00, /*  Collection (Physical)                   */
//    0x05, 0x09, /*      Usage Page (Buttons)                */
//    0x19, 0x01, /*      Usage Minimum (01)                  */
//    0x29, 0x03, /*      Usage Maximum (03)                  */
//    0x15, 0x00, /*      Logical Minimum (0)                 */
//    0x25, 0x01, /*      Logical Maximum (0)                 */
//    0x95, 0x03, /*      Report Count (3)                    */
//    0x75, 0x01, /*      Report Size (1)                     */
//    0x81, 0x02, /*      Input (Data, Variable, Absolute)    */
//    0x95, 0x01, /*      Report Count (1)                    */
//    0x75, 0x05, /*      Report Size (5)                     */
//    0x81, 0x01, /*      Input (Constant)    ;5 bit padding  */
//    0x05, 0x01, /*      Usage Page (Generic Desktop)        */
//    0x09, 0x30, /*      Usage (X)                           */
//    0x09, 0x31, /*      Usage (Y)                           */
//    0x15, 0x81, /*      Logical Minimum (-127)              */
//    0x25, 0x7F, /*      Logical Maximum (127)               */
//    0x75, 0x08, /*      Report Size (8)                     */
//    0x95, 0x02, /*      Report Count (2)                    */
//    0x81, 0x06, /*      Input (Data, Variable, Relative)    */
//    0xC0, 0xC0}
{
   0x05, 0x01,         //Usage Page (Generic Desktop)
   0x09, 0x04,         //Usage (Joystick)
   0xA1, 0x01,         //Collection (Application) 
   0xA1, 0x02,            //Collection (Logical)
   0x75, 0x08,               //Report size (8)
   0x95, 0x04,               //Report count (4)
   0x15, 0x00,               //Logical Minimum (-127)
   0x26, 0xFF, 0x00,         //Logical Maximum (128)
   0x35, 0x00,               //Physical Minumum (0)
   0x46, 0xFF, 0x00,         //Physical Maximum (255)
   0x09, 0x30,               //Usage (X)
   0x09, 0x31,               //Usage (Y)
   0x09, 0x32,               //Usage (Z)
   0x09, 0x35,               //Usage (Rz)
   0x81, 0x02,               //Input (Data, Variable, Absolute)
   0x75, 0x08,               //Report size (8)
   0x95, 0x01,               //Report count (1)
   0x25, 0x07,               //Logical Maximum (7)
   0x46, 0x3B, 0x01,         //Physical Maximum (315)
   0x65, 0x14,               //Unit (Eng Rot: Degree)
   0x09, 0x39,               //Usage (Hat switch)
   0x81, 0x42,               //
   0x65, 0x00,               //Unit (None)
   0x75, 0x01,               //Report size (1)
   0x95, 0x08,               //Report count (8)
   0x25, 0x01,               //Logical Maximum (1)
   0x45, 0x01,               //Physical Maximum (1)
   0x05, 0x09,               //Usage Page (Button)
   0x19, 0x01,               //Usage Minumum (Button 1)
   0x29, 0x08,               //Usage Maximum (Button 8)
   0x81, 0x02,               //Input (Data, Variable, Relative) 
   0xC0,               //End collection
   0xC0            //End collection
 
////   size 53
//   0x05, 0x01,
//   0x09, 0x04,
//   0xa1, 0x01,
//    0x09, 0x01,
//   0xa1, 0x00,
//   0x75, 0x08,
//   0x95, 0x04,
//   0x15, 0x00,
//   0x25, 0xff,
//   0x35, 0x00,
//   0x46, 0xff, 0x00,
//   0x05, 0x01,
//   0x09, 0x30,
//   0x09, 0x31,
//   0x09, 0x32,
//   0x09, 0x35,
//   0x81, 0x02,
//   0x75, 0x01,
//   0x95, 0x08,
//   0x25, 0x01,
//   0x45, 0x01,
//   0x05, 0x09,
//   0x19, 0x01,
//   0x29, 0x08,
//   0x81, 0x02,
//   0xc0, 
//   0xc0
}
};/* End Collection,End Collection            */
//Array of configuration descriptors
ROM BYTE *ROM USB_CD_Ptr[]=
{
    (ROM BYTE *ROM)&configDescriptor1
};
//Array of string descriptors
ROM BYTE *ROM USB_SD_Ptr[]=
{
    (ROM BYTE *ROM)&sd000,
    (ROM BYTE *ROM)&sd001,
    (ROM BYTE *ROM)&sd002
};
/** EOF usb_descriptors.c ***************************************************/
#endif
```
Ver el archivo adjunto hid.rar 
a lo mejor te sirve yo aun no puedo recibir nada pero si puedo enviar


----------



## fernandoae (Mar 11, 2012)

Les comento que lo  mejor no es usar un descriptor de gamepad, tiene muchas limitaciones, por ejemplo un maximo de 8 analogicos. Usen un hid generico, busquen ejemplos en google para sus lenguajes de programación, hay mucha info


----------



## tecniloco80 (Mar 11, 2012)

fernandoae dijo:


> Les comento que lo mejor no es usar un descriptor de gamepad, tiene muchas limitaciones, por ejemplo un maximo de 8 analogicos. Usen un hid generico, busquen ejemplos en google para sus lenguajes de programación, hay mucha info


 si creo que ese es mi problema solo puedo hacer funcionar 7 potes el descriptor es de un gamepad ahora creo que empezare de nuevo con otro descriptor


----------



## fernandoae (Mar 11, 2012)

En que programás? asi te ayudo un poco


----------



## tecniloco80 (Mar 11, 2012)

fernandoae dijo:


> En que programás? asi te ayudo un poco


estoy aprendiendo a programar con el ccs y recien ahora me doy cuenta de los ejemplos trae uno que creo nos prodria servir para los que tienen ccs esta en C:\Archivos de programa\PICC\Examples\ex_usb_hid.c


----------



## fernandoae (Mar 11, 2012)

Ah si es con CCS no te puedo ayudar porque yo también estoy aprendiendo  muy de a poco porque no tengo tiempo libre. El CCS se ve bueno pero en el proton ide escribo menos jeje!

Tenemos que ver el tema de las jogwheels, les paso un para de links:
http://www.instructables.com/id/HDDJ-Turning-an-old-hard-disk-drive-into-a-rotary/





























El ultimo video es similar a lo que te comenté por privado rachelies... pero en vez de estar ubicados en esas barritas van en algo que se asemeje a una bateria


----------



## tecniloco80 (Mar 11, 2012)

Lo de los jogwheels no parece tan dificil los datos que envia un denon los capture y son repetitivos esto es lo que envia

 TIMESTAMP IN PORT STATUS DATA1 DATA2 CHAN NOTE EVENT               

 00057636  10   1     B3    25    00    4  ---  Control Change        
 00059C53  10   1     B3    25    7F    4  ---  Control Change        
 00059D92  10   1     B3    25    00    4  ---  Control Change        
 0005A1FD  10   1     B3    25    7F    4  ---  Control Change        
 0005A33C  10   1     B3    25    00    4  ---  Control Change        
 0005AC98  10   1     B3    25    7F    4  ---  Control Change        
 0005AD8E  10   1     B3    25    00    4  ---  Control Change        
 0005B913  10   1     B3    25    7F    4  ---  Control Change        
 0005B9D7  10   1     B3    25    00    4  ---  Control Change        

si giras a la izquierda solo cambia el b3 por b2 parecido a un encoder que una vez hice
para contar las espiras de una maquina de rebobinar


----------



## fernandoae (Mar 11, 2012)

Eso si está claro, incluso en hid es cambiar un bit unicamente y ya lo hice... con dos pulsadores manejaba el scratch un paso adelante y un paso atrás.
A lo que voy es al tema hardware y a la lectura con el pic, eso todavia no lo estudié pero tengo entendido que es con interrupciones. Igual con el pic trabajando a 48Mhz no se si hace falta, es más, en una parte del midibox conectan multiples encoders a la placa Din y la misma no crea ninguna interrupcion.


----------



## rachelies (Mar 12, 2012)

A ver si esta tarde tengo tiempo a probar algo más en hid, si no, dejo mi controlador en midi que funciona bien. Lo de la latencia del midi es con el midi tradicional, pero por usb no tiene porque tener latencia. El usb va mucho más rápido que lo que el oido puede percibir, jajajaja.
Yo mi jogwhell lo hice con dos discos duros, y en el programa hice esto para enviar por midi:

```
////////////////////////////////////////////////////
//interrupción para pulsos encoder
////////////////////////////////////////////////////
#int_EXT2
void EXT2_isr()
{	
		//giro derecha
	if(!bit_test(INTCON2,4)) 		//entra por flanco bajada
		{	if(bit_test(PORTA,1)) p1=4;
			if(!bit_test(PORTA,1)) p1=1;
		}
		//giro izqierda
	if(bit_test(INTCON2,4))			//entra por flanco subida
		{ 	if(bit_test(PORTA,1)) p1=3;
			if(!bit_test(PORTA,1)) p1=2;
		}
	
	INTEDGE=!INTEDGE;
	
	if(p1==2||p1==4) encoderA=0x01;
	if(p1==1||p1==3) encoderA=0x7F;
	//if(encoderA>0x7F) encoderA=0x01;
	//if(encoderA<0x01) encoderA=0x7F;

	pulsos[3]=encoderA;
	usb_put_packet(1,pulsos,4,USB_DTS_TOGGLE);
}
```

Esto sería solo para uno de ellos. Utilizo dos entradas, y con una interrupcion entro en esta subrutina, detecto si el cambio para entrar en la subrutina fue un flanco de subida o de bajada, y después escaneo como está el otro pin, y así se si estoy girando a derecha o a izquierda. Envío 0x7F cuando giro a derecha o 0x01 cuando giro a izquierda, aunque estos valores no estoy seguro de que estén bien para VirtualDj, ya que también estuve haciendo pruebas con el Traktor y ahora no recuerdo de cual eran.

Otra desventaja que encuentro al HID es que no me vale con el Traktor, que solo admite Midi.
Un saludo y gracias por colaborar


----------



## tecniloco80 (Mar 12, 2012)

fernandoae dijo:


> Eso si está claro, incluso en hid es cambiar un bit unicamente y ya lo hice... con dos pulsadores manejaba el scratch un paso adelante y un paso atrás.
> A lo que voy es al tema hardware ....


Lo del  hardware tampoco se ve muy dificil mira esto





para conectar un motor de paso como encoder





este es óptico parecido a los que traen los controladores comerciales
claro que es mas facil decirlo que hacerlo pero en google encontraras mucha info
mira esta es con un raton viejo
Ver el archivo adjunto Como hacer un encoder Ã³ptico usando partes de un mouse mecÃ¡nico.pdf


----------



## rachelies (Mar 12, 2012)

El circuito que tengo yo para utilizar el disco duro es este que adjunto.
No hace falta alimentar el motor ni nada, solo con 3 pines: uno para el canal A, otro para el B y otro que uno a la masa del circuito. Es muy muy sensible, con moverlo muy poco ya da pulsos, y a la salida del operacional tenemos +5V para meter al PIC.


----------



## fernandoae (Mar 12, 2012)

> Otra desventaja que encuentro al HID es que no me vale con el Traktor, que solo admite Midi.


Y bueno, todo en la vida no se puede  pero en ese caso si la haces con HID podés usar el programa GLOVEPIE como puente entre el HID y el MIDI... yo hace unos dias tomé mi wiimote (que para la pc es un dispositivo hid) y usaba los acelerometros y demas para manejar el Ableton live.
Con la camara y un led infrarrojo sensando la posición en x y en y se podria hacer un theremin o manejar un efecto, la verdad es muy interesante todo lo que se puede hacer con el aparatito 




Respecto al tema de las jogwheels, voy a probar esos esquemas, porque una vez armé uno que vi para eso y me quedaban los tres leds encendidos y como me dió bronca porque en vez de hacerlo en el protoboard lo hice en pcb y no anduvo no probé más...
Y se puede hacer sin interrupciones lo de los encoders creo, porque en la imagen adjunta se ve eso. Con el pic trabajando a 48Mhz se pueden detectar los cambios por mas rapidos que sean...


----------



## rachelies (Mar 12, 2012)

Claro que se puede hacer sin interrupciones, pero a mi me gusta más con interrupciones para no ocupar el micro constantemente escaneando las entradas. Para eso están las interrupciones, jejeje

Por cierto, muy bueno el video!!!


----------



## fernandoae (Mar 12, 2012)

Me aclaraste la duda que tenia, gracias!
Alguien usó el encoder de la rueda de scroll de un mouse? porque por lo visto no larga dos señales en cuadratura... voy a probarlo de nuevo


----------



## fernandoae (Mar 12, 2012)

> Lo de la latencia del midi es con el midi tradicional, pero por usb no  tiene porque tener latencia. El usb va mucho más rápido que lo que el  oido puede percibir, jajajaja.


Sea tradicional o usb mis oidos hasta hace poco trabajaban a 1 Gb/s, asi que si noto la latencia, o bueno... por lo menos hasta unos 10 microsegundos.
Probe con el ultimo circuito ya que tenia los componentes a mano y me funcionó, es normal que quede un led encendido? digo, porque cuando el disco está quieto no hay ninguna tensión generada...
En cuanto pueda edito y subo el video


----------



## fernandoae (Mar 12, 2012)

Lo prometido es deuda:
http://www.youtube.com/watch?v=Ts5YuJo7Wkk&feature=youtu.be
Tenia un problemita, el pic lo habia programado para que me mande tres pulsos en un sentido y uno en el inverso... y me colgaba el vdj, cual era el problema? que en el device habia especificado un reporte de leds hacia el pic y no lo estaba usando. Cuando le elimine esa parte funcionó bien, ahora me falta hacer el código para los encoders. Se dan cuenta que hicimos una consola que puede competir con las comerciales que son muchisimo mas costosas? he visto de 2500 pesos!


----------



## fernandoae (Mar 12, 2012)

Rachelies como puedo leer el o los encoders sin usar interrupciones? tenés los "pasos" a seguir o algún ejemplo?


----------



## rachelies (Mar 13, 2012)

fernandoae dijo:


> Rachelies como puedo leer el o los encoders sin usar interrupciones? tenés los "pasos" a seguir o algún ejemplo?



A ver si esta noche te lo puedo hacer, que es muy fácil, pero ahora estoy en el trabajo y no llegaré hasta la noche. No se si has entendido el ejemplo que puse con interrupciones, pero yo asigno a cada combinación un número:

p1=1  es Canal A bajo, canal B bajo
p1=2      canal A alto, canal B bajo
p1=3      canal A alto, canal B alto
p1=4      canal A bajo, canal B alto

Bueno, nada más que pueda  te hago el código, que es simple.

Saludos


----------



## fernandoae (Mar 13, 2012)

Lo logré, era cuestión de pensar un poquito lo que hacia el encoder y lo que yo queria 
Con el esquema de los dos operacionales tengo un problema, que en vez de quedar las dos salidas en 0 hay una que permanece en 1... hasta que le quito el cristal al pic  no se como solucionarlo, voy a ver si conecto la pata inversora de ese operacional a un divisor resistivo en vez de ponerla directo a masa.
Con la velocidad estoy satisfecho, pero de la resolución no hablemos  mejor. Posiblemente termine utlizando un encoder óptico de un mouse, o, utilizando un motor diferente...


----------



## rachelies (Mar 13, 2012)

Bueno, me alegro que lo hayas logrado, no era muy dificil... ¿No te gusta la resolución? Hace tiempo que hice las pruebas, pero no recuerdo que me fuese mal con ello. ¿Serán todos los discos duros iguales? 
Y tampoco recuerdo si quedaban a cero las dos salidas del operacional, pero creo que no, que según parabas así se quedaban, tendria que comprobarlo otra vez.


----------



## fernandoae (Mar 13, 2012)

Calculo que no, hay algunos que tienen mas polos en el estator... y depende de eso. Pero comparado con las 40 mas o menos de un mouse es diferencia 





Respecto a lo de las salidas no se que es, pero en la pc de escritorio me quedan a 0 y en la notebook a 1


----------



## fernandoae (Mar 13, 2012)

> Bueno, nada más que pueda  te hago el código, que es simple.


Bueno, te lo agradeceria... no tanto el codigo sino la explicacion. hay algo está fallando en mi código... aparte que al no usar interrupciónes hay que usar bits para indicar que el incremento o decremento ya se envió y no lo haga en cada comparación...


----------



## fernandoae (Mar 14, 2012)

Gente estuve probando con un código que encontré que es el siguiente:

```
Interrupcion:                 '-------- Decodificador de Encoder --------------
       
    Context SAVE              ' Salva en contexto de los registros antes de operar con la
                              ' interrupción.
    
    If PORTB.0 = 1    Then    ' Si RB0 se ha puesto a 1 (flanco de subida),
       INTEDG  = 0            ' entonces activar la siguiente interrupción por flanco de
                              ' bajada.
       If PORTB.1 = 1 Then    ' Si RB1 está a 1,
          Inc x               ' entonces incrementar el contador X.
       EndIf
    Else                      ' Si RB0 se ha puesto a 0 (flanco de bajada),  
       INTEDG  = 1            ' entonces activar la siguiente interrupción por flanco de
                              ' subida.
       If PORTB.1 = 1 Then    ' Si RB1 está 1,
          Dec x               ' entonces decrementar el contador X.
       EndIf
    EndIf
     
    INTF = 0                  ' Borra el "flag" de la interrupción RB0/INT para poder permitir
                              ' la siguiente interrupción cuando ocurra. 
    Context Restore           ' Restablece el contexto de los registros tal como estaban antes
                              ' de la interrupción.
[LEFT]
```
Pero tengo un problema, si giro el encoder en un sentido todo bien, pero cuando lo giro en el otro a baja velocidad me indica el giro al revés del sentido real... alguien sabe por que puede ser? estará mal el código ese?
[/LEFT]


----------



## rachelies (Mar 15, 2012)

Ese código no termino de ver como puede funcionar, para mi que le faltan cosas. Además es con interrupciones también
Este es el que yo he hecho así rápidamente sin interrupciones:


```
x=0;
for(;;){	
	pos2=pos;

if(bit_test(PORTB,0)){
	if(bit_test(PORTB,1)) pos=3;
	else pos=2;
}
if(!(bit_test(PORTB,0))){
	if(bit_test(PORTB,1)) pos=4;
	else pos=1;
}
if (pos2!=pos){
	switch(pos){
		case 1: if(pos2==4) x++;
				else x--;
				break;
		case 2: if(pos2==1) x++;
				else x--;
				break;
		case 3: if(pos2==2) x++;
				else x--;
				break;
		case 4: if(pos2==3) x++;
				else x--;
				break;
}
}
}
```

A cada combinación de las entradas le doy un número, correspondiente a las 4 combinaciones posibles de los canales A y B. Al principio copio la posición anterior para luego comparar donde estaba. Leo la posición actual.
Si no ha cambiado, vuelo al principio.
Si ha cambiado compruebo si ha ido hacia adelante o hacia atrás, e incremento o decremento el contador.
No lo he probado, pero creo que puede funcionar. Se aceptan sugerencias, mejoras y todo lo demás.

Un saludo


----------



## fernandoae (Mar 15, 2012)

Navegando por la red encontré un muy similar, que lo estaba posteando desde la pc de escritorio... venia bien con la explicación hasta que se me cortó la luz, y de ahi me dió bronca y me fui a hacer otra cosa 
Es muy parecido al tuyo pero parece que toma dos pasos y no los cuatro posibles (11,10,01,00).
En un rato lo paso al proton, la idea ya está... se agradece el aporte compañero.
Este es el código:

viejo=actual
actual = ~PORTA & 3

If viejo= 2 And actual= 3 Then
USBBuffer[0]= %00000000
USBBuffer[1]= %00000001
GoSub DoUSBOut
USBBuffer[0]= %00000000
USBBuffer[1]= %00000000
GoSub DoUSBOut
EndIf

If viejo=3 And actual=2 Then
USBBuffer[0]= %00000000
USBBuffer[1]= %00000010
GoSub DoUSBOut
USBBuffer[0]= %00000000
USBBuffer[1]= %00000000
GoSub DoUSBOut
EndIf

Para que detecte todas las transiciones habria que hacer lo mismo para el resto de los cambios no? por ejemplo 3-2  2-1  1-0 0-3 y   0-1  1-2   2-3  3-0


----------



## rachelies (Mar 16, 2012)

Pero esa parte solo es la que detecta para que lado va y hace el envío USB, ¿no? Faltarían las otras detecciones para detectar todos las posibilidades, y antes de eso, hay que leer los pines del puerto para detectar los pulsos.


----------



## fernandoae (Mar 16, 2012)

Exactamente, y ya lo tengo solucionado, ahora no me gusta porque es demasiado sensible jaja.
Cuando esté en la otra pc subo las cosas completas, el problema que me surgió es que como en el ejemplo detectaba la transición de 3 a 2 y de 2 a 3 yo dije bueno, el resto es 0-1 1-2 etc y no, no es asi.
Con un dibujo me di cuenta  en un rato lo subo.


----------



## fernandoae (Mar 16, 2012)

Ahora si está completo y detecta todas las transiciones... el problema era que debido a la forma de leer los pines los valores no eran 0 1 2 3... sino 0 2 3 1 debido a que el "peso" del bit A es 1 y el B es 2, de esto me di cuenta cuando vi la imagen que aparece acá http://sites.google.com/site/proyec...coder-por-software/encoder-simple-con-16f628a
Asi que bueno, ya está todo funcionando, jogwheels, leds, faders, potes, botones... yo la verdad no se si voy a armar una consola, era para decir yo puedo hacer esto por mi cuenta, barato, y con la satisfacción que deja saber que es algo que hizo uno mismo 

```
'****************************************************************
'*  Name    : Conexion usb                                      *
'*  Author  : FERNANDOAE                                        *
'****************************************************************
Config_Start
   PLLDIV = 1 ; No prescale (4 MHz oscillator input drives PLL directly)
   CPUDIV = OSC1_PLL2 ; [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
   USBDIV = 2 ; USB clock source comes from the 96 MHz PLL divided by 2
   FOSC = XTPLL_XT ; XT oscillator, PLL enabled, XT used by USB
   PWRT = On ; PWRT enabled
   BOR = OFF ; Brown-out Reset disabled in hardware and software
   VREGEN = On ; USB voltage regulator enabled
   WDT = OFF ; HW Disabled - SW Controlled
   MCLRE = OFF ; RE3 input pin enabled; MCLR disabled
   PBADEN = OFF ; PORTB<4:0> pins are configured as digital I/O on Reset
   LVP = OFF ; Single-Supply ICSP disabled
   Debug = OFF ; Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
Config_End

'SELECCIONAMOS EL PIC Y LA FRECUENCIA DE TRABAJO (48Mhz PARA USB)
Device = 18F2550
Xtal = 48    
All_Digital= 1
'ESTA FILA LA GENERA EL MISMO "EASYHID USB WIZARD" Y LA COLOCA 
'JUNTO A ESTE ARCHIVO .BAS DONDE TRABAJAREMOS LA APLICACIÓN 
'(EN LA MISMA CARPETA)
USB_Descriptor = "DESCRIPTOR.inc"

'LOS TAMAÑOS DEL BUFFER USB
Symbol USBBufferSizeMax = 8
Symbol USBBufferSizeTX  = 8
Symbol USBBufferSizeRX  = 8
Dim    USBBuffer[USBBufferSizeMax] As Byte


                                                
'REGISTROS Y BANDERAS
Dim PP0 As Byte System        ' REGISTRO DENTRO DEL PIC USBPOLL STATUS
Symbol CARRY_FLAG = STATUS.0  ' EN ESTADO ALTO SI EL PIC NO TIENE 
                              ' EL CONTROL SOBRE EL BUFFER
Symbol ATTACHED_STATE = 6     ' SI USB ESTÁ CONECTADO

Clear                         'LIMPIO LA RAM AL INICIAR

 TRISA = %11111111         
 TRISB = %11111111

GoSub AttachToUSB             'ME VOY A VER SI ESTÀ CONECTADO
                              'AL INICIAR EL PROGRAMA

' *****************************************************************     
' *****************************************************************
' * LAZO PRINCIPAL DEL PROGRAMA MIENTRAS SE ESTÁ CONECTADO A USB; *
' * RECUERDA QUE DEBES MANTENER LA CONEXIÓN "VIVA" CON LLAMADOS   *
' * CONSTANTES A LAS RUTINAS USBPoll, USBIn or USBOut CADA ALGUNOS*
' * MILISEGUNDOS O MÁS                                            *
' *****************************************************************
' *****************************************************************
Dim x As Byte
Dim viejo As Byte
Dim actual As Byte

viejo=0
actual=0


INICIO:

viejo=actual
actual = ~PORTA & 3

If viejo= 0 And actual= 2 Then
GoSub incremento
EndIf
If viejo= 2 And actual= 3 Then
GoSub incremento
EndIf
If viejo= 3 And actual= 1 Then
GoSub incremento
EndIf
If viejo= 1 And actual= 0 Then
GoSub incremento
EndIf


If viejo= 1 And actual= 3 Then
GoSub decremento
EndIf
If viejo= 3 And actual= 2 Then
GoSub decremento
EndIf
If viejo= 2 And actual= 0 Then
GoSub decremento
EndIf
If viejo= 0 And actual= 1 Then
GoSub decremento
EndIf


USBIn 1, USBBuffer, USBBufferSizeRX,norecibi
norecibi:
GoTo INICIO                'CIERRO EL LAZO DESPUÉS DE TODO EL TRABAJO

' ************************************************************
' *               RUTINA DE RECEPCIÓN DE DATOS               *
' ************************************************************
DoUSBIn:
   USBIn 1, USBBuffer, USBBufferSizeRX, DoUSBIn
   Return
   
' ************************************************************
' *              RUTINA DE TRANSMISIÓN DE DATOS              *
' ************************************************************
DoUSBOut:   
   USBOut 1, USBBuffer, USBBufferSizeTX, DoUSBOut
   Return

' ************************************************************
' *           ESPERA HASTA QUE EL USB SE CONECTE             *
' ************************************************************
AttachToUSB:
   Repeat                                
   USBPoll        
   Until PP0 = ATTACHED_STATE
   Return
   
decremento:
USBBuffer[0]= %00000000
USBBuffer[1]= %00000010
GoSub DoUSBOut
USBBuffer[0]= %00000000
USBBuffer[1]= %00000000
GoSub DoUSBOut
Return

incremento:
USBBuffer[0]= %00000000
USBBuffer[1]= %00000001
GoSub DoUSBOut
USBBuffer[0]= %00000000
USBBuffer[1]= %00000000
GoSub DoUSBOut
Return
```

http://www.youtube.com/watch?v=6Tv9YiPQIRc&feature=youtu.be


----------



## rachelies (Mar 17, 2012)

¡Buen trabajo! Este lenguaje no lo entiendo muy bien, ¿cual es? 
¿Me puedes decir que siginifica esta instrucción? : 
	
	



```
actual = ~PORTA & 3
```

A mi me pasa como a tí, que no se si le daré uso a la consola, pero es un placer verlo funcionar, jejej

La mia definitivamente la voy a dejar en Midi, porque es compatible con mas software, y no me sigo comiendo la cabeza con los leds, que los dejo por imposible.

Un saludo.



Vale, ya entiendo la instrucción. He visto la web que has puesto y el código está claro en CCS. Es bastante sencillo, pero para los motores paso a paso del disco duro, mejor utilizar todas las transiciones para tener más sensibilidad, ¿no?

De todas formas, y no es por ser cabezón, prefiero utilizar interrupciones para no estar millones de ciclos esperando por algo que no llega, porque cuando no se mueve el jogwhell estás perdiendo tiempo en escanear unas entradas que no cambian.


----------



## fernandoae (Mar 17, 2012)

> ¡Buen trabajo! Este lenguaje no lo entiendo muy bien, ¿cual es?


Es el de Proton, si no me equivoco se llama Proton Basic.



> ¿Me puedes decir que siginifica esta instrucción? :      Código:
> actual = ~PORTA & 3


"~" Es para invertir los bits del puerto A(porque el encoder en reposo me da 11), o sea, no cambia el valor del puerto... solamente toma el valor invertido. Calculo que en CCS seria algo como "not porta" 
"&" es el operador AND, se utiliza como máscara, para que solo considere los valores del bit 1 y el bit 2 del puerto, por eso va un 3 en este caso... asi ignora el resto, es como decirle "mirá solamente estos dos bits".



> A mi me pasa como a tí, que no se si le daré uso a la consola, pero es un placer verlo funcionar, jejej


O también podés venderla 



> La mia definitivamente la voy a dejar en Midi, porque es compatible con  mas software, y no me sigo comiendo la cabeza con los leds, que los dejo  por imposible.


Pero si los leds los hice funcionar, fijate.

A mi me interesa el tema del midi, podrias explicar como se maneja el tema con ccs?



> pero para los motores  paso a paso del disco duro, mejor utilizar todas las transiciones para  tener más sensibilidad, ¿no?


Si, es lo mejor. Queda con muy buena sensibilidad, incluso girandolo MUUUUY lento detecta todo. 



> De todas formas, y no es por ser cabezón


 jaja



> , prefiero utilizar  interrupciones para no estar millones de ciclos esperando por algo que  no llega, porque cuando no se mueve el jogwhell estás perdiendo tiempo  en escanear unas entradas que no cambian.


Eso tambien quiero probar, de hacerlo con interrupciones. Perooo, y cuando tengo dos encoders y se mueven en simultaneo?



Ah rachelies, como es esto? que va en cada buffer?

        buf[1] = 0x90;        COMANDO
        buf[0]=buf[1]>>4; Y ACA??? QUE SE HACE Y POR QUE? 
        buf[2] = 0x00;        NOTA
        buf[3] = 0;             VELOCIDAD

Serias tan amable de explicarme como enviar CC y el resto de los comandos?


----------



## rachelies (Mar 17, 2012)

Hola.
Cuando tengas dos encoders y se muevan a la vez, en realidad no es simultaneo, porque es prácticamente imposible que el cambio de dos flancos sea exactamente en el mismo nanosegundo. Además y de esto no estoy cierto, si cuando estás en una interrupción ocurre otra, entra en la segunda al salir de la primera, pero ojo, de esto no estoy seguro. Pero de todas formas no te preocupes, que no van a llegar 2 flancos al mismo instante.

Lo del buffer midi:

buffer[0]=0x09     que significa note-on
buffer[1]=0x90     que no recuerdo porque, pero hay que invertir los nybbles

Despues la nota, y la velocidad. 

Para enviar un note-on, con la nota 1, velocidad 127 (que es el máximo) tienes que enviar 09 90 01 7F  

Un note-off sería:
08 80 01 00

Lo saqué todo del manual usb-midi que adjunto.

Para enviar los CC sería:

buf[0]=0x0B
buf[1]=0xB0
buf[2]=0x XX (cc que quieres manejar)
buf[3]=0x XX (el valor que quierer darle)

0B B0 01 00

Espero que más o menos lo vayas entendiendo.
Un saludo


----------



## fernandoae (Mar 18, 2012)

Hasta ahi va todo bien, voy entendiendo  para los potes se usa CC y para los botones las notas no? o es lo mismo?
Tenés algun ejemplo básico sobre como configurar los adc en el 18F2250 y enviarlos por midi?


----------



## rachelies (Mar 21, 2012)

Al principio del todo ponemos esto, para decirle la resolucion del ADC. 8 bits para el pitch será suficiente.

```
#device ADC=8
```
Además, en el midi solo se podrá enviar hasta el 127, así que habrá que convertir el valor leido antes de enviarlo.
Lo siguiente lo metemos ya dentro del main()

```
setup_adc_ports(AN0_TO_AN1);
setup_adc(ADC_CLOCK_INTERNAL);
```

Con esto decimos que AN0 y AN1 sean analógicos, y seleccionamos el reloj interno del adc, que para esto será suficiente.
Y por último, leemos por ejemplo el canal 0, lo convertimos al rango que envía el Midi, comprobamos si ha cambiado desde la última lectura, y si ha cambiado, lo enviamos por USB.


```
set_adc_channel(0);
delay_us(30);
tempoA1=read_adc();
tempoA11=tempoA1/2;	//convierte del rango 0xFF a 0x7F para Midi

//comprueba si ha cambiado el pitch para enviarlo			
if(tempoA11!=tempoA2)
	{	tempA[1]=0xB0;
		tempA[0]=tempA[1]>>4;
		tempA[2]=0x00;
		tempA[3]=tempoA11;
		usb_put_packet(1,tempA,4,USB_DTS_TOGGLE);
		tempoA2=tempoA11;
}
```

El byte 0 y 1 son el comando CC, el byte 2 el nº de comando y el tercer byte, el valor del potenciometro.
Espero haberte ayudado. Un saludo


----------



## Oceano (Mar 22, 2012)

Fernandoae, el código que pusistes en Proton IDE no está completo, sólo pusistes la interrupción.

El código completo para un 16F876 y que funciona mediante interrupción por RB0/INT es este:


```
Device=16F876A

REMINDERS = FALSE
     Config XT_OSC, PWRTE_ON, CPD_OFF, WDT_OFF, BODEN_OFF, LVP_OFF
REMINDERS = TRUE

Symbol INTF   = INTCON.1         ' RB0 External Interrupt Flag
Symbol INTE   = INTCON.4         ' RB0 External Interrupt Enable
Symbol GIE    = INTCON.7         ' Global Interrupt Enable
Symbol INTEDG = OPTION_REG.6     ' Flag = 0 Flanco bajada. Flag = 1 Flanco subida.

On_INTERRUPT GoTo Interrupcion   ' Interrupción por hardware (es la más rápida).

GIE    = 1                       ' Activa interrupciones generales.
INTE   = 1                       ' Activa la interrupción externa RB0/INT.
INTEDG = 1                       ' Hace que inicialmente la interrupción se dispare
                                 ' por flanco de subida.

ALL_DIGITAL = TRUE               ' Todas las entradas y salidas son digitales.
                                                                              
TRISA  = %111111
TRISB  = %11111111               ' Puerto A y B todo entradas.
TRISC  = %00000000               ' Puerto C como salida para visualizar a través de los LED.
           
Dim x As  Byte                   ' Variable X ---> contador de posición actual.

x=0                              
 
While 1=1                        ' |------ Programa Principal ------|
     
     PORTC = x                   ' El contenido de X se visualiza en el Puerto C a través de los LED.

Wend                             ' |--------------------------------|
             
End                              

    
Interrupcion:                 '-------- Decodificador de Encoder --------------
       
    Context SAVE              ' Salva en contexto de los registros antes de operar con la interrupción.
    
    If PORTB.0 = 1    Then    ' Si RB0 se ha puesto a 1 (flanco de subida),
       INTEDG  = 0            ' entonces activar la siguiente interrupción por flanco de bajada.
       If PORTB.1 = 1 Then    ' Si RB1 está a 1
          Inc x               ' entonces incrementar el contador X.
       EndIf
    EndIf
    
    If PORTB.0 = 0    Then    ' Si RB0 se ha puesto a 0 (flanco de bajada),
       INTEDG  = 1            ' entonces activar la siguiente interrupción por flanco de subida.
       If PORTB.1 = 1 Then    ' Si RB1 está 1
          Dec x               ' entonces decrementar el contador X.
       EndIf
    EndIf
     
    INTF = 0                  ' Borra el "flag" de la interrupción RB0/INT     
                              ' para poder permitir la siguiente interrupción.
    Context Restore           ' Restablece el contexto de los registros tal como estaban antes de la
                              ' interrupción.
```

Funciona de la siguiente manera: Podemos hacer que la interrupción se active con un flanco de subida o de bajada, esto es programable modificando el registro INTEDG. Cuando ocurre una interrupción por flanco de subida hemos de programar la siguiente interrupción para que se active por flanco de bajada e incrementamos el contador si RB1 está a 1. Y viceversa, si ocurre una interrupción por flanco de bajada hemos de programar la siguiente interrupción por flanco de subida y decrementamos el contador si RB1 está a 1. La única condición que ha de cumplir es que cuando ocurra la interrupción previamente programada (sea de subida o de bajada) en RB0, RB1 ha de estar a 1. No tiene más secretos y cuenta los pulsos de forma muy eficiente.

Esquema:






Por otra parte, el encoder que usas es el de un ratón, tiene muchos dientes, si eso lo colocas en un motor son muchos pulsos por vuelta y no creo que al PIC le diera tiempo de leer los pulsos. El máximo es de 5 pulsos por vuelta en un motor a toda velocidad.

Más info aquí: https://sites.google.com/site/proyectosroboticos/encoder/encoder-por-software


----------



## fernandoae (Mar 22, 2012)

Subi tantas cosas que ya ni se lo que subi jeje... pero por las dudas acá te adjunto lo de las jogwheels, más atrás subi lo de los botones y lo de los leds... completo no hay nada, estan las partes .
En cuanto pueda voy a estudiar lo de las interrupciones, ademas creo que en los pics de la serie 18F las interrupciones se manejan de forma distinta... pero en la ayuda está todo.
Y en la página que pusiste también, yo de ahi saqué varias cosas.
Este es el código para las interrupciones en el 18F4550:

```
[LEFT]Device = 18F4550  ' Usamos el PIC 18F4550, pero puedes declarar cualquiera de los 18Fxx5x.


REMINDERS = 1     ' Comunicar todos los avisos de compilación.


XTAL = 4          ' Pon el cristal que quieras; en principio usamos un cristal de 4MHz.




Symbol INTF   = INTCON.1         ' RB0 External Interrupt Flag
Symbol INTE   = INTCON.4         ' RB0 External Interrupt Enable
Symbol GIE    = INTCON.7         ' Global Interrupt Enable
Symbol INTEDG = INTCON2.6        ' Flag = 0 int. por flanco bajada. Flag = 1 int. por flanco subida.


On_INTERRUPT GoTo Interrupcion   ' Interrupción por Hardware (es la más rápida).


GIE    = 1                       ' Activa interrupciones generales.
INTE   = 1                       ' Activa la interrupción externa RB0/INT.
INTEDG = 1                       ' Hace que inicialmente la interrupción se habilite
                                 ' por flanco de subida.
ALL_DIGITAL = TRUE               ' Todas las entradas y salidas son digitales.
                                                                              
TRISA  = %11111111               ' Puerto A todo entradas, en este caso no usamos el Puerto A.
TRISB  = %11111111               ' Puerto B todo entradas, sólo usamos las entradas RB0 y RB1.
TRISC  = %11111111               ' Puerto C todo entradas, en este caso no usamos el Puerto C.
TRISD  = %00000000               ' Puerto D todo salidas  (8 bits que irán a los LEDs).
TRISE  = %11111111               ' Puerto E todo entradas, en este caso no usamos el Puerto E.          


Dim x As  Byte                   ' Variable X ---> contador de posición actual con resolución
                                 ' 0..255
x=0                              
 
While 1=1                        ' |------ Programa Principal ------|
     
     PORTD = x                   ' El contenido de X se visualiza en el Puerto D a través de
                                 ' los LED.
Wend                             ' |--------------------------------|
             
End                              


Interrupcion:                 '-------- Decodificador de Encoder --------------
       
    Context SAVE              ' Salva en contexto de los registros antes de operar con la
                              ' interrupción.
    
    If PORTB.0 = 1    Then    ' Si RB0 se ha puesto a 1 (flanco de subida),
       INTEDG  = 0            ' entonces activar la siguiente interrupción por flanco de
                              ' bajada.
       If PORTB.1 = 1 Then    ' Si RB1 está a 1,
          Inc x               ' entonces incrementar el contador X.
       EndIf
    Else                      ' Si RB0 se ha puesto a 0 (flanco de bajada),  
       INTEDG  = 1            ' entonces activar la siguiente interrupción por flanco de
                              ' subida.
       If PORTB.1 = 1 Then    ' Si RB1 está 1,
          Dec x               ' entonces decrementar el contador X.
       EndIf
    EndIf
     
    INTF = 0                  ' Borra el "flag" de la interrupción RB0/INT para poder permitir
                              ' la siguiente interrupción cuando ocurra. 
    Context Restore           ' Restablece el contexto de los registros tal como estaban antes
                              ' de la interrupción.
[/LEFT]
```

Y respecto a lo de los 5 pulsos por vuelta... eso es con cristal de 4Mhz según lo que dice, pero con el pic trabajando a 48Mhz se pueden leer más pulsos.


----------



## BrunoF (Mar 22, 2012)

Hola.

Vengo referenciado del foro Todopic. 

Primero quiero felicitarlos por el proyecto. Es muy interesante. Algún día seguramente también lo haga. aunque tal vez utilice un ARM para ello.

En cuanto a la lectura e interpretación del Quadrature, lo mejor sería utilizar dos pines de entre los [RB4-RB7] ya que ellos permiten configurar una interrupción de cambio de estado(sin importar el flanco). Por ende interrumpirían ante cualquier cambio, y sólo habría que manipular una interrupción en lugar de 2.

Con respecto al problema de tener más de una interrupción y ambas sucedan al mísmo tiempo:
Hasta la serie 16F e inferiores, sólo poseen un nivel de prioridad de interrupciones, por lo que se levantarían ambos flags a la vez, y se ingresaría al vector de interrupción(0x004) y el código del usuario sería quien elija cuál de ambas se atiende primero según el orden ingresado(en caso de utilizar un compilador el orden será elegido por defecto por el compilador, aunque por lo general permiten especificar el orden de atención de las interrupciones). 
En la serie 18F y superiores ya aparecen niveles de prioridad, en el caso de los 18F, uno puede elegir seleccionar ciertas interrupciones como de baja prioridad y otras como de alta. En caso de tener dos interrupciones que se produzcan a la vez pero ambas están configuradas con el mísmo nivel de prioridad(sea tanto bajo como alto) se aplicaría el caso que explico anteriormente. 

En caso de que una sea configurada con nivel bajo y la otra con alto:

De producirse ambas exáctamente a la vez, se atenderá primero a la alta y luego se atenderá la baja.
En caso de producirse la alta mientras el uC está atendiendo la baja, se interrumple la baja, se atiende la alta y se la procesa. Luego una vez que se sale de la alta, se continúa con la baja, siempre y cuando no vuelva a ocurrir una de alto nivel.
En caso de producirse una baja mientras se atiende una alta, sólo una vez que se retorna de la alta se atenderá a la baja.

Digamos que como bien dice la palabra "prioridad", lo que está más arriba puede interrumpir a lo que está más abajo, pero no al reves.
Interrupción alta prioridad
Interrupción baja prioridad
Flujo de código normal​P.D. Los jogwheel estaría bueno hacerlos con ruedas capacitivas, no?

Saludos.


----------



## fernandoae (Mar 22, 2012)

Ahora está más claro lo de las interrupciones 



> P.D. Los jogwheel estaría bueno hacerlos con ruedas capacitivas, no?


Yo cuando tenga tiempo voy a ver si hago algo asi, busca en google, con un pin y una resistencia se puede hacer, creo que hay que poner el pin a 1, esperar 5 useg y leer la entrada...
Yo tengo ganas de hacer un teclado midi capacitivo ahora que ya están las bases del midi con el 18f2550 y funciona. Cualquier novedad les comento.

Justo encontré el link http://mondo-technology.com/touch.html


----------



## BrunoF (Mar 22, 2012)

Hay muchos uC PIC que ya traen la posibilidad de funcionar capacitivamente con algunas de sus entradas para realizar botones, teclados multiplexados, etc. Hay muchos tipos de sensado, y depende del uC(si son modelos viejitos o más nuevos, que traen módulos específicos). 

Más info en: http://www.microchip.com/pagehandler/en_us/technology/mtouch/


----------



## fernandoae (Mar 22, 2012)

Si pero los pics con Mtouch son un poco dificiles de conseguir, mirá esta técnica:
http://www.pic24.ru/doku.php/en/osa/articles/pk2_osa_piano
Son 36 teclas con sensado capacitivo, cuando me haga un tiempito para la Electrónica voy a realizar pruebas sobre el tema para hacer algo como esto 



una matriz de botones táctiles midi.


----------



## rachelies (Mar 23, 2012)

BrunoF dijo:


> En cuanto a la lectura e interpretación del Quadrature, lo mejor sería utilizar dos pines de entre los [RB4-RB7] ya que ellos permiten configurar una interrupción de cambio de estado(sin importar el flanco). Por ende interrumpirían ante cualquier cambio, y sólo habría que manipular una interrupción en lugar de 2.



Sería lo ideal, pero esas entradas son las que se utilizan para los botones.

Saludos y gracias por las aportaciones.



No sé si el video será de vuestro gusto, pero aquí podeis ver lo que se puede llegar a hacer con el midi. Aguantad hasta el minuto 4:15 para ver lo que hace.





Este tipo antes solo utilizada un pad midi Akay, y viendolo fue lo que me llevó a plantearme el controlador midi, y que sería posible hacerlo en casa, jejeje


----------



## fernandoae (Mar 23, 2012)

> *BrunoF* dijo:                     _
> 
> _
> En  cuanto a la lectura e interpretación del Quadrature, lo mejor sería  utilizar dos pines de entre los [RB4-RB7] ya que ellos permiten  configurar una interrupción de cambio de estado(sin importar el flanco).  Por ende interrumpirían ante cualquier cambio, y sólo habría que  manipular una interrupción en lugar de 2.​
> ...


Pero se pueden usar otras, o si queremos también podemos usar un ic con entrada paralela y salida serie como el *74ls165 (8-bit parallel-in/serial out shift register)* y leer los botones que queramos usando solamente 3 pines..


----------



## fernandoae (Mar 26, 2012)

Rachelies me das una mano, necesito leer 8 canales adc del pic18f2550, ir muestreandolos lo mas rapido posible y detectar los picos... o sea, ver mientras va aumentando la tension y cuando empieza a bajar enviar un note on con un volumen proporcional al maximo detectado. Probè con los códigos que has subido pero no puedo compilarlo...


----------



## rachelies (Abr 3, 2012)

Hola!!
Perdón por la tardanza, pero estuve unos cuantos días fuera de casa. Déjame un día o 2 para ir preparando un código más o menos.
Nunca emplee el A/D para algo muy rápido, así que será una buena oportunidad para llevarlo al límite, jejejeje.
Según lo que he calculado, creo que puede llegar a escanear una entrada cada 4us. Teniendo 8 entradas, una misma entrada la leerá cada 32us, ¿es suficiente?
Bueno, me pongo con el código y cuando lo tenga lo pego aquí.
Saludos



Aquí tengo un código que hay que probar:


```
#include <18F2550.h>
#device ADC=8
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)

#DEFINE USB_HID_DEVICE     FALSE
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK  //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP2_RX_ENABLE  USB_ENABLE_BULK  //turn on EP1 for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    64  //size to allocate for the tx endpoint 1 buffer
#define USB_EP2_RX_SIZE    64   //size to allocate for the rx endpoint 1 buffer

#include <pic18_usb.h>
#include <.\include\midi7.h>
#include <usb.c>           //handles usb setup tokens and get descriptor reports

int a1,a2,b1,b2,c1,c2,d1,d2,e1,e2; //variables para guardar
int f1,f2,g1,g2,h1,h2; //cada entrada, y el valor anterior
int envia[4];  //buffer para enviar las notas

void envia_nota()
{	usb_put_packet(1,envia,4,USB_DTS_TOGGLE);
}

void main(void)
{	a1=a2=b1=b2=c1=c2=d1=d2=e1=e2=f1=f2=g1=g2=h1=h2=0;
	envia[1]=0x90;
	envia[0]=envia[1]>>4;
	setup_adc_ports(ALL_ANALOG);  //todas las entradas analogicas
	setup_adc(ADC_CLOCK_DIV_16);  //dividimos el reloj por 16, para tener
			//un tiempo de conversion de 1.33us
	for(;;)
	{	set_adc_channel(0);
		a2=a1;
		delay_us(3);
		a1=read_adc();
		if(a2>a1)
			{	envia[2]=0x00; //nota 0
				envia[3]=(a2/2);
				envia_nota();
			}
		
		set_adc_channel(1);
		b2=b1;
		delay_us(3);
		b1=read_adc();
		if(b2>b1)
			{	envia[2]=0x01; //nota 1
				envia[3]=(b2/2);
				envia_nota();
			}

		set_adc_channel(2);
		c2=c1;
		delay_us(3);
		c1=read_adc();
		if(c2>c1)
			{	envia[2]=0x02; //nota 2
				envia[3]=(c2/2);
				envia_nota();
			}
	
		set_adc_channel(3);
		d2=d1;
		delay_us(3);
		d1=read_adc();
		if(d2>d1)	
			{	envia[2]=0x03; //nota 3
				envia[3]=(d2/2);
				envia_nota();
			}

		set_adc_channel(4);
		e2=e1;
		delay_us(3);
		e1=read_adc();
		if(e2>e1)	
			{	envia[2]=0x04; //nota 4
				envia[3]=(e2/2);
				envia_nota();
			}
	
		set_adc_channel(8);
		f2=f1;
		delay_us(3);
		f1=read_adc();
		if(f2>f1)
			{	envia[2]=0x05; //nota 5
				envia[3]=(f2/2);
				envia_nota();
			}

		set_adc_channel(9);
		g2=g1;
		delay_us(3);
		g1=read_adc();
		if(g2>g1)	
			{	envia[2]=0x06; //nota 6
				envia[3]=(g2/2);
				envia_nota();
			}

		set_adc_channel(10);
		h2=h1;
		delay_us(3);
		h1=read_adc();
		if(h2>h1)
			{	envia[2]=0x07; //nota 7
				envia[3]=(h2/2);
				envia_nota();
			}

	}
}
```

Hay que tener en cuenta:
-Configuro el ADC a 8 bits, ya que luego el volumen de la nota tendrá que tener 7 bits, así que 8 en principio sobran.
-Donde pongo 
	
	



```
#include <.\include\midi7.h>
```
 hay que poner la ruta donde tienes tu propio descriptor midi.

Pruebalo y comenta las dudas y problemas. Yo lo he compilado y no me da errores.

Un saludo


----------



## fernandoae (Abr 3, 2012)

Mil gracias, vamos a ver si sale el invento, para los que se pregunten que es lo que quiero hacer : http://es.wikipedia.org/wiki/Batería_electrónica
Un "E-drum" 
Ahora tendria que analizar o màs bien PROBAR los valores de estos componentes para acondicionar la señal de los piezos.


----------



## fernandoae (Abr 3, 2012)

Ah porque en este código no va esto?

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use fast_io(A)

Me lo compila bien y todo pero no lo detecta la pc, que puede ser?
Aparecia un define en rojo... lo escribi en minusculas y quedo bien.

Y yo quiero utilizar un cristal de 4Mhz y deshabilitar el pin MCLR, esta bien esto que hice?:
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NOMCLR,NODEBUG,USBDIV,PLL1,VREGEN

Adjunto lo que tengo hecho a ver si detectas los problemas 

#include <18F2550.h>
#device ADC=8
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NOMCLR,NODEBUG,USBDIV,PLL1,VREGEN      //~~~ 4MHZ OSCILLATOR CONFIGS ~~~//
#use delay(clock=48000000)

#define USB_HID_DEVICE     FALSE
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK  //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP2_RX_ENABLE  USB_ENABLE_BULK  //turn on EP1 for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    64  //size to allocate for the tx endpoint 1 buffer
#define USB_EP2_RX_SIZE    64   //size to allocate for the rx endpoint 1 buffer

#include <pic18_usb.h>
#include <midi7.h> //USB Configuration and Device descriptors for this UBS device
#include <usb.c>           //handles usb setup tokens and get descriptor reports

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use fast_io(A)

int a1,a2,b1,b2,c1,c2,d1,d2,e1,e2; //variables para guardar
int f1,f2,g1,g2,h1,h2; //cada entrada, y el valor anterior
int envia[4];  //buffer para enviar las notas

void envia_nota()
{    usb_put_packet(1,envia,4,USB_DTS_TOGGLE);
}

void main(void)
{    a1=a2=b1=b2=c1=c2=d1=d2=e1=e2=f1=f2=g1=g2=h1=h2=0;
    envia[1]=0x90;
    envia[0]=envia[1]>>4;
    setup_adc_ports(ALL_ANALOG);  //todas las entradas analogicas
    setup_adc(ADC_CLOCK_DIV_16);  //dividimos el reloj por 16, para tener
            //un tiempo de conversion de 1.33us
    for(;
    {    set_adc_channel(0);
        a2=a1;
        delay_us(3);
        a1=read_adc();
        if(a2>a1)
            {    envia[2]=0x00; //nota 0
                envia[3]=(a2/2);
                envia_nota();
            }

        set_adc_channel(1);
        b2=b1;
        delay_us(3);
        b1=read_adc();
        if(b2>b1)
            {    envia[2]=0x01; //nota 1
                envia[3]=(b2/2);
                envia_nota();
            }

        set_adc_channel(2);
        c2=c1;
        delay_us(3);
        c1=read_adc();
        if(c2>c1)
            {    envia[2]=0x02; //nota 2
                envia[3]=(c2/2);
                envia_nota();
            }

        set_adc_channel(3);
        d2=d1;
        delay_us(3);
        d1=read_adc();
        if(d2>d1)    
            {    envia[2]=0x03; //nota 3
                envia[3]=(d2/2);
                envia_nota();
            }

        set_adc_channel(4);
        e2=e1;
        delay_us(3);
        e1=read_adc();
        if(e2>e1)    
            {    envia[2]=0x04; //nota 4
                envia[3]=(e2/2);
                envia_nota();
            }

        set_adc_channel(8);
        f2=f1;
        delay_us(3);
        f1=read_adc();
        if(f2>f1)
            {    envia[2]=0x05; //nota 5
                envia[3]=(f2/2);
                envia_nota();
            }

        set_adc_channel(9);
        g2=g1;
        delay_us(3);
        g1=read_adc();
        if(g2>g1)    
            {    envia[2]=0x06; //nota 6
                envia[3]=(g2/2);
                envia_nota();
            }

        set_adc_channel(10);
        h2=h1;
        delay_us(3);
        h1=read_adc();
        if(h2>h1)
            {    envia[2]=0x07; //nota 7
                envia[3]=(h2/2);
                envia_nota();
            }

    }
}


----------



## rachelies (Abr 4, 2012)

Hola:
Lo del MCLR está bien, pero ten en cuenta que esto te habilita el pin E3 como entrada, y esto no se puede cambiar, así que ponlo a masa para no tener problemas.
Lo del #use rs232 no se muy bien para que es, pero añadelo a ver. 
Los fuses los tienes bien para un cristal de 4Mhz.
Y el usb no te lo detecta porque me faltó añadirte alguna cosa, ahora me doy cuenta, jjajajaja.

Después del "void main..." hay que definir los pines analogicos del puerto A y B como entradas
	
	



```
set_tris_A(0b00101111);	
	set_tris_B(0b00001110);
```
Después de los "setup_adc....", añade 
	
	



```
usb_init_cs();
usb_task();
```
y después del "for(;, añade

```
if(usb_enumerated()){
```
y pon otro 
	
	



```
}
```
abajo del todo del código.
Al principio del código pon tambien 
	
	



```
#use_fast_io(B)
```
Pruébalo y a ver si te funciona.


----------



## fernandoae (Abr 4, 2012)

Gracias por la ayuda, pero sigue sin funcionar  ahora por lo menos me dice que no se reconoce el dispositivo usb. La verdad no se si es problema del código o del pickit y las palabras de configuración :cabezon: esto es lo que quedó: 
	
	



```
#include <18F2550.h>
#device ADC=8
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NOMCLR,NODEBUG,USBDIV,PLL1,VREGEN      //~~~ 4MHZ OSCILLATOR CONFIGS
#use delay(clock=48000000)

#define USB_HID_DEVICE     FALSE
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK  //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP2_RX_ENABLE  USB_ENABLE_BULK  //turn on EP1 for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    64  //size to allocate for the tx endpoint 1 buffer
#define USB_EP2_RX_SIZE    64   //size to allocate for the rx endpoint 1 buffer

#include <pic18_usb.h>
#include <descriptors.h>   //USB Configuration and Device descriptors for this UBS device
#include <usb.c>           //handles usb setup tokens and get descriptor reports

#use fast_io(A)
#use fast_io(B)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

int a1,a2,b1,b2,c1,c2,d1,d2,e1,e2; //variables para guardar
int f1,f2,g1,g2,h1,h2; //cada entrada, y el valor anterior
int envia[4];  //buffer para enviar las notas

void envia_nota()
{   usb_put_packet(1,envia,4,USB_DTS_TOGGLE);
}

void main(void)
{ 

   a1=a2=b1=b2=c1=c2=d1=d2=e1=e2=f1=f2=g1=g2=h1=h2=0;
   envia[1]=0x90;
   envia[0]=envia[1]>>4;
   setup_adc_ports(ALL_ANALOG);  //todas las entradas analogicas
   setup_adc(ADC_CLOCK_DIV_16);  //dividimos el reloj por 16, para tener un tiempo de conversion de 1.33us
   usb_init_cs();
   usb_task();

 for(;;)
 if(usb_enumerated()){

   {   set_adc_channel(0);
      a2=a1;
      delay_us(3);
      a1=read_adc();
      if(a2>a1)
         {   envia[2]=0x00; //nota 0
            envia[3]=(a2/2);
            envia_nota();
         }
      
      set_adc_channel(1);
      b2=b1;
      delay_us(3);
      b1=read_adc();
      if(b2>b1)
         {   envia[2]=0x01; //nota 1
            envia[3]=(b2/2);
            envia_nota();
         }

      set_adc_channel(2);
      c2=c1;
      delay_us(3);
      c1=read_adc();
      if(c2>c1)
         {   envia[2]=0x02; //nota 2
            envia[3]=(c2/2);
            envia_nota();
         }
   
      set_adc_channel(3);
      d2=d1;
      delay_us(3);
      d1=read_adc();
      if(d2>d1)   
         {   envia[2]=0x03; //nota 3
            envia[3]=(d2/2);
            envia_nota();
         }

      set_adc_channel(4);
      e2=e1;
      delay_us(3);
      e1=read_adc();
      if(e2>e1)   
         {   envia[2]=0x04; //nota 4
            envia[3]=(e2/2);
            envia_nota();
         }
   
      set_adc_channel(8);
      f2=f1;
      delay_us(3);
      f1=read_adc();
      if(f2>f1)
         {   envia[2]=0x05; //nota 5
            envia[3]=(f2/2);
            envia_nota();
         }

      set_adc_channel(9);
      g2=g1;
      delay_us(3);
      g1=read_adc();
      if(g2>g1)   
         {   envia[2]=0x06; //nota 6
            envia[3]=(g2/2);
            envia_nota();
         }

      set_adc_channel(10);
      h2=h1;
      delay_us(3);
      h1=read_adc();
      if(h2>h1)
         {   envia[2]=0x07; //nota 7
            envia[3]=(h2/2);
            envia_nota();
         }

   }
}
}
```

Será algo con el "void envia_nota" que está antes del main? capaz que se cuelga ahi.


----------



## fernandoae (Abr 4, 2012)

Ya consegui hacerlo funcionar partiendo del código ese que enviaba note on y note off .
Rachelies me preguntabas si leer entradas cada 32useg es suficiente? SI, y sobra, me crea un overflow :enfadado: 
Habra alguna forma de impedir que envie notas tan rapido sin dejar de leer las otras entradas? a mi se me ocurre que se puede hacer usando contadores y una interrupcion que los vaya decrementando... por ej, al golpear un pad el contador se pone a 255 y se impide enviar nuevamente esa nota hasta que llegue a 0...


```
#include <18F2550.h>
#device ADC=8
#fuses HSPLL,NOWDT,NOPROTECT,NOMCLR,NOLVP,NODEBUG,USBDIV,PLL1,VREGEN      //~~~ 4MHZ OSCILLATOR CONFIGS ~~~//
#use delay(clock=48000000)

#DEFINE USB_HID_DEVICE     FALSE
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK  //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP2_RX_ENABLE  USB_ENABLE_BULK  //turn on EP1 for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    64  //size to allocate for the tx endpoint 1 buffer
#define USB_EP2_RX_SIZE    64   //size to allocate for the rx endpoint 1 buffer

#include <pic18_usb.h>
#include <descriptors.h>   //USB Configuration and Device descriptors 
#include <usb.c>           //handles usb setup tokens and get descriptor reports

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use fast_io(A)
#use fast_io(B)

int a1,a2,b1,b2,c1,c2,d1,d2,e1,e2; //variables para guardar
int f1,f2,g1,g2,h1,h2; //cada entrada, y el valor anterior
int envia[4];  //buffer para enviar las notas

void envia_nota()
{   usb_put_packet(1,envia,4,USB_DTS_TOGGLE);
}

void main(void) {
   
   a1=a2=b1=b2=c1=c2=d1=d2=e1=e2=f1=f2=g1=g2=h1=h2=0;
   envia[1]=0x90;
   envia[0]=envia[1]>>4;
   setup_adc_ports(ALL_ANALOG);  //todas las entradas analogicas
   setup_adc(ADC_CLOCK_DIV_16);
   usb_init_cs();

   while (TRUE) {
      usb_task();

      if(usb_enumerated()) 
    {

      {   set_adc_channel(0);
      a2=a1;
      delay_us(3);
      a1=read_adc();
      if(a2>(a1+5))
         {   envia[2]=0x25; //nota 0
            envia[3]=(a2/2);
            envia_nota();
         }                  
      }
   }
   }
}
```


----------



## rachelies (Abr 4, 2012)

Se puede hacer que las lea más despacio, porque si haces lo de los contadores como dices, a lo mejor pierdes otros picos que han de ser enviados y no los dejas enviar, ¿no?
Cambia el "delay_us(3)" por otro valor más alto, para esperar más tiempo antes de leer la entrada analógica.
Aunque también se me ocurre que no puede enviar un pico si no es superior al valor anterior de medida.
No se, habría que estudiarlo, pero mejor de momento pruebas a subir el valor de retardo ese.
¿No crees que sería mejor abrir otro hilo con otro título para tratar este tema aparte del controlador midi? Aunque se apoye en la base del controlador creo que sería mejor separarlos.
Un saludo y a ver si dentro de unas horas tengo más tiempo para probar tu código y ver como podemos optimizarlo.


----------



## fernandoae (Abr 4, 2012)

Lo voy a hacer con el código asi, tengo que ver como acondiciono mejor la señal de entrada para que no me dispare muchas veces, tengo que mejorar el circuito de "peak and hold" 
Después capaz que armó un hilo nuevo para este invento, agradezco mucho la ayuda que me brindaste con el CCS


----------



## rachelies (Abr 5, 2012)

Todos aprendemos algo de todos, jejeje
Como te dije, si envia muchas veces es que detecta muchos picos, a lo mejor hay que filtrar de algún modo la señal de entrada


----------



## rodrigo_6 (Abr 6, 2012)

hola amigos que tal como les va. bueno me uno al proyecto jeje. yo recien lo estoy por armar. no tengo nada de los componentes requeridos para tal proyecto recien estoy en la face investigativa. el que quiera colaborar con algo. por ejemplo codigo de los botones y demas o cualq otra cosa le agradecere. 
una cosulta. en la imagen que adjunto, que significa ese recuadro grande arriba a la derecha y los esquemitas de abajo? que son? bueno y otra por que estan con X (equis) esas salidas??

saludos!!!

por cierto que tal van con su controlador??? ya terminaron??


----------



## fernandoae (Abr 6, 2012)

Ya está funcionando, te recomiendo que leas el tema completo con atención para comprender mejor, saludos


----------



## rodrigo_6 (Abr 6, 2012)

hola fernando gracias. mira te explico.

con tantos codigos ya me mareé y mucho jejeje.  mira lo que yo trato es simplemente de ver si pueden esclarecer, osea. resumir, si se quiere lo que se ha  hecho en este topic. no por mi, sino para todos los futuros emprendedores de este proyecto. osea
yo para ir guiandome mas claramente porque les soy sincero no se de programacion, algo se casi nada. ni me acuerdo el programa con el que me enseñaron jeje. bueno. espero no ser molestia porque la verdad que no me gusta pedir cosas. quisiera por favor si son tan amables alguien pueda recopilar cada dato, codigo, truco, etc.. que funcione, les agradeceria eternamente. como les iba diciendo no les pediria esto si en verdad no lo quisiera realizar..
se juntaron mis dos pasiones: el djing y la electronica.


muchas gracias por su colaboracion y dedicacion a todos!!


----------



## fernandoae (Abr 6, 2012)

Es que está más o menos resumido  en cada codigo que ves acá se explica una forma de hacer algo, por ejemplo leer un boton, leer un potenciometro, enviar un comando desde la pc para contolar leds, interpretar las jogwheels... y se trató en dos "formas" diferentes: HID (que es compatible con menos programas pero muchisimo mas veloz) y la otra forma es MIDI, que es ampliamente reconocido por los programas de musica, sintetizadores, etc.
Eso es en cuanto a la manera que la pc detecta la consola, despues para programar el microcontrolador pic hay dos formas: en PROTON IDE y en CCS...
Te comento que vas a tener que leer bastante bastante para entender todos los conceptos, y por si recién comenzás en esto de la electronica te comento que los microcontroladores por si solos no hacen nada, son una especie de computadoras por decirlo de alguna manera a las cuales hay que cargarles el programa para indicarle la tarea que deben realizar por medio de un "programador-quemador-etc".
Esto te lo aclaro porque hay mucha gente que recien empieza y cree que cada micro ya realiza la función especifica para ese circuito 



PD: Cuando encontré este tema no sabia hacer programas en CCS, y ahora... tampoco jaja, pero ya tengo muchos mas conocimientos y me defiendo. Me bajé un manual y empece a leerlo de a poco, esa es la forma de aprender


----------



## rodrigo_6 (Abr 6, 2012)

me gustaria levantarlo con el virtual dj.. osea.. cualquier duda, consulta la comento aca. bueno hora de irse estate en contacto. estense en contact. nos vemos.


-> es este el codigo que tengo que cargar en el pic y nada mas?? por favor ayudame  estoy confundido!! no se nada de nada.. de programacion, por eso. je. diganme si necesito algo mas para quefuncione OK.
otra cosa. 

1- lo puedo grabar en un 18f2455 como lo hico rache.-- ???
2- yo en vez de usar el ENC A y ENC B voy a utilizar dos cositos de los mouses mecanicos. tengo dos "engranajes" y dos pares de led y fototransistor. como los uno al proyecto??? necesito algo mas?? muchas gracias.


```
'****************************************************************
'*  Name    : Conexion usb                                      *
'*  Author  : FERNANDOAE                                        *
'****************************************************************
Config_Start
   PLLDIV = 1 ; No prescale (4 MHz oscillator input drives PLL directly)
   CPUDIV = OSC1_PLL2 ; [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
   USBDIV = 2 ; USB clock source comes from the 96 MHz PLL divided by 2
   FOSC = XTPLL_XT ; XT oscillator, PLL enabled, XT used by USB
   PWRT = On ; PWRT enabled
   BOR = OFF ; Brown-out Reset disabled in hardware and software
   VREGEN = On ; USB voltage regulator enabled
   WDT = OFF ; HW Disabled - SW Controlled
   MCLRE = OFF ; RE3 input pin enabled; MCLR disabled
   PBADEN = OFF ; PORTB<4:0> pins are configured as digital I/O on Reset
   LVP = OFF ; Single-Supply ICSP disabled
   Debug = OFF ; Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
Config_End

'SELECCIONAMOS EL PIC Y LA FRECUENCIA DE TRABAJO (48Mhz PARA USB)
Device = 18F2550
Xtal = 48    
All_Digital= 1
'ESTA FILA LA GENERA EL MISMO "EASYHID USB WIZARD" Y LA COLOCA 
'JUNTO A ESTE ARCHIVO .BAS DONDE TRABAJAREMOS LA APLICACIÓN 
'(EN LA MISMA CARPETA)
USB_Descriptor = "DESCRIPTOR.inc"

'LOS TAMAÑOS DEL BUFFER USB
Symbol USBBufferSizeMax = 8
Symbol USBBufferSizeTX  = 8
Symbol USBBufferSizeRX  = 8
Dim    USBBuffer[USBBufferSizeMax] As Byte


                                                
'REGISTROS Y BANDERAS
Dim PP0 As Byte System        ' REGISTRO DENTRO DEL PIC USBPOLL STATUS
Symbol CARRY_FLAG = STATUS.0  ' EN ESTADO ALTO SI EL PIC NO TIENE 
                              ' EL CONTROL SOBRE EL BUFFER
Symbol ATTACHED_STATE = 6     ' SI USB ESTÁ CONECTADO

Clear                         'LIMPIO LA RAM AL INICIAR

 TRISA = %11111111         
 TRISB = %11111111

GoSub AttachToUSB             'ME VOY A VER SI ESTÀ CONECTADO
                              'AL INICIAR EL PROGRAMA

' *****************************************************************     
' *****************************************************************
' * LAZO PRINCIPAL DEL PROGRAMA MIENTRAS SE ESTÁ CONECTADO A USB; *
' * RECUERDA QUE DEBES MANTENER LA CONEXIÓN "VIVA" CON LLAMADOS   *
' * CONSTANTES A LAS RUTINAS USBPoll, USBIn or USBOut CADA ALGUNOS*
' * MILISEGUNDOS O MÁS                                            *
' *****************************************************************
' *****************************************************************
Dim x As Byte
Dim viejo As Byte
Dim actual As Byte

viejo=0
actual=0


INICIO:

viejo=actual
actual = ~PORTA & 3

If viejo= 0 And actual= 2 Then
GoSub incremento
EndIf
If viejo= 2 And actual= 3 Then
GoSub incremento
EndIf
If viejo= 3 And actual= 1 Then
GoSub incremento
EndIf
If viejo= 1 And actual= 0 Then
GoSub incremento
EndIf


If viejo= 1 And actual= 3 Then
GoSub decremento
EndIf
If viejo= 3 And actual= 2 Then
GoSub decremento
EndIf
If viejo= 2 And actual= 0 Then
GoSub decremento
EndIf
If viejo= 0 And actual= 1 Then
GoSub decremento
EndIf


USBIn 1, USBBuffer, USBBufferSizeRX,norecibi
norecibi:
GoTo INICIO                'CIERRO EL LAZO DESPUÉS DE TODO EL TRABAJO

' ************************************************************
' *               RUTINA DE RECEPCIÓN DE DATOS               *
' ************************************************************
DoUSBIn:
   USBIn 1, USBBuffer, USBBufferSizeRX, DoUSBIn
   Return
   
' ************************************************************
' *              RUTINA DE TRANSMISIÓN DE DATOS              *
' ************************************************************
DoUSBOut:   
   USBOut 1, USBBuffer, USBBufferSizeTX, DoUSBOut
   Return

' ************************************************************
' *           ESPERA HASTA QUE EL USB SE CONECTE             *
' ************************************************************
AttachToUSB:
   Repeat                                
   USBPoll        
   Until PP0 = ATTACHED_STATE
   Return
   
decremento:
USBBuffer[0]= %00000000
USBBuffer[1]= %00000010
GoSub DoUSBOut
USBBuffer[0]= %00000000
USBBuffer[1]= %00000000
GoSub DoUSBOut
Return

incremento:
USBBuffer[0]= %00000000
USBBuffer[1]= %00000001
GoSub DoUSBOut
USBBuffer[0]= %00000000
USBBuffer[1]= %00000000
GoSub DoUSBOut
Return
```

miren estas fotos. seria posible conectar estos botones cue y play (de las denon) a este controlador??? alguien sabe como son los contactos de las denon por dentro de estas gomitas??

estoy colaborando jejejje.

A alguien le funciona con el virtual dj??

saludoos!


----------



## rachelies (Abr 7, 2012)

Hola!! A mí me funciona en el Virtual dj tanto en midi como en HID, pero en HID no fui capaz de hacer funcionar los leds, así que lo dejé en midi ,que así tambien me funciona con el Traktor.
Te explico del esquema:
Lo de arriba a la derecha es la matriz de botones, 32 botones, como está conectados y que nombre tienen. Lo de las X en verde, es que a la hora de hacerlo funcionar no las tuve que poner, aunque en teoría y en todos los esquemas salen dibujados.
Esos circuitos de abajo, son expansores de salidas, porque con el PIC no tenía bastantes salidas, y utilicé estos expansores de salidas que se conectan con I2C al PIC. Son los que utilizo para los leds.
Lo de los botones de los denon supongo que funcionarán, no dejarán de ser un contacto.

Y en cuanto a código, no creo que hay posteado ninguno completo, porque yo no tengo ninguno hecho entero, son todo trozos de código de ir probando cada parte por separado. Ahora que ya estoy con lo último voy uniendo los trozos para hacerlo funcionar entero.
Tienes que saber lo que quieres hacer para ir adaptándote los códigos a lo que vayas a hacer, porque cada uno de los del foro lo debimos de hacer diferente, jajajjaja.

Venga, empieza poco a poco y ve comprendiendo cada parte por separado verás como lo sacas.
Yo te animaría a empezar con los botones, montando una placa para pruebas y paciencia!!!

Un saludo


----------



## rodrigo_6 (Abr 7, 2012)

rachelies dijo:


> Lo de arriba a la derecha es la matriz de botones, 32 botones, como está conectados y que nombre tienen.



ah, esta bien. mirando el esquema: mi duda es esta;

la salida de RA2 se conecta al K del led y el A de este se conecta a un pulsador NA y este a la entrada del RB7.

Es eso correcto??



> Lo de las X en verde, es que a la hora de hacerlo funcionar no las tuve que poner, aunque en teoría y en todos los esquemas salen dibujados.



Ok, entonces esos dos pines (RB3 y RBL) las coloco directamentea los PCF, no? por cierto que es eso escrito en rojo?? que dicen?



> Esos circuitos de abajo, son expansores de salidas, porque con el PIC no tenía bastantes salidas, y utilicé estos expansores de salidas que se conectan con I2C al PIC. Son los que utilizo para los leds.



ah esta bien, esos Enc A y Enc B son *encoders*, no?
esta bien, lo que no entiendo es que funcion cumplen esos PCF8574N jeje..
y otra cosita mi plan es colocarle las rueditas dentadas de un mouse mecanico. ya las tengo y con sus respectivos led y fototransist.  entonces es necesario si o si colocarle esos PCF y encoders que dibujaste?



> Y en cuanto a código, no creo que hay posteado ninguno completo, porque yo no tengo ninguno hecho entero, son todo trozos de código de ir probando cada parte por separado. Ahora que ya estoy con lo último voy uniendo los trozos para hacerlo funcionar entero.



Ok, hare lo posible por hacerlo funcionar.



> Venga, empieza poco a poco y ve comprendiendo cada parte por separado verás como lo sacas.
> Yo te animaría a empezar con los botones, montando una placa para pruebas y paciencia!!!



bueno, esta bien, voy a ver que es lo que me sale. jejeje.


pregunta: en esos codigos que postearon, los programaron para que se encienda el led del boton play cuando se acciona el boton y el del cue para lo mismo??? y el play parpadea cuando se pausea la cancion?

muchisimas gracias a todos por su tiempo!!!

EDIT: 
P2°- el cristal es de 48 Mhz? por que tanto? he leido sobre las jogwheels que madan muchos datos al pic acaso es por ese motivo?
P3°- El componente dibujado arriba del pic a la izquierda que vendria a ser?? ya se donde va conectado pero no se lo que es . jejee.




Saludoss..


----------



## fernandoae (Abr 7, 2012)

> P2°- el cristal es de 48 Mhz? por que tanto? he leido sobre las jogwheels que madan muchos datos al pic acaso es por ese motivo?


El cristal que se utiliza es de 4-8-12... Mhz, lo que hace el pic internamente es multiplicar la fecuencia del cristal para tener una frecuencia mayor para manejar el tema del usb.
El código está por partes para que vayamos comprendiendo como se hace cada cosa y despùes cada uno lo adapte a sus necesidades para tener una consola personalizada a gusto de cada uno, por eso no hay un código que haga todo, por ejemplo, capaz que yo quiero una consola de 60 botones con 5 leds y rachelies quiere una con 10 botones 15 leds y 2 faders... y ahi bueno, cada uno va juntando pedacitos de todo lo del tema y la hace a su manera 
Te recomiendo que empieces a estudiar el tema de programación en Proton Ide que es el mas sencillo, después segui con CCS, es algo que si o si tenes que saber para poder continuar con esto.
Y si querés algo hecho podés probar con lo de esta página http://ucapps.de/ 



> Hola!! A mí me funciona en el Virtual dj tanto en midi como en HID, pero  en HID no fui capaz de hacer funcionar los leds, así que lo dejé en  midi ,que así tambien me funciona con el Traktor.


Hey compañero Rachelies! si yo lo logré y hasta subi un videito, arrancá con eso, lo unico que no me quedó del todo claro es el tema de la posición en los bytes del reporte (hacelo por prueba y error hasta que enganches el primero).


----------



## rodrigo_6 (Abr 7, 2012)

Gracias por responder.



> si querés algo hecho podés probar con lo de esta página http://ucapps.de/



que serian esos?

otra cosa no menorr..

en donde se conecta el auricular??? todo controlador tiene esa salida de audio para el auric.

jejeje.


----------



## fernandoae (Abr 7, 2012)

> si querés algo hecho podés probar con lo de esta página http://ucapps.de/
> 
> que serian esos?


Son modulos que se van interconectando para armar una consola midi.Lo bueno es que ya viene hecho y no tenes que hacer vos el programa (creo). Miralo con paciencia, y si no te sirve vas a tener que aprender a programar pic, pero no te asustes que internet hay muchisima información... le vas a tener que dedicar tiempo. Es increible las cosas que podes hacer con micros, te simplifican la vida  podes hacer temporizadores, secuenciadores de luces, reguladores de intensidad y velocidad, cajas musicales, voltimetros, joysticks usb... lo que quieras!



> en donde se conecta el auricular??? todo controlador tiene esa salida de audio para el auric.


Este es especial  no tiene, lo que se me ocurre que podes hacer es comprar un HUB usb de cuatro bocas y conectar en una la consola, en otra una placa de sonido usb (que son economicas) y las dos que te quedan libres dejarlas para conectar un mouse, teclado, un pen con musica.
 etc


----------



## rodrigo_6 (Abr 7, 2012)

> Este es especial  no tiene, lo que se me ocurre que podes hacer es comprar un HUB usb de cuatro bocas y conectar en una la consola, en otra una placa de sonido usb (que son economicas) y las dos que te quedan libres dejarlas para conectar un mouse, teclado, un pen con musica.



que lastima, che.. ahora.. yo tengo una. jeje.. lo que podria hacer es lo siguiente:

desoldar los cablecitos que vienen del cable usb y añadirles mi cablesitos del controlador, entonces asi tengo un solo usb pero con una placa de sonido.

lo mejor seria armar bien una plaquita de sonido para el deck B con una llavesita para correrla a la izquierda y escuchar un tema y correrla hacia la derecha para escuchar otro.
se lo podra diseñar con mi placa de sonido usb que ya tengo?? osea conectarle la llavesita y hacerle una entrada para los auris...
---


----------



## fernandoae (Abr 7, 2012)

> desoldar los cablecitos que vienen del cable usb y añadirles mi  cablesitos del controlador, entonces asi tengo un solo usb pero con una  placa de sonido.


NI LO INTENTES, algo vas a quemar  no se pueden poner los usb en paralelo... justamente para eso inventaron el HUB USB. Y a la placa de sonido no hace falta tocarle nada, simplemente enchufarle los auriculares y listo, el tema de que canal queres escuchar se hace desde el virtual dj o el programa que uses.


----------



## rodrigo_6 (Abr 7, 2012)

ta copado, pero no me cierra todavia la idea de tener dos usb, para eso si lo hago lo hago bien y hago una placa de sonido o compro una y le adapto un switch ... canal A canal B.

consejos??


----------



## fernandoae (Abr 7, 2012)

Capaz que me expresé mal, para agregar salida de auriculares necesitas una sola placa de sonido usb, vos ahi vas a enchufar tus auriculares y vas a decidir que deck queres escuchar seleccionandolo en el software de mezcla de musica, obviamente que en vez de hacerle click con el mouse lo podes hacer comodamente tocando dos botoncitos o uno ubicado en tu consola.
Consejos? Si, si queres que tu consola tenga salida y entrada de audio... del hub usb no te salvás, en una boca va el pic de la consola, en la otra tu placa de sonido usb y en las dos que te sobran conectas lo que se te antoje (teclado, mouse, un pen con mas musica que te lleva uno de los que estan en la super fiesta, una lamparita usb para iluminar tu consola,una caca usb, un dedo con musica y hasta un espermatozoide de los cuales adjunto fotos).


----------



## rodrigo_6 (Abr 7, 2012)

buenisimo. jajaj. bueno a intentarlo !! jeje. despues esta el tema de la configuracion del virtual dj al controlador y a la placa de sonido usb!! ja. yo le voy a conectar un botoncito al ctrlador para decirle al pc cual deck quiero preescuchar.
no se si conoces algun controlador o compactera; para subir o bajar el ritmo de la cancion, existe un "pote" lo pongo entre " por que nose como funciona en realidad no se si es un pote. el tema es que este componente en la mitad de su recorrido tiene como un pequeño tope, el cual indica que es el valor cero del *pitch* (asi se llama este incrementador de ritmo). me entendes??
cuanto te salio hacerlo fernando? yo porque tambien soy de argentina y quiero saber el valor en ARS$ jeje. hace cuanto lo hiciste, que componentes reciclaste y si podes colocar un par de fotos de tu controlador 

muchas gracias!!

EDIT:

estaria bueno otro botoncito para sincronizar el deck A con el B y viceversa!! se puede??


----------



## fernandoae (Abr 7, 2012)

> despues esta el tema de la  configuracion del virtual dj al controlador y a la placa de sonido usb!!


Para la placa no tenes que configurar casi nada, está en opciones de audio, tenes que elegir salida por la pc y preescucha con la placa auxiliar...



> cuanto te salio hacerlo fernando? yo porque tambien soy de argentina y  quiero saber el valor en ARS$ jeje.


Ni idea, lo mas caro es el pic 18f2550... que te puede salir de $35 a $75 dependiendo de que tan ladrón sea el vendedor. :enfadado: acá donde vivo no me quedo otra que pagarlo $50 porque es el unico lugar donde los consigo.



> hace cuanto lo hiciste, que  componentes reciclaste y si podes colocar un par de fotos de tu  controlador


En mi canal tenés todos los videos, los componentes que reciclé de otros equipos son los potenciometros, los leds... los potes que utilize para probar los saqué de un ecualizador de un minicomponente. Y dos venian con la trabita esa que te indica que está centrado.



> no se si conoces algun controlador o compactera; para subir o bajar el  ritmo de la cancion, existe un "pote" lo pongo entre " por que nose como  funciona en realidad no se si es un pote. el tema es que este  componente en la mitad de su recorrido tiene como un pequeño tope, el  cual indica que es el valor cero del *pitch* (asi se llama este incrementador de ritmo). me entendes??


El pitch es un pote más, asi como lo es el crossfader y el resto, los dos tipos de potenciometros que se pueden usar en la consola son los lineales y los giratorios... eso va a gusto de cada uno, se podria usar tranquilamente un pote giratorio para el pitch...



estaria bueno otro botoncito para sincronizar el deck A con el B y viceversa!! se puede??


----------



## rodrigo_6 (Abr 7, 2012)

> Para la placa no tenes que configurar casi nada, está en opciones de audio, tenes que elegir salida por la pc y preescucha con la placa auxiliar...



sisi. eso si se como hacer.



> lo mas caro es el pic 18f2550... que te puede salir de $35 a $75 dependiendo de que tan ladrón sea el vendedor. :enfadado: acá donde vivo no me quedo otra que pagarlo $50



que carooooo!!!! bueno voy a consultar por ese micro aca.. decime.. el 2545 es el mismo, no??



> En mi canal tenés todos los videos



ok ahora lo chekeo.


Que me decis sobre esto? 
estaria bueno otro botoncito para sincronizar el deck A con el B y viceversa!!

otra cosa..viste el video de prueba scratch.. ?? que es, un motor PaP??
yo quiero utilizar una rueda dentada, pueden ser las de los mouse mecanicos? obvio, con los IR y fototransistores. jeje.

saludos.


----------



## fernandoae (Abr 7, 2012)

> que carooooo!!!! bueno voy a consultar por ese micro aca.. decime.. el 2545 es el mismo, no?


Y... es caro, pero una vez que ves todo lo que puede hacer decis "valió la pena"  en cuanto a lo de si el 2545 es el mismo... emm... no  es el 2545. Algo diferente tiene, puede ser la memoria interna o algun chiche como comparadores, adc, etc.



> estaria bueno otro botoncito para sincronizar el deck A con el B y viceversa!!


Una vez que tenés la consola armada la función de cada botón la elegís vos desde el programa, la consola le dice al vdj "juancito" y el vdj dice "ahhh me dijo juancito, tengo que sincronizar los beats" jaja algo asi.



> otra cosa..viste el video de prueba scratch.. ?? que es, un motor PaP??


Si si lo vi porque yo lo hice   es un motor parecido, se llaman brushless y tiene solo tres contactos.Son bastante sencillos de identificar y generalmente en algun lado te indican los contactos con "U" "V" y "W".


----------



## rodrigo_6 (Abr 8, 2012)

> Si si lo vi porque yo lo hice



jajajaj.. era una forma de deciiirr jjajajaja




> se llaman brushless



aahh mira vos, ahora voy a googlearlo jeje..

yo quiero utilizar los de los mouse mecanicos, dicen que son mas precisos,no se en que... (¿?) que opinas?


----------



## fernandoae (Abr 8, 2012)

Que son muy parecidos... yo usando el motor ese de una lectora de dvd consegui unos resultados buenisimos. Y te ahorrás la parte de alinear los fotodiodos y demás. La parte mecánica se simplifica mucho usando un motor de estos, es más, el que yo tenia ya venia hasta con el soporte, lo unico que hice fué pegarle un cd encima del eje.


----------



## rodrigo_6 (Abr 8, 2012)

hola de nuevo, fernando, entontre esta foto en este post. mira este dispositivo. de donde se podra obtener dos de estos?? viste que ahi ya viene armado el led con el fotoTrans. ya vienen armados y compactos.

pd: te agrege al FB.


----------



## fernandoae (Abr 8, 2012)

De un mouse viejo de los de bolita, ahi tenes dos. Te conviene cortarlos armados de la plaqueta, que ya vienen con la distancia justa.


----------



## rodrigo_6 (Abr 8, 2012)

claro.. yo ya los tengo desarmados 

bueno voy a ver si consigo dos motores brushless o dos discos de estos. que te mensione, quiero unos de mas o menos 5 cm de diametro  jejejee a esos le conecto los discos de discos rigidos y chau. que opinas??

los discos que yo te decia son como los que puse en la imagen q ajunte ahi. no se de donde se obtienen.. vos sabes de donde'???

edit:

1° yo lo voy a hacer con el PIC18F2455. que software me recomiendan??
2° el programa que me enseñaron una vez, a manejar se llama *niple* con el cual no lo puedo programar al micro q yo quiero. que programa necesito para hacer arrancar esos codigos que postearon??
3° el de rachelies es un xtal de 48 megas??
4° para que sirven en este caso los PCF8574N?? son realmente necesarios? 
5° son necesarios los Enc A y Enc B del esquema de rachelies??
6° en que lugar del esquematico colocaria los dos *faders*?? y los dos *pitch*?
7° tengo aca un motor, de un disco rigido, pero mepa que es paso a paso, no se decime o diganme que opinas/n. pero no se como sacarlo jaja. esta muy dificil aca. 

Muchas gracias por su tiempo!


----------



## fernandoae (Abr 8, 2012)

> bueno voy a ver si consigo dos motores brushless o dos discos de estos.  que te mensione, quiero unos de mas o menos 5 cm de diametro  jejejee a esos le conecto los discos de discos rigidos y chau. que opinas??


Que para eso agarres dos discos rigidos viejos y listo, esos motores sirven. Tenes que armar el acondicionador de señal de los dos operacionales.



> los discos que yo te decia son como los que puse en la imagen q ajunte ahi. no se de donde se obtienen.. vos sabes de donde'???


No te compliques usando ese tipo de sensores, dejalos como ultimo recurso.



> 1° yo lo voy a hacer con el PIC18F2455. que software me recomiendan??


Proton ide o el compilador CCS integrado al Mplab ide de Microchip. Pero empeza a estudiar



> 2° el programa que me enseñaron una vez, a manejar se llama niple. que  programa necesito para hacer arrancar esos codigos que postearon??


Cualquiera de los dos de arriba, el niple hasta donde yo se no maneja usb y es muy limitado para esto.



> 3° el de rachelies es un xtal de 48 megas??


Es lo que te comenté mas arriba, el codigo se ejecuta a esa velocidad pero el cristal puede ser de otra frecuencia, por ej: 4-8-12...


> 4° para que sirven en este caso los PCF8574N?? son realmente necesarios?


Son solamente por si no te alcanzan las entradas o salidas del pic.



> 5° son necesarios los Enc A y Enc B del esquema de rachelies??


y depende, si queres las ruedas de jogwheel o no 



> 6° en que lugar del esquematico colocaria los dos *faders*?? y los dos *pitch*?


Eso lo definis cuando haces el código, por eso te digo que lo primero que tenes que hacer es aprender a programar, sin eso no vas a poder armar tu consola


----------



## rachelies (Abr 9, 2012)

Bufff, como ha corrido esto en un par de días que estoy fuera. A ver si me pongo al día.

Rodrigo_6, con todos mis respetos, creo que quieres correr demasiado. Empieza por aprender a programar, a manejar el Mplab y el CCS, y ve poco a poco. El controlador yo lo divido en botones, falders, encoders y salida hacia los leds. Empieza sólo por uno de los temas, comprendiéndolo, y cuando te funcione, pasa al siguiente para ir añadiendo cosas. Si lo haces todo a la vez, es fácil que algo te falle y luego te vuelves loco buscando pq no funciona.

El cristal que utilizo es de 20Mhz, pero como digo fernando, puedes utilizar otro. Lo que sí que tienes que respetar es a la hora de configurarlo, tener 96Mhz para el USB.

1º empieza por el MPlab y el CCS, o el Proton, eso ya cada uno...y después poco a poco. 

Saludos y ánimo!!


----------



## tangopic (Abr 9, 2012)

Hola,que bueno que estén "cacharreando" con Midi! quisiera hacer un aporte,ya que no se qué Descriptor están usando para la comunicación Midi-Usb. Asunto que me llevó unos meses de dolor de cabeza .
Originalmente me paso con un código en Basic (Proton) y luego con el que utilizan aqui...aparentemente hay problemas con los procesadores de doble nucleo (por lo menos en Xp,en casi todas las Portátiles) y el dispositivo "no inicia",necesita reconocerlo como un "Disp. Compuesto".  Si mal no recuerdo al Descriptor hay que incluirle la "AC Interface" ... en conclusión ..si alguien tiene este problema puede utilizar estos Descriptor Midi - Usb:

Proton Ide: http://midiquet.wordpress.com/2010/12/16/larri_usb-controlador-midi-usb/

En C "CCS":http://midiquet.wordpress.com/2011/02/12/caoss-midi-usb-tactil/
este ultimo es el código que utilizan aqui con dicha modificación.
Espero ahorrar algún dolor de cabeza!
saludos.


----------



## fernandoae (Abr 9, 2012)

Bienvenido al tema 



> Proton Ide: http://midiquet.wordpress.com/2010/1...ador-midi-usb/


Vos sabés que estuve viendo ese código del tal Larry, pero está incompleto, le falta el include "usb_md_maker" o algo asi... tambien vi uno de un pen ir que le falta lo mismo. Por eso no pude hacer lo del midi en Proton.

Acá ya tenemos funcionando:
Interfaz HID USB en CCS y en PROTON
Interfaz MIDI USB en CCS solamente.

Estaria bueno buscarle la vuelta en proton ya que ese lenguaje lo manejo mejor  yo calculo que en el archivo que falta hay macros para generar los bytes que se tienen que enviar, ya le voy a dedicar un tiempito.
http://midiquet.wordpress.com/2010/12/16/larri_usb-controlador-midi-usb/


----------



## rachelies (Abr 9, 2012)

Muy buen aporte!!! Yo la verdad no he tenido problemas con el midi, ni en XP ni en Windows 7 64bits, y con procesador de doble nucleo, aunque eso si, no es portatil.

Supongo que en Proton se puede hacer el interface Midi, pero yo no tengo ni idea de Proton ni de las funciones usb que incorpora.

Saludos


----------



## tangopic (Abr 9, 2012)

Me parece que el archivo que te falta esta acà;
http://dl.dropbox.com/u/21142400/Larri_Usb_32.rar
ese tal Larry soy yo!
saludos!


----------



## rodrigo_6 (Abr 10, 2012)

que seria este componente dibujado??
cual es su nomenclatura, ej tic xxx, T234, 

salu2.


----------



## tecniloco80 (Abr 10, 2012)

Esta quedando muy bueno el controlador les tengo una consulta como se usan los 12 analogicos del pic 18f4550 en pic basic pro o solo se pueden usar 8 
si no me explique bien quiero configurar lo que se hace en pic C setup_adc_ports(ALL_ANALOG); 
en basic no me funciona 

tambien les subo todos los mapers y devices comerciales que encontre del virtual dj7 
http://www.4shared.com/rar/xNHdBf4c/virtualdj7devices.html


----------



## rodrigo_6 (Abr 10, 2012)

hola tecniloco. como estas. lamento no poder responder a tu pregunta. solo te agradezco el mapper y eso. Gracias.


----------



## rachelies (Abr 11, 2012)

rodrigo_6 dijo:


> que seria este componente dibujado??
> cual es su nomenclatura, ej tic xxx, T234,
> 
> salu2.



jajjajaa, no se si la pregunta es de broma, o que con lo mal que dibujo no se entiende.

Lo de la izquierda es el conector USB  y las flechitas de la izquierda en el puerto del pic era para  indicar que ese puerto es de entrada/salida, es decir, para comunicar.

saludos



tecniloco80, no te puedo ayudar en pbp porque no tengo ni idea. ¿Conoces algún manual donde vengan las instrucciones que se pueden usar o las configuraciones de los puertos? Por ejemplo en CCS, viene una carpeta Devices donde salen las diferentes configuraciones que pueden tener los puertos en cada uno de los micros, algo como esto:

```
// Constants used in SETUP_ADC_PORTS() are:
#define NO_ANALOGS   0x0F   // None
#define ALL_ANALOG   0x00   // A0 A1 A2 A3 A5 B2 B3 B1 B4 B0              
#define AN0_TO_AN11  0x03   // A0 A1 A2 A3 A5 B2 B3 B1 B4                 
#define AN0_TO_AN10  0x04   // A0 A1 A2 A3 A5 B2 B3 B1                    
#define AN0_TO_AN9   0x05   // A0 A1 A2 A3 A5 B2 B3                       
#define AN0_TO_AN8   0x06   // A0 A1 A2 A3 A5 B2                          
#define AN0_TO_AN4   0x0A   // A0 A1 A2 A3 A5
#define AN0_TO_AN3   0x0B   // A0 A1 A2 A3
#define AN0_TO_AN2   0x0C   // A0 A1 A2
#define AN0_TO_AN1   0x0D   // A0 A1
#define AN0          0x0E   // A0
```

Aquí sale lo que hay que poner para configurar las entradas analógicas.


----------



## rodrigo_6 (Abr 11, 2012)

Muchas gracias rachelies! Perdoname por el mal entendido. no lo hice en broma.  perdona.


----------



## fernandoae (Abr 11, 2012)

Rodri ponete a estudiar asi entendés todo  arranca con algun manualcito sobre pic 16f84.. y andá avanzando de a poco hasta llegar a la serie 18F que tienen usb. Aprende a manejar los adc, los timers, interrupciones. En google hay muchisimo sobre el tema, y yo aprendi asi, con tiempo y sin nadie que me enseñe 



> Esta quedando muy bueno el controlador les tengo una consulta como se  usan los 12 analogicos del pic 18f4550 en pic basic pro o solo se pueden  usar 8


Esta quedando? no... ya quedó! si estan todas las cosas necesarias para hacerse una consolita a gusto de cada uno. Respecto a los adc en pbp te recomiendo que.... leas la ayuda  yo tengo un lio con lo que son las versiones de pbp, proton...son codigos muy parecidos.

Gracias tal larry!!! jaja. ahora si puedo hacerme mi consola en un lenguaje que conozco.  despues les cuento como me fué.



Ahi estuve tratando de compilar el codigo de Proton de Larry pero me tira estos errores:
Que puede ser?


----------



## rodrigo_6 (Abr 13, 2012)

en *ninguna* casa de electronica de mi ciudad consigo el maldito pic el 18f2455  fuckkkkkkk


----------



## fernandoae (Abr 13, 2012)

Suele suceder, a mi me ha pasado que veo la datasheet de un integrado y digo "uhhh ya se que me puedo armar con esto" y se la "teoria" pero no lo puedo hacer porque no consigo los componentes...
Fijate igual si conseguis el 18F2550 o el 18F4550...

Larry! no se si viste mi edicion del mensaje anterior... me tira errores


----------



## rodrigo_6 (Abr 13, 2012)

hola fer. vos sabes que aca no venden ningun 18F... solo venden 16F


----------



## rachelies (Abr 13, 2012)

Pero hay muchas tiendas online que seguro que pueden enviar a Argentina, y no creo que salga muy caro. El 18f2455 en la tienda me cobran unos 20€, pero los pido en Farnell y salen a 4€ o así. Las tiendas online que conozco grandes aquí son Farnell y RS Online
Busca alguna tienda online, y si es de Argentina mucho mejor.

Fernando, los errores pueden ser porque al compilar te falta adjuntar algunos archivos al proyecto.


----------



## fernandoae (Abr 13, 2012)

Exacto, a veces conviene comprar online aunque se gaste un poco en el envio... eso si, hace un pedido grande  no vas a pedir un solo pic jeje.

Es raro Rachelies, porque al parecer eso es lo que deberia tener el descriptor para midi... ya voy a seguir  probando, ahora estoy con la Domótica  estoy manejando cosas con una tablet Android... ya manejo cualquier cosa que sea IR y dos canales pwm por usb a traves de una netbook que uso como servidor, pero eso es como para empezar, la base del proyecto ya esta


----------



## tangopic (Abr 13, 2012)

Hola "fernandoae", el tema con Proton IDE es complicado,como te decía,no lo tengo instalado y espero no hacerlo, a menos que tenga la licencia, me parece una buena herramienta pero sin acceso a los códigos y demás es complicado.El tema Midi Usb empezó acá :
http://www.protonbasic.co.uk/showthread.php/54010-USB-Midi-Class-Streaming?highlight=midi
hoy dia un tal "albapic" no puede ver los archivos,ja! (no son muy amigables los muchachos)
hay un tema importante con las Versiones de Proton para ese codigo! quiza sea por ahi tu problema,lee bien ese post.
Parece que andamos en lo mismo! hace mucho que estoy haciendo una app en Android con Midi .
Seguramente la semana que viene la subo al Market !  tengo una ver. para tablet y otra para phone!
saludos.


----------



## fernandoae (Abr 13, 2012)

Si vi lo que son con la gente pobre como nosotros que usamos soft trucho jaja 



> Parece que andamos en lo mismo! hace mucho que estoy haciendo una app en Android con Midi .
> Seguramente la semana que viene la subo al Market !  tengo una ver. para tablet y otra para phone!
> saludos.


No.. no andamos en lo mismo, se mezclò un poco... yo lo que estoy haciendo con la tablet es manejar una casa (luces, persianas, musica, comfort, etc) usando una netbook como cerebrito, me conecto por telnet y le digo lo que tiene que hacer.
Pd: cuando empieze a desarrollar apps android te voy a molestar


----------



## tangopic (Abr 13, 2012)

Que versión de Android tiene tu tablet?
cuando quieras arrancar con el androide avisame! no te lo pierdas!


----------



## fernandoae (Abr 13, 2012)

Es una Kyros 7012 con Android 2.3.3.3.3.3.3.0,5 jaja, es de las más básicas, ni siquiera es multitouch... pero para usarla de panel de control de una casa inteligente funciona de diez (tambien le meti el droid tesla, es un simulador spice, lo encontre full).
Volviendo a tema, y si para complementar la consola esta haces una app GRATUITA  que envie midi? estaria muy bueno, pones la tablet en el medio de la consola y sabes que!!! un lujo.


----------



## tangopic (Abr 13, 2012)

Un pequeño adelanto...captura de pantalla de mi Tablet.
Se conecta al Pc via Wi Fi!


----------



## fernandoae (Abr 13, 2012)

Te felicito! yo ya tengo el eclipse con el sdk de android instalado... pero todavia no se programar en java, para mi sistema domotico uso el openremote.. pero no hay caso con los faders! asi que dije "voy a aprender a hacer mis apps para Android"  y ya habia pensado eso del un controlador para vdj, en el market hay algo pero yo quiero hacer el mio a gusto. Me enseñas a poner controles personalizados en un layout? por ejemplo los scroll verticales y algo como lo que tienen las apps para simular el disco que gira...


----------



## tangopic (Abr 13, 2012)

Veo que estas en el tema! seria buenísimo que te metas con Java ante nada. Pero me parece que es para hablar en otro lugar... (para no desviar el tema del post)
para aprender Android sugiero este sitio en español:
http://androideity.com/
y podemos quitarnos dudas aquí (foro):
http://novatecas.org/foro/index.php?board=3.0
me gustaría me cuentes de ese "openremote"
saludos!


----------



## rodrigo_6 (Abr 13, 2012)

que esa imagen que vi de tangopic?? acaso es  un controlador en la tablet??


----------



## tangopic (Abr 13, 2012)

Eso mismo! pronto va estar disponible..free!
"fernandoae" mandame tu mail porque no te puedo enviar privados (me faltan post).
saludos!


----------



## fernandoae (Abr 13, 2012)

Quien es alejandroae? jajaj, lo mas parecido a eso que tenemos aca es a mi


----------



## tangopic (Abr 13, 2012)

ese tal "alejandroae" nunca existió ,ja!
sigo sin comunicarme...hola,hola...probando 1,2,3 !


----------



## fernandoae (Abr 13, 2012)

ahi te escribi, te llegó?
sino contactate conmigo por youtube


----------



## tangopic (Abr 26, 2012)

Hola, quería compartir mi proyecto :






Las Versiones para Android están Gratis y sin Pulicidad en Google Play

Para descargar "MidiServer", tutorial y demás:
 - MidiDroide


Se aceptan ideas,diseños ..
gracias!


----------



## rodrigo_6 (Abr 27, 2012)

jajaja muy buenoo ya lo estoy bajando che se puede con el virtual dj?????? jejejexxxx adíoo


----------



## fernandoae (Abr 27, 2012)

Muy bueno compañero! lo que me parece una terrible boludez es que android 2.3 no traiga sliders verticales por defecto... no se que estaban pensando cuando lo hicieron


----------



## neburalex (May 5, 2012)

Muy buenas gente.. hace mese que vengo siguiendo el tema.
Paso a contarles, mi intencion es hacer un teclado controlador (un organo musicalmente hablando, pero que solo maneje señales midi, si tienen idea de musica sabran a lo que me refiero).
El tema es que estoy haciendo todo virtualmente a travez de Proteus en windows xp.
Pero no logro que windows instale los drivers del pic.
Cargue al pic el descriptor que dejaron en post anteriores, al encender el pic lo detecta como "usb audio device" pero cuando instala los drivers me informa que ha ocurrido un error y el dispositivo no queda instalado correctamente.
Talvez necesite algo mas que solo el pic y el cristal para que windows lo reconozca??

Si alguno a incursionado en este proyecto usando el proteus agradeceria que me dieran una mano


----------



## fernandoae (May 5, 2012)

Buenas!  yo si entiendo lo que querés hacer, de cuantas octavas necesitás hacerlo?? como para ir viendo que se puede hacer.



Es más, ahora estoy viendo esto http://www.pic24.ru/doku.php/en/osa/articles/pk2_osa_piano es un piano con teclas capacitivas, podés usar cualquier cosa metalica como tecla...


----------



## neburalex (May 7, 2012)

La idea es hacerlo de 7 octavas, aunque con 5 no se precisaría mas.
Sigo sin poder hacer que la pc me reconozca el pic como dispositivo midi a través del proteus.
Seguiré investigando a ver si puedo solucionar, es que no quiero comprar el pic y todos los elementos y encontrarme conque no me funcione de todas maneras.


----------



## rachelies (May 7, 2012)

neburalex dijo:


> La idea es hacerlo de 7 octavas, aunque con 5 no se precisaría mas.
> Sigo sin poder hacer que la pc me reconozca el pic como dispositivo midi a través del proteus.
> Seguiré investigando a ver si puedo solucionar, es que no quiero comprar el pic y todos los elementos y encontrarme conque no me funcione de todas maneras.



Compra el PIC y anímate, que no pierdes mucho y seguro que te funciona, es muy fácil.
La verdad es que en proteus no probé el midi, pero con el pic me funcionó a la primera.
Un saludo


----------



## juanlasserre (May 14, 2012)

Gente los felicito estoy muy orgulloso de pertencer al foro y poder leer lo que han hecho. En breve comenzare la fabricacion de un controlador midi. mi idea es hacer algo que permita el control total del traktor y no necesitar ni mouse ni teclado para una MAC y una PC. Estare subiendo los resultados y agradezco toda la info para tener un ppunto de partida!! Saludos a todos!!!


----------



## rachelies (May 14, 2012)

Me alegro que te guste, *fuanlasserre*. No se decirte si el descriptor midi tambien funciona en MAC, pero estaría bien probarlo. Por lo demás, ¡¡ánimo!! que no es dificil y se puede hacer todo lo que quieras.
Un saludo


----------



## josb86 (May 24, 2012)

aquí les dejo un ejemplo que baje que es el MIDI y un programa que no termine al final. La idea era que solo enviara cuando había un cambio en las teclas presionadas por eso el “            if (bit_test(estado_p,i)==0 && bit_test(botones_2,i) != bit_test(botones,i)){”  la idea era almacenar un estado y después compararlo si las teclas presionadas eran las mismas pues que no enviara nada por USB.


----------



## gmazz94 (Jun 3, 2012)

Hola gente muy buenos días.
me presento.. tengo 18años y soy estudiante de una escuela técnica, siempre me gusto la tecnologia y de chico desarmaba todo para ver como funciona. este es mi ultimo año de la secundaria y empezamos a ver programación en asembler para pic´s el que estamos viendo es el 16f84.
Utilizamos Mplab
El año pasado realice una pedalera midi con un arduino y un par de censores ultrasonicos la cual se conectaba a la compu, te lo reconocía automáticamente como dispositivo midi y lo vinculábamos con un soft  de música llamado Guitar rig.

Este año decidí avanzar y en vez de utilizar arduino, empece a meterme mas con los microcontroladores por mi cuenta. 
Este foro me facilito muchísimas cosas y cuanto mas investigaba mas ganas tenia de armar algo.
Me puse como objetivo hacer una controladora midi para Vdj o traktor por supuesto quiero empezar desde abajo.
ayer me compre un pic 18F4550 alguno componentes para que funcione y otros para armarme un JDM.
También termine de armar todo el JDM y lo probé para ver si funcionaba cosa que anduvo de primera. y hoy busque algunos ejemplos para empezar. 
Logre prender un led y que parpade. esto me ayudo a configurar el mplab y el jdm para poder compilar un programa y grabarlo al pic

Ahora quiero empezar con CCS ya que por lo que vi en este tema hay bastantes ejemplos.
Lo primero que quiero hacer es poner un boton en una entrada digital, que mande por midi a la compu y que modifique algo en el VDJ o el traktor.

Me lei todas las publicaciones anteriores pero ya mucho empiezan con cosas complicadas como 10 botones, 2 pontenciometros etc y se me mezcla el codigo.
Después quiero conectar un potenciometro y modificar algo analógico en el programa.

Alguna recomendación o ayuda? 
Se que para que la compu me reconozca el pic como dispositivo midi tengo que poner la librería midi7.h que ya la descargue.
pero después no c de que manera enviar los datos con código y de que manera le asigno lo que quiero modificar a en el VDJ. 

muchas gracias y muy bueno el foro


----------



## fernandoae (Jun 3, 2012)

No recuerdo bien el tema de cada código en ccs, pero yo en lo que es USB HID explique bien como se hace cada cosa por separado, el tema de las jogwheels, botones, pulsadores,potenciometros y hasta las luces de los botones y demas...
Pero lo que te recomiendo es que estudies primero sobre los pics y sus perifericos como son los convertidores adc, modulos ccp, usb. Y una vez que aprendas a caminar empeza a correr  ah y al asm no le des mucha bola, para cosas complejas estan los lenguajes de alto nivel


----------



## rachelies (Jun 4, 2012)

Hola gmazz94.
Si quieres te voy ayudando yo a empezar. Para hacer lo primero, con un botón enviar un comando al virtualdj, o traktor por midi es muy fácil. Mi controlador lo hice en CCS, así que es así como te puedo ayudar.
Primero haz el código para que detecte cuando presionas el botón, que eso lo puedes hacer a tu gusto. Después, para enviar esto en midi hay dos posibilidades: Enviar un "note_on" cuando presionas, y un "note_off" cuando sueltas, o la segunda posibilidad, que es como yo lo hago, que es enviar en cada modificación un "note_on" y variando el volumen, "0x7F" para enviar un "1", y volumen "0x00", para un "0".
¿Dificil?, jejej, verás que en la práctica no.
Yo he creado una matriz de 4 bytes llamada "envia" para meter los datos a enviar, declarandola así:

```
unsigned char envia[4];
```
Una vez hayas detectado el cambio en el botón, metes esto en la matriz:

```
envia[1]=0x90;
envia[0]=envia[1]>>4;
envia[2]=0x00;
envia[3]=0x7F;
usb_put_packet(1,envia,4,USB_DTS_TOGGLE);
```
Traduciendo esto:
envia[1] es el comando "note_on", que está especificado en el estandar midi-usb que es así, 0x90. En algún sitio leí, pero no se donde, que antes del comando, tienes que enviarlo intercambiando los nibbles, es decir, en "envia[0]" habría que enviar 0x09, por eso la operación que ves más arriba.
Después, "envia[2]" lleva el número de nota, que va de 0x00 a 0x7F. Cada botón tiene que tener asignada una nota diferente, por lo que podrías tener 128 botones. En realidad se pueden enviar muchos más, porque hay más canales midi, y se podrían enviar 128 en cada uno de ellos, pero eso ya es más complejo.
Y al final, en "envia[3]" se mete el valor del volumen de nota, que asignamos para los botones 0x7F para cuando envias un "1", y 0x00 para un "0". 
Para enviar solamente botones, "envia[0]" y "envia[1]" serían siempre iguales, y solo se cambiaria "envia[2]" que haría referencia al numero de boton, y "envia[3]" para el estado del botón. Y siempre que cambie un botón para enviarlo, después de cambiar las variables, colocas 
	
	



```
usb_put_packet(1,envia,4,USB_DTS_TOGGLE);
```
 y listo, para empezar ya tienes.
Échale un ojo y luego seguimos con más dudas.
Un saludo.


----------



## gmazz94 (Jun 4, 2012)

Hola rachelies, hola fernandoae
muchas gracias por las recomendaciones y la explicación del codigo, me ayudo a entender bastante.
Ahora se bien como tengo que hacer lo de la coneccion midi. en estos días voy a estar probando haber si puedo hacer que funcione.
si tengo alguna duda pregunto.
muchas gracias.


----------



## Deltaeco (Jun 7, 2012)

hola chicos, llevo siguiendo este post desde hace unos días , yo tengo una mesa midi de hércules para virtual dj , pero el problema que los job son sin movimiento, y me gustaría que funcionara de esta forma como se ve en el vídeo que adjunto al post, que el job no suena cuando lo mueves, sino al revés, cuando lo tocar o lo paras ya que el job esta en movimiento como si fuera un vinilo ,,, seguiré investigando.


----------



## fernandoae (Jun 7, 2012)

Se llaman JOG no job, job es trabajo  
Esas no son dificiles de hacer... se pueden hacer táctiles para que funcionen solamente cuando las tocás o motorizadas como las del video.. cuando me haga un tiempito voy a ver como es el asunto, saludos.


----------



## Deltaeco (Jun 8, 2012)

Ok fernandoae, gracias por la corrección amigo , la ideal que sea en movimiento como las del vídeo para los dj que utilizan el scrach vale la pena, las normales sin movimiento traen un sensor óptico con unas barras para crear el lógico 1 y 0. yo seguiré también buscando haber que se encuentra  un saludo ¡¡


----------



## gmazz94 (Jun 8, 2012)

Hola buen dia a todos.
Estuve intentado hacer un pequeño programa que detecte un boton y mande el estado de este por midi.
Me ayude un poco por los códigos que aparecen en este foro, tabn busque como configurar los fuses y al
final me quedo el siguiente codigo.
Lo grabo y cuando lo conecto a la compu no pasa absolutamente nada
primero quise probar sin conectar el boton ni nada pero la compu no me lo reconoce como dispositivo midi.
seguramente me este equivocando en alguna cosa fácil que no me doy cuenta. alguna ayuda? 

tengo un clock de 20mhz conectado y la coneccion del pic al usb me guié por una foto que encontré en Internet.

```
#include <18f4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#fuses NOMCLR   //Habilita MCLR/RE3 como entrada   
#use delay(clock=48000000)

#DEFINE USB_HID_DEVICE     FALSE
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK  //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP2_RX_ENABLE  USB_ENABLE_BULK  //turn on EP1 for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    64  //size to allocate for the tx endpoint 1 buffer
#define USB_EP2_RX_SIZE    64   //size to allocate for the rx endpoint 1 buffer

#include <pic18_usb.h>
#include <.\include\midi7.h>   //USB Configuration and Device descriptors for this UBS device
#include <usb.c>           //handles usb setup tokens and get descriptor reports

void main(void) 
{ 

SET_TRIS_D(0xFF);
int8 botones=0;
int8 estado=0;
while(TRUE){

int8 out_data[4];
estado= input_state(pin_D1);
 
           if (estado==0){
					out_data[1] = 0x90;          //Note on
      				out_data[0]= out_data[1]>>4;
      				out_data[2] = 0x00;         // Nota 0
      				out_data[3] = 0x7F;         // Volumen 127
      				usb_put_packet(1,out_data,4,USB_DTS_TOGGLE); 
					delay_ms(6);

						}
		if (estado==1){
					out_data[1] = 0x90;          //Note on
      				out_data[0]= out_data[1]>>4;
      				out_data[2] = 0x00;         // Nota 0
      				out_data[3] = 0x00;         // Volumen 0
      				usb_put_packet(1,out_data,4,USB_DTS_TOGGLE); 
					delay_ms(6);

						}
}	
}
```

muchas gracias


----------



## fernandoae (Jun 8, 2012)

Conectaste el pin MCLR a positivo con una resistencia de 4,7 kohm?...


----------



## gmazz94 (Jun 8, 2012)

hola fernandoae si conecte una resistencia de 4,4kohms al mclr, 2 capasitores de 22pf conectados a el cristal de 20mhz y conectados a tierra. vdd en el pin 32, vcc en el pin 31 (el vdd y el vcc los saco de la coneccion del cable usb), y un capasitor de 470nf al pin 18 que es Vusb. los pines 23 y 24 los conecto al los pines del usb
como en la foto: http://ladelec.com/images/stories/stories2/aar%2026%20pic%2018f4550%20circuito%20completo.jpg

no c donde puede estar el error. porque cargo un programa simple que apague y prenda un led y funciona.


----------



## fernandoae (Jun 8, 2012)

Bueno entonces descartamos eso, ahora... no tendras los cables de datos del usb invertidos (d+ y d-)?
Porque a cualquiera se le escapan detalles jeje, el otro dia revise un circuito en la protoboard para asegurarme que todo este bien, enciendo la fuente y salio olor a quemado... habia conectado el micro y demas a 16v, pero bueno... por suerte era un 12f675.


----------



## gmazz94 (Jun 8, 2012)

uu no te lo puedo creer que bajon que haya pasado eso.
ya revise los pines y están bien.(revise varias veces que sean los pines que hay que conectar.) puede ser que sea algo del codigo? o del complilador? lo probe conectándolo a la una notebook y a una pc y en las 2 no hace absolutamente nada, tengo windos 7 y cuando conecto el usb no me aparece que se conecto algo desconocido o algo raro. directamente no pasa nada... medio raro no c que puede ser. ya teste que cuando grabo el programa en el pic se haya grabado bien grabo bien.


----------



## fernandoae (Jun 8, 2012)

bueno... seguimos, tenes el archivo midih7.inc en la carpeta include dentro de tu proyecto?... seguro que si sino no te deberia compilar... otra cosa no se me ocurre, revisaste la palabra de configuración al momento de grabarlo?


----------



## rachelies (Jun 9, 2012)

La resistencia en MCLR no hace falta, que en los fuses está definido el pin como entrada.
Yo probaría a poner un led en una salida que encienda y apague para saber que el PIC "está vivo"
Un saludo


----------



## fernandoae (Jun 9, 2012)

> La resistencia en MCLR no hace falta, que en los fuses está definido el pin como entrada.


Era por probar otra cosa para ver si asi funciona


----------



## gmazz94 (Jun 9, 2012)

yo probé prender y apagar un led pero con un código en C18 y funcionaba.
en CCS hice esto... tendría que funcionar o me falta algo para prender y apagar el led?
tengo miedo que quemar el micro por alguna configuración o algo mal por eso pregunto.

```
#include <18f4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#fuses NOMCLR
#use delay(clock=48000000)
void main(void) 
{ 
SET_TRIS_B(0x00);
while(TRUE){

                Delay_ms(500);
                output_low(pin_B7);
		Delay_ms(500);
                output_high(pin_B7);
}}
```
Muchas gracias por la ayuda


----------



## fernandoae (Jun 9, 2012)

Que pic estas usando?


----------



## gmazz94 (Jun 9, 2012)

Estoy usando un 18F4550


----------



## fernandoae (Jun 9, 2012)

Entonces la verdad no se que mas puede ser


----------



## gmazz94 (Jun 9, 2012)

buen dps de ver y comparar con los ejemplos que hay en este foro.
1ro decidí pasarme al pcwhd de Css para compilar un ejemplo que hay y sin tocar nada funciono y me lo reconocio.
2do puse mi programa y no funcionaba... compare los 2 programas y me di cuenta que
faltaba el:
usb_init_cs();
usb_task();
y esto:

```
if(usb_enumerated()) 
          { //programa

}
```
ahora me lo reconoce


----------



## fernandoae (Jun 9, 2012)

Bueno, ya diste el primer paso ( ahora vienen los tropezones jaja!!) a expirementar!


----------



## rachelies (Jun 10, 2012)

Claro!! Como no nos dimos nadie cuenta de eso? jajajaja Lo primero es inicializar el USB. Ahora te tiene que funcionar el ejemplo que tenías del botón, y como mínimo, reconocerlo como dispositivo midi.
Yo siempre añado un led dentro del programa para saber que está corriendo. En tu caso, puedes ponerlo que al presionar el botón se encienda o apague, así sabras que el pic está funcionando y hasta donde te funciona el programa. Es una forma de hacer debuger, jejjeje
Un saludo y ánimo!!!


----------



## gmazz94 (Jun 10, 2012)

listoo ya lo reconoció como dispositivo midi y me detecto el boton en traktor. pero en el virtualdj se cuelga... conecto el usb y se cuelga, lo desconecto y se "descuelga" por asi decirlo. no c que puede ser :S alguna solución? 
También modifique el programa porque el que puse antes me envia dada vez que pregunta el estado del pin la nota midi. lo modifique le agregue una variable para que solo mande cuando cambio de estado y que mande 1 sola vez el paquete.
y lo del led es una buena forma para saber que pasa. una gran consejo lo voy a implementar.


----------



## fernandoae (Jun 10, 2012)

Estas usando el vdj7 crackeado? proba desconectandote de internet o bloqueando la salida y entrada del soft desde tu firewall, no te sale algo de que va a funcionar solo por 15 minutos?


----------



## rachelies (Jun 11, 2012)

En traktor funciona sin problemas y lo detecta como midi y demás, pero ahora llegas al siguiente jaleo en el virtual dj: los mappers y devices.... En este hilo más atrás se habló de ello. Tienes que escribir un par de archivos que se meten en la carpeta mappers y devices del virtual dj para que reconozca lo que has conectado. 
Échale un vistazo y si no te vamos ayudando.
Un saludo


----------



## gmazz94 (Jun 11, 2012)

Si estoy usando virtualdj7 crackeado ya probé lo de el Internet y sigue sin funcionar se me tilda. 
Por ahora sigo probando con el traktor que anda perfecto. esta semana me fijo lo de los mappers y devices, lo había leído anteriormente pero muy bien no entendí para que sirve y en que carpeta los tengo que colocar. voy a seguir averiguando y dentro de poco empiezo a probar con los potes.

una consulta de cuantos koms tiene que ser los potes? o pueden ser de cualquier medida? yo compre uno de 5k lineal. y tengo entendido que el conector de la derecha lo conecto a 5v el de la izquierda a tierra y el del medio es la entrada al pin del micro... es correcto?

muchas gracias


----------



## fernandoae (Jun 11, 2012)

los potes pueden ser de cualquier valor hacia arriba, pero no menos de 5k para que no consuman mucha corriente... igual si son de mucho valor pueden meterse señales indeseadas, de 5k o 10k son buenos valores.


----------



## gmazz94 (Jun 12, 2012)

Bueno wow por ahora me resultando relativamente facil sacando algunas complicaciones que tuve. ya logre detectar un pote de 5k y que lo mande por  midi logrando modificar algún parámetro en el traktor.
todavía lo de los mappers y devices para el vdj no me puse a verlo ya que estoy conforme con el traktor seguramente lo haga mas adelante.

Supongo que el próximo paso sera hacer lo de los jog wheel.
tengo en casa un disco rigido desarmado que lo desarme hace mil para ver que tenia adentro por curiosidad y nunca logre hacer nada con el.

Vi anteriormente que rachelies había publicado como conectar el disco. pero no entiendo muy bien haber si me ayudan. en la foto que esta adjuntada:
-los pines 3 pines que están a la izquierda son los que se conectan al disco? en ese orden?
-el LM358 que función cumpliría?
-y a que se refieren con canal A y canal B? cada uno va a un pin de entrada digital al micro?
espero no molestar con tantas preguntas. pero me gusto mucho la idea del controlador dj.

muchas gracias por la ayuda y la paciencia


----------



## rachelies (Jun 13, 2012)

Hola amigo!!
Yo te explico. Los 3 pines son del disco. El que yo desmonté, tenía 4 pines en una lámina flexible que va conectada al motor. En ella veían marcados los pines como "A" "B" "C" y "COM". El del medio del esquema lo conecté al COM, y luego utilicé el A, que puede ser el de arriba, y el B, abajo. Tuve suerte y me funcionó a la primera. Si los tuyos no vienen marcados, prueba esto a ver si coincide:
Viendo el motor desde los pines, y con el motor en la parte de arriba y los pines abajo, el mio lleva A B C  y Com de derecha a izquierda.

Después, el LM358 lo que hace es transformar la señal del disco a una onda cuadrada que entienda el micro. El LM lo alimentas a 5V, y lo conectas como en el esquema. Cuando "vea" algo en la entrada, se saturará y se podrá a 5V, y si no hay nada, a 0V. Así hacemos la onda cuadrada.

Y se usan dos canales para poder saber el sentido de giro. El disco lleva 3 bobinas, y nosotros utilizamos 2. De esta forma tendremos 2 señales que van desfasadas 120º, y así puedes saber hacia que lado estas moviendo el jog.
Estos 2 canales se conectan al pic para poder leerlas.

Haz la prueba y comenta los resultados. A mí me funcionó a la primera, y me dejó bastante sorprendido porque funcionaba bastante bien.

Un saludo


----------



## gmazz94 (Jun 15, 2012)

hola rachelies.
Me sirvió mucho la explicación que diste. 
mi disco tiene 3 pines pude detectar cual era el com y los otros dos (A y B)
resulta que lo conecto y cuando giro el disco un poco la cancion se avanza bastante y no me detecta para que lado giro. a veces anda bien y a veces no. es como que se vuelve "loco".

estoy pensando si el disco anda mal o este quemado o algo ya que en los 3 pines si mido continuidad entre cualquiera de los pines me da que el circuito esta cerrado. sin conectar a nada.
y si lo conecto al LM y giro el disco las salidas A y B se ponen en 3v aprox independientemente para que lado gire y si no lo giro las 2 salidas se ponen en 0v. (se modifican simultáneamente)

Como funciona el sistema? ejempo si giro para un lado el A se pone en "1" y el B en "0", y si giro para el otro lado el A se ponen en "0" y el B en "1"? o funciona de otra manera?

Que disco usaron? ya que estoy pensando en comprarme un disco menor a 10gb en mercadolibre que son los mas baratos usados y con algunos defectos (mientras ande el motor supongo que me sirve).

muchas gracias


----------



## fernandoae (Jun 15, 2012)

> mi disco tiene 3 pines pude detectar cual era el com y los otros dos (A y B)


Si es de 3 cables no tiene un "comun", es lo mismo cualquiera de los tres porque esta en triangulo.








> estoy pensando si el disco anda mal o este quemado o algo ya que en los 3  pines si mido continuidad entre cualquiera de los pines me da que el  circuito esta cerrado.


Puede ser eso o que tengan una resistencia muy baja y estes midiendo mal 





> Como funciona el sistema? ejempo si giro para un lado el A se pone en  "1" y el B en "0", y si giro para el otro lado el A se ponen en "0" y el  B en "1"? o funciona de otra manera?


Busca en google "encoder optico" y ahi vas a tener una idea de como funciona, y sino ponele leds a la salida y tiene que hacer algo como lo de mi video


----------



## rachelies (Jun 16, 2012)

Busca un disco estropeado. Lo más normal es que tenga el motor bien. Seguro que en alguna tienda donde reparen pcs te lo pueden regalar.

A la salida del LM tienes que tener 2 trenes de pulsos, pero uno adelantado respecto al otro. Si giras hacia un lado va por delante uno, y si giras hacia el otro, va delante el otro. Te hice un dibujo con paint a ver si se entiende mas o menos, jejejej.

No te desanimes y busca otro disco. Seguro que con ese disco no funcionaba bien o tienes algo mal en el código.

Según el dibujo que hice, puedes detectar el sentido de la siguiente manera. Si tienes el canal A a 1, y se pone a cero, si el B está a 0 estás girando a izquierda, y si está a 1 estás girando a derecha.
Una opción es hacerlo con una interrupción cuando cambia el canal A, miro si el cambio fue de subida  o bajada, y luego escaneo como está el B.
Un saludo.


----------



## gmazz94 (Jun 19, 2012)

Buen ya entendí bien como funciona y todo. el código que tengo funciona por interrupciones,
funciona pero tengo un problema que es que no siempre me detecta el mismo sentido seguido. ej: giro el disco para un lado. y en el miditrace me tira que el pic manda 10 veces que gira para el lado correcto y un par de veces entre esas diez que gira para el lado incorrecto. como que me detecta mal el disco.

Encontré un problema que puede ser que el pic no me detecta bien los 1 y 0 en los pines de entrada ya que en la salida del LM358 cuando estoy girando el disco me figura que circulan 1,3v aprox y cuando no giro el disco 0v.
las conecciones las hice igual que el circuito que figura en el post anterior con las resistencias de 10k.

cual podría ser el problema?
todavía no pude ir a buscar otro disco rígido para probar. supongo que sera eso. 
En estos días pruebo con otro disco y comento los resultados.
muchas gracias


----------



## rachelies (Jun 20, 2012)

Prueba esto. Algún día lo vi no se donde cuando miraba esto del encoder con un disco duro. Yo no lo he montado, pero bueno, prueba que es fácil.
Y perdón por el dibujo, que lo hice con el paint ahora en un momento, jejeje


----------



## gmazz94 (Jun 22, 2012)

Buen después de mucha lucha, idas y vueltas pude hacer que funcione con el circuito que tenia antes(el ultimo que publico rachelies no me sirvió ) con el codigo que subio rachelies anteriormente, uno que no usaba interrupciones. pude hacer que funcione perfectamente el jog wheel. 
no se dan una idea lo feliz que estoy. 
voy a seguir avanzando con lo que ya tengo echo y posiblemente suba algo cuando lo tenga todo terminado.
Muchas Gracias a todos por la ayuda.


----------



## fernandoae (Jun 22, 2012)

Gente no pude sacarle fotos a mi invento!!!!  me trajeron una consola para reparar y como estaba dañada una de las placas agarre un pic y la converti a midi (en realidad hid), el cliente chocho  asi que dijo que me iba a traer algunas mas para ver que se podia hacer, de estas si voy a sacar fotos para compartirlas... 
gmazz me alegro mucho que te funcione! saludos.


----------



## gmazz94 (Jun 25, 2012)

Hola gente tengo un gran problema...
Todo lo que hice funciona en traktor pero cuando lo quiero hacer funcionar en VDJ no funciona porque se tilda cuando conecto mi dispositivo y cuando lo desconecto vuelve a la normalidad.
me estoy volviendo loco porque no anda
Puse el archivo devices y el mapper pero no funciona.
como que no se identifica el dispositivo o algo.
al final de la pagina 3 de este tema fernandoae tuvo el mismo problema... 
pero no figura como lo resolvió 

en el mapper tengo:


> <?xml version="1.0" encoding="UTF-8"?>
> <mapper device="SPV">
> <map value="JOG" action="jogwheel+1.0" />
> </mapper>



En el device tengo:


> <?xml version="1.0" encoding="UTF-8"?>
> <device name="SPV" type="MIDI" decks="1" >
> <jog cc="0x01" name="JOG" channel="1" deck="1" />
> </device>


----------



## fernandoae (Jun 25, 2012)

La verdad yo tampoco me acuerdo como lo solucioné! pero... bajate la ultima versión del vdj, desconectate de internet y ejecutalo como administrador (boton derecho, ejecutar como admin)... con eso capaz que se soluciona.


----------



## rachelies (Jun 28, 2012)

No creo que sea problema de version del VDj. Es problema de los mappers, que son un rollo. En el virtual dj nunca hice funcionar el jog wheel, solo los botones. Aquí te explica como se debe hacer. http://es.virtualdj.com/wiki/ControllerDefinitionMIDI.html 
Échale un vistazo y nos comentas. De todas formas, el Traktor está muy bien, no?
Un saludo


----------



## Eloy94 (Jul 6, 2012)

hola gente, me estado leyendo este tema bastante rato lo que pasa es que estoy bastante ocupado últimamente y quería pedirles ayuda.
necesito ayuda para construir un controlador para VDJ ya que lo he intentado con un teclado viejo sin éxito
agradecería mucho la ayuda,
he estado leyendo el foro pero por motivos varios no he podido prestarle la atención que me hubiera gustado
 Muchas Gracias


----------



## fernandoae (Jul 6, 2012)

Hola  con un teclado podes manejar botones unicamente, si lo haces con un microcontrolador pic ya podes hacer lo que se te ocurra... en que necesitas ayuda? porque si lees el tema ya está todo resuelto practicamente...


----------



## Eloy94 (Jul 6, 2012)

hola fernandoae y gracias por la rapidez de respuesta 
necesito ayuda con la placa para el microcontrolador pic toda la posible ya que yo de pic's no entiendo casi nada.... ya he visto alguna foto pero me hago bastante lío a la hora de detectar cuales son los componentes que lleva o los que se necesitan
Muchas Gracias otra vez


----------



## fernandoae (Jul 6, 2012)

Ah pero como para poder empezar tendrias que leer mucho sobre programacion de microcontroladores  sino lo veo dificil...


----------



## Eloy94 (Jul 6, 2012)

bueno lo de los pic tengo un amigo que lo sabe hacer, porque otra manera no hay no? u.u'
de todas necesito algo por donde empezar el proyecto
peron por mi insistencia. 
Muchas Gracias fernandoae.


----------



## rachelies (Jul 6, 2012)

Hola Eloy94. Más atrás hay un esquema hecho a mano. Búscalo, échale un vistazo y comenta lo que no entiendas. Pero bueno, necesitas saber de PICs, porque si no te va a sonar todo a chino, jejeje
Un saludo


----------



## Eloy94 (Jul 6, 2012)

rachelies supongo que te refieres a este esquema Ver el archivo adjunto 70477 la verdad es que entiendo muy poco, por eso pido ayuda u.u' no creia que fuera tan dificil de crear la verdad...
toda la ayuda que me puedas echar sera bienvenida 
Gracias por contestar a esta horas


----------



## fernandoae (Jul 6, 2012)

En realidad no es nada dificil esto de los pic una vez que lo estudias, pero lleva su tiempo  yo de a poco fui aprendiendo... y una vez que decidi aprender sobre el puerto USB en pics a los dos dias ya tenia mi primer programa funcionando...
Yo te puedo dar una mano si especificas mejor que es lo que queres hacer, por ejemplo la cantidad de botones, cuantos potenciometros (incluidos los faders y demas), salidas con led...


----------



## Eloy94 (Jul 7, 2012)

hola fernandoae y gracias por tu paciencia 
la idea es hacer algo como esto http://imagenes.pccomponentes.com/hercules_dj_control_mp3_e2_2.jpg
no se si es muy complicado...
en esta mesa hay:
35 botones (aunque yo querria poner 50 al ser posible)
8 potenciometros
3 faders
y lo que hace girar el plato 
5 led's
Muchas Gracias otra vez fernandoae


----------



## rachelies (Jul 7, 2012)

Para lo que quieres hacer tienes que utilizar un micro 18F4550, pero 50 botones igual son muchos, no se si podrías poner tantos. 
Tienes que utilizar ese mismo esquema, pero adaptándolo a lo que necesitas.
El esquema aunque esté mal dibujado, se entiende. Lo del medio es el PIC, lo de la derecha, la matriz de botones que hay 32, y tendrías que adaptarla a los que tu necesites; los 2 integrados de abajo a la izquierda son los operacionales para detectar el giro de los platos; y los otros 3 de la derecha, son expansores de salidas que comunican con el pic por I2C para poder tener más salidas para los leds. Luego, arriba a la izquierda hay 2 potenciometros, que tu tendrías que poner 11 en tu PIC, conectados a las entradas analógicas y poco más.

Yo creo que tendrías que empezar poco a poco intentando manejar un botón, luego un potenciometro... e ir ampliando poco a poco el proyecto, adaptándolo a tus necesidades. Me atrevería a decir que sin tenerlo practicado, es imposible hacer lo que tu quieres de una sola vez sin ir poco a poco.

Un saludo

Por cierto, ¿de donde eres?


----------



## fernandoae (Jul 7, 2012)

Rachelies con un 18F2550 tambien se puede... no hay que preocuparse por la cantidad de pines  para eso se recurre a los multiplexores digitales y analogicos, por ejemplo, con tres pines podes leer los 50 botones o mas, para 32 entradas analogicas se pueden usar cuatro multiplexores analogicos 8 a 1 y ahi con 4 entradas analogicas y tres salidas digitales para seleccion lo haces... para leds con tres pines manejas 500 si queres.


----------



## rachelies (Jul 7, 2012)

Bueno, con multiplexores si, jejeje, pero yo lo digo para no utilizarlos y no complicar más el circuito.


----------



## Eloy94 (Jul 7, 2012)

gracias a los dos otra vez 
rachelies soy de tarragona 
por cierto de que esquema me hablas :S
pido disculpas por lo pesado que soy pero me he leído todo varias y no he entendido mucho u.u'
cual es exactamente el material que necesito?
Gracias por vuestra paciencia


----------



## fernandoae (Jul 7, 2012)

necesitas, un pic con usb, un cristal para el pic, estudiar y paciencia jaja  una vez que estudies va a ser todo mas familiar y entendible y vas a poder hacer tu consola a gusto, con lo que vos quieras...


----------



## rachelies (Jul 8, 2012)

El esquema que te digo está en la página 2.
Por cierto, tarragona me pilla muy lejos para ir a ayudarte, jejeje


----------



## fernandoae (Jul 8, 2012)

Seria una linda función para el foro poder buscar gente por ubicación?


----------



## Niht (Ago 13, 2012)

Buenos dias a todos el codigo Para los Jogs se puede aplicar para los encoder tipo potenciometro? alguien lo a probado? desarme un controlador dañado y me encontre que trae muchos de ellos mas que potenciometros, quiero usar el chasis de ese controlador estropeado pára montar uno con microcontrolador.


----------



## rachelies (Ago 13, 2012)

perdona mi ignorancia, pero ¿como es un encoder tipo potenciometro? no se a que te refieres


----------



## Niht (Ago 13, 2012)

Buenas tardes Rachelies Gracias por responder, lo de tipo potenciometro hace referencia a su forma. El funcionamiento de este consta en dos llaves individuales con una conexión común a GND y que se activan una tras otra con un desfasaje de 90 grados. En uno de los sentidos de funcionamiento, uno de los impulsos obtenidos en los resistores pull-up (A) se adelantará 90° al otro (B) y en el sentido inverso B se adelantará a A. 
esa es una imagen del encoder del que hablo.


----------



## rachelies (Ago 15, 2012)

Aaaa, perdona, si si, los conozco. Con uno de esos pensaba hacerlo al principio, pero luego, leyendo las hojas de características vi que la vida útil no creo que sea adecuada para esto. Por servir, claro que sirve, y además no te hace falta el circuito con los operacionales, lo puedes enchufar directamente a las entradas.
Un saludo


----------



## Niht (Ago 21, 2012)

Disculpen tengo otra duda, lo que pasa es que tengo un problema cuando conecto el Pic al pc a veces se queda como pegado enviando datos midi en una especie de loop hasta que se bloquea el midi trace, ya cambie el cristal pero sigue igual lo único que me queda es el condensador de VUSB tengo uno 470nf que recicle de una tarjeta ese valor lo tome de un diagrama de conexión en la web pero varían muchos los valores que se encuentran en los diagramas, en uno vi que conectan un condensador de 47uf electrolítico entonces tengo dudas en cual debo usar ya que los de 220nf que pide en el datasheet no lo consigo en las tiendas de electrónica. 
¿Esta puede ser la causa de la inestabilidad del Pic?


----------



## rachelies (Ago 21, 2012)

No se si eso puede ser una causa o no. Yo siempre utilizo uno de 0.47uF electrolítico. Está claro que si es algo que pasa solo de vez en cuando puede ser un problema en la conexion o algún componente


----------



## josb86 (Ago 21, 2012)

si se desgastan muy rápido yo compre uno hace un tiempo para probar, por allí fogonazo alguna ves hizo un post sobre como hacer un encoder rotativo


----------



## electrochispa (Ago 22, 2012)

hola job86 usted me puede regalar el codigo completo de un boton para partir de hay comenzar a construir mi controlador quiero hacer una especie de reproductor de samples, he estado probando con codigos que hay en el foro pero no me ha salido nada usted me puede colaborar?



Buen dia! desde colombia, alguien del foro que me pueda pasar un codigo completo de un boton yo tengo un pic 18f4550 he probado con codigos del foro pero no me sale con un codigo de un boton funcionando puedo partir, parece una pavada que envie dato midi de ON cuando se presione y un OFF cuando se suelte pero que no se mantenga el dato OFF, ya me estoy volviendo chango jajajaja...


----------



## josb86 (Ago 22, 2012)

@electrochispa cual codigo? para trabajar con el encoder?


----------



## electrochispa (Ago 22, 2012)

Hola Josb86 pues te cuento que por ahora estoy comenzando con pulsadores (botones) pero si me facilitan tambien los ejemplos de código completos para ecordér y potenciómetro yo no me disgustaría para nada jajaja con esa información me dedico a  hacer pruebas y ya solo quedaría unir código, yo se que en el foro hay fragmentos de código pero a la hora de probar se escapan cosas, aclaro que de CCS no sabía nada estuve leyendo, haciendo pruebas y practicando para aprender pero echar una mano con "ejemplos de código completo" y que este probado nos llega del cielo.  
Gracias por contestar y quedo ansioso a la respuesta


----------



## josb86 (Ago 22, 2012)

bueno mira para manejar el encoder tiene que trabajar con interrupciones pude ser la interrupción por el pin INT y la configuras como flanco de subida, conectas el pin 2 del encoder al pin int del pic y el 3 lo puedes conectar a cualquiera, ahora si miras el gráfico que coloco @niht si hay un cambio de flanco miras enseguida el estado del pin donde conectaste el pin 3 del encoder si el estado es bajo estas girando hacia la izquierda y si el estado es alto va hacia la derecha, recomiendo utilizar capacitores de 100nf en paralelo con cada sw por lo de los rebotes.

Ahora bien este tema es un poco avanzado, sobre todo por lo del usb. en este momento no recuerdo muy bien el programa que realice esta aqui https://www.forosdeelectronica.com/f24/controlador-midi-usb-pic-virtual-dj-39371/index10.html

ero hay una parte que no funciona y que hay que mejorar no le seguí dando, mi computador se pegaba después me dijeron aquí que había que deshabitar la tarjeta de red.


----------



## rachelies (Ago 23, 2012)

electrochispa, no entiendo lo que quieres decir con lo de ON  y OFF. ¿Quieres que al pulsar una vez envíe ON, se mantenga en ON, y al pulsar otra vez se ponga en OFF? Dime lo que quieres hacer para echarte una mano a arrancar con el proyecto, y por la mañana te puedo ir dando ideas, que ahora en España es hora de irse a la cama, jejeje
Un saludo


----------



## josb86 (Ago 23, 2012)

electrochispa si quieres trabajar midi usb lo mas importante primero es montar el circuito bien, con figurar el reloj bien, y tener el descriptor indicado, como te dije yo hice un comentario anterior el programa funciona no perfecto ero funciona yo lo monte con un 18f4550 y un reloj de 20Mhz hay dos carpetas en el zip uno es prueba middi alli adentro hay un archivo .h llamado descriptor ese archivo se lo cargas al pic ara que el cuando sea conectado a una c el le diga a la pc que es un controlador de audio. en la carpeta prueba midi 2 esta el programa que estuve haciendo también funciona aunque faltan algunos detalles, en el puerto d coloque 8 pulsadores y coloque un capacitor de 470nanofaradios entre el in 18 (Vusb) y tierra.


----------



## fernandoae (Ago 23, 2012)

> Hola Josb86 pues te cuento que por ahora estoy comenzando con pulsadores  (botones) pero si me facilitan tambien los ejemplos de código completos  para ecordér y potenciómetro yo no me disgustaría para nada jajaja


Gente yo creo que con lo que comentamos en el foro con rachelies ya les da como para empezar a hacer sus cosas, ejemplos hay de todo... ahora le quedaria estudiarlos y entenderlos para poder hacer sus propios equipos


----------



## rachelies (Ago 24, 2012)

Hola fernandoae!! Estoy contigo, creo que hemos comentado tantas posibilidades que ya está todo en el hilo, solo queda unir partes y que cada uno lo adapte a sus necesidades, por que lo que es cierto, no existe un código completo que sirva para todos los controladores. 
Cada uno tiene que pensar la configuración de su controlador y luego adaptar el código, que ya está todo aqui explicado.

Un saludo


----------



## fernandoae (Ago 24, 2012)

Este controlador me gustó, es basico pero tiene las funciones necesarias


----------



## rachelies (Ago 25, 2012)

jejeje, curioso. ¿Donde lo has visto?


----------



## fernandoae (Ago 25, 2012)

buscando info en internet... me gustó porque es simple y con los mismos botones se manejan los efectos, los loops y los samples


----------



## zeta_bola_1 (Ago 26, 2012)

fernandoae dijo:


> buscando info en internet... me gustó porque es simple y con los mismos botones se manejan los efectos, los loops y los samples



vos viste lo que salen los que vende musimundo??


----------



## fernandoae (Ago 26, 2012)

No no  cuanto?


----------



## zeta_bola_1 (Ago 27, 2012)

fernandoae dijo:


> No no  cuanto?



los siguientes links son sin animo de lucro

http://musimundo.com/producto-3800000048318~CONSCONTROLADOR-DJ-DUO-POKET.aspx

http://musimundo.com/producto-3800000026438~MEZCLADORA--CONTROLADORA-USB-DJ-FOR-ALL.aspx

http://musimundo.com/producto-3800000026448~MEZCLADORA--CONTROLADORA-USB-DJ-IMIX.aspx


----------



## fernandoae (Ago 27, 2012)

Al mio me queda mejorarle lo estetico y soy capaz de hacerlo mucho mejor que esos juguetitos plasticos para nenes jaja


----------



## zeta_bola_1 (Ago 27, 2012)

fernandoae dijo:


> Al mio me queda mejorarle lo estetico y soy capaz de hacerlo mucho mejor que esos *juguetitos plasticos para nenes* jaja



por eso te habia preguntado si habias visto los precios jaja


----------



## Niht (Ago 27, 2012)

Saludos a todos, quiero contarles que solucione el problema de la inestabilidad del Pic colocando un condensador de 100nf en la alimentación. Por otro lado haciendo pruebas descubrí algo que me tiene pensando, tengo un potenciómetro y tres botones  cuando oprimo un botón no puedo usar otra función por decir el potenciómetro u otro botón  solo hace una tarea a la vez me pregunto si me pueden colaborar con el asunto ustedes me dirán si posteo mi código a ver que puede estar ocurriendo.
Gracias.


----------



## capitanp (Ago 27, 2012)

zeta_bola_1 dijo:


> los siguientes links son sin animo de lucro
> 
> http://musimundo.com/producto-3800000048318~CONSCONTROLADOR-DJ-DUO-POKET.aspx
> 
> ...




jajajjaaaj que garompa, ahora se juega el dj?


----------



## fernandoae (Ago 27, 2012)

@niht
antes de que subas el codigo te voy a decir que pasa jaja, seguramente esta mal diseñado el programa y se queda en un bucle leyendo el boton, pero subilo y lo vemos compañero!
https://www.forosdeelectronica.com/miembros/51972-niht/


----------



## zeta_bola_1 (Ago 27, 2012)

capitanp dijo:


> jajajjaaaj que garompa, ahora se juega el dj?




bueno, hay algo peor, asi como hay un guitar hero o rockband donde se usan instrumentos, hay un dj no secuanto, que usan una mesa para hacer scrach y un par de potes delizables, alto curro!!!


----------



## fernandoae (Ago 27, 2012)

Si, el DJ HERO  ni con el nombre se gastaron..
http://www.geek.com.mx/2009/07/grandmaster-flash-en-dj-hero/


----------



## zeta_bola_1 (Ago 27, 2012)

fernandoae dijo:


> Si, el DJ HERO  ni con el nombre se gastaron..
> http://www.geek.com.mx/2009/07/grandmaster-flash-en-dj-hero/



ese!! jaja, viste la "turntable"? jaja. ojo, a mi me encanta el rock band, mi ahijado tiene los instrumentos en casa y nunca los uso, sabes la paliza que le doy a la bateria y un amigo a la viola. esos si estan buenos, pero el del dj? mmmmmmm


----------



## Niht (Ago 28, 2012)

fernandoae gracias por la ayuda, al igual que muchos aquí emprendimos este proyecto sin conocer nada del lenguaje pero con paciencia hemos ido aprendiendo un poco, como voz dices seguramente está mal diseñado “no sería nada raro ”.
Este es el codigo que tengo "tengan compasión de mi" 


```
#include <18F4550.h>
#device ADC=8
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN      //~~~ 20MHZ OSCILLATOR CONFIGS ~~~//
#use delay(clock=48000000)


#DEFINE USB_HID_DEVICE     FALSE
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK  //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP2_RX_ENABLE  USB_ENABLE_BULK  //turn on EP1 for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    64  //size to allocate for the tx endpoint 1 buffer
#define USB_EP2_RX_SIZE    64   //size to allocate for the rx endpoint 1 buffer

#include <pic18_usb.h>
#include <descriptors.h>   //USB Configuration and Device descriptors 
#include <usb.c>           //handles usb setup tokens and get descriptor reports

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#use fast_io(A)
#use fast_io(B)


#byte PORTB=0xF82


int tempoA1,tempoA2,tempoA11;
int envia[4];  
unsigned char tempA[4];

void envia_nota()
{   usb_put_packet(1,envia,4,USB_DTS_TOGGLE);
}

void main(void) {
   
   tempoA11=tempoA2=0;
   envia[1]=0x90;
   envia[0]=envia[1]>>4;
   setup_adc_ports(AN0_TO_AN1);  
   setup_adc(ADC_CLOCK_INTERNAL);
   usb_init_cs();

   while (TRUE) {
      usb_task();

      if(usb_enumerated()) 
    {

      {   set_adc_channel(0);
         delay_us(30);
         tempoA1=read_adc();
         tempoA11=tempoA1/2;      
                       
        
         if(tempoA11!=tempoA2)   
            {   tempA[1]=0xB0;
               tempA[0]=tempA[1]>>4;
               tempA[2]=0x00;
               tempA[3]=tempoA11;
               usb_put_packet(1,tempA,4,USB_DTS_TOGGLE);
               tempoA2=tempoA11;
            }
               
          { If (input (PIN_B0))          
      {  delay_ms (10);             
         If (input (PIN_B0));       
            envia[1] = 0x90; //Note on
            envia[0] = envia[1]>>4;
            envia[2] = 0x00; // Nota 0
            envia[3] = 0x7F; // Volumen 127
            envia_nota();
            
         {  do { } while (input (PIN_B0));  
            bit_set(PORTB,0);
            delay_ms(60);
            bit_clear(PORTB,0);
            envia[1] = 0x90; //Note off
            envia[0] = envia[1]>>4;
            envia[2] = 0x00; //Nota 0
            envia[3] = 0x00; // Volumen 0
            envia_nota();
                }
      }
                
                { If (input (PIN_B1))          
      {  delay_ms (10);             
         If (input (PIN_B1));     
            envia[1] = 0x90; //Note on
            envia[0] = envia[1]>>4;
            envia[2] = 0x01; // Nota 0
            envia[3] = 0x7F; // Volumen 127
            envia_nota();
            
         {  do { } while (input (PIN_B1));  
            bit_set(PORTB,1);
            delay_ms(60);
            bit_clear(PORTB,1);
            envia[1] = 0x90; //Note off
            envia[0] = envia[1]>>4;
            envia[2] = 0x01; //Nota 0
            envia[3] = 0x00; // Volumen 0
            envia_nota();
             }
      }
                
                { If (input (PIN_B2))          
      {  delay_ms (10);             
         If (input (PIN_B2));      
            envia[1] = 0x90; //Note on
            envia[0] = envia[1]>>4;
            envia[2] = 0x02; // Nota 0
            envia[3] = 0x7F; // Volumen 127
            envia_nota();
            
         {  do { } while (input (PIN_B2));  
            bit_set(PORTB,2);
            delay_ms(60);
            bit_clear(PORTB,2);
            envia[1] = 0x90; //Note off
            envia[0] = envia[1]>>4;
            envia[2] = 0x02; //Nota 0
            envia[3] = 0x00; // Volumen 0
            envia_nota();
                }
              }
            }
          }
        }
      }
     }
   }
}
```


----------



## rachelies (Ago 28, 2012)

Hola Niht. Veo que has utilizado los comentarios y la forma de mi código, jejejje. Me alegro, así me resulta más fácil de leer. La forma de gestionar los botones no es la más correcta. Te explico:

-Detectas si el botón ha sido pulsado con "If (input (PIN_Bx)" y luego envias el note_on. Ok, está bien, pero luego dejas parado el programa con el "do{} while (input (PIN_Bx)", y hasta que no lo sueltas y envía el note_off, el programa está esperando en ese "do{}..." y no puede hacer nada más.

Yo lo he hecho de otra forma. Cuando presiono un botón, entro en una interrupción, detecto que botón se ha pulsado, y calculo si lo que tengo que enviar es un note_on o un note_off, salgo de la interrupción y sigo con otras cosas, incluso puedo pulsar otro botón mientras tengo ese pulsado, y luego, cuando suelto, entro de nuevo en la interrupción y vuelvo a hacer lo mismo.
Claro, esto puedes hacerlo con botones conectados en el puerto B, pines 4,5,6 y 7.

Y no te preocupes, haciendo una matriz puedes conectar un montón de botones, no solo 4, jejejej.

venga, mira a ver si puedes solucionar algo y nos comentas. Un saludo


----------



## fernandoae (Ago 28, 2012)

Yo sabia jeje!!! se queda en un bucle esperando a que sueltes el boton


----------



## Niht (Ago 29, 2012)

Hola foro, decidí tomar el ejemplo de la matriz para los botones que subió rachelies "MIDI_12" pero tengo un problemilla del número de nota 0X00 a la 0X07 envía el valor de volumen de nota 0X7F  pero después del número de nota 0X07 todos los valores de volumen de nota son 0X00 esto es lo que me muestra el Miditrace.

90 04 7F 00
90 04 00 00
90 05 7F 00
90 05 00 00
90 06 7F 00
90 06 00 00
90 07 7F 00
90 07 00 00
90 08 00 00
90 08 00 00
90 09 00 00
90 09 00 00
90 0A 00 00
90 0A 00 00

El subprograma de busca diferencias está bien no se a que se deba ustedes me podrían explicar he estado revisando pero no doy con la falla.


```
#include <18F4550.h>
#device ADC=8
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN      //~~~ 20MHZ OSCILLATOR CONFIGS ~~~//
#use delay(clock=48000000)


#DEFINE USB_HID_DEVICE     FALSE
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK  //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP2_RX_ENABLE  USB_ENABLE_BULK  //turn on EP1 for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    64  //size to allocate for the tx endpoint 1 buffer
#define USB_EP2_RX_SIZE    64   //size to allocate for the rx endpoint 1 buffer

#include <pic18_usb.h>
#include <midi7.h>   //USB Configuration and Device descriptors 
#include <usb.c>           //handles usb setup tokens and get descriptor reports


#use fast_io(A)
#use fast_io(B)
#use fast_io(C)

#byte PORTA=0xF80
#byte PORTB=0xF81
#byte PORTC=0xF82
#byte LATB=0xF8A
#byte INTCON=0xFF2
#byte ADCON1=0XFC1

short bitT;
int tempoA1,tempoA2,tempoA11;
int matriz1,matriz2,matriz1bis,matriz2bis;
int matriz3,matriz4,matriz3bis,matriz4bis;
int diferencias,contador;
unsigned char envia[4];
unsigned char tempA[4];

void envianota()
{   
   envia[1]=0x90;
   envia[0]=envia[1]>>4;
   
   usb_put_packet(1,envia,4,USB_DTS_TOGGLE);
}


void busca_diferencias()
{   diferencias=matriz1^matriz1bis;
   if(diferencias!=0)
      {   contador=0x00;
         while(contador<=0x07)
         { if(bit_test(diferencias,0))
            {   envia[2]=contador;
               bitT=bit_test(matriz1,contador);
               envia[3]=0x7F*bitT;
               envianota();
            }
         contador++;
         rotate_right(&diferencias,1);

      }
      }
   diferencias=matriz2^matriz2bis;
   if(diferencias!=0)
      {   contador=0x08;
         while(contador<=0x0F)
         { if(bit_test(diferencias,0))
            {   envia[2]=contador;
               bitT=bit_test(matriz2,contador);
               envia[3]=0x7F*bitT;
               envianota();
            }
         contador++;
         rotate_right(&diferencias,1);

      }
      }
   diferencias=matriz3^matriz3bis;
   if(diferencias!=0)
      {   contador=0x10;
         while(contador<=0x17)
         { if(bit_test(diferencias,0))
            {   envia[2]=contador;
               bitT=bit_test(matriz3,contador);
               envia[3]=0x7F*bitT;
               envianota();
            }
         contador++;
         rotate_right(&diferencias,1);

      }
      }
   diferencias=matriz4^matriz4bis;
   if(diferencias!=0)
      {   contador=0x18;
         while(contador<=0x1F)
         { if(bit_test(diferencias,0))
            {   envia[2]=contador;
               bitT=bit_test(matriz4,contador);
               envia[3]=0x7F*bitT;
               envianota();
            }
         contador++;
         rotate_right(&diferencias,1);

      }
      }
}

#int_RB
void RB_isr()
{
   matriz1bis=matriz1;
   matriz2bis=matriz2;
   matriz3bis=matriz3;
   matriz4bis=matriz4;
   LATB=PORTB;
   delay_ms(20);
   if(bit_test(PORTB,7)&&bit_test(PORTB,6)&&bit_test(PORTB,5)&&bit_test(PORTB,4))
   {
      matriz1=matriz2=matriz3=matriz4=0;
      busca_diferencias();
      return;
   }
   output_high(PIN_A2);
   output_high(PIN_A3);
   output_high(PIN_A4);
   output_high(PIN_A5);
   output_high(PIN_C0);
   output_high(PIN_C1);
   output_high(PIN_C2);
   delay_cycles(10);
   output_low(PIN_C6);
   delay_cycles(10);
   if(!(bit_test(PORTB,7)&&bit_test(PORTB,6)&&bit_test(PORTB,5)&&bit_test(PORTB,4)))
   {
      if(!bit_test(PORTB,7)) bit_set(matriz4,4);
      else bit_clear(matriz4,4);
      if(!bit_test(PORTB,6)) bit_set(matriz4,5);
      else bit_clear(matriz4,5);
      if(!bit_test(PORTB,5)) bit_set(matriz4,6);
      else bit_clear(matriz4,6);
      if(!bit_test(PORTB,4)) bit_set(matriz4,7);
      else bit_clear(matriz4,7);
      delay_cycles(10);

   }
   output_low(PIN_C2);
   delay_cycles(10);
   output_high(PIN_C6);
   delay_cycles(10);
   if(!(bit_test(PORTB,7)&&bit_test(PORTB,6)&&bit_test(PORTB,5)&&bit_test(PORTB,4)))
   {
      if(!bit_test(PORTB,7)) bit_set(matriz4,0);
      else bit_clear(matriz4,0);
      if(!bit_test(PORTB,6)) bit_set(matriz4,1);
      else bit_clear(matriz4,1);
      if(!bit_test(PORTB,5)) bit_set(matriz4,2);
      else bit_clear(matriz4,2);
      if(!bit_test(PORTB,4)) bit_set(matriz4,3);
      else bit_clear(matriz4,3);
      delay_cycles(10);

   }
   output_low(PIN_C1);
   delay_cycles(10);
   output_high(PIN_C2);
   delay_cycles(10);
   if(!(bit_test(PORTB,7)&&bit_test(PORTB,6)&&bit_test(PORTB,5)&&bit_test(PORTB,4)))
   {
      if(!bit_test(PORTB,7)) bit_set(matriz3,4);
      else bit_clear(matriz3,4);
      if(!bit_test(PORTB,6)) bit_set(matriz3,5);
      else bit_clear(matriz3,5);
      if(!bit_test(PORTB,5)) bit_set(matriz3,6);
      else bit_clear(matriz3,6);
      if(!bit_test(PORTB,4)) bit_set(matriz3,7);
      else bit_clear(matriz3,7);
      delay_cycles(10);
   
   }
   output_low(PIN_C0);
   delay_cycles(10);
   output_high(PIN_C1);
   delay_cycles(10);
   if(!(bit_test(PORTB,7)&&bit_test(PORTB,6)&&bit_test(PORTB,5)&&bit_test(PORTB,4)))
   {
      if(!bit_test(PORTB,7)) bit_set(matriz3,0);
      else bit_clear(matriz3,0);
      if(!bit_test(PORTB,6)) bit_set(matriz3,1);
      else bit_clear(matriz3,1);
      if(!bit_test(PORTB,5)) bit_set(matriz3,2);
      else bit_clear(matriz3,2);
      if(!bit_test(PORTB,4)) bit_set(matriz3,3);
      else bit_clear(matriz3,3);
      delay_cycles(10);
   
   }
   output_low(PIN_A5);
   delay_cycles(10);
   output_high(PIN_C0);
   delay_cycles(10);
   if(!(bit_test(PORTB,7)&&bit_test(PORTB,6)&&bit_test(PORTB,5)&&bit_test(PORTB,4)))
   {
      if(!bit_test(PORTB,7)) bit_set(matriz2,4);
      else bit_clear(matriz2,4);
      if(!bit_test(PORTB,6)) bit_set(matriz2,5);
      else bit_clear(matriz2,5);
      if(!bit_test(PORTB,5)) bit_set(matriz2,6);
      else bit_clear(matriz2,6);
      if(!bit_test(PORTB,4)) bit_set(matriz2,7);
      else bit_clear(matriz2,7);
      delay_cycles(10);
   
   }
   output_low(PIN_A4);
   delay_cycles(10);
   output_high(PIN_A5);
   delay_cycles(10);
   if(!(bit_test(PORTB,7)&&bit_test(PORTB,6)&&bit_test(PORTB,5)&&bit_test(PORTB,4)))
   {
      if(!bit_test(PORTB,7)) bit_set(matriz2,0);
      else bit_clear(matriz2,0);
      if(!bit_test(PORTB,6)) bit_set(matriz2,1);
      else bit_clear(matriz2,1);
      if(!bit_test(PORTB,5)) bit_set(matriz2,2);
      else bit_clear(matriz2,2);
      if(!bit_test(PORTB,4)) bit_set(matriz2,3);
      else bit_clear(matriz2,3);
      delay_cycles(10);
   
   }
   output_low(PIN_A3);
   delay_cycles(10);
   output_high(PIN_A4);
   delay_cycles(10);
   if(!(bit_test(PORTB,7)&&bit_test(PORTB,6)&&bit_test(PORTB,5)&&bit_test(PORTB,4)))
   {
      if(!bit_test(PORTB,7)) bit_set(matriz1,4);
      else bit_clear(matriz1,4);
      if(!bit_test(PORTB,6)) bit_set(matriz1,5);
      else bit_clear(matriz1,5);
      if(!bit_test(PORTB,5)) bit_set(matriz1,6);
      else bit_clear(matriz1,6);
      if(!bit_test(PORTB,4)) bit_set(matriz1,7);
      else bit_clear(matriz1,7);
      delay_cycles(10);
   
   }
   output_low(PIN_A2);
   delay_cycles(10);
   output_high(PIN_A3);
   delay_cycles(10);
   if(!(bit_test(PORTB,7)&&bit_test(PORTB,6)&&bit_test(PORTB,5)&&bit_test(PORTB,4)))
   {
      if(!bit_test(PORTB,7)) bit_set(matriz1,0);
      else bit_clear(matriz1,0);
      if(!bit_test(PORTB,6)) bit_set(matriz1,1);
      else bit_clear(matriz1,1);
      if(!bit_test(PORTB,5)) bit_set(matriz1,2);
      else bit_clear(matriz1,2);
      if(!bit_test(PORTB,4)) bit_set(matriz1,3);
      else bit_clear(matriz1,3);
      delay_cycles(10);
   
   }
      output_low(PIN_A2);
      output_low(PIN_A3);
      output_low(PIN_A4);
      output_low(PIN_A5);
      output_low(PIN_C0);
      output_low(PIN_C1);
      output_low(PIN_C2);
      output_low(PIN_C6);
      LATB=PORTB;
      busca_diferencias();
      return;
}

void main(void) {
   delay_ms(1000);
   set_tris_A(0b00000011);      //PORTA todo salidas, menos AN0 y AN1
   set_tris_B(0b11111111);      //PORTB entradas
   set_tris_C(0b10000000);
   port_B_pullups(TRUE);
   LATB=PORTB;
   output_C(0);
   PORTA=0;
   tempoA11=tempoA2=0;
   setup_adc_ports(AN0_TO_AN1);  //AN0 y AN1 como entradas analogicas
   setup_adc(ADC_CLOCK_INTERNAL);
   
   usb_init_cs();
   
   INTCON=0;
   enable_interrupts(INT_RB);   //Interrupciones por cambio en RB7 a RB4
   enable_interrupts(global);

   while (TRUE) {
      usb_task();

      if(usb_enumerated()) 
    {

         set_adc_channel(0);
         delay_us(30);
         tempoA1=read_adc();
         tempoA11=tempoA1/2;      //convierte del rango
                           //0xFF a 0x7F para Midi
        
         if(tempoA11!=tempoA2) //comprueba si ha cambiado el tempo para enviarlo  
            {   tempA[1]=0xB0;
               tempA[0]=tempA[1]>>4;
               tempA[2]=0x00;
               tempA[3]=tempoA11;
               usb_put_packet(1,tempA,4,USB_DTS_TOGGLE);
               tempoA2=tempoA11;
            }
        }
     }
  }
```


----------



## rachelies (Ago 30, 2012)

He encontrado el fallo. Ese archivo que he subido me acabo de dar cuenta que está mal. En la subrutina de "busca_diferencias()", en la primera parte se analiza la matriz1; eso está bien. En las 3 restantes, en las líneas como:

```
bitT=bit_test(matriz2,contador);
```
debería poner:

```
bitT=bit_test(matriz2,(contador-8));
```
En matriz3 y matriz4 también hay que corregirlo, pero restando 16 y 24 respectivamente.
Pongo ese trozo de código completo:

```
void busca_diferencias()
{	diferencias=matriz1^matriz1bis;
	if(diferencias!=0)
		{	contador=0x00;
			while(contador<=0x07)
			{ if(bit_test(diferencias,0))
				{	envia[2]=contador;
					bitT=bit_test(matriz1,contador);
					envia[3]=0x7F*bitT;
					envianota();
				}
			contador++;
			rotate_right(&diferencias,1);

		}
		}
	diferencias=matriz2^matriz2bis;
	if(diferencias!=0)
		{	contador=0x08;
			while(contador<=0x0F)
			{ if(bit_test(diferencias,0))
				{	envia[2]=contador;
					bitT=bit_test(matriz2,(contador-8));
					envia[3]=0x7F*bitT;
					envianota();
				}
			contador++;
			rotate_right(&diferencias,1);

		}
		}
	diferencias=matriz3^matriz3bis;
	if(diferencias!=0)
		{	contador=0x10;
			while(contador<=0x17)
			{ if(bit_test(diferencias,0))
				{	envia[2]=contador;
					bitT=bit_test(matriz3,(contador-16));
					envia[3]=0x7F*bitT;
					envianota();
				}
			contador++;
			rotate_right(&diferencias,1);

		}
		}
	diferencias=matriz4^matriz4bis;
	if(diferencias!=0)
		{	contador=0x18;
			while(contador<=0x1F)
			{ if(bit_test(diferencias,0))
				{	envia[2]=contador;
					bitT=bit_test(matriz4,(contador-24));
					envia[3]=0x7F*bitT;
					envianota();
				}
			contador++;
			rotate_right(&diferencias,1);

		}
		}
}
```

Perdón por el error. 
Un saludo


----------



## Niht (Sep 1, 2012)

Gracias por la corrección del código rachelies todo funcionando bien, también hice pruebas del encoder. Que tal son los CD4051? O que multiplexor recomiendan? La idea es agregar unos cuantos potes y ya comienzan a  escasear  los puertos del pic jejeje.


----------



## rachelies (Sep 1, 2012)

Nunca he probado los multiplexores. En mi controlador lo que tengo son expansores de salidas PCF8574N (que utilizo para los leds) que se conectan por i2c, y así no gastas pines para manejar los multiplexores. También hay circuitos de estos para conversiones a/d. 
Creo que el i2c es la mejor opción para ampliar el circuito sin seguir gastando pines del microcontrolador.
Un saludo



Sin buscar mucho, lo primero que me ha salido ha sido esto, ADS1015. 4 conversores A/D con interface i2c


----------



## zeta_bola_1 (Sep 1, 2012)

se que no tiene casi nada que ver con lo que estan haciendo, pero vieron esto?(verlo es una forma de decir, por uqe no hay imagenes)

http://www.taringa.net/posts/hazlo-...-mixer-para-Virtual-DJ-y-te-lo___-_EDIT_.html


----------



## rachelies (Sep 2, 2012)

Hay varios proyectos así, utilizando un joystick o creando una interface HID con un PIC, y luego hay varios software que convierten estos comandos en MIDI. Yo empecé por ahí, pero me parece un rollo tener que poner un software intermedio.


----------



## zeta_bola_1 (Sep 2, 2012)

sisi, es verdad, lo puse como ejemplo, por ejemplo en mi caso me vendria bien solo tener un boton de play y pause por deck, el plato que ahora no me acuerdo como se llama apenas lo uso, el resto de las funciones las realizo con consola externa(volumen, fader, etc)


----------



## Niht (Sep 19, 2012)

Buenos dias a todos les cuento ya tengo trabajando botones, fader, y encoder me gustaria agregarle los led, alguien podria explicarme mejor esta parte en el foro dice que con esta instruccion el pic detecta los datos de entrada.


```
if (usb_kbhit(1)) 
{
  usb_get_packet(1,recibe,8);
}
```

pero como direcciono el dato a un puerto del pic o en dado caso un expansorpara tener mas salidas, como sabe al pic que nota midi se esta enviando para cada led. yo uso traktor y estoy trabajando en MIDI.

Gracias.


----------



## rachelies (Sep 23, 2012)

Hola Niht. Has llegado al punto más engorroso, jejeje. A ver si te lo puedo explicar fácilmente, porque hace tiempo que no uso el traktor, aunque es más fácil que con VirtualDj. Por ejemplo para el botón del play, vas a configuración de "Midi Mapping". Agregas un nuevo comando, "Transport"--"Play/Pause", y luego lo configuras como "Output---LED" y la asignas a la nota que te interese. 
Luego, cuando el Traktor lo vea oportuno, te envia esa nota por el Midi, que es lo que detecta el PIC con  

```
if (usb_kbhit(1)) 
{
  usb_get_packet(1,recibe,8);
}
```

A mi me llega una trama más o menos así:

Encender led: 	09 90 20 7F
Apagar led:		09 90 20 00

Cuando ese "if" detecta que ha llegado algo, voy a una subrutina donde descifro que es lo que ha llegado, leyendo el tercer byte que es la nota, en este caso 0x20 y el cuarto byte, que si es 0x7F es encender led, y si es 0x00 apagar.

Que led tienes que encender o apagar lo tienes que tener en cuenta tú. En mi controlador, de la 0x20 a la 0x27 van a un expansor de salidas, de la 0x28 a 0x2F a otro, y de la 0x30 a 0x37 a otro más, total 24 leds.
Este es mi programa completo para gestionar los leds:


```
int32 leds;
#locate leds=0x50
#byte leds1=0x50
#byte leds2=0x51
#byte leds3=0x52

/////////////////////////////////////////
//subprograma para lectura leds
////////////////////////////////////////

void detecta_led()
{	leds1copia=leds1;
	leds2copia=leds2;
	leds3copia=leds3;	
	recibe[2]=recibe[2]-32;
	if(recibe[3]==127) bit_clear(leds,recibe[2]);		//encender leds
	if(recibe[3]==0) bit_set(leds,recibe[2]);		//apagar leds
	
	if(leds1!=leds1copia){
		i2c_start();
		i2c_write(0x40);
		i2c_write(leds1);
		i2c_stop();
		}	
	if(leds2!=leds2copia){
		i2c_start();
		i2c_write(0x42);
		i2c_write(leds2);
		i2c_stop();
		}	
	if(leds3!=leds3copia){
		i2c_start();
		i2c_write(0x44);
		i2c_write(leds3);
		i2c_stop();
		}	
}
```

Un saludo y ya comentarás que tal. Espero que la explicación esté mas o menos, jejeje


----------



## electrochispa (Oct 9, 2012)

hola!!! estube probando los codigos para el pic que han subido y ya hice funcionar algunos con lo que no he podido es con los Jogswheel para hacer el scratch, use unos  codigos que hay en el tema el que tiene interrupciones y el que no  pero no me funcionan consegui un motor de disco duro y monte el circuito de los operacionales para generar los pulsos pero no me funcionan los codigo que probe. si hay algun alma caritativa que se apiade de mi y me ayude con el codigo para poner a funcionar los jogwheel se lo agradesco yo se que me diran que en el tema esta todo para hacerlo y creanme ya lo he leido de arriba a abajo y he buscado en internet pero quedo en las mismas... gracias por la colaboracion que me den.


----------



## fernandoae (Oct 9, 2012)

Hola... en el tema está todo para hacerlo, jaja ... fijate en mi canal los videos de las jogwheels con indicadores led, una vez que estes seguro que en la salida tenes bien los pulsos empezá con la programación. Yo lo hice funcionar con ele ejemplo ese que no necesita interrupciones, me anduvo a la primera por suerte. 

http://www.youtube.com/user/fernandoae/videos


----------



## dinoelectro (Oct 9, 2012)

muy buen trabajo fernando.. me gusta el proyecto usb-dmx, aunque seria bueno que lo cambies de cdc a hid.. 

espero algun dia construirlo!


----------



## electrochispa (Oct 10, 2012)

fernandoae el codigo sin interrupciones al que te refieres es este?

```
x=0;
for(;;){	
	pos2=pos;

if(bit_test(PORTB,0)){
	if(bit_test(PORTB,1)) pos=3;
	else pos=2;
}
if(!(bit_test(PORTB,0))){
	if(bit_test(PORTB,1)) pos=4;
	else pos=1;
}
if (pos2!=pos){
	switch(pos){
		case 1: if(pos2==4) x++;
				else x--;
				break;
		case 2: if(pos2==1) x++;
				else x--;
				break;
		case 3: if(pos2==2) x++;
				else x--;
				break;
		case 4: if(pos2==3) x++;
				else x--;
				break;
}
}
}
```

podrias explicarme con este codigo como enviar el buffer con los datos midi.


----------



## fernandoae (Oct 22, 2012)

Claro, igual yo mucho no manejo ccs... yo uso mas el basic  pero es esta parte la del codigo:
if (pos2!=pos){ 	switch(pos){ 		case 1: if(pos2==4) x++; 				else x--; 				break; 		case 2: if(pos2==1) x++; 				else x--; 				break; 		case 3: if(pos2==2) x++; 				else x--; 				break; 		case 4: if(pos2==3) x++; 				else x--; 				break;


----------



## roberto_in (Dic 11, 2012)

Buenas a todos! Excelentes los aportes de todos; muy interesante el proyecto. Quería preguntarles cómo hago para que el Traktor reconozca el dispositivo? No me quedó muy claro lo de los Mappers y Devices. Estoy programando en CCS y simulando con Proteus (ni bien consiga el PIC lo armo real). Hasta ahora logro que windows me reconozca como dispositivo de audio USB (estoy usando el descriptor midi7.h) pero no sé cómo verlo desde traktor. Muchas gracias, saludos!


----------



## rachelies (Dic 12, 2012)

El Traktor no lleva Mappers y Devices, eso es en el VirtualDj. Ahora mismo no tengo el Traktor aquí no recuerdo de memoria, pero en el botón de configuración, hay un sitio donde salía algo así como Dispositivos Midi o algo así. Échale un vistazo que te tiene que salir por algún sitio, dale vueltas.
Un saludo.


----------



## fernandoae (Dic 12, 2012)

Gente alguno sabe si traktor soporta consolas HID?


----------



## rachelies (Dic 15, 2012)

Se podría probar con un un joystick o gamepad, no? Estos días no tengo el PC con el Traktor o el Virtual Dj conmigo, pero nada más que pueda lo pruebo


----------



## jjpl2001 (Mar 24, 2013)

Saludos, Me preguntaba si podrian dejarme el link de descarga de la Libreria midi7.h?? no la encuentro por ningun lado. Gracias


----------



## rachelies (Mar 25, 2013)

En el post #22 la tienes. Saludos


----------



## JABE (Jul 15, 2013)

He tratado de comunicar mi pic 18f4550 con virtual empezando con un botón pero no logro hacerlo trabajo en ccs alguna ayuda este es mi código:

```
#include <G-PIC Lite!.c>
#fuses hspll,nowdt,nomclr,noprotect,nolvp,nodebug,usbdiv,pll1,cpudiv1,vregen
#use delay(clock=48M)
#define USB_CONFIG_HID_RX_SIZE   16
#define USB_CONFIG_HID_TX_SIZE   16
#DEFINE USB_HID_DEVICE TRUE
#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT
#define USB_EP1_TX_SIZE 16
#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT
#define USB_EP1_RX_SIZE 16
#include <pic18_usb.h>
#include <usb_desc_hid.h>
#include <usb.c>
int out_data[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};
void main()
{
   usb_init ();
   enable_interrupts (global);
   enable_interrupts (INT_usb);
   usb_wait_FOR_enumeration ();
   output_high (PIN_B6);
   WHILE (true)
   {
   if (usb_enumerated())
   {
   usb_task();
   if (input(pin_b7)==1)
   {
      usb_put_packet(1,out_data,16,USB_DTS_TOGGLE);
      delay_ms(50);
   }
   
      }
   }

   }
```

si alguien puede ayudarme o lo estoy haciendo mal plis.
todo por HID


----------



## rachelies (Jul 16, 2013)

Hola JABE:
No me he mirado muy a fondo el código, pero veo que dentro del bucle while, en el momento que pin_B7 está a "1" lo envías por usb, pero nunca envías cuando está a cero.
Por otra parte, falta el reporte HID para ver si está bien definido el botón.
Nunca he probado HID en Virtual Dj, pero bueno, mira este par de cosas.
Saludos


----------



## dashafi (Jul 18, 2013)

quería hacerles una pregunta, quizá tonta, pero soy mas teórico que "constructor", diseñé un aparato midi para un proyecto en mi universidad (no se si conocen el theremín), la cosa es que me pillo con esto y me pareció interesante la comunicación por USB, entonces quería preguntarles: en el PCB de mi circuito, el chasis del conector USB lo conecto con mis 0[V]??? Tengo una confusión con ello, porque todo mi circuito es alimentado con un transformador de punto medio, y precisamente el punto medio lo tengo conectado a tierra, entonces no se si eso afectará y haré un cuete gigante en mi notebook.

(es mi primer post, pero siempre leo este foro)


----------



## rachelies (Jul 24, 2013)

Si tienes dudas déjalo sin conectar. Yo no lo conecto. Si no me equivoco, la carcasa del conector va unida a la malla del cable USB y ya hace contacto en el lado del PC, así que en la placa no lo conectes.
Si estoy equivocado me pueden corregir. 
Un saludo


----------



## dashafi (Jul 24, 2013)

justamente ayer conversando con un profesor me dijo lo mismo, que no los conectara, porque en el notebook podría hacer un cuete y decidí usar un optoacoplador en el conversor AD...
Por lo demás rachelies, estuve probando tu programa para la comunicación usb, y funcionó muy bien a la primera. Decidí tu descriptor que está muy bueno, yo tenía todo escrito directamente en el programa principal. (hace poco comencé a programar en C y hay muchas cosas que no conozco. En este tema recién me enteré que era un descriptor )


----------



## Nuyel (Jul 24, 2013)

El chasis si va conectado a tierra en la computadora, pero en el dispositivo no debería, o se hace a través de una resistencia ya que no debe transportar corriente, esta debe ser centralizada a la fuente (la computadora que es la que alimenta el USB) así se asegura que la malla cumpla con su función.
Pero bueno, esto hablando de un cable USB correcto, por que he visto unos baratos sin malla donde ya no importa ya que el chasis queda aislado.


----------



## dinoelectro (Jul 28, 2013)

hola companeros, al igual que jabe no consigo comunicar VIRTUAL DJ con mi dispositivo HID programado con el PIC18F4550, me han dicho que si el sistema operativo es de 64 bits no va funcionar...  ¿es eso cierto?


----------



## rachelies (Jul 29, 2013)

Eso es falso, porque el mio es el windows 7 64bits y funciona. Lo complicado es hacerlo funcionar por el tema de los mappers y todo eso. Al final lo dejé porque era bastante fastidioso, mucho más fácil con el Traktor


----------



## dashafi (Jul 29, 2013)

Exacto, yo probe los programas que subieron acá en un 18F4550 y en un 18F2550 y funcionan la mayoria (los que están pulidos) y tengo windows 7 de 64 bits y en notebook, ademas han funcionado en todos los computadores que probé. Un detalle para el que le sirva, de todos los programas que probé, el mas simple para recibir las señales midi es el FRUITY LOOPS. No hay que configurar nada, y los potenciometros los puedes asignar a cualquier pista con solo moverlos + 1 click


----------



## Daniel Meza (Jul 29, 2013)

Saludos, muy interesante el tema... (y muy extenso para leerlo todo, solo he leído los últimos comentarios). 

Apenas ando terminando un proyecto similar pero para controlar Traktor, como interfaz utilizo Arduino UNO, el cual se encarga de recibir datos serie enviados por un PIC16F73 para posteriormente enviarlos vía USB a la computadora. En la computadora, aparte de estar corriendo el traktor, utilizo otro programa (LoopBe3) que recibe los datos desde el puerto USB y los envía a un puerto MIDI virtual que finalmente se comunica con el Traktor. 

Aquí es donde tengo un "problema", este programa LoopBe3 lo descargué como versión de prueba y después de 60 min caduca y el puerto virtual se cierra. Entonces quisiera saber si ustedes conocen algun otro programa para generar puertos MIDI virtuales sin la limitación temporal (si no los hay, tendré que comprar la versión de paga de LoopBe3). Utilizo W7 con 64 Bits.

PD. Si ya hablaron de esto en el tema por favor si pueden dirigirme al post donde lo trataron


----------



## Nuyel (Jul 30, 2013)

Sabes el Arduino Uno se puede programar para aparecer como MIDI-USB así que no necesitarías usar la interfaz virtual, lo que necesitas es cambiar el firmware del ATmega16u2 que controla la comunicación.


----------



## rachelies (Jul 30, 2013)

¿Y no te merece más la pena enviar los datos MIDI directamente al USB? Supongo que en el Arduino se puede hacer.

Nuyel, hemos pensado lo mismo a la vez, jajajaja


----------



## Daniel Meza (Jul 30, 2013)

rachelies dijo:


> ¿Y no te merece más la pena enviar los datos MIDI directamente al USB? Supongo que en el Arduino se puede hacer.
> 
> Nuyel, hemos pensado lo mismo a la vez, jajajaja





Nuyel dijo:


> Sabes el Arduino Uno se puede programar para aparecer como MIDI-USB así que no necesitarías usar la interfaz virtual, lo que necesitas es cambiar el firmware del ATmega16u2 que controla la comunicación.



Gracias por responder, verán esa es una solución pero lo que pasa es que en un futuro pienso quitarle el Arduino y utilizar un FT232 para hacer la conversión RS232-USB. Por eso me interesa más un programa que esté en el ordenador

Saludos


----------



## Nuyel (Jul 30, 2013)

Pues el LoopBe1 es gratuito, solo que se limita a un dispositivo pero no tiene limite de tiempo, por que de otra manera no se si solo es cosa mía pero conseguir un PIC18F4550 para usar la comunicación USB de este en lugar del FT232 y emplearlo para el procesamiento en lugar del PIC16F73 podria ser más económico ($4.50 + $8.69 = 13.19 comparados con los $5.82 del PIC18F4550)


----------



## rachelies (Jul 30, 2013)

Y si no necesitas tantos pines, yo he utilizado un 18F2455 que es más barato aún.


----------



## Daniel Meza (Jul 30, 2013)

Nuyel dijo:


> Pues el LoopBe1 es gratuito, solo que se limita a un dispositivo pero no tiene limite de tiempo, por que de otra manera no se si solo es cosa mía pero conseguir un PIC18F4550 para usar la comunicación USB de este en lugar del FT232 y emplearlo para el procesamiento en lugar del PIC16F73 podria ser más económico ($4.50 + $8.69 = 13.19 comparados con los $5.82 del PIC18F4550)






rachelies dijo:


> Y si no necesitas tantos pines, yo he utilizado un 18F2455 que es más barato aún.



Muy bien, en realidad solo necesito un puerto así que creo este me servirá (y veo que si opera bajo W7 ). 

Tengo a la mano dos PIC's con puerto USB, el 18F2550, y el 18F2450 y por su número de pines ambos me servirían bien salvo que aún no se programarles el puerto USB, verán que se me dificulta un poco el C, me voy más por el asm. Pero en un futuro seguiré su consejo de utilizar un PIC18 para ahorrar componentes. 
Gracias por sus respuestas

PD. Seguiré al pendiente del post por si puedo aportar algo


----------



## rachelies (Jul 30, 2013)

El USB en asm...yo ni me lo planteo, jejeje. Si miras por el comienzo del hilo, sale todo explicado para manejar el puerto USB como si fuese un dispositivo midi, y así no necesitas el programa puente para convertir a MIDI. Eso sí, en lenguaje C de CCS. Yo creo que es bastante sencillo.
Un saludo


----------



## Daniel Meza (Jul 30, 2013)

Si la USB y asm es mucho muy complejo por eso me fui por el Arduino jeje, bueno por el momento ya descargué el LoopBe1 y quedó resuelto el problema del tiempo, ya me armé un djset de más de una hora  
Saludos


----------



## dinoelectro (Jul 30, 2013)

rachelies dijo:


> Eso es falso, porque el mio es el windows 7 64bits y funciona. Lo complicado es hacerlo funcionar por el tema de los mappers y todo eso. Al final lo dejé porque era bastante fastidioso, mucho más fácil con el Traktor



Hola rachelies ¿porque es fastidioso?,  segun revice la informacion en la pagina de virtual DJ, dicen que HID es recomendable antes que midi.  

mi dispositivo funciona bien con WIN7 de 32 bits pero  en la portatil de 64 bits no puedo hacerlo funcionar.. que pudiera estar ocurriendo??


----------



## rachelies (Jul 31, 2013)

En HID no lo probé, pero en MIDI si, y tienes que hacer dos archivos en el virtual dj, el mappers y el devices si no recuerdo mal, donde (y te hablo de cabeza porque hace muuucho que no lo hago) tienes que declarar como variables en un archivo y hacer la llamada en el otro archivo para decir lo que hace esa tecla o conjunto de teclas. No es tan fácil como pulsar una tecla y que la detecte el vitual dj y asignarle una función como se hace en otros.
En HID puede que sea más fácil, no se.


----------



## giudixi (Nov 9, 2013)

hola rachelies, mi nombre es tomas y te quería consultar sobre el proyecto que esta posteado en la pagina dos de este hilo,en esa pagina hay un programa midi por usb que vos escribiste (MIDI 12 y midi7), la verdad quería saber si se puede adaptar para el pic 18f4550 y de ser posible como lo podría realizar? estoy en un instituto técnico en la especialidad de electrónica y esta información me seria de gran utilidad. desde ya muchas gracias.


----------



## dashafi (Nov 9, 2013)

Oye, funciona perfectamente con el 18f4550, yo lo hice con ese PIC, te recomiendo que uses el MIDI7 tal cual, no lo modifiques, y fijate en los programas de la pagina  de este mismo hilo del foro, ahi hay un programa base que sirve muy bien del usuario fernandoae. Con esas dos cosas puedes partir y agregar lo que tu quieras, que yo con esas dos bases hice un dispositivo muy complejo


----------



## giudixi (Nov 9, 2013)

ajam, ya tengo el programa que me decís, el que dice virtual dj.rar y la parte del midi7.h también, ahora como programo los archivos .xml en el pic? porque yo tenia entendido que son .hex los que se programan en el pic, yo suelo usar el winpic. 
otra pregunta, veo que hay dos carpetas en el archivo rar, una que dice device que supongo sera la consola y otra que dice mapper lo que hace que el virtual dj tome las teclar y les asigne funciones, ahora bien, como lo programo todo en el pic?


----------



## rachelies (Nov 11, 2013)

Hola giudixi:

Esos archivos .xml no son para meter en el pic, si no para el pc si vas a utilizar el virtual dj, para la interface entre el dispositivo midi y el software. Ya ni me acuerdo como era, porque es bastante complejo y sin embargo, con el Traktor el todo más fácil. 
Si no utilizas el virtualDj, olvídate de esas carpetas Devices y Mappers.


----------



## dashafi (Nov 12, 2013)

me referia a los programas escritos en C, estan en la pagina 7 de este tema.

y sabes, un programa mas simple de usar es el fruity loops, te reconoce el dispositivo MIDI automaticamente y no necesitas programar a full si quieres aprender al comienzo, porque con solo clickear en los botones t asigna sola la funcion midi, solo falta q ocupes los descriptores del midi7 y juegues con un potenciometro, y te repito, fijate en la pagina 7


----------



## rachelies (Nov 13, 2013)

No entiendo a que programas te refieres. Todo lo que hay en C es para PIC, lo que no hay es ningún programa completo que puedas cargar en el PIC y a funcionar. Son todo trozos para ir uniendo y que cada uno lo adapte a sus necesidades.
saludos


----------



## Hernan David (Nov 21, 2013)

Hola Rachelies, he estado indagando sobre la comunicacion midi y todo eso  y hasta ahora en el post veo que usan pics usb y mi pregunta es, puedo hacerlo con un Pic 16f88? se que usa solo comunicacion serial pero habra alguna forma que enviar señales midi por este medio?, tengo claro que virtualdj soporta dispositivos puerto serial.
Agradezco tu ayuda
Saludos!


----------



## rachelies (Nov 21, 2013)

Hernan David dijo:


> Hola Rachelies, he estado indagando sobre la comunicacion midi y todo eso  y hasta ahora en el post veo que usan pics usb y mi pregunta es, puedo hacerlo con un Pic 16f88? se que usa solo comunicacion serial pero habra alguna forma que enviar señales midi por este medio?, tengo claro que virtualdj soporta dispositivos puerto serial.
> Agradezco tu ayuda
> Saludos!



Claro que se puede usar, el tema está en saber la secuencia que tienes que enviar en cada comando midi, que no dejan de ser números hexadecimales enviados por serie (RS232 por ejemplo). Otra cosa será la velocidad que te permita para la comunicación, que no sé si será suficiente para que no haya retardos entre las ejecuciones.
Saludos.


----------



## JOSE JAVIER BAEZ (Feb 28, 2014)

hola amigos del foro, me encontré con este tema muy interesante, y eso a sido lo que yo he querido hacer hace mucho tiempo, pero no pensé que fuera posible, ¿al final lograron terminar satisfactoriamente con el proyecto? por que no encuentro ningún video de alguien que lo aya echo realmente,no entiendo claramente en que lenguaje están programando por que no he tenido mucho tiempo de recorrer las 17 paginas de este foro. parece que es en C. ¿se puede programar en lenguaje Basic? por que el C no lo conozco muy bien. gracias y espero me puedan ayudar de alguna forma.


----------



## fernandoae (Feb 28, 2014)

Si, está toda la info para hacer una consola a gusto, en Ccs y en Proton ide.
Yo en proton consegui manejar hasta los leds indicadores en virtual dj. En mi canal de Youtube hay videos


----------



## elkonii (Abr 13, 2014)

hola que tal creen que se podria usar un atmega 32?


----------



## Nuyel (Abr 14, 2014)

elkonii dijo:


> hola que tal creen que se podria usar un atmega 32?



Hablando de ello quiero intentarlo pero con un MSP430, el descriptor de hardware es el problema, hay que adaptarlo para nuestros microcontroladores y controlar los periféricos por los medios que disponemos, eso es reescribir todo el código extra pero si adaptamos el descriptor USB con eso ya es un avance enorme.


----------



## fernandoae (Abr 14, 2014)

Con atmega
http://www.wikihow.com/Build-a-MIDI-Controller-(Hardware)
http://www.avrfreaks.net/modules/FreaksArticles/files/19/Midi and the AVR.pdf


----------



## elkonii (Abr 20, 2014)

hola nuevamente no se mucho de pic controladores y eso pero el atmega 32 es buena opcion para usar?


----------



## Daniel Meza (Abr 20, 2014)

elkonii dijo:


> hola nuevamente no se mucho de pic controladores y eso pero el atmega 32 es buena opcion para usar?



Será con el que te acomodes mejor, lo que se busca es que de preferencia el uC tenga entre sus periféricos el puerto USB para poder comunicarse con la PC. 
En caso de que no lo tenga pues están los famosos FTDI para convertir de RS232 a USB ya que es muy común que los micros tengan al menos una UART para comunicarse.

Saludos


----------



## elkonii (Abr 21, 2014)

claro tendria que usar el 232 pero no hay problema con eso mi pregunta hasta cuantos potenciometros podria controlar con este uc y cuantos pulsadores como maximo pero sin bajar mucho el rendimiento


----------



## Daniel Meza (Abr 21, 2014)

Tantos como canales analógicos tenga el micro, creo recordar tiene 8. Pero puedes utilizar un multiplexor analógico externo para gestionar un número mayor de potenciómetros. 
De igual forma con los botónes


----------



## Nuyel (Abr 21, 2014)

El rendimiento dependerá de lo rápido del MCU para realizar las operaciones y el ancho de banda de la comunicación, el limite será el que tú le impongas, de potenciometros tienes que multiplexarlos, de pulsadores usar matrices, yo usé un Arduino (Si no mal recuerdo es ATmega328 para obtener los datos + ATmega16u2 para la comunicación USB) y leí una matriz 8x7 de un teclado CASIO CTK-230 con 49 teclas más 2 potenciomentros y resultó bastante bien, ahora quiero hacerlo con 16 pots, 8 sliders, pedal de expresión (analogico) más las 49 teclas de la matriz, 8 pads, pantalla y otras teclas para control, y se que hay espacio para ello a pesar de la inmensa cantidad de botones.

Ya lo otro que me viene a la mente es comprar uno de esos USB-MIDI que no son tan costosos, de ahí la comunicación se simplifica por que solo es UART a 31 250 bauds


----------



## elkonii (Abr 22, 2014)

claro ya entiendo, yo estaba medio preocupado con lo del lag, pero es cuestion de ir probando
ahora lo quie me queda es empezar a ver lo de los codigos ya que eso es a lo que no le estuve mucho 
encima


----------



## Nuyel (Abr 22, 2014)

Siendo controles que vas a tener que mover con la mano, diría que el lag estará en tus dedos  quieres más velocidad entonces tendrías que usar HID por que la taza de MIDI es reducida, pero para un dispositivo generalmente es suficiente aún si tienes que usar todos los canales.


----------



## elkonii (Abr 23, 2014)

buenoooo era lo que pensaba ajaj nunca toque este tema!!


----------



## picnerdtesla (Jul 5, 2014)

Hola estoy desarrollando un controlador MIDI con ccs y el pic 18f2550 por medio de MIDI-USB, el pc ya me reconoce el pic como dispositivo de audio usb aunque con un signo de interrogación, se supone que en FL studio que es el que pienso utilizar, me debe aparecer como MIDI In mi controlador ? porque no me aparece nada y no se como hacer para comunicar Fl studio con el controlador que ya tengo programado...


----------



## Nuyel (Jul 5, 2014)

Si te reconoce e instala el dispositivo no tiene que aparecer el signo de interrogación, eso significa que probablemente falten controladores, por eso no se activa como dispositivo MIDI que reconozca el FL


----------



## picnerdtesla (Jul 9, 2014)

comprendo, entonces que podría ser, básicamente lo que he hecho es copiar las librerias de midi, descriptores.h etc.. en pocas palabras en el ccs me compila bien; también descargue he instale los controladores para usb de la pagina de microchip y lo estoy probando con una simulación en isis, que me podría faltar ?   :/


----------



## rachelies (Jul 10, 2014)

Puede estar mal montado el hardware, alguna vez me dio fallos el usb por estar mal el conector, confundidos D+ y D- en el Pic, no tener condensador en Vusb....
Cualquier pequeño fallo de conexión, aparece como conectado pero no lo reconoce.


----------



## picnerdtesla (Jul 10, 2014)

no lo que pasa es que estoy probando con una simulación en proteus, al parecer si pueden ser falta de controladores, pero no sabría cuales, pues en si los que descargue hace poco son de a pagina de mirchochip (ya probé con algunos ejemplos de HID y funciono, con uno de cdc porque no se como es jaja ... ), podrían ser unos especializados para MIDI, porque al dirigirme a dispositivos e impresoras me reconoce el controlador, pero sale con un signo de interrogación como dispositivo de audio USB, y al mirar con mas detalle, dice que no se reconoce el dispositivo,  y que este dispositivo no puede iniciar(codigo 10) ... entonces si debe ser eso, o no se que mas me pueda faltar porque ya me e descargado las librerías o descriptores que aparecen en este foro , las puse en la carpeta de drivers de pic c, ya he colocado el #include <midi7.h> etc me compila perfecto el código, siguiendo los ejemplos de este foro, entonces no se que mas me podria faltar jaja ... les agradeceria mucho que me ayudaran con esto  ...


----------



## HoracioFdez (Jul 27, 2014)

Hola compañeros.
Bueno quiero agradecer a todos los que han aportado a este tema, me ha ayudado bastante ya que llevo desarrollando un dispositivo MIDI desde hace un año pero solo lo comunicaba mediante transmisión serial, ahora con el aporte de el descriptor midi7.h logre comunicarlo mediante usb tipo bulk, me fue muy emocionante ver que cualquier software de audio reconocia mi placa.

Muchas gracias.


----------



## agustin8199 (Sep 11, 2014)

Daniel Meza dijo:


> Saludos, muy interesante el tema... (y muy extenso para leerlo todo, solo he leído los últimos comentarios).
> 
> Apenas ando terminando un proyecto similar pero para controlar Traktor, como interfaz utilizo Arduino UNO, el cual se encarga de recibir datos serie enviados por un PIC16F73 para posteriormente enviarlos vía USB a la computadora. En la computadora, aparte de estar corriendo el traktor, utilizo otro programa (LoopBe3) que recibe los datos desde el puerto USB y los envía a un puerto MIDI virtual que finalmente se comunica con el Traktor.
> 
> ...



hola me peguntaba si me pueden ayudar  la idea es básicamente la misma ,tengo un arduino mega y quiero usarlo como un plato midi solo me falta la parte de como configurar(el codigo) el motor del HDD y como conectarlo , soy nuevo en el mundo de la electrónica digital  

ante todo muchas gracias


----------



## Daniel Meza (Sep 13, 2014)

Hola, como tal el motor del disco duro no se controla por el ARDUINO si no lo contrario, el ARDUINO recibe impulsos del HD a través de un circuito diseñado para tal fin.

El diagrama por desgracia no lo tengo a la mano ahorita pero lo buscaré, te adelanto que se trata de un par de comparadores de Schmitt y un flip flop. Los comparadores "convierten" la señal senoidal que genera el HD cuando gira a digital para que pueda ser reconocida por el arduino.

El código si variará pero la idea central será la misma entre PIC y arduino

Saludos


----------



## mdu4 (Dic 26, 2014)

Hola, saludos.

He leido todas las paginas y he podido hacer funcionar todo excepto los leds. Quede perdido...
Estuve siguiendo todo el desarrollo y respecto a los leds el tema queda parado en la pag 15 donde rachelies publica como logro hacer que funcionar los leds. Sin embargo no he logrado que me funcionen.

El problema que tenido es el siguiente:
utilizo la funcion "if (usb_kbhit(1))" para verificar si llegan datos al pic, y en caso de que lleguen, se encinda un led. Sin embargo esta funcion solo se cumple una vez, despues el pic pareciera que ignora esta parte del codigo y no entiendo por que. Busque un poco de info en google y encontre a otros que les pasaba este problema con la funcion usb_kbhit, pero nadie daba respuestas a sus problemas.

Adjunto mi codigo por si encuentran algun error:

```
#include <18F4550.h>
#device adc=8
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN      //~~~ 20MHZ OSCILLATOR CONFIGS ~~~//
#FUSES NOMCLR                   //Master Clear pin used for I/O
#use delay(clock=48000000)

#use FIXED_IO( A_outputs=PIN_A4 )

#DEFINE USB_HID_DEVICE     FALSE
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK  //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP2_RX_ENABLE  USB_ENABLE_BULK  //turn on EP1 for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    64  //size to allocate for the tx endpoint 1 buffer
#define USB_EP2_RX_SIZE    64   //size to allocate for the rx endpoint 1 buffer

#include <pic18_usb.h>
#include <descriptors.h>   //USB Configuration and Device descriptors for this UBS device
#include <usb.c>           //handles usb setup tokens and get descriptor reports

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use fast_io(A)

#byte PORTA=0xF80

int lec_vel = 0;
int recibe[8];

int8 rxdata[8];
int buf1;

void main(void) {

   unsigned char buf[4];

   enable_interrupts(INT_USB);
   enable_interrupts(GLOBAL);
   
   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_DIV_16);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   set_tris_A(0);
   PORTA=0;
   
   usb_init_cs();

   while (TRUE) {
      usb_task();

            if (usb_kbhit(1)) {
               output_high(PIN_A4);
               delay_ms(2000);
               usb_get_packet(1,recibe,8);
            } 
            
            //if (recibe[2] != 0){
            //   output_high(PIN_A4);
            //}
            //if (recibe[2] == 0){
            //   output_low(PIN_A4);
            //}

      if(usb_enumerated()) 
      
      {
          //set_adc_channel(0);
          //delay_us(3);
          //lec_vel = read_adc();   
          //lec_vel = (int16) lec_vel * 127 / 255; //rango de valores de protocolo midi, van de 0 a 127
         
         //if(bit_test(PORTA,2)){
            //buf[1] = 0x90;          //Note on
            //buf[0]=buf[1]>>4;
            //buf[2] = 0x30;         // Nota 30
            //buf[3] = 0x7F;         // Volumen 127
            //buf[3] = lec_vel;
            //usb_put_packet(1, buf, 4, USB_DTS_TOGGLE);
            
            //delay_us(200);     
       
      }
   }
}
```


----------



## transistor2020 (Ene 14, 2015)

saludos, no se si va aca esta pregunta, es sobre un midi in, es decir tengo un teclado con un cable midi a usb funciona bien el midi out del teclado con fl studio, entre otros programas, pero mi gran duda que funcion cumple el mdii in de mi teclado con respecto a la computadora, no con respecto a otro teclado sin no del pc al midi in porque no se si es que en mi piano va a sonar lo que esta por ejemplo en fl studio en las cornetas de mi piano o teclado, esa es mi duda porque he buscado en google y solo hablan que se conecta otro teclado, pero no como es respecto al pc.


----------



## EMILIOJES (Mar 23, 2015)

mdu4 dijo:


> hola, saludos.
> 
> He leido todas las paginas y he podido hacer funcionar todo excepto los leds. Quede perdido...
> Estuve siguiendo todo el desarrollo y respecto a los leds el tema queda parado en la pag 15 donde rachelies publica como logro hacer que funcionar los leds. Sin embargo no he logrado que me funcionen.
> ...



amigo cual es el código completo para poder probar la comunicación.


----------



## rembertolayme (Mar 28, 2015)

Hola. En muchos códigos en la parte de los pote*nciómetros,* veo q*ue* utilizan mucho los bucles para la lectura de pote*nciómetros,* pero al usar bucles constantemente se envía midi*,* hecho q*ue* veo *innecesario*, ya q*ue* al no *hab*er movimiento en pote*nciómetros*, no debería haber env*í*o de MIDI.

*¿*Alguien tiene idea cómo se pudiese hacer esto?? Enviar MIDI sólo cuando haya movimiento en pote*nciómetros*.

Saludos*.*


----------



## Scooter (Mar 28, 2015)

Pues en el bucle pones un if, y si cambia envías y si no ha cambiado no envías


----------



## rafaaaa21 (Jul 1, 2015)

Buenas, chicos.

Estuve siguiendo el hilo y me armé un controlador con PIC18F4550.

Tengo 8 botones los cuales ya andan 8 leds que estoy tratando de descifrar el código aún y 8 potes los cuales el código ya me funciona, pero tengo un pequeño problema con las conversiones  ADC.

Se me mete ruido, de alta frecuencia de no más de 100 mv de amplitud, por lo que veo en el osciloscopio.
Eso hace que la conversión ADC varíe constantemente en no más de 1 o 2 valores, por lo que se manda MIDI constantemnte y lo cual es un problema.

Tengo capacitores de 100nf en todas las entradas.
Si puenteo a masa la entrada analógica, el valor sigue variando en el midi OX de 00, 01, 02 como mucho.
Según lo que noté en el osciloscopio, el ruido se me mete por la alimentación.

¿Alguna idea?

Gracias!!


----------



## EMILIOJES (Jul 2, 2015)

rafaaaa21 dijo:


> Buenas, chicos.
> 
> Estuve siguiendo el hilo y me armé un controlador con PIC18F4550.
> 
> ...




buenas noches, emplea algo como esto:


aunque no necesariamente tantos capacitores, con uno de 100nf uno de 10uf y otro de 1000uf es sufisiente para eliminar cualquier ruido, si persiste, colocale lo mas proximo al pic par de capacitores de 100nf y 1uf, en la parte de la fuente.


----------



## greggsdrummer (Ene 31, 2016)

dashafi dijo:


> Oye, funciona perfectamente con el 18f4550, yo lo hice con ese PIC, te recomiendo que uses el MIDI7 tal cual, no lo modifiques, y fijate en los programas de la pagina  de este mismo hilo del foro, ahi hay un programa base que sirve muy bien del usuario fernandoae. Con esas dos cosas puedes partir y agregar lo que tu quieras, que yo con esas dos bases hice un dispositivo muy complejo



Hola dashafi
Te escribo desde Córdoba para hacerte una consulta sobre el programa que hablaste hace un tiempo de USB-MIDI en la pagina foros de electrónica.
Estoy renegando y no hay forma de hacerlo funcionar. La PC me detecta el puerto midi (lo estoy haciendo con el pic 18f4550) pero me lo deja con un signo de admiración y tanto el midi-ox (monitor midi) como el midi trace me dicen que no hay ningún dispositivo midi conectado. Tendras idea en que estoy fallando?.


----------



## Fuegomp3 (Jul 20, 2016)

Gente, estoy intentando armarme un controlador, con dos discos rigidos, un par de potenciometros y algunos botones, estuve buscando bastante y vi que hay varias formas de hacerlo, tengo un pic18f2550 y un atmega328 (el del arduino), puedo armar el circuito y todo, pero por mas que me haya leido las 18 paginas, no me cierra el tema de la programacion, soy un -10 en eso  alguno que lo haya armado y tenga un .hex para pasarme? no se si el archivo para el 4550 servira en el 2550, pero bue, cualquier cosa sera bienvenida, muchas gracias!


----------



## Nuyel (Jul 20, 2016)

Sí sirve, son idénticos a nivel de software y configuración, los puertos que no tiene el 2550 simplemente se leerán como 0 siempre creo.


----------



## Fuegomp3 (Jul 21, 2016)

Buenisimo, gracias! ahora solo me falta el .hex y a probar a ver que sale


----------



## Fuegomp3 (Ago 31, 2016)

Estoy rompiendome el cerebro con esto, asi que pido algo de ayuda u orientacion. 
Juntando todo lo que lei en las 18 paginas, arme este codigo:

```
#include <18F2455.h>
#device ADC=8
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#fuses NOMCLR   //Habilita MCLR/RE3 como entrada   
#use delay(clock=48000000)

#DEFINE USB_HID_DEVICE     FALSE
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK  //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP2_RX_ENABLE  USB_ENABLE_BULK  //turn on EP1 for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    64  //size to allocate for the tx endpoint 1 buffer
#define USB_EP2_RX_SIZE    64   //size to allocate for the rx endpoint 1 buffer

#include <usb_bootloader.h>
#include <pic18_usb.h>
#include <.\include\midi7.h>   //USB Configuration and Device descriptors for this UBS device
#include <usb.c>           //handles usb setup tokens and get descriptor reports

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use i2c(MASTER,SCL=PIN_B3,SDA=PIN_B2,SLOW,FORCE_HW,RESTART_WDT)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)

#byte PORTA=0xF80
#byte PORTB=0xF81
#byte LATB=0xF8A
#byte BTRISB=0xF93
#byte INTCON=0xFF2
#byte ADCON1=0XFC1

short bitT;
int tempoA1,tempoA2,tempoA11,tempoB1,tempoB2,tempoB11;
int matriz1,matriz2,matriz1bis,matriz2bis,diferencias,contador;
int matriz3,matriz4,matriz3bis,matriz4bis;
int leds1,leds2,leds3;
int recibe[8];
unsigned char envia[4];
unsigned char tempA[4];
unsigned char tempB[4];

/////////////////////////////////////////
//subprograma para enviar notas
/////////////////////////////////////////
void envianota()
{   
   envia[1]=0x90;
   envia[0]=envia[1]>>4;
   
   usb_put_packet(1,envia,4,USB_DTS_TOGGLE);
}

//////////////////////////////////////////
//busca diferencias en los botones para enviar solamente
//los que hayan cambiado
//el subprograma trada 2.33uS si no hay diferencias
//////////////////////////////////////////
void busca_diferencias()
{   diferencias=matriz1^matriz1bis;
   if(diferencias!=0)
      {   contador=0x00;
         while(contador<=0x07)
         { if(bit_test(diferencias,0))
            {   envia[2]=contador;
               bitT=bit_test(matriz1,contador);
               envia[3]=0x7F*bitT;
               envianota();
            }
         contador++;
         rotate_right(&diferencias,1);

      }
      }
   diferencias=matriz2^matriz2bis;
   if(diferencias!=0)
      {   contador=0x08;
         while(contador<=0x0F)
         { if(bit_test(diferencias,0))
            {   envia[2]=contador;
               bitT=bit_test(matriz2,(contador-8));
               envia[3]=0x7F*bitT;
               envianota();
            }
         contador++;
         rotate_right(&diferencias,1);

      }
      }
   diferencias=matriz3^matriz3bis;
   if(diferencias!=0)
      {   contador=0x10;
         while(contador<=0x17)
         { if(bit_test(diferencias,0))
            {   envia[2]=contador;
               bitT=bit_test(matriz3,(contador-16));
               envia[3]=0x7F*bitT;
               envianota();
            }
         contador++;
         rotate_right(&diferencias,1);

      }
      }
   diferencias=matriz4^matriz4bis;
   if(diferencias!=0)
      {   contador=0x18;
         while(contador<=0x1F)
         { if(bit_test(diferencias,0))
            {   envia[2]=contador;
               bitT=bit_test(matriz4,(contador-24));
               envia[3]=0x7F*bitT;
               envianota();
            }
         contador++;
         rotate_right(&diferencias,1);

      }
      }
}
////////////////////////////////////////////////////
//interrupción para escaneo de botones
//tarda 25uS+retardo_rebote_botón
////////////////////////////////////////////////////
#int_RB
void RB_isr()
{
   matriz1bis=matriz1;
   matriz2bis=matriz2;
   matriz3bis=matriz3;
   matriz4bis=matriz4;
   LATB=PORTB;
   delay_ms(20);
   if(bit_test(PORTB,7)&&bit_test(PORTB,6)&&bit_test(PORTB,5)&&bit_test(PORTB,4)){
      matriz1=matriz2=matriz3=matriz4=0;
      busca_diferencias();
      return;
   }
   output_high(PIN_A2);
   output_high(PIN_A3);
   output_high(PIN_A4);
   output_high(PIN_A5);
   output_high(PIN_C0);
   output_high(PIN_C1);
   output_high(PIN_C2);
   delay_cycles(10);
   output_low(PIN_C6);
   delay_cycles(10);
   if(!(bit_test(PORTB,7)&&bit_test(PORTB,6)&&bit_test(PORTB,5)&&bit_test(PORTB,4)))
   {
      if(!bit_test(PORTB,7)) bit_set(matriz4,4);
      else bit_clear(matriz4,4);
      if(!bit_test(PORTB,6)) bit_set(matriz4,5);
      else bit_clear(matriz4,5);
      if(!bit_test(PORTB,5)) bit_set(matriz4,6);
      else bit_clear(matriz4,6);
      if(!bit_test(PORTB,4)) bit_set(matriz4,7);
      else bit_clear(matriz4,7);
      delay_cycles(10);

   }
   output_low(PIN_C2);
   delay_cycles(10);
   output_high(PIN_C6);
   delay_cycles(10);
   if(!(bit_test(PORTB,7)&&bit_test(PORTB,6)&&bit_test(PORTB,5)&&bit_test(PORTB,4)))
   {
      if(!bit_test(PORTB,7)) bit_set(matriz4,0);
      else bit_clear(matriz4,0);
      if(!bit_test(PORTB,6)) bit_set(matriz4,1);
      else bit_clear(matriz4,1);
      if(!bit_test(PORTB,5)) bit_set(matriz4,2);
      else bit_clear(matriz4,2);
      if(!bit_test(PORTB,4)) bit_set(matriz4,3);
      else bit_clear(matriz4,3);
      delay_cycles(10);

   }
   output_low(PIN_C1);
   delay_cycles(10);
   output_high(PIN_C2);
   delay_cycles(10);
   if(!(bit_test(PORTB,7)&&bit_test(PORTB,6)&&bit_test(PORTB,5)&&bit_test(PORTB,4)))
   {
      if(!bit_test(PORTB,7)) bit_set(matriz3,4);
      else bit_clear(matriz3,4);
      if(!bit_test(PORTB,6)) bit_set(matriz3,5);
      else bit_clear(matriz3,5);
      if(!bit_test(PORTB,5)) bit_set(matriz3,6);
      else bit_clear(matriz3,6);
      if(!bit_test(PORTB,4)) bit_set(matriz3,7);
      else bit_clear(matriz3,7);
      delay_cycles(10);
   
   }
   output_low(PIN_C0);
   delay_cycles(10);
   output_high(PIN_C1);
   delay_cycles(10);
   if(!(bit_test(PORTB,7)&&bit_test(PORTB,6)&&bit_test(PORTB,5)&&bit_test(PORTB,4)))
   {
      if(!bit_test(PORTB,7)) bit_set(matriz3,0);
      else bit_clear(matriz3,0);
      if(!bit_test(PORTB,6)) bit_set(matriz3,1);
      else bit_clear(matriz3,1);
      if(!bit_test(PORTB,5)) bit_set(matriz3,2);
      else bit_clear(matriz3,2);
      if(!bit_test(PORTB,4)) bit_set(matriz3,3);
      else bit_clear(matriz3,3);
      delay_cycles(10);
   
   }
   output_low(PIN_A5);
   delay_cycles(10);
   output_high(PIN_C0);
   delay_cycles(10);
   if(!(bit_test(PORTB,7)&&bit_test(PORTB,6)&&bit_test(PORTB,5)&&bit_test(PORTB,4)))
   {
      if(!bit_test(PORTB,7)) bit_set(matriz2,4);
      else bit_clear(matriz2,4);
      if(!bit_test(PORTB,6)) bit_set(matriz2,5);
      else bit_clear(matriz2,5);
      if(!bit_test(PORTB,5)) bit_set(matriz2,6);
      else bit_clear(matriz2,6);
      if(!bit_test(PORTB,4)) bit_set(matriz2,7);
      else bit_clear(matriz2,7);
      delay_cycles(10);
   
   }
   output_low(PIN_A4);
   delay_cycles(10);
   output_high(PIN_A5);
   delay_cycles(10);
   if(!(bit_test(PORTB,7)&&bit_test(PORTB,6)&&bit_test(PORTB,5)&&bit_test(PORTB,4)))
   {
      if(!bit_test(PORTB,7)) bit_set(matriz2,0);
      else bit_clear(matriz2,0);
      if(!bit_test(PORTB,6)) bit_set(matriz2,1);
      else bit_clear(matriz2,1);
      if(!bit_test(PORTB,5)) bit_set(matriz2,2);
      else bit_clear(matriz2,2);
      if(!bit_test(PORTB,4)) bit_set(matriz2,3);
      else bit_clear(matriz2,3);
      delay_cycles(10);
   
   }
   output_low(PIN_A3);
   delay_cycles(10);
   output_high(PIN_A4);
   delay_cycles(10);
   if(!(bit_test(PORTB,7)&&bit_test(PORTB,6)&&bit_test(PORTB,5)&&bit_test(PORTB,4)))
   {
      if(!bit_test(PORTB,7)) bit_set(matriz1,4);
      else bit_clear(matriz1,4);
      if(!bit_test(PORTB,6)) bit_set(matriz1,5);
      else bit_clear(matriz1,5);
      if(!bit_test(PORTB,5)) bit_set(matriz1,6);
      else bit_clear(matriz1,6);
      if(!bit_test(PORTB,4)) bit_set(matriz1,7);
      else bit_clear(matriz1,7);
      delay_cycles(10);
   
   }
   output_low(PIN_A2);
   delay_cycles(10);
   output_high(PIN_A3);
   delay_cycles(10);
   if(!(bit_test(PORTB,7)&&bit_test(PORTB,6)&&bit_test(PORTB,5)&&bit_test(PORTB,4)))
   {
      if(!bit_test(PORTB,7)) bit_set(matriz1,0);
      else bit_clear(matriz1,0);
      if(!bit_test(PORTB,6)) bit_set(matriz1,1);
      else bit_clear(matriz1,1);
      if(!bit_test(PORTB,5)) bit_set(matriz1,2);
      else bit_clear(matriz1,2);
      if(!bit_test(PORTB,4)) bit_set(matriz1,3);
      else bit_clear(matriz1,3);
      delay_cycles(10);
   
   }
      output_low(PIN_A2);
      output_low(PIN_A3);
      output_low(PIN_A4);
      output_low(PIN_A5);
      output_low(PIN_C0);
      output_low(PIN_C1);
      output_low(PIN_C2);
      output_low(PIN_C6);
      LATB=PORTB;
      busca_diferencias();
      return;
}

///////////////////////////////////////////
//programa principal
///////////////////////////////////////////
void main(void) 
{   delay_ms(1000);
   set_tris_A(0b00000011);      //PORTA todo salidas, menos AN0 y AN1
   set_tris_B(0b11111111);      //PORTB entradas
   set_tris_C(0b10000000);      //RC7 como entrada
   port_B_pullups(TRUE);
   LATB=PORTB;
   output_C(0);
   PORTA=0;
   tempoA11=tempoA2=tempoB11=tempoB2=0;
   leds1=leds2=leds3=0;
   setup_adc_ports(AN0_TO_AN1);
   setup_adc(ADC_CLOCK_INTERNAL);
   
      usb_init_cs();

   INTCON=0;
   enable_interrupts(INT_RB);   //Interrupciones por cambio en RB7 a RB4
   enable_interrupts(global);
   
      while (TRUE) {
         usb_task();

         if(usb_enumerated()) 
      {
            //if (usb_kbhit(2)) 
         {
                //if(bit_test(PORTA,1)) bit_clear(PORTA,1);
            //else bit_set(PORTA,1);
               //usb_get_packet(2,recibe,8);
                    
            }         
      
//lectura del potenciometro del pitch A
           set_adc_channel(0);
         delay_us(30);
         tempoA1=read_adc();
         tempoA11=tempoA1/2;      //convierte del rango
                           //0xFF a 0x7F para Midi
         if(tempoA11==0x3F) bit_set(leds2,6);  //tempoA centrado a cero
         else bit_clear(leds2,6);

//comprueba si ha cambiado el tempo para enviarlo         
         if(tempoA11!=tempoA2)
            {   tempA[1]=0xB0;
               tempA[0]=tempA[1]>>4;
               tempA[2]=0x00;
               tempA[3]=tempoA11;
               usb_put_packet(1,tempA,4,USB_DTS_TOGGLE);
               tempoA2=tempoA11;
            }
//lectura del potenciometro del pitch B
           set_adc_channel(1);
         delay_us(30);
         tempoB1=read_adc();
         tempoB11=tempoB1/2;      //convierte del rango 
                           //0xFF a 0x7F para Midi
         if(tempoA11==0x3F) bit_set(leds2,7);  //tempoA centrado a cero
         else bit_clear(leds2,7);

//comprueba si ha cambiado el tempo para enviarlo
         if(tempoB11!=tempoB2)
            {   tempB[1]=0xB0;
               tempB[0]=tempB[1]>>4;
               tempB[2]=0x01;
               tempB[3]=tempoB11;
               usb_put_packet(1,tempB,4,USB_DTS_TOGGLE);
               tempoB2=tempoB11;
            }
                          
      }
   }
}

////////////////////////////////////////////////////
//interrupción para pulsos encoder
////////////////////////////////////////////////////
#int_EXT2
void EXT2_isr()
{     
      //giro derecha
   if(!bit_test(INTCON2,4))       //entra por flanco bajada
      {   if(bit_test(PORTA,1)) p1=4;
         if(!bit_test(PORTA,1)) p1=1;
      }
      //giro izqierda
   if(bit_test(INTCON2,4))         //entra por flanco subida
      {    if(bit_test(PORTA,1)) p1=3;
         if(!bit_test(PORTA,1)) p1=2;
      }
   
   INTEDGE=!INTEDGE;
   
   if(p1==2||p1==4) encoderA=0x01;
   if(p1==1||p1==3) encoderA=0x7F;
   //if(encoderA>0x7F) encoderA=0x01;
   //if(encoderA<0x01) encoderA=0x7F;

   pulsos[3]=encoderA;
   usb_put_packet(1,pulsos,4,USB_DTS_TOGGLE);
}

//////////////////////////////////////////////
// Leds
//////////////////////////////////////////////
if (usb_kbhit(1)) 
{
  usb_get_packet(1,recibe,8);
}
int32 leds;
#locate leds=0x50
#byte leds1=0x50
#byte leds2=0x51
#byte leds3=0x52

/////////////////////////////////////////
//subprograma para lectura leds
////////////////////////////////////////

void detecta_led()
{	leds1copia=leds1;
	leds2copia=leds2;
	leds3copia=leds3;	
	recibe[2]=recibe[2]-32;
	if(recibe[3]==127) bit_clear(leds,recibe[2]);		//encender leds
	if(recibe[3]==0) bit_set(leds,recibe[2]);		//apagar leds
	
	if(leds1!=leds1copia){
		i2c_start();
		i2c_write(0x40);
		i2c_write(leds1);
		i2c_stop();
		}	
	if(leds2!=leds2copia){
		i2c_start();
		i2c_write(0x42);
		i2c_write(leds2);
		i2c_stop();
		}	
	if(leds3!=leds3copia){
		i2c_start();
		i2c_write(0x44);
		i2c_write(leds3);
		i2c_stop();
		}	
}
```

Pero cuando lo compilo (Mpalb 8.92, CCS 5.015), me tira los siguientes errores:


```
Clean: Deleting intermediary and output files.
Clean Warning: File "D:\Archivos\manuales\Controlador Fueguito 01\controlador midi\MIDI_12.o" doesn't exist.
Clean: Deleted file "MIDI_12.ERR".
Clean: Done.
Executing: "C:\Archivos de programa\PICC\Ccsc.exe" +FH "MIDI_12.c" +DF +LN +T +A +M +Z +Y=9 +EA
>>> Warning 203 "C:\Archivos de programa\PICC\drivers\pic18_usb.c" Line 643(1,1): Condition always TRUE
*** Error 99 "MIDI_12.c" Line 19(5,65): Option invalid   Wrong pins for H/W
*** Error 12 "MIDI_12.c" Line 376(17,24): Undefined identifier   INTCON2
*** Error 12 "MIDI_12.c" Line 377(33,35): Undefined identifier   p1
*** Error 12 "MIDI_12.c" Line 378(33,35): Undefined identifier   p1
*** Error 12 "MIDI_12.c" Line 381(16,23): Undefined identifier   INTCON2
*** Error 12 "MIDI_12.c" Line 382(34,36): Undefined identifier   p1
*** Error 12 "MIDI_12.c" Line 383(33,35): Undefined identifier   p1
*** Error 12 "MIDI_12.c" Line 386(4,11): Undefined identifier   INTEDGE
*** Error 12 "MIDI_12.c" Line 388(7,9): Undefined identifier   p1
*** Error 12 "MIDI_12.c" Line 389(7,9): Undefined identifier   p1
*** Error 12 "MIDI_12.c" Line 393(4,10): Undefined identifier   pulsos
*** Error 12 "MIDI_12.c" Line 394(21,27): Undefined identifier   pulsos
*** Error 43 "MIDI_12.c" Line 400(1,3): Expecting a declaration
*** Error 43 "MIDI_12.c" Line 400(4,5): Expecting a declaration
*** Error 28 "MIDI_12.c" Line 400(15,16): Expecting an identifier
*** Error 43 "MIDI_12.c" Line 400(17,18): Expecting a declaration
*** Error 43 "MIDI_12.c" Line 401(1,2): Expecting a declaration
*** Error 28 "MIDI_12.c" Line 402(18,19): Expecting an identifier
*** Error 48 "MIDI_12.c" Line 402(20,26): Expecting a (
*** Error 43 "MIDI_12.c" Line 402(27,28): Expecting a declaration
*** Error 43 "MIDI_12.c" Line 402(28,29): Expecting a declaration
*** Error 43 "MIDI_12.c" Line 402(29,30): Expecting a declaration
*** Error 43 "MIDI_12.c" Line 403(1,2): Expecting a declaration
*** Error 12 "MIDI_12.c" Line 415(2,12): Undefined identifier   leds1copia
*** Error 12 "MIDI_12.c" Line 416(1,11): Undefined identifier   leds2copia
*** Error 12 "MIDI_12.c" Line 417(1,11): Undefined identifier   leds3copia
*** Error 12 "MIDI_12.c" Line 422(11,21): Undefined identifier   leds1copia
*** Error 53 "MIDI_12.c" Line 424(11,15): Expecting function name  ::
*** Error 53 "MIDI_12.c" Line 425(11,16): Expecting function name  ::
*** Error 12 "MIDI_12.c" Line 428(11,21): Undefined identifier   leds2copia
*** Error 53 "MIDI_12.c" Line 430(11,15): Expecting function name  ::
*** Error 53 "MIDI_12.c" Line 431(11,16): Expecting function name  ::
*** Error 12 "MIDI_12.c" Line 434(11,21): Undefined identifier   leds3copia
*** Error 53 "MIDI_12.c" Line 436(11,15): Expecting function name  ::
*** Error 53 "MIDI_12.c" Line 437(11,16): Expecting function name  ::
      35 Errors,  1 Warnings.
Build Failed.
Halting build on first failure as requested.
BUILD FAILED: Wed Aug 31 11:20:15 2016
```

me exede por completo :/


----------



## D@rkbytes (Sep 2, 2016)

Se ve que tomaste como referencia el archivo MIDI_12.c, y los errores que existen deben ser porque agregaste código de otros programas.
El programa del archivo MIDI_12.c compila bien, pero modificando el error que tiene en la configuración del módulo I2C.

Adjunto el archivo con los cambios. No sé si funcione ya que no estoy metido en ésto.

Nota:
Compilado con CCS PIC C Compiler v 5.062

Suerte.


----------



## Fuegomp3 (Sep 2, 2016)

Gracias D@rk, lo probé y compiló perferctamente, ahora voy a ver como agrego las cosas que faltan a ver si sale funcionando algo, asi que si tira errores es culpa mia  cualquier duda que se me presente volveré a preguntar por aca.

Gracias de nuevo.


----------



## canibalbeats (Jun 21, 2022)

josb86 dijo:


> hola rachelies como andas, mira no se si a ti se te ha presentado un problema que se me sucede a mi. el controlador funciona perfectamente en mi pc de escritorio pero en mi portátil algunas veces se cuelga, el pic sigue trabajando pero el programa en este caso guitar rig no me recibe los datos que manda el pic y ya he probado en varios portátiles y pasa lo mismo.
> 
> 
> crooin mira el archivo que coloca rachelies es el mas importante ahoramismo no estoy en el pc donde tengo el archivo de ccs primero que todo si has manejado usb de pic?


Buena noche*. U*n gusto leer tantos buenos con*s*ejos*.
T*engo el mismo inconveniente que el compañero*.
M*i m*á*quina funciona perfecto, pero si dejo de tocarla por menos de un minuto, se inhabilita, sigue apareciendo el controlador midi pero queda congelado.
*L*es agradecería cualquier información al respecto.*..*


----------

