Comunicação USB com o PIC- parte 2
Transcript of Comunicação USB com o PIC- parte 2
-
8/14/2019 Comunicao USB com o PIC- parte 2
1/13
1
WWW.cerne-tec.com.br
WWW.cerne-tec.com.br
Comunicao USB com o PICVitor Amadeu Souza Parte II
Continuando com o artigo apresentado na edio passada de comunicaoUSB com o PIC, continuaremos nesta edio o estudo do mikroC e a configuraodo mesmo para a correta comunicao do PIC com o PC via USB.
O Ambiente de Programao
Aps a instalao do mikroC, execute o mesmo. Teremos a tela da figura 1.
-
8/14/2019 Comunicao USB com o PIC- parte 2
2/13
2
WWW.cerne-tec.com.br
Figura 1 Tela inicial do mikroC
O mikroC trabalha com o conceito de projeto, ou seja, sempre quequisermos compilar um determinado cdigo, precisaremos criar um projeto. Nestecaso, v no menu Project -> New Project, a tela da figura 2 ser apresentada:
Figura 2 Criando um projeto no mikroC
No campo Project Name, devemos informar o nome do nosso projeto.Informe neste campo por exemplo, o nome comunicao_usb ou o nome quemelhor lhe convier. Em seguida, escolha a pasta onde o projeto ficar salvo,clicando no boto Browse do campo Project Path. O campo Descritption
-
8/14/2019 Comunicao USB com o PIC- parte 2
3/13
3
WWW.cerne-tec.com.br
opcional e serve para detalharmos o que o nosso projeto faz, podendo ficar nesteexemplo sem preenchimento. O campo clock serve para configurarmos nocompilador qual a velocidade de processamento no qual o PIC est funcionando,No nosso caso, apesar do oscilador ser de 4 MHz, escolha o clock de 48 MHz,pois como a srie 18 possui internamente PLLs que permitem aumentar o clock do
microcontrolador, neste exemplo iremos utilizar este recurso. No campo Device,escolha o modelo que iremos utilizar neste projeto, neste caso o PIC18F4550.Atravs do campo Device Flags, podemos ajustar os bits de configurao do PIC.Observe na tabela 1 os campos que devem ficar marcados para o corretofuncionamento deste exemplo.
Configuration BitPLLDIV_1_1L
CPUDIV_OSC1_PLL2_1LUSBDIV_2_1LFOSC_XTPLL_XTVREGEN_ON_2L
WDT_OFFMCLRE_OFF
LPT1OSC_OFFPBADEN_OFFLVP_OFF_4L
ICPRT_OFF_4LXINST_OFF_4L
DEBUG_OFF_4LTabela 1 Ajuste de Configurations Bits
* Recomendo a leitura do datasheet do PIC18F4550 na parte dos configurations bits para um entendimento melhor dos mesmos.
Feito os ajustes apresentados, pressione o boto ok. Agora o mikroC ficarcom a tela apresentada na figura 3.
-
8/14/2019 Comunicao USB com o PIC- parte 2
4/13
4
WWW.cerne-tec.com.br
Figura 3 Tela apresentada pelo mikroC
Agora precisaremos criar um arquivo chamado descritor. A funo destearquivo fazer a identificao do dispositivo USB assim que o mesmo forconectado ao PC. Para acessar este item, v no menu Tools -> HID Terminal. A
tela da figura 4 surgir.
-
8/14/2019 Comunicao USB com o PIC- parte 2
5/13
5
WWW.cerne-tec.com.br
Figura 4 Configurao do arquivo descritor
Agora clique na aba Descriptor, a tela da figura 5 surgir.
-
8/14/2019 Comunicao USB com o PIC- parte 2
6/13
6
WWW.cerne-tec.com.br
Figura 5 Abrindo o HID Terminal
Neste arquivo, definimos por exemplo o VID (Vendor ID) e PID (Product ID)do dispositivo. Estes dois parmetros, so fornecidos diretamente pela USB.orgporm iremos utilizar o mesmo que est sendo informado como parmetro. Outrasinformaes que podemos ajustar o buffer de entrada e sada, atravs do campoReport Lenght porm como iremos comunicar a nvel de bytes, podemos manter aconfigurao atual. Alm disso, no campo bus power, podemos ajustar se odispositivo ser do tipo bus powered, ou seja alimentado pela prpria USB ou selfpowered, o que quer dizer que est sendo alimentado pela fonte no qual o
equipamento est ligado. No nosso caso, a opo bus powered dever ficarmarcado, que por sinal j o default. Note que no campo abaixo da configuraoda alimentao do dispositivo, podemos tambm configurar a corrente mxima noqual este ir utilizar. Este campo tambm no precisa ser alterado, podendomanter neste caso com 100 mA que 50mA x 2. Os campos de Strings de VendorName e Product Name servem para que assim que o dispositivo for conectado aporta USB, este nome seja apresentado, podemos tambm manter a stringapresentada. Aps este passo, note que existem trs ferramentas no qual o HID
-
8/14/2019 Comunicao USB com o PIC- parte 2
7/13
7
WWW.cerne-tec.com.br
Terminal pode configurar para gerar o campo descritor, sendo necessrio escolhera opo mikroC. Pronto, agora pressione o boto Create e salve o arquivo com onome usbdsc.c na pasta onde est o seu projeto. Agora, de volta a janela principaldo mikroC, precisamos adicionar este arquivo descritor ao projeto. Para isso, vno menu Project -> Add to Project. Neste momento, ser aberta uma nova janela
onde voc dever escolher o arquivo recm criado, neste caso o usbdsc.c napasta onde voc salvou o mesmo.Para encerrar esta parte de configurao, devemos copiar dois arquivos
chamados var.h e definit.h que se encontram na pasta...\mikroelektronika\mikroC\examples\extra_examples\hid-library para a pasta doseu projeto e adicionar os mesmos, da mesma forma que o usbdsc.c ao projeto.Note que normalmente, o mikroC fica instalado na pasta arquivos de programa doseu PC.
Cdigo
Com o ambiente devidamente configurado, podemos agora nos ater aocdigo que ir rodar no PIC. Este cdigo est disponvel no box1. Vamos agoraesmiuar melhor o seu funcionamento.
As funes Hid_Write e Hid_Read conseguem comunicar com at 64 bytes.Apesar de utilizarmos somente 1 byte tanto na transmisso como na recepo,precisamos declarar estes dois vetores de forma que todo o byte transmitido ourecebido fique armazenado nestes dois buffers.
Agora entramos na funo principal de programa do programa em C, nestecaso a funo void (principal). Note que logo destarte, declarada uma variveldo tipo char chamada recebe . Esta varivel ser utilizada logo a frente noprograma, para indicar se um dado foi recebido ou no do PC. Inicialmente,quando o microcontrolador energizado, os pinos do PORTA e PORTE ficamconfigurados como entradas analgicas. No nosso caso, em que a porta serutilizada da forma digital, devemos desligar este recurso e isso feito atribuindo
unsigned char userWR_buffer[64]; //Buffer de transmisso serialunsigned char userRD_buffer[64]; //Buffer de recepo serial
void main(){
char recebe; //Varivel indicadora de bytes recebidosADCON1 = 0x0F; //Configura os pinos de forma digitaltrisa.ra1=0; //Configura o pino do led como sadatrisb.rb0=1; //Configura o pino do boto como entrada
-
8/14/2019 Comunicao USB com o PIC- parte 2
8/13
8
WWW.cerne-tec.com.br
ao registrador ADCON1 o valor 0x0F. De acordo com o esquema eltrico, no pinoRA1 est conectado um led, enquanto no pino RB0 o boto. Configurando osregistradores TRISB e TRISA do PIC, estamos ajustando as direes no qual osmesmos iro funcionar.
Neste ponto, feita a inicializao da USB no PIC. Note que os dois vetoresque foram inicializados no incio do programa, so informados para a funoHID_Enable. Todo o byte recebido ou transmitido pela USB, sero feitos atravsdestes dois registradores.
Dando prosseguimento a anlise do cdigo, entramos no loop while em queconstante os estados do boto so verificados e enviado o byte referente se omesmo est pressionado ou no. Se o boto estiver pressionado ( if(portb.rb0==0)) primeiramente carregado o byte A no vetor usbWR_Buffer[0]que o byte que ser enviado para o PC e logo em seguida o mesmo escritoatravs da funo HID_Write, que transmite 1 byte do vetor usbWR_Buffer[0].
HID_Enable(&userRD_buffer, &userWR_buffer);//Inicializa a USB
while (1){
if (portb.rb0==0){
userWR_buffer[0]='1'; //Carrega byte a ser enviado para o PCwhile (!HID_Write(&userWR_buffer, 1)) ;
//Envia e aguarda finalizar o envio do//byte pela USB
}else
{userWR_buffer[0]='0'; //Carrega byte a ser enviado para o PCwhile (!HID_Write(&userWR_buffer, 1)) ;
//Envia e aguarda finalizar o envio//do byte pela USB
-
8/14/2019 Comunicao USB com o PIC- parte 2
9/13
9
WWW.cerne-tec.com.br
Para saber se um determinado byte foi recebido, a varivel recebe recebe ovalor proveniente da funo hid_read(). Caso a mesma retorne 0, indica quenenhum byte foi recebido e caso contrrio, h a existncia de algum dado nobuffer de recepo. Note que logo em seguida, o contedo do buffer de recepo checado e caso haja o caracter A, o led aceso e caso contrrio, verificadose o B sendo neste caso apagado. O delay_ms(1000) foi colocado apenas paraque possamos verificar com mais clareza os dados recebidos pelo PIC, no sendoobrigatrio o seu uso.
Este bloco de interrupo foi criado para que toda a transao que ocorrerna USB, seja tratada pela mesma. Observe que a funo HID_InterruptProc()tambm j disponibilizada pelo prprio mikroC.
Agora compile e grave este programa no microcontrolador, de forma quepossamos continuar o nosso estudo.
recebe=hid_read(); //Verifica se h algum byte no//buffer de recepo
if (recebe!=0) //H algum byte para receber?{
if(userRD_buffer[0]=='A') // o 'A'?porta.ra1=1; //Sim, ento liga o led
if(userRD_buffer[0]=='B') // o 'B'?porta.ra1=0; //Sim, ento desliga o led
}
Delay_ms(1000); //Delay para atualizao
void interrupt(void){
HID_InterruptProc(); //Tratamento da interrupo de USB
}
-
8/14/2019 Comunicao USB com o PIC- parte 2
10/13
10
WWW.cerne-tec.com.br
Box 1 Cdigo Fonte
unsigned char userWR_buffer[64]; //Buffer de transmisso serialunsigned char userRD_buffer[64]; //Buffer de recepo serial
void main(){
char recebe;
ADCON1 = 0x0F; //Configura os pinos de forma digital
trisa.ra1=0; //Configura o pino do led como sadatrisb.rb0=1; //Configura o pino do boto como entrada
HID_Enable(&userRD_buffer, &userWR_buffer);//Inicializa a USB
while (1){
if (portb.rb0==0){
userWR_buffer[0]='1'; //Carrega byte a ser enviado para o PCwhile (!HID_Write(&userWR_buffer, 1)) ;
//Envia e aguarda finalizar o envio do//byte pela USB}
else{
userWR_buffer[0]='0'; //Carrega byte a ser enviado para o PCwhile (!HID_Write(&userWR_buffer, 1)) ;
//Envia e aguarda finalizar o envio//do byte pela USB
}
recebe=hid_read(); //Verifica se h algum byte no//buffer de recepo
if (recebe!=0) //H algum byte para receber?{
if(userRD_buffer[0]=='A') // o 'A'?porta.ra1=1; //Sim, ento liga o led
if(userRD_buffer[0]=='B') // o 'B'?porta.ra1=0; //Sim, ento desliga o led
}
Delay_ms(1000); //Delay para atualizao
}
}
void interrupt(void){
HID_InterruptProc(); //Tratamento da interrupo de USB
-
8/14/2019 Comunicao USB com o PIC- parte 2
11/13
11
WWW.cerne-tec.com.br
Conectando ao PC
Assim que o microcontrolador for conectado ao PC, ir aparecer umamensagem informativa do Windows, conforme a figura 6.
Figura 6 - Detectando o dispositivo USB
Neste instante, ir aparecer o assistente de instalao do Windows,conforme a figura 7.
Figura 7 Assistente de instalao do Windows
Escolha a opo No, no agora e pressione Avanar. Na prxima tela,escolha a opo Instalar o Software Automaticamente (recomendvel) e pressioneok. Em seguida, o Windows pode informar que o dispositivo no est registrado nologotipo do mesmo. Ignore esta mensagem e continue pressionando Continuar. Oresultado dever ser o apresentado na figura 8.
-
8/14/2019 Comunicao USB com o PIC- parte 2
12/13
12
WWW.cerne-tec.com.br
Figura 8 Dispositivo reconhecido e pronto para funcionar
Agora iremos utilizar a ferramenta HID Terminal que fica no prprio mikroCpara comunicar com o PIC. Note que neste ponto, outras aplicaes como oDelphi, Visual Basic ou Java j poderiam comunicar com o PIC, desde que estestivessem os devidos componentes de acesso a USB. Para abrir o HID Terminal,v em Tools -> HID Terminal. Note que assim que voc abrir este software, omesmo j ir apresentar os dados recebidos da USB, conforme apresentado nafigura9.
Figura 9 Recebendo dados da USB
-
8/14/2019 Comunicao USB com o PIC- parte 2
13/13
13
WWW.cerne-tec.com.br
Observe que o 0 est sendo apresentado em funo do boto estar solto.Conforme o mesmo for pressionado, o 1 ser enviado.
Agora para testar o acesso as sadas do PIC via USB, na caixacommunication, coloque o caracter A e logo em seguida, pressione o boto Send.
Observe que neste instante, o led ir acender. A mesma idia vlida paraapagar, bastando neste caso enviar o caracter B.
Concluso
Vimos nestes dois artigos como implementar a comunicao USB com oPIC. Este tema se torna importante nos dias atuais, em que cada vez mais a portaRS232 entra em desuso, e atualizar os atuais projetos com a USB se torna tonecessrio.