Fork me on GitHub

14/02/14

PIC: Comunicação USB CDC

PIC: Comunicação USB CDC




A comunicação USB CDC ( Communication Device Class ) implementa um mecanismo de comunicação de propósito geral que pode ser usado para a comunicação entre a maioria dos dispositivos.


No exemplo iremos "emular" uma porta serial via USB utilizando a biblioteca USB DEVICE do MikroC PRO PIC. Você terá que baixar e instalar. Para instalar, utilize o programa Package Manager. Depois de instalado, verá que foi adicionado mais uma biblioteca na lista de bibliotecas ( Library Manager ).



Precisamos também do driver, para que o PC possa reconhecer o dispositivo corretamente. Uma vez instalado, o microcontrolador sempre será reconhecido corretamente. Para instalar o driver siga estes passos:

  • 1 - Abra o Gerenciado de Dispositivos ( Painel de Controle -> Hardware e Sons -> Gerenciador de Dispositivos ).
  • 2 - Clique em "Adicionar hardware herdado". Clique em avançar até aparecer o botão "Com disco..." Clique e selecione o arquivo de configuração do driver "C:\Program Files\MikroElektronika\mikroC PRO for PIC\Packages\USB_Device\Examples\VCPDriver\VCPDriver.inf".

Após instalada verá que foi adicionado mais uma porta COM:



CÓDIGO
O código abaixo é um exemplo modificado do código disponível na biblioteca USB DEVICE, que se encontra nesta pasta "C:\Program Files\MikroElektronika\mikroC PRO for PIC\Packages\USB_Device\Examples\PIC18F4550\Virtual COM Port\".

Você pode notar que é bem simples:

// Buffer de 64 bytes
char buffer[64] absolute 0x500;

// USB interrupt service routine
void interrupt()
{
  // Call library interrupt handler routine
  USBDev_IntHandler();
}

//função nao utilizada, mas necessita colocá-la
void USBDev_CDCParamsChanged(){}

char dataReceived = 0;
unsigned dataReceivedSize;

//Esta funcão será chamada, sempre que receber algum dado
void USBDev_CDCDataReceived( unsigned size )
{
  dataReceived = 1;
  dataReceivedSize = size;
}

void main()
{
  ADCON1 = 0x07; 
  
  //Iniciar a classe CDC com
  //Baud Rate = 9600bps
  //Stop Bits = 1(0)
  //Paridade = None(0)
  //Data Bits = 8
  //USBDev_CDCInit();
  
  //Ou Iniciar a classe CDC personalizado
  USBDev_CDCSetLineCoding( 57600, 0, 0, 8 );
  
  //Inicia o modulo USB
  USBDev_Init();
  //Habilita as interrupçoes
  IPEN_bit = 1;   //Ativa interrpção por prioridade
  USBIP_bit = 1;  //Ativa prioridade alta
  USBIE_bit = 1;  //Interrupção da porta USB
  GIEH_bit = 1;   //Interrupção global

  //Espera o dispositivo ser configurado
  while( USBDev_GetDeviceState() != _USB_DEV_STATE_CONFIGURED );
 
  //Define o buffer de recepção
  USBDev_CDCSetReceiveBuffer(buffer);

  while(1)
  {
    //Se recebeu algum dado
    if( dataReceived == 1 )
    {
      dataReceived = 0; //limpa a flag
      
      //Esta funcao é usada para enviar dados ao PC
      USBDev_CDCSendData( buffer, dataReceivedSize );

      memcpy( buffer, "Microcontrolandos", 17 );
      USBDev_CDCSendData( buffer, 17 );

      //Prepara o buffer de recepção
      USBDev_CDCSetReceiveBuffer( buffer );
    }
  }
}

12 comentários:

  1. Parabéns pela iniciativa amigo! Seu blog é um dos melhores da área

    ResponderExcluir
  2. bom dia será que tem como vc me passar o driver VCPDriver.inf no meu mikroc não tem a pasta Packages\ e não achei o driver nas outras pastas..

    ResponderExcluir
    Respostas
    1. é só instalar a biblioteca USB Device...é so seguir os passos descrito no post. Abraços.

      Excluir
  3. Cara, nao tivesse sucesso em fazer funcionar este exemplo,
    tentei tambem o codigo que vem junto com o pacote, porem o mesmo até é detectado pelo windows,
    porem com VID e PID 0, sendo assim nao consigo carregar o driver....

    teria como disponibilizar o exemplo completo zipado?

    ResponderExcluir
    Respostas
    1. O código que eu tenho é o mesmo do pacote. Você já tentou alterar o VID e o PID?

      Excluir
  4. É sempre um trabalho implementar esse PIC18F4550 com USB. Fiz todos os passos mas não funcionou.Ao instalar o driver VCPDriver.inf fica um ponto de interrogação ao lado da COM, ao ver detalhes do hardware aparece a mensagem "Este dispositivo não pode ser iniciado. (Código 10)". Tento conectar a placa na usb e nada acontece, nem um barulho, nem uma mensagem, nada. Você sabe se precisa fazer alguma modificação no hardware para fazer esse exemplo funcionar, estou usando a placa de desenvolvimento "PROTO'n" que usa cristal de 20MHz e um capacitor de 1uF no pino 18, o MCLR está em pull up com um resistor de 10k.

    ResponderExcluir
    Respostas
    1. Amigo, estou com o mesmo problema, aparece o mesmo código de erro, se puder me ajudar. desde já agradeço. Mari

      Excluir
    2. pior, agora com essa nova biblioteca que instala, no mikroc aparece um monte de erro que antes funcionava normal, help me please! Mari

      Excluir
    3. Funcionou amigo, como estou usando um cristal de 20MHz é necessário reconfigurar o projeto em Edit Project-> PLL Prescaler - > Selecionar "Divide by 5 (20MHz oscillator input), dependendo o cristal que você está usando tem que mudar o PLL Prescaler

      Excluir
    4. Você instalou a biblioteca e está aparecendo erros, ok, isso é normal, provavelmente se você for no menu Library Manager vai estar tudo selecionado, você precisa desativar as biblioteca que não está usando, só deixe as bibliotecas que vc vai usar, se todas estiverem selecionadas podem acontecer conflitos.

      Excluir
    5. Existe um passo neste artigo que mostra isso:(seleção da biblioteca no Library Manager)

      " Depois de instalado, verá que foi adicionado mais uma biblioteca na lista de bibliotecas ( Library Manager )"

      -Vá em library manager

      -Nesta parte você só deixa selecionado as bibliotecas que vai usar no projeto, no caso como vai usar a biblioteca de comunicação CDC deve selecionar somente as classes dela, conforme a figura abaixo.
      http://i.imgur.com/NKU0EWl.png

      -Se você usar alguma outra biblioteca no projeto também deve selecionar( as mais comuns que são usadas em todos projetos ADC - C_string, Conversions)

      -Você deve tomar cuidado quando for criar um novo projeto , pois aparece uma opção "include libraries->include all (default) para incluir todas as bibliotecas no projeto, nesse caso todas as biblioteca vão ser selecionadas e vai dar erro na hora de compilar porque essas biblioteca de usb dão conflitos entre si, você pode selecionar a opção ("include libraries->include none") e depois durante o processo de desenvolvimento ir selecionando as bibliotecas que vai usar no menu Library Manager, ou adicionar todas e depois ir em Library manager e desmarcar as que dão conflito entre si. Espero ter ajudado.

      Excluir
  5. Funcionou amigo, como estou usando um cristal de 20MHz é necessário reconfigurar o projeto em Edit Project-> PLL Prescaler - > Selecionar "Divide by 5 (20MHz oscillator input)

    ResponderExcluir

Postagens Relacionadas!!