For english version http://dincaysroom.blogspot.com (Not complete yet)

30 Ekim 2010 Cumartesi

Ftdi VCP Sürücüleri ile Seri Iletisim

Libftdi kullanarak yaptıgim seri iletişimi ftdi'in VCP (Virtual Com Port) sürücüleri kullanarak da yaptım.

VCP kullanmamın sebebi, C dışında başka dillerle de ftdi çipini kullanmak istemem. Önceleri libftdi kullanmamın bana daha esneklik vereceğini düşünüyordum. Fakat neredeyse her programlama dili ile pc'nin seri portuyla (com port) konuşabilirim. Libftdi gibi ozellesmis bir kutuphane yerine cok daha yaygin olarak kullanilan seri port kutuphaneleri ile is yapmak daha mantikli.

VCP'yi yuklemek icin ftdi'in web sitesinden suruculeri indirdim. make komutunu dedigim zaman  

cc1: fatal error: /lib/modules/2.6.35-22-generic/build/include/linux/modversions.h: No such file or directory

diye hata verdi. Biraz arastirdigimdan anladigim kadari ile bu dosya daha eski linux versiyonlarinda buluyormus (Su an Ubuntu 10.04 kullaniyorum). http://ftdi-usb-sio.sourceforge.net/#sec6 adresinde eger vcp dogru yuklenmisse su sekilde anlayabilirsiniz diyor. Yazilanlari yaptigimda dogru yuklendigini gordum :)

Vcp'yi kullanmak icin C yerine python dili ile bir program yazdim. Python'da seri iletisim icin pySerial modulu gerekiyor. Kurulum icin http://pypi.python.org/pypi/pyserial adresindeki modulu indirdim. Kurulumun nasil olacagi indirilen klasorun icinde de yaziyor. Indirdigim klasore gidip

sudo python setup.py install 

komutunu verdigimde kurulum tamamlaniyor.

http://pyserial.sourceforge.net/shortintro.html adresindeki kucuk orneklere bakarak fpga'e data yollayip alabilen bir program yazdim. Program cok kisa oldugu icin buraya yaziyorum.


#python serial read-write
import serial


#baud rate = 19200, timeout = 10 sec
ser = serial.Serial('/dev/ttyUSB0', 19200, timeout=10)
ser.write("5")
x = ser.read()
print(x)
ser.close()


Artik de0 kartina bilgisayardan komut gonderebiliyor ve kartin tepkisini okuyabiliyorum. Bundan sonra komut alma/verme isini kolaylastiran bir komut cozucu yazacagim. 

18 Ekim 2010 Pazartesi

Altera DE0 - Seri Konfigurasyon Cipi (EPCS) Programlama

DE0'in uzerinde 4 kbitlik ozel bir seri flash var. Altera'nin dokumanlarindaki adi Serial Configuration Device, EPCS diye kodlaniyor. DE0'da 4 kbitlik modeli oldugu icin kodu epcs4. Karta guc verildiginde, eger programlama anahtari Run konumundaysa fpga epcs'deki konfigurasyonu yukluyor. Karti her baslattigimda, kartta, fabrikada yuklenen test programini gormek istemedigim icin epcs'yi kendi istegime gore programlamak istedim.

Epcs'yi programlamak icin DE0'in kullanim kilavuzunda bir bolum var (sayfa 20-21) ama orada yazanlari yapmak yeterli degil. Sadece orada yazanlar yapilirsa epcs'yi programlanamiyor. Zaten bu yaziyi yazma sebebim kullanim kilavuzunda ve internette bununla ilgili eksiksiz bir kaynak olmamasi.

Altera'nin fpga'in icine yuklenen konfigurasyon dosyasinin uzantisi .sof. Xilinx'te bu .bit idi. Fakat bu .sof dosyasi fpga icin, bunu epcs icin olacak sekilde degistirmek gerekiyor. Bunun icin quartus'ta
  • File->Convert Programming Files
tiklamak gerekiyor. Acilan yeni pencerede yapilmasi gereken ayarlar:

  • Programming file type -> Programmer Object File (.pof)
  • Configuration Device -> ECPS4
  • Input files to convert -> "SOF data'ya tikla" -> Add File -> cevirilecek .sof dosyasini sec

Bende bu islemlerden sonra pencerenin goruntusu soyle: 


Generate diyip .pof dosyasini olusturdum.

Ikinci adim yaratilan bu .pof dosyasini epsc4'e yazmak. Bunun icin quartus'tan programmer'i aciyorum. Cikan ekranda yapilacak degisiklikler soyle:

  • Hardware Setup -> USB Blaster
  • Mode -> Active Serial Programming -> Cikan ekrana 'Yes'
  • Enable real-time ISP to allow background programming (for Max2 devices) sec
  • Add Device -> EPCS4 -> OK
  • Cikan sembole tikla -> Change file -> .pof dosyasini sec
  • Program/Configure secenegini sec
  • Start

Start'a basmadan once ekran goruntusu soyle


Bu adimlari izledikten sonra epcs4'u programlayabildim ve kart her acilisinda artik saat uygulamasi ile basliyor.

7 Ekim 2010 Perşembe

PC-FPGA RS232 ile iletisim - 2

Fpga'de calisan koda ek olarak bilgisayarda da calisan bir yazilima ihtiyac var. Ftdi ciplerinin kontrol edilebildigi iki kutuphane mevcut: D2XX kutuphanesi ve libftdi kutuphanesi. Bunlardan ilki ftdi'in hazirladigi kutuphane ve acik kaynak kodlu degil. Fakat dokumantasyonu guzel. Libftdi ise acik kaynak kodlu ama dokumantasyonu kotu. Onceleri libftdi kullaniyordum. Bu defa dokumantasyonu daha iyi oldugu icin d2xx kullanmaya niyetlendim ama ubuntuda kutuphaneyi yuklemeyi beceremedim. Libftdi ise ubuntunun "repository"lerinde var ve cok kolay yukleniyor. Herhangi bir paket programiyla (synaptic, aptitude vs..) yuklenebiliyor. Lbftdi fonksiyonlari hakkinda bilgi sahibi olunabilecek belki de tek yer kutuphanenin dokumantasyon web sitesi. http://www.intra2net.com/en/developer/libftdi/documentation/index.html adresindeki sitede her fonksiyonla ilgili kisa aciklamalar var. Ayrica kutuphaneyi kurduktan sonra /usr/share/doc/libftdi-dev/examples klasoru altinda 5-6 tane ornek kod var. Orneklerden simple.c ve serial_read.c kodlari cok yardimci oldu.

Program deneme programi oldugu icin faydali bir seyler yazmaya calismadim. Program 100 kere donen bir dongu icinde once klavyeden girilen sayiyi yolluyor, sonra fpgaden gelecek datayi bekliyor. Data geldiginde ise o degeri ekrana basiyor.

Program 3 esas kisma ayrilabilir: baslangic, yazma ve okuma. Su an yazilimi anlattigim icin yazma ve okuma tanimlarini yazilimin bakis acisindan yaziyorum. Ornegin cikis dedigim yazilimdan fpga'e giden demek.

Baslangic kisminin buyuk kismini ftdi'in bilgisayara kurdugu examples klasorundeki simple.c programindan yararlanarak yaptim. Iletisim hizini, data bicimini buradan belirliyoruz. Fpga'deki program 19200 baud, 1+8+1 bit (start+data+stop) seklinde oldugu icin yazilimi da ayni ayarlarda calistiriyorum.

Yazma kismi basit. Fpga, gelecek data icin surekli hazir oldugu icin bilgisayardan data yollama isi cabuk bitti. Tek yapilmasi gereken ftdi_write_data fonksiyonunu cagirmak.

Okumak en zor ve libftdi'yi ogrenmeyi gerektiren kisim. Dokumantasyonda okuma fonksiyonu hakkinda 1 satir aciklama yapilmis. Aciklamada fonksiyon cagirildiginda data alana kadar bekliyor mu yoksa data yoksa devam ediyor mu bahsedilmiyor. D2XX kutuphanesinin dokumantasyonunda bu durumdan acikca bahsediliyor ve iki durum icin de fonksiyonun nasil kullanilacagi anlatiliyor. Samples klasorundeki serial_read.c programina baktigimda data yoksa beklemedigini anladim. Fonksiyon dogru sekilde okudugu data sayisini dondugu icin, dondugu deger 0'dan farkli olana kadar dongu icinde cagirdim.

Programi test ederken dikkatimi ceken bir sey oldu. Ftdi cipinin icinde buffer var. Eger fpga'den data yollama sirasinda 1'den fazla data yollarasaniz, bilgisayar tarafindan okunmayanlar cipin icindeki buffera kaydediliyor ve bir sonraki okuma sirasinda yollaniyor. Yazdigim programi her defasinda 1 byte okuyacak sekilde yazdim. Ola ki fpga'den bilgisayara 2 byte yollandi, bu durumda bir sonraki okuma fpga o sirada ne gonderirse gondersin bir onceki seferde ne okuduysa onu gonderiyor. Bu ozelligi yollama ozelligi icin debounce filtresi olmadigi zaman farkettim.

Bir sonraki asamada VCM (Virtual COM Port) suruculerini kullanarak ayni isi yapmaya calisacagim.

Program kodlari buradan indirilebilir.

6 Ekim 2010 Çarşamba

PC-FPGA RS232 ile iletisim - 1

FTDI cipini kullanarak libftdi kutuphanesi ve rs232 protokolu ile fpga - bilgisayar arasinda cift yonlu veri aktarimini basardim.

Bu isi yapmasi icin yazdigim program once kullanicidan bir sayi istiyor ve bu sayiyi fpga'e gonderiyor. Fpga'de bu sayi 3 ve 4uncu 7 segment ledlerde gosteriliyor. Sonrasinda program fpga'den data yollamasini bekliyor. Fpga'den data yollamak icin kart uzerindeki button 1'e basmak yeterli. Butona basinca kart uzerindeki anahtarlarla girilen 8 bitlik sayiyi bilgisayara yolluyor ve bilgisayardaki program gonderilen sayiyi ekrana basiyor. Bu sayede hem bilgisayardan fpga'e, hem de fpga'den bilgisayara veri transferi yapilabiliyor. Bu sistemin guzelligi, pc'de atik eskiyen rs232 portu yerine usb portundan veriyi yollamasi. Ftdi cipi usb'den gelen datayi rs232 formatina ceviriyor. Ayrica ftdi cipini kontrol etmek icin ozel programlara ihtiyac yok, bunun icin olusturulmus bir kutuphane var. Bu sayede herhangi bir c programinda gerekli fonksiyonlari cagirarak rs232 portunu istedigimiz sekilde kontrol edebiliriz. Bu da bilgisayarda uygulama gelistirmek icin cok buyuk bir esneklik sagliyor. Ftdi ciplerinin kutuphanesini kullanarak yaptigim bir oyunu bu bloga yazmistim. Bu linkten o yaziya ulasilabilir.

Rs232 uygulamasi icin fpga icin yazdigim kod esas olarak 3 parcadan olusuyor. Baud yaraticisi, alici ve verici. Baud hizi olarak 19200 kullandim. Rs232 protokolunde ayrica bir clock bilgisi gitmedigi icin, ornekleme noktasini hassas olarak ayarlamak icin baud yaraticisi 19200x16 Hz hizinda palsler uretiyor. Alici ve verici modulleri kendi iclerinde palsleri sayiyorlar. Her bit gonderimi 16 pals surdugu icin; verici, basla komutu geldikten sonra her 16 palste bir cikisini guncelliyor. Alici ise yeni data gonderildigini algiladigi anda ilk basta 8 pals sayiyor ki orneklemeler bitlerin tam ortasina denk gelebilsin. Sonrasinda 16 palste bir hatti okuyup datayi aliyor. Kodlari referens kitabi olarak kullandigim kitaptan esinlenerek yazdim. Kod kendimin ama algoritma kitabin. Kitabi anlattigim yaziya buradan ulasilabilir.

Bu semada fpga icindeki esas bloklarin baglanti semasi gosteriliyor.


Alici ve vericinin arkasindaki bloklar basit birer RS flip flop. Rs232 modulunu sadece bu projede tek basina kullandim, bundan sonra kullanacagim her projede rs232 modulu yan modul olarak kullanilacak. O yuzden ana modulle iletisimlerini kolaylastirmak icin yeni veri alindigini(newdata) ve o an bir veri yollandigini(busy) gosteren iki sinyal de rs232 modulunun icinde uretiliyor.

Bilgisayarda yazdigim yazilimi bir sonraki yazida anlatacagim.

Program kodlarina buradan erisilebilir.