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().
3º - 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.
Sensacional! Trabalho de qualidade! Obrigado amigo (;
ResponderExcluiro capacitor no pino 16 deve ser somente de 100nF? Ele é ceramico?
ResponderExcluirObrigado
o valor do capacitor fica na faixa de 100nF à 1uF. E deve ser ceramico.
ExcluirOi amigo, não estou conseguindo fazer funcionar.
ResponderExcluirVoce 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
Vc instalou o drive USB do proteus??
ExcluirOi Tiago, obrigado por responder!
ExcluirSim, 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
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.
ExcluirOi Tiago. Baixei o exemplo do site, mas ainda aparece o mesmo erro:
ResponderExcluirUSB: 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
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!
ExcluirAmigo... é possível simular no Windows 8 64 bits? não consigo simular a USB... uso o Proteus 7.8 SP2. Obrigado
ExcluirÉ 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!
ExcluirExiste 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É o link completo : http://www.rakeshmondal.info/USB-Demo-Interface-Development-Board-Project
ExcluirMas se quiser só o programa : http://www.rakeshmondal.info/CS-Application-To-Control-PIC18F4550-Board-6LED.zip
Alguém sabe como fazer pra um "enter" e voltar pro início da linha ?
ResponderExcluirPor exemplo, só consigo:
"teste teste teste teste teste"
e gostaria de :
"teste
teste
teste
teste"
tem que colocar "\r\n". Só "\n" não funciona.
ExcluirHID_Write("teste\r\n",64);
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.
ResponderExcluirOlá, eu copiei seu código e apartir do void main até o fim do programa, indica erro;
ResponderExcluir0 360 Unresolved extern 'USB_Init_Desc' __Lib_USB_genHID.c
Sabe o que pode ser?
Voce tem que adicionar o descriptor. Olhe o passo 2.
Excluirola amigo,tem como ler sensor lm 35 co o pic e enviar para o pc atraves da porta usb ?
ResponderExcluirTem sim. :)
ExcluirFigura do passo 2 - HID Terminal não está carregando (arquivo corrompido), pode consertar por gentileza?
ResponderExcluirQuando conecto a placa ao computador aparece a mensagem: Dispositivo USB Desconhecido. Como posso resolver este problema?
ResponderExcluirThiago boa noite vom a versão crackeada do mikroc funciona conexão USB
ResponderExcluirgrato.
Olá, pode reupar a imagem das configurações? Não esta funcionando!
ResponderExcluirOlá, 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?
ResponderExcluirFigura do passo 2 - HID Terminal não está carregando (arquivo corrompido), pode consertar por gentileza?
ResponderExcluirolá, segui os passos e quando conecto o dispositivo, ele não é reconhecido. Erro 43
ResponderExcluirquando fui configurar HID Terminal não sei as referencia por que a figura do passo 2 não carrega, pode arrumar por favor
ResponderExcluirverdade a figura n tem!
ResponderExcluirA imagem do HID Terminal não esta carregando, a imagem do obs.: também não. Muito bom o post.
ResponderExcluirDuas imagens não estão funcionando
ResponderExcluiré possivel comunicar com o pic usando o C++ microsoft visual studio 2010 ?
ResponderExcluir