Controlador MIDI por USB con PIC para Virtual Dj

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.
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..
 
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...
 
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:

Código:
#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
Código:
#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
 
Última edición:
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();
}

}
}
 
Última edición:
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
Código:
set_tris_A(0b00101111);	
	set_tris_B(0b00001110);
Después de los "setup_adc....", añade
Código:
usb_init_cs();
usb_task();
y después del "for(;;), añade
Código:
if(usb_enumerated()){
y pon otro
Código:
}
abajo del todo del código.
Al principio del código pon tambien
Código:
#use_fast_io(B)
Pruébalo y a ver si te funciona.
 
Última edición:
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ó:
Código:
#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.
 
Ya consegui hacerlo funcionar partiendo del código ese que enviaba note on y note off :D.
Rachelies me preguntabas si leer entradas cada 32useg es suficiente? SI, y sobra, me crea un overflow :enfadado: :aplauso:
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...

Código:
#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();
         }                  
      }
   }
   }
}
 
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.
 
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" :D
Después capaz que armó un hilo nuevo para este invento, agradezco mucho la ayuda que me brindaste con el CCS :apreton: (y)
 
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
 
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??
 

Adjuntos

  • Esquema2.jpg
    Esquema2.jpg
    382.8 KB · Visitas: 101
Última edición:
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!!
 
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 :)
 
Última edición:
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.

Código:
'****************************************************************
'*  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!
 

Adjuntos

  • CUE-PLAY.jpg
    CUE-PLAY.jpg
    1.9 KB · Visitas: 32
  • fader.jpg
    fader.jpg
    4.3 KB · Visitas: 32
Última edición:
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
 
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. :D 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..
 
Última edición:
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).
 
Atrás
Arriba