collapse

* Posts Recentes

Power spike on power off por vasco
[Hoje às 13:22]


LusoRobótica - Website - Estado actual por vasco
[Ontem às 14:10]


Circuito para distinguir fase do neutro por TigPT
[Ontem às 14:04]


Vídeo sobre o projecto e a montagem de um conversor 12VDC - 230VAC por senso
[19 de Novembro de 2018, 15:39]


Compra Colectiva Mouser N3-2018 (limite 25 Nov) por Hugu
[19 de Novembro de 2018, 01:01]


Vídeo - selecção da uma fonte de alimentação em substituição de um transformador por vasco
[18 de Novembro de 2018, 16:21]


Placa BMS Desliga por jm_araujo
[17 de Novembro de 2018, 22:36]


Vende-se MUITO e BOM material por m90mine
[13 de Novembro de 2018, 23:32]


leitura de voltagens com o analogRead(A0) por vasco
[08 de Novembro de 2018, 13:59]


Controlar Velocidade Motor AC por senso
[06 de Novembro de 2018, 23:05]

Autor Tópico: Problema com programação em PIC 18f4550.  (Lida 1066 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline Tiago_D

  • Mini Robot
  • *
  • Mensagens: 20
Problema com programação em PIC 18f4550.
« em: 23 de Setembro de 2012, 19:46 »
Boas.
Estou a desenvolver um controlador midi, utilizando um PIC 18f4550 e estou a usar um código exemplo da Microchip Solutions, modificando-o para a minha aplicação, só que me deparei com um problema. Não consigo utilizar 2 botões em simultâneo, sei que se trata de um problema de código mas não sei como resolve-lo.


Código: [Seleccione]
void ProcessIO(void)
{
    //static BYTE pitch = 0x3C;
    static BOOL sentNoteOff = TRUE;
    //Blink the LEDs according to the USB device status
    BlinkUSBStatus();

    // User Application USB tasks
    if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) return;

    if(!USBHandleBusy(USBRxHandle))
    {
        //We have received a MIDI packet from the host, process it and then
        //  prepare to receive the next packet

        //INSERT MIDI PROCESSING CODE HERE

        //Get ready for next packet (this will overwrite the old data)
        USBRxHandle = USBRxOnePacket(MIDI_EP,(BYTE*)&ReceivedDataBuffer,64);
    }
   
    if(sw1==0)
    {
        if(sentNoteOff == TRUE)
        {
        if(msCounter == 0)
         {
                if(!USBHandleBusy(USBTxHandle))
                {
                    //Debounce counter for 100ms
                    msCounter = 5;
                    midiData.Val = 0;   //must set all unused values to 0 so go ahead
                                        //  and set them all to 0

                    midiData.CableNumber = 0;
                    midiData.CodeIndexNumber = MIDI_CIN_NOTE_ON;
                    midiData.DATA_0 = 0x90;         //Note on
                    midiData.DATA_1 = 0x77;         //pitch
                    midiData.DATA_2 = 0x2F;  //velocity

                    USBTxHandle = USBTxOnePacket(MIDI_EP,(BYTE*)&midiData,4);
                    sentNoteOff == FALSE;
                }
            }
        }
    }
    else if(sw2==0)
    {
        if(sentNoteOff == TRUE)
        {
          if(msCounter == 0)
          {
                if(!USBHandleBusy(USBTxHandle))
                {
                    //Debounce counter for 100ms
                    msCounter = 5;
               
                    midiData.Val = 0;   //must set all unused values to 0 so go ahead
                                        //  and set them all to 0

                    midiData.CableNumber = 0;
                    midiData.CodeIndexNumber = MIDI_CIN_NOTE_ON;
                    midiData.DATA_0 = 0x90;         //Note on
                    midiData.DATA_1 = 0x76;         //pitch
                    midiData.DATA_2 = 0x2F;  //velocity

                    USBTxHandle = USBTxOnePacket(MIDI_EP,(BYTE*)&midiData,4);
                   
                    sentNoteOff == FALSE;
                   
               }
            }
        }
    }
 else
    {
        if(msCounter == 0)
        {
            if(sentNoteOff == FALSE)
            {
                if(!USBHandleBusy(USBTxHandle))
                {
                    //Debounce counter for 100ms
                    msCounter = 5;

                    midiData.Val = 0;   //must set all unused values to 0 so go ahead
                                        //  and set them all to 0

                    midiData.CableNumber = 0;
                    midiData.CodeIndexNumber = MIDI_CIN_NOTE_ON;
                    midiData.DATA_0 = 0x90;     //Note off
                    midiData.DATA_1 = 0x80;     //pitch
                    midiData.DATA_2 = 0x00;        //velocity


                    USBTxHandle = USBTxOnePacket(MIDI_EP,(BYTE*)&midiData,4);
                    sentNoteOff == TRUE;
                   
                }
            }
        }
    }

}//end ProcessIO


Se for necessário posso postar mais do código.
O problema está no sentNoteOff que não permite que quando um botão está a ser pressionado outro não pode ser. E sem este sentNoteOff quando é pressionado o botão esta constantemente a enviar sinal midi, o que é indesejado.
Se alguém poder ajudar agradecia.