merhaba. bu sabah surada https://www.picproje.org/index.php/topic,59847.msg462497.html#msg462497 (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 (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 ::)