PIC ile USB HABERLEŞMESİ

 USB protokolü günümüzün en çok kullanılan haberleşme protokolü haline geldi.Bunun nedenleri arasında iletişim hızı, veri güvenliği gibi daha pek çok neden sayılabilir. Bizde bu yazımızda PIC mikrodenetleyicilerinin USB üzerinden bilgisayar ile iletişiminden bahsetmeye çalışacağız.
Öncelikle kullanacağımız mikrodenetleyicimizi belirleyelim.Bize USB haberleşme desteği olan bir mikrodenetleyici lazım. Bunun için denetleyicimizi UART desteği olması şart.  Biz burada PIC18F4550 kullanmayı deneyeceğiz. Piyasada bulunması gayet kolay olan bir mikrodenetleyici. UART desteği olan diğer mikrodenetleyicileri kaynak kısmında (1) numaralı linkte verdiğim adreste görebilirsiniz.

Şimdi proteus üzerinde basit bir ADC devresi kuralım. Hem kısaca bir Analog-Dijital konusundan da bahsetmiş oluruz. 3 tane potansiyometre koyalım ve bunlardan okuduğumuz değerleri USB üzerinden bilgisayara aktaralım. Devremizi aşağıdaki gibi kuruyoruz.

1

Eğer devreyi Proteusta deneyecekseniz Proteus klasörü içinden VirtualUSB’yi kurmayı unutmayın. (Bknz. C:\Program Files (x86)\Labcenter Electronics\Proteus 8 Professional\DRIVERS\)

 

#include "USBdsc.c" //  microchip sitesinden indirdiğimiz C dosyası

unsigned char oku[10] absolute 0x500;

unsigned char yaz[10] absolute 0x540;

int sensor1,sensor2,sensor3,sensor4,sensor5;

void interrupt(){

USB_Interrupt_Proc();}

void main(){

delay_ms(1000);

ADCON0 = 0x09; // ADC aktif edildi

ADCON1 &= 0xF0; // Analog pinleri analog giriş olarak ayarlandı.

CMCON |= 7; // karşılaştırıcı pasif edildi.

TRISD = 0; // PORTD çıkış yap

PORTD=0; // PORTD sıfırla

HID_Enable(&oku,&yaz);  // okuduğumuz ve yazacağımız verinin saklandığı belleği tanımlayıp HID iletişimini aktif hale getiriyoruz.

while(1){

sensor1 = ADC_Read(0); // sensör 1 den 10 bitlik değer oku

sensor2 = ADC_Read(1); // sensör 2 den 10 bitlik değer oku

sensor3 = ADC_Read(2); // sensör 3 den 10 bitlik değer oku

yaz[0] = 0x01;   // sensor 1 düşük seviyeli 8 bitini aktarıyoruz

yaz[1] = sensor1;   // sensor 1 yüksek seviyeli kalan 2 bitini aktarıyoruz

yaz[2] = 0x02;

yaz[3] = sensor2;

yaz[4] = 0x03;

yaz[5] = sensor3;

while(!HID_Write(&yaz,10)); // USB veri gönder

while(HID_Read()){ // USB gelen veri varsa döngüye gir.

if(oku[0]==0)

PORTD=0;

else

PORTD =1;

}

}

}

 

Devremizi hazırladıktan sonra şimdi de mikrodenetleyicimiz için programımızı yazmaya başlayalım. Bunun için MikroC dilini kullanacağız.MikroC PRO for PIC isimli yazılımımızı sitemizden indirebilirsiniz. (Kaynak : 2)

2

Programımızı yukarıdaki gibi yazdıktan sonra #include “USBdsc.c” komutunda belirtildiği gibi USBdsc.c dosyamızı oluşturmamızz gerek. Bunun için Tools > HID Terminal adımlarını takip edersek aşağıdaki gibi bir pencere açılacaktır.

3

Bu pencerede VID ve PID bizim aygıt ve ürün numaramız olacak. Buradan istediğimiz numarayı verebiliriz.(Tavsiyem 1234 olarak kullanmanız. Çünkü diğer USB aygıtları ile çakışma olabilir. ) Report Length ksımında input ve output olarak verilen değerler göndereceğimiz ve alacağımız veri için önbellek boyutunu belirler. Biz burada çok uzun veriler göndermeyeceğimiz için 10 byte bizim için yeterli.Vendor Name ve Product Name kısımlarını istediğimiz gibi doldurabiliriz. Daha sonra Save descriptor deyip dosyamızı diğer .C dosyalarımızın yanına oluşturuyoruz.

Şimdi mikrodenetleyicimizin osilatör ayarlarına geldik.Bunun için Project > Edit Project adımlarını takip edersek aşağıdaki gibi bir pencere açılacaktır.

4

Burada denetleyici tipini ve osilatör frekens hızını değiştireceğiz. PIC18F4550ye 8Mhzlik bir kristal osilatör bağlamıştık.Bunun için burada frekans ayarımızı 8Mhz olarak ayarlıyoruz. Diğer ayalarda ekrandaki gibi kalabilir.

Programımızı derledikten sonra mikrodenetleyicimize yükleyebiliriz. Devreyi proteusta çalıştırdığımızda tıpkı bilgisayara USB aygıt takılmış gibi algılayacak.Bilgisayar üzerinden herhangi bir seri port haberleşme yazılımı veya kendinizin yazabileceği bir arayüz ile kontrol edebilirsiniz.

Ben C# ta ufak bir arayüz tasarlamıştım. Sizler için bunun kodlarını da buraya vereyim.

5

 

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using UsbLibrary;

namespace hid

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

this.port.ProductId =4660;

this.port.VendorId = 4660;

this.port.CheckDevicePresent();

}

private void usb_OnDeviceArrived(object sender, EventArgs e)

{

durum.Text = "USB takıldı";

}



private void usb_OnDeviceRemoved(object sender, EventArgs e)

{

if (InvokeRequired)

{

Invoke(new EventHandler(usb_OnDeviceRemoved), new object[] { sender, e });

}

else

{

durum.Text = "USB çıkarıldı";

}

}

private void usb_OnSpecifiedDeviceArrived(object sender, EventArgs e)

{

durum.Text = "PIC takıldı";

}

private void usb_OnSpecifiedDeviceRemoved(object sender, EventArgs e)

{

if (InvokeRequired)

{

Invoke(new EventHandler(usb_OnSpecifiedDeviceRemoved), new object[] { sender, e });

}

else

{

durum.Text = "PIC çıkarıldı";

}

}

private void usb_OnDataRecieved(object sender, DataRecievedEventArgs args)

{

if (InvokeRequired)

{

try

{

Invoke(new DataRecievedEventHandler(usb_OnDataRecieved), new object[] { sender, args });

}

catch

{ }

}

else

{

byte[] gelen = new byte[10];

gelen = args.data;



s1.Text = gelen[2].ToString();

s2.Text = gelen[4].ToString();

s3.Text = gelen[6].ToString();



durum.Text = "Veri alınıyor...";

}

}



protected override void OnHandleCreated(EventArgs e)

{

base.OnHandleCreated(e);

port.RegisterHandle(Handle);

}

protected override void WndProc(ref Message m)

{

port.ParseMessages(ref m);

base.WndProc(ref m);

}

byte d = 0xFF;

private void button1_Click(object sender, EventArgs e)

{

byte[] veri = new byte[11];

veri[0] = d;

veri[1] = d;



for (int i =2 ; i < 10; i++) veri[i] = 0;



if (port.SpecifiedDevice != null)

port.SpecifiedDevice.SendData(veri);

if (d == 0xff) d = 0;

else d = 0xff;

}



}

}

 

Visual Studio ya USBLibrary.dll dosyasını eklemeyi unutmayın.. (Kaynak 3)

Selametle.

KAYNAK

1 – http://www.microchip.com/pagehandler/en-us/technology/usb/microcontrollers/home.html

2 – http://forum.mekatronikmuhendisligi.com/Konu-MikroC-Pro-2012-5-61-lisans-sorunu-cozuldu-ektedir.html?highlight=mikroc

3 – https://yadi.sk/d/_tCgZQivhdeUm

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir