Controlando PIC18F4550 via USB
Autor: Eletroautomação | Publicado: 2013-12-07T17:17:00-08:00


PIC: Controlando PIC18F4550 via USB





Projeto de um sistema de comunicação via USB, entre o PIC18F4550 e o programa feito em C#.&nbsp;Este programa monitoras 8 entradas digitais e 8 entradas analógicas e controla 8 saídas digitais e 2 saídas PWM.O Firmware foi feito no MikroC PRO PIC. O código é simples, mas para realizar a comunicação USB, você deve configurar os seguintes bits de configuração: Selecione o menu&nbsp;Project&nbsp;&gt;&nbsp;Edit Project



PLL Prescaler Selection: Caso você queira utilizar um outro valor de cristal, altere este campo&nbsp;No download, estou incluindo o firmware, e o software junto com o seu código-fonte.DOWNLOAD:Projeto:&nbsp;ControladorUSB.rar&nbsp;






#include "built_in.h"
#define STX 0x0F

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

enum Comandos {None=0, Analog, DigitalIn, DigitalOut, PWM};

char cmd = None;

void interrupt()
{
 Usb_Interrupt_Proc();
}

void CheckCommand()
{
   if(cmd == None)
   {
     if(HidReadBuff[0] != STX) return;
     cmd = HIDReadBuff[1];
   }
}

void EntradaAnalogica()
{
unsigned analogVal;
  HIDWriteBuff[1] =  Analog;
analogVal = ADC_get_sample(0);
  HIDWriteBuff[2] =  Hi(analogVal);
  HIDWriteBuff[3] =  Lo(analogVal);
analogVal = ADC_get_sample(1);
  HIDWriteBuff[4] =  Hi(analogVal);
  HIDWriteBuff[5] =  Lo(analogVal);
analogVal = ADC_get_sample(2);
  HIDWriteBuff[6] =  Hi(analogVal);
  HIDWriteBuff[7] =  Lo(analogVal);
analogVal = ADC_get_sample(3);
  HIDWriteBuff[8] =  Hi(analogVal);
  HIDWriteBuff[9] =  Lo(analogVal);
analogVal = ADC_get_sample(4);
  HIDWriteBuff[10] =  Hi(analogVal);
  HIDWriteBuff[11] =  Lo(analogVal);
analogVal = ADC_get_sample(5);
  HIDWriteBuff[12] =  Hi(analogVal);
  HIDWriteBuff[13] =  Lo(analogVal);
analogVal = ADC_get_sample(6);
  HIDWriteBuff[14] =  Hi(analogVal);
  HIDWriteBuff[15] =  Lo(analogVal);
analogVal = ADC_get_sample(7);
  HIDWriteBuff[16] =  Hi(analogVal);
  HIDWriteBuff[17] =  Lo(analogVal);

  while(!HID_Write(&amp;HIDWriteBuff, 64));
}

void EntradaDigital()
{
   HidWriteBuff[1] = DigitalIn;
   HidWriteBuff[2] = PORTD;

   while(!Hid_Write(&amp;HidWriteBuff, 64));
}

void SaidaDigital()
{
   HidWriteBuff[1] = DigitalOut;
   HidWriteBuff[2] = PORTB;

   while(!Hid_write(&amp;HidWriteBuff, 64));
}

void USB_Recv()
{
 char dataRx = 0;

   while(1)
   {
      HidWriteBuff[0] = STX;
      EntradaAnalogica();
      EntradaDigital();
      SaidaDigital();

      dataRx = HID_Read();

      if(dataRx)
      {
        dataRx = 0;
        CheckCommand();

        if(cmd == DigitalOut) //Saídas Digitais
        {
          PORTB = PORTB ^ (1 &lt;&lt; HidReadBuff[2]);
          cmd = None;
        }

        else if(cmd == PWM)
        {
         PWM1_Set_Duty(HidReadBuff[2]);
         PWM2_Set_Duty(HidReadBuff[3]);
         cmd = None;
        }
     }
   delay_ms(100);
   }
}

void main()
{
    TRISD = 255;
    TRISB = 0;
    TRISA = 255;
    TRISC = 0;
    PORTB = 0xAA;
    
    ADC_Init();
    PWM1_Init(4000);
    PWM2_Init(3000);
    PWM1_Set_Duty(127);
    PWM2_Set_Duty(127);
    PWM1_Start();
    PWM2_Start();
    HID_Enable(&amp;HidReadBuff, &amp;HidWriteBuff);
    
    Usb_Recv();
}