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 ); } } }
Parabéns pela iniciativa amigo! Seu blog é um dos melhores da área
ResponderExcluirbom 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é só instalar a biblioteca USB Device...é so seguir os passos descrito no post. Abraços.
ExcluirCara, nao tivesse sucesso em fazer funcionar este exemplo,
ResponderExcluirtentei 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?
O código que eu tenho é o mesmo do pacote. Você já tentou alterar o VID e o PID?
ExcluirÉ 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.
ResponderExcluirAmigo, estou com o mesmo problema, aparece o mesmo código de erro, se puder me ajudar. desde já agradeço. Mari
Excluirpior, agora com essa nova biblioteca que instala, no mikroc aparece um monte de erro que antes funcionava normal, help me please! Mari
ExcluirFuncionou 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
ExcluirVocê 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.
ExcluirExiste um passo neste artigo que mostra isso:(seleção da biblioteca no Library Manager)
Excluir" 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.
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)
ResponderExcluirUtilizando a comunicação USB CDC a comunicação UART do PIC será afetada?
ResponderExcluirNão!
ResponderExcluir