VCP uygulamasi

Başlatan Karamel, 17 Haziran 2015, 19:41:39

Karamel

merhaba. bu sabah surada https://www.picproje.org/index.php/topic,59847.msg462497.html#msg462497 yakin zamanda VCP uygulamasi yapacagimi soylemistim. uzerinden birkac saat gecti. toplumun kanayan yarasina derman olabilmek adina calismalara basladim :P

gecenlerde mikroe nin virtual com port codelarina rastgelmistim ama dersler sebebi ile ilgilenememistim. sabah gaza gelerek bu konu uzerine calismaya basladim :) mikroe nin codelari uzerinde ufak duzenlemeler yaparak ft232 gibi entegreleri taklit edebildim. olay cok basit. dilim dondugu kadar tercume etmeye calisacagim ::)


oncelikle example imizi buradan indiriyoruz. http://dosya.co/adkmi56j6rox/Virtual_COM_Port.rar.html

klasorumuzun icersinde bir adet example. iki adet te driver var. x86 ve x64 icin. example imiz pic18f4550 icin yazilmis ama biz baska bir usb li pic microcontroller icin bunu duzenleyebiliriz. bu asamadan sonra biraz code larimiza bakalim. sonrada neler yapmamiz gerektigini konusalim.

main code umuz soyle:
/*
 * Project name:
     Virtual COM Port Demo
 * Description
     Example showing usage USB CDC device that functions as a generic virtual 
     COM port. The example echoes data sent via USART terminal.
 * Test configuration:
     MCU:             P18F4550
     dev.board:       EasyPIC v7 Connectivity
                      http://www.mikroe.com/easypic/
     Oscillator:      HS-PLL, 48.000MHz
     Ext. Modules:    None.
     SW:              mikroC PRO for PIC
                      http://www.mikroe.com/mikroc/pic/
     Notes:           Example uses CDC Driver included in Windows. An .inf file
                      is supplied with the example in order to match the driver
                      with this device (user must guide driver installation 
                      wizard to the VCPDriver folder).

 */

#include <stdint.h>

// Buffer of 64 bytes
char buffer[64] absolute 0x500;

unsigned char i;

char error, byte_read;

// USB interrupt service routine
void interrupt(){
  // Call library interrupt handler routine
  USBDev_IntHandler();
}

void USBDev_CDCParamsChanged(){

}

extern const uint8_t _USB_CDC_BULK_EP_IN;   // Data interface IN endpoint
extern const uint8_t _USB_CDC_BULK_EP_OUT;  // Data interface OUT endpoint
uint8_t dataReceived = 0;
uint16_t dataReceivedSize;

void USBDev_CDCDataReceived(uint16_t size){
  dataReceived = 1;
  dataReceivedSize = size;
}

void main(void){
  ADCON1 |= 0x0F;                         // Configure all ports with analog function as digital
  CMCON  |= 7;                            // Disable comparators

  TrisC = 0b10000011;
  PortC = 0;

  //UART1_Init(9600);
  //Delay_ms(100);
  Soft_UART_Init(&PORTC, 7, 6, 9600, 0);

  // Initialize CDC Class
  USBDev_CDCInit();
  
  // Initialize USB device module
  USBDev_Init();
 
  // Enable USB device interrupt
  IPEN_bit = 1;
  USBIP_bit = 1;
  USBIE_bit = 1;
  GIEH_bit = 1;

  // Infinite loop
  while(1){
    // If device is configured
    if(USB_CDC_DeviceConfigured){
      // Set receive buffer where received data is stored
      USBDev_CDCSetReceiveBuffer(buffer);

      // Reset configured flag
      USB_CDC_DeviceConfigured = 0;
    }

    if(dataReceived == 1){
      dataReceived = 0;
      // Send back received packet
      //USBDev_CDCSendData(buffer, dataReceivedSize);

      for(i=0; i != dataReceivedSize; i++) Soft_Uart_Write(buffer[i]);
      
      // Prepare receive buffer
      USBDev_CDCSetReceiveBuffer(buffer);
    }
    
    if(PortC.F7 == 0)
    {
        Buffer[0] = Soft_UART_Read(&error);
        
        USBDev_CDCSendData(buffer, 1);
        USBDev_CDCSetReceiveBuffer(buffer);
        
    }
  }

}



-iletisimi soft uart ile yaptim. yani bu nedemek? microcontrollerin donanimsal uartina mahkum değiliz. Soft_UART_Init(&PORTC, 7, 6, 9600, 0); buradaki code da 7 ve 6 portc ye tanimlanmis rx ve tx pinleri. burada RX = 7. TX = 6 olarak tanimlanmis. istersek biz bunlari keyfimizde gore degistirebiliriz.


-eger bilgisayar usb to uart seklinde veri gondermeye calisiyorsa dataReceived = 1 oluyor. bunu algilayip. for(i=0; i != dataReceivedSize; i++) Soft_Uart_Write(buffer); bu code umuzla alinan veri kadarini karsi tarafa basiyoruz. ardindan USBDev_CDCSetReceiveBuffer(buffer); code umuz ile receiver bufferlarini yeniden prepare ediyoruz.


- eger PortC.F7 == 0 sa. start biti gelmis demektir. eger boyle olursa. Buffer[0] = Soft_UART_Read(&error); code u ile datamizi aliyoruz. stop biti esnasinda  USBDev_CDCSendData(buffer, 1); ile uart kismindan gelen veriyi usb kismina aktariyoruz. daha sonrada USBDev_CDCSetReceiveBuffer(buffer); code u ile receiver bufferimizi prepare ediyoruz.



amacimiz usb - uart conversion ise. yukarida ki 3 maddeden eger ile baslayanlar ile isimiz yok. sadece microcontroller in rx tx pinlerini secmek yeterli. portc 7 ve 6 benim icin uygun derseniz. hic degisiklik yapmaya gerek yok. :)


simdi nasil calistigini inceleyelim.


oncelikle hex code umuzu microcontroller a yukluyoruz. bilgisayar a usb ile baglanti kurmaya calistigimizda aygit olarak bulunuyor ama driver i yuklenmedigi icin hata veriyor. bilgisayarim a sag tik. ozellikler. aygit yoneticisinden. tanimlanmamis aygitimizi buluyoruz. manual olarak indirdigimiz dosya icersindeki driver i gosteriyoruz. driver in yuklenmesi bende ilginctir biraz fazla zaman aldi. 2-3 dk gibi. eger boyle bir bekleme durumu olursa sorun yok. olmadi diye kapatmayin. o install isini halledecek.


tum bunlari yaptiktan sonra isimiz tamam. usb to uart converter imiz calisacaktir. bundan sonra converterimizi mutlu mesut kullanabiliriz ::)


bunlari arm microcontrollerlarada yapabiliriz. pic18f4550 cok buyuk ve pahali bir microcontroller. usb to uart icin pekte uygun değil. kucuk boyutta. az pinli. ucuz bir microcontroller kesfedip. bu codelari ona uygulamak gerekli ::)



arastirmalarim bu kadar. umarim faydali olabilmisimdir ::)