collapse

* Posts Recentes

+ LASERs por dropes
[03 de Julho de 2025, 19:35]


Cerca eléctrica por SerraCabo
[14 de Junho de 2025, 23:26]


Alguém arranja motores? por almamater
[10 de Junho de 2025, 22:34]


Condensador 4.7uF 0603 por brunus
[09 de Junho de 2025, 15:52]


Lenovo IdeaPad 3 Não liga por jm_araujo
[07 de Maio de 2025, 19:10]


Identificar Diodo Zenner por filjoa
[01 de Maio de 2025, 23:07]


Meu novo robô por dropes
[18 de Março de 2025, 14:51]


JBL partybox On-The-Go por almamater
[21 de Fevereiro de 2025, 23:32]


Talking Reverse Engineering with an Absolute Legend! por SerraCabo
[13 de Fevereiro de 2025, 09:56]


Motoserra Stihl 120C por brunus
[11 de Fevereiro de 2025, 16:29]

Autor Tópico: Problema com programação em PIC 18f4550.  (Lida 5490 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.