sábado, 7 de dezembro de 2013

Controlando PIC18F4550 via USB

PIC: Controlando PIC18F4550 via USB






Projeto de um sistema de comunicação via USB, entre o PIC18F4550 e o programa feito em C#.
 

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 Project > Edit Project


PLL Prescaler Selection: Caso você queira utilizar um outro valor de cristal, altere este campo 

No download, estou incluindo o firmware, e o software junto com o seu código-fonte.

DOWNLOAD:
Projeto: ControladorUSB.rar 






  1. #include "built_in.h"
  2. #define STX 0x0F
  3. unsigned char HidReadBuff[64] absolute 0x500;
  4. unsigned char HidWriteBuff[64] absolute 0x540;
  5. unsigned char Reserve4thBankForUSB[256] absolute 0x400;
  6. enum Comandos {None=0, Analog, DigitalIn, DigitalOut, PWM};
  7. char cmd = None;
  8. void interrupt()
  9. {
  10. Usb_Interrupt_Proc();
  11. }
  12. void CheckCommand()
  13. {
  14. if(cmd == None)
  15. {
  16. if(HidReadBuff[0] != STX) return;
  17. cmd = HIDReadBuff[1];
  18. }
  19. }
  20. void EntradaAnalogica()
  21. {
  22. unsigned analogVal;
  23. HIDWriteBuff[1] = Analog;
  24. analogVal = ADC_get_sample(0);
  25. HIDWriteBuff[2] = Hi(analogVal);
  26. HIDWriteBuff[3] = Lo(analogVal);
  27. analogVal = ADC_get_sample(1);
  28. HIDWriteBuff[4] = Hi(analogVal);
  29. HIDWriteBuff[5] = Lo(analogVal);
  30. analogVal = ADC_get_sample(2);
  31. HIDWriteBuff[6] = Hi(analogVal);
  32. HIDWriteBuff[7] = Lo(analogVal);
  33. analogVal = ADC_get_sample(3);
  34. HIDWriteBuff[8] = Hi(analogVal);
  35. HIDWriteBuff[9] = Lo(analogVal);
  36. analogVal = ADC_get_sample(4);
  37. HIDWriteBuff[10] = Hi(analogVal);
  38. HIDWriteBuff[11] = Lo(analogVal);
  39. analogVal = ADC_get_sample(5);
  40. HIDWriteBuff[12] = Hi(analogVal);
  41. HIDWriteBuff[13] = Lo(analogVal);
  42. analogVal = ADC_get_sample(6);
  43. HIDWriteBuff[14] = Hi(analogVal);
  44. HIDWriteBuff[15] = Lo(analogVal);
  45. analogVal = ADC_get_sample(7);
  46. HIDWriteBuff[16] = Hi(analogVal);
  47. HIDWriteBuff[17] = Lo(analogVal);
  48. while(!HID_Write(&HIDWriteBuff, 64));
  49. }
  50. void EntradaDigital()
  51. {
  52. HidWriteBuff[1] = DigitalIn;
  53. HidWriteBuff[2] = PORTD;
  54. while(!Hid_Write(&HidWriteBuff, 64));
  55. }
  56. void SaidaDigital()
  57. {
  58. HidWriteBuff[1] = DigitalOut;
  59. HidWriteBuff[2] = PORTB;
  60. while(!Hid_write(&HidWriteBuff, 64));
  61. }
  62. void USB_Recv()
  63. {
  64. char dataRx = 0;
  65. while(1)
  66. {
  67. HidWriteBuff[0] = STX;
  68. EntradaAnalogica();
  69. EntradaDigital();
  70. SaidaDigital();
  71. dataRx = HID_Read();
  72. if(dataRx)
  73. {
  74. dataRx = 0;
  75. CheckCommand();
  76. if(cmd == DigitalOut) //Saídas Digitais
  77. {
  78. PORTB = PORTB ^ (1 << HidReadBuff[2]);
  79. cmd = None;
  80. }
  81. else if(cmd == PWM)
  82. {
  83. PWM1_Set_Duty(HidReadBuff[2]);
  84. PWM2_Set_Duty(HidReadBuff[3]);
  85. cmd = None;
  86. }
  87. }
  88. delay_ms(100);
  89. }
  90. }
  91. void main()
  92. {
  93. TRISD = 255;
  94. TRISB = 0;
  95. TRISA = 255;
  96. TRISC = 0;
  97. PORTB = 0xAA;
  98. ADC_Init();
  99. PWM1_Init(4000);
  100. PWM2_Init(3000);
  101. PWM1_Set_Duty(127);
  102. PWM2_Set_Duty(127);
  103. PWM1_Start();
  104. PWM2_Start();
  105. HID_Enable(&HidReadBuff, &HidWriteBuff);
  106. Usb_Recv();
  107. }

0 comentários:

Postar um comentário