Fork me on GitHub

06/09/13

TUTORIAL: Comunicação USB no MikroC

TUTORIAL: Comunicação USB no MikroC



Olá pessoal !!! 

Aqui no blog, há alguns projetos envolvendo comunicação USB, mas em nenhum deles expliquei como fazer essa comunicação.

Então neste post mostrarei um passo-a-passo de como fazer uma comunicação USB com PIC através do compilador MikroC PRO PIC.

1 - Criar um Novo Projeto
Abra o mikroC PRO, e crie um novo projeto.

2 - HID Terminal
Para configurar o PIC como um USB HID Device, é necessário gerar um arquivo de descrição de funções de acordo com os padrões USB HID.

Após criado o projeto, deve abrir a ferramenta HID Terminal, que se encontra no Menu Tools.


Na aba Descriptor deve-se preencher os dados de configuração conforme a figura acima. Você pode alterar os valores de VID, PID, Vendor Name e Product Name. Os valores de Report Length (Input e Output) também podem ser alterados. Esse valores correspondem ao tamanho do buffer de transmissão e recepção de dados.

Em seguida clique em Save Descriptor para o arquivo ser salvo.

Esse arquivo precisa ser inserido no projeto. No menu Project, clique em Add File to Project e selecione o arquivo USBdsc.c, que você salvou anteriormente.

3 - Código
Utilizaremos a biblioteca USB HID do mikroC.



A biblioteca possui quatro funções.
HID_Enable(char * readBuffer, char *writeBuffer) - Habilita a comunicação USB.
HID_Read() - Verifica se algum dado foi recebido.
Obs.: A função não retorna os dados recebidos. todos os dados recebidos são salvos no buffer.
HID_Write(char *writeBuffer, char Length) - Envia um dado pela USB.
HID_Disable() - Desabilita a comunicação USB.

1º: Declara-se o buffer. O tamanho máximo para o buffer é 64 bytes.


//Declara-se duas variáveis do buffer de recepção e transmissão
//a diretiva absolute especifica o endereço de memória onde estas variáveis serão salvas.
//Leia o datasheet do PIC para mais informações.
unsigned char HidReadBuff[64]  absolute 0x500; //USB RAM
unsigned char HidWriteBuff[64] absolute 0x540; //USB RAM

2º: É necessário inserir a função de execução dos serviços de USB, Usb_Interrupt_Proc() ou USB_Polling_Proc().
A função USB_Interrupt_Proc() deve ser chamada dentro de uma interrupção. Na maioria dos projetos é necessário a sua utilização.

A função USB_Polling_Proc() não é chamada dentro de uma interrupção. Esta função deve ser chamada periodicamente, dentro de um loop infinito, de preferência a cada 100 microssegundos. Esta função é utilizada somente em casos onde não é possível utilizar o vetor de interrupção, como por exemplo, num projeto de Bootloader USB.
Obs.: Para utilizar esta função deve-se alterar o arquivo descriptor "UsbDsc.c". Edite a seguinte linha no arquivo:



Se o valor da variável for 0 deverá utilizar a função USB_Polling_Proc(). Caso for 1 utilizará a função Usb_Interrupt_Proc().

- Por fim, escreva seu código.
Exemplo:

unsigned char HidReadBuff[64]  absolute 0x500;
unsigned char HidWriteBuff[64] absolute 0x540;

void interrupt()
{
 Usb_Interrupt_Proc();
}

void main()
{
  HID_Enable(&HidReadBuff, &HidWriteBuff); //Habilita a comunicação USB

  while(1)
{
    if(HID_Read() > 0) //Verifica se recebeu algum dado.
    {
      if(HidReadBuff[0]==1) //Faz a leitura do primeiro byte recebido
      {
        PORTB.B0 = ~PORTB.B0; //aciona alguma coisa.
      }
      
      HidWriteBuff[0] = PORTB; //Escreve um byte no buffer de transmissão
      while(!Hid_Write(HidWriteBuff, 64)); //Envia algo atraves da USB para o PC.
    }
}
}
    

4 - Configuração do cristal e...
Modo Full Speed:
O Modo Full Speed, a velocidade do clock é de 48Mhz. A biblioteca do MikroC trabalha com este modo.
Veja as configurações necessárias:

PLL Prescaler Selection - Seleciona o valor do cristal a ser utilizado no seu projeto. Exemplo: Divide by 4(16Mhz oscillator input) quer dizer que você deve utilizar um cristal de 16 MHz.

System Clock Postcaler Selection - Deixe como a imagem acima. Divide o valor da frequência do clock e do PLL.

USB Clock Selection - Seleciona a fonte de clock da USB. Deixe como a a imagem acima.

Oscillator Selection - Seleciona a fonte de clock do PIC. Escolha somente aquelas com PLL Enable.

USB Voltage Regulator - Deve estar habilitado.

Obs.:

  • Quando o PLL é ativado, o clock da USB é de 48Mhz e seu código também rodará à 48Mhz. Não esquece de configurar a frequência no seu projeto.

  • Não é possível utilizar o clock interno.

Modo Low Speed
Para Low Speed USB , ajuste o clock à 24 Mhz (veja o datasheet ) e define o valor do registro UCFG.FSEN para 0. Isto faz também que a velocidade de clock da CPU seja de 24 MHz.


5 - Está Pronto!!!
Projeto concluído, é hora de testar.
Ao conectar o microcontrolador no PC, irá aparecer uma mensagem informativa do Windows.

Não há necessidade de instalar drivers.

Abra o HID Terminal para visualizar e transmitir os dados para seu microcontrolador. Você também pode utilizar qualquer programa criado com Visual C#, Basic, Java, etc, desde que este tivesse os devidos componentes de comunicação USB.

Isto é tudo pessoal!! Se tiver alguma dúvida é só PERGUNTAR.

30 comentários:

  1. Sensacional! Trabalho de qualidade! Obrigado amigo (;

    ResponderExcluir
  2. o capacitor no pino 16 deve ser somente de 100nF? Ele é ceramico?
    Obrigado

    ResponderExcluir
    Respostas
    1. o valor do capacitor fica na faixa de 100nF à 1uF. E deve ser ceramico.

      Excluir
  3. Oi amigo, não estou conseguindo fazer funcionar.
    Voce poderia disponibilizar o arquivo do Proteus e o código do MikroC?

    Os capacitores do Proteus usados são os genericos e nao-eletrolíticos?

    meu e-mail: nyckmaia@gmail.com

    Obrigado,
    Nyck

    ResponderExcluir
    Respostas
    1. Oi Tiago, obrigado por responder!

      Sim, instalei.
      Estou usando o Proteus 8.

      Quando eu rodo o arquivo, ele nem aparece o sinal de conectado nem no Windows, nem no Explorer.

      Talvez eu esteja cometendo um erro bobo.
      Por isso, gostaria de ter um exemplo que eu tenha certeza que funciona...mas não estou encontrando.

      Por acaso, você teria esse exemplo do Proteus com o código em C para o MikroC?

      Obrigado!
      Nyck

      Excluir
    2. Tem uma postagem no blog, sobre como controlador o pic via usb. Ta disponivel o download do codigo e do esquema do proteus, clique nesse LINK.

      Excluir
  4. Oi Tiago. Baixei o exemplo do site, mas ainda aparece o mesmo erro:

    USB: Unable to connect to Virtual USB Host
    Please, install Virtual USB Drivers from Start menu - Programs - Proteus 7 Professional - Virtual USB.

    Já instalei e desinstalei o Proteus 7 e o Proteus 8 várias vezes.
    Já instalei os drivers USB que vem na pasta do Proteus e também os baixados diretamente do site da LabEletronics.

    O estranho é que, mesmo quando eu desinstalo totalmente as duas versões do Proteus (7 e 8), deleto as pastas e apago os registros (regedit) e depois instalo somente o Proteus 8, a mensagem de erro continua imutável (falando pra instalar os drivers localizados na pasta do "PROTEUS 7"...)

    Por favor, se você puder me ajudar, ficaria muito grato.

    Obrigado,
    Nyck

    ResponderExcluir
    Respostas
    1. Amigo, espero ainda estar precisando da informação... Basta ir no menú iniciar/todos os programas/proteus/ e você vai ver o programa que instala o drive virtual! Click nele. Demora um pouquinho(vai dar uma tela preta com mensagens marcadas de progresso da instalação). Boa sorte!

      Excluir
    2. Amigo... é possível simular no Windows 8 64 bits? não consigo simular a USB... uso o Proteus 7.8 SP2. Obrigado

      Excluir
    3. É possível sim, amigo. Eu também tive esse problema achei que fosse com o Proteus ou com o SO, mas acabou que era no crack do MikroC. Tem um crack nesse mesmo blog que funciona perfeitamente!

      Excluir
  5. Existe algum outro software de leitura de dados enviados pela porta USB? Pra serial (Portas COM) da pra utilizar o Hyperterminal, mas para USB só conheço o terminal do MikroC, alguém conhece outro?

    ResponderExcluir
    Respostas
    1. É o link completo : http://www.rakeshmondal.info/USB-Demo-Interface-Development-Board-Project

      Mas se quiser só o programa : http://www.rakeshmondal.info/CS-Application-To-Control-PIC18F4550-Board-6LED.zip

      Excluir
  6. Alguém sabe como fazer pra um "enter" e voltar pro início da linha ?
    Por exemplo, só consigo:
    "teste teste teste teste teste"

    e gostaria de :

    "teste
    teste
    teste
    teste"

    ResponderExcluir
    Respostas
    1. tem que colocar "\r\n". Só "\n" não funciona.

      HID_Write("teste\r\n",64);

      Excluir
  7. Boa noite. Criei um circuito com o PIC18F2550 para medir a temperatura do ambiente com um LM35 e enviar esse valor pela USB. No desktop fiz um software em C# para receber esse valor, armazenar em um arquivo txt e gerar um gráfico em tempo de execução. Tudo funcionava muito bem durante todo o dia. Agora a noite o circuito simplesmente não funciona mais. Quando ligo o circuito no USB do PC aparece o seguinte erro: "Dispositivo USB Desconhecido (Falha na Solicitação de Descritor de Dispositivo). Já revisei e compilei o firmware do PIC várias vezes, já gerei outros USBdsc, já revisei o circuito mas está tudo OK. A princípio imaginei que o PIC tivesse queimado por algum motivo mas já gravei outros programas nele e funcionou muito bem! Alguém tem alguma ideia do que possa ter acontecido e como posso resolver esse problema? Já testei em outros computadores e aparece o mesmo erro. Toda ajuda é bem vinda... Grato! Abraços.

    ResponderExcluir
  8. Olá, eu copiei seu código e apartir do void main até o fim do programa, indica erro;
    0 360 Unresolved extern 'USB_Init_Desc' __Lib_USB_genHID.c
    Sabe o que pode ser?

    ResponderExcluir
  9. ola amigo,tem como ler sensor lm 35 co o pic e enviar para o pc atraves da porta usb ?

    ResponderExcluir
  10. Figura do passo 2 - HID Terminal não está carregando (arquivo corrompido), pode consertar por gentileza?

    ResponderExcluir
  11. Quando conecto a placa ao computador aparece a mensagem: Dispositivo USB Desconhecido. Como posso resolver este problema?

    ResponderExcluir
  12. Thiago boa noite vom a versão crackeada do mikroc funciona conexão USB
    grato.

    ResponderExcluir
  13. Olá, pode reupar a imagem das configurações? Não esta funcionando!

    ResponderExcluir
  14. Olá, estou desenvolvendo um ArcadePad para funcionar como controlador de jogos. Utilizei o Pic18F4550 em Full Speed com um cristal de 20MHz e toda a programação do código no MikroC. Em simulação tudo funcionou corretamente, entretanto na protoboard que montei o circuito, o sistema reconhece o Pic como um controlador de jogos, mas os bytes indicando botões pressionados, acelerômetro etc sempre são enviados com o valor 0 ao invés do que deveria realmente ser enviado. Sobre isso, alguém sabe dizer se seria um problema do código ou do circuito e comunicação com o PC?

    ResponderExcluir
  15. Figura do passo 2 - HID Terminal não está carregando (arquivo corrompido), pode consertar por gentileza?

    ResponderExcluir
  16. olá, segui os passos e quando conecto o dispositivo, ele não é reconhecido. Erro 43

    ResponderExcluir
  17. quando fui configurar HID Terminal não sei as referencia por que a figura do passo 2 não carrega, pode arrumar por favor

    ResponderExcluir
  18. A imagem do HID Terminal não esta carregando, a imagem do obs.: também não. Muito bom o post.

    ResponderExcluir

Postagens Relacionadas!!