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.
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.
Código:
#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;
}
}
}
}