FT232 - Delphi - XP

Başlatan z, 13 Ocak 2009, 13:19:22

z

PC ile seri port uzerinden haberlesen bir kartim var.

Kartin seri portunun hemen onune FT232 koyarak artik karti PC ile USB uzerinden haberlestiriyorum.

Kart uzerindeki islemci ve PC yazilimim, hantal sayilabilecek bir protokol kullanarak seri data iletisimi yapmakta, bu sayede gurultulu ortamlardan kaynaklanabilecek veri bozulmalarinin onune gecilmekte.

Projeyi win98 uzerinde gelistirirken USB kullanmiyor ve haberlesmeyi dogrudan PC uzerindeki UART cipinin registerleri uzerinden yurutuyordum.
Bu haliyle iletisim hantal protokola ragmen son derece hizli idi. Asla ve asla iletisimde yavaslik kesinti yasamiyordum.

Gel gelelim XP isletim sistemininde, sinirlamalardan dolayi artik PC ciplerinin registerlerine dogrudan ulasilamadigi icin seri portu
CreateComport, SetupComm, BuidCommState, SetCommState gibi dusuk seviyeli komutlar uzerinden halletmek zorunda kaldim.

Bu ise hatiri sayilir bir yazilim gecikmelerine neden oldu.

FT232 uzerinden 115200 baud ile haberlesiyorum. Ancak verilerin pespese gonderilmesi esnasinda anormal yavaslik var.

(Benzetmek gerekirse, eskiden idrar sarrrr diye bosalirdi simdi prostatli birisinin isemesi gibi)

Iletisimi nasil hizlandiririm?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Sorunumun XP seri port kullanimi asamasindaki yogun isletim sistemi denetimlerinin neden oldugu gecikmeden kaynaklandigini bu nedenle PC tarafinda FT232 cipi ile haberlesmek icin seri port kullanmam gerekmemeli diye dusunuyorum.

FT232 nin RX, TX, LSR,  MSR gibi registerlerine ulasmami saglayacak bir driver sanki sorunumu kokten cozuverecek gibi.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

wsxwsx

bu register larla hiç işin olmaz.  sorunsuz haberleşiyor. zaten. yalnız formalitesine uymak gerekir.

Firma diyor ki :

FT çipten veriokumak için 2 yöngtem vardır.
1- Ya çipteki buffer dolacak
2- ya zaman aşımı oluşacak

çipteki buffer 60 bayt civarı. zaman aşımını ise sen 500 ms ayarlamışsan ( veya varsayılan hali ne ise artık)çipten "şebelek" stringi gönderdin diyelim. istediğinkadar hızlı gönder.  bu string çok kısa  olduğu için buffer dolmayacak ve zaman aşımı oluşana kadar bekleyecektir. ( 500ms ise okadar bekler)

Yukarıda anlattıklarımdirekkullanım için. ancak bu sanal com port da öncelikle direk sürücüden geçerek sanal comporta dönüştüğünden dolayı hantallık oluşmuştur.

Cihazdan sürekli veri göndermeyi deneyin. sorunsuz gelir.

z

Hakli olabilirsiniz. FT232 ye gecis tamamen USB ve XP zorunlulugundan dolayi oldu ve belki eski protokolu terketmem gerekecek.

Ancak soyle bir durum var.

PC - USB kalblosu - FT232 baglantisinda USB protokolu PC - FT232 arasinda  hatasiz veri iletimini %100 garanti ediyor olsun. (Muhtemelen boyledir)

Fakat FT232 ile kendi islemcim arasindaki veri iletiminin %100 dogru oldugunu kimse garanti edemez.


Ilemcim bir onceki veriyi okumakta gecikebilir yenisi bir oncekinin ustune yazilabillir, ortam gurultusunden dolayi islemciye gelen yada islemciden giden bazi bitler konum degistirebilir vs.

RS232 ile dogrudan haberlesirken veri kontrolunu iki uc tarafinda yani PC ve islemci tarafinda yapip tamam aldigin veri dogru bunu kullan yada yanlis olmuş aman kullanma sana 32bit veriyi tekrar yollayacagim seklinde protokol kullaniyordum.

FT232 ye geciste her seyi dll lere birakirsam aldigim verinin dogrumu yanlismi oldugunu nasil kontrol edecegim?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

wsxwsx

cehecksum gibi bazı bilgiler gerekecek.

z

Donduk dolastik gene ayni yere geldik. Yani protokol olusturmak gerekecek.

Cipi monte edip veri alip verdigimi gorunce FT232 ye hic kafa yormadim dokumanlarini okumadim. Ancak geldigim noktada FT232 uzerine kafa yormam gerekecek.

Peki sunu sorayim;

En azindan FT232 icindeki buffer verilerle tamamen doldugunda, buffer bosalirken gonder bekle gonder bekle gibi bir fren mekanizmasi olusturabilirmiyiz. Yoksa buffer doldugunda veriler hurra tx pinine hucum mu ediyor?

(Su anki mevcut uygulamam da PC tarafindaki seri port bufferini sadece 1 byte uzunluga set ettim)
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

wsxwsx

edemezsin olmaz öyle şey. buffer çipin içinde . ama yazılımdan ayarladıysan gerçekten ayarlanmış olmaz. buffer den sonra buffer ayarlamış olursun. örnek 5 saniye timeout ve 500kb buffer yada dediğin gibi 1 bayt buffer ayarlanabilir. bunlar DLLden gelen verileri okumak içindir. gerçekte ise çipten 64 baytmı ne geliyor. bunlardan 2 si start stop gibi bitlermiş.

1 bayt ayarladıysan senin çipten gelen bu bir baytı okuyabilmek için en az timeout kadar beklemen gerekir.  o da galiba en düşük 1ms

çipin içinde ne işin oluyor onu anlamadım. okuyacaksan okuyorsun. yazacaksan yazıyorsun. bu işlemlerde bir sıkıntı yok.

Bufferin dolması ve boşalması bizi ilgilendirmiyor. (çift buffer yapmıştır. biri dolarken diğeri boşalıyordur. ne olduğunu anlamamız gerekmiyor.)7

gönder diyorsun gidiyor. oku diyorsun okuyor. hatta okuma yazma durumunu algılamak için rs485 işlemleri için ek bir uç vermiş. aynı anda okuma yazma olmaması için

Galiba bir de çip içinde veri gelip birikmişse başka bir uç 1 oluyor. ozaman okumaya başlıyorsun. (en falza çipin hafızası kadar okursun 62 bayt olsa gerek) bunlar bitince program veri pompalamaya devam etmesi gerekir.

z

Varmis varmis.

Xon/Xoff yada donanimsal el sikisma ozelligi varmis. Is basa dustu. Dokumanina bakiyorum artik.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

OptimusPrime

evet elsıkışma kullanabilirsin ayrıca checksum tarzı bir yöntemde işini görecektir. tabi her halukarda yeniden bir protokol hazırlamak gerekir.

benim başka sorularım olacak.
1.ft232 tampon belleği dolduğunda veya 1bayt aldığında pc tarafında nasıl interrupt yaptırabilirim?
2.ft232 nin usb den çıkarıldığını bir timer nesnesi kullanmadan veya sürekli kontrol etmeden nasıl algılayabilirim?
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

z

Sorularinin cevabini bilmiyorum fakat;

Seri portu kullanan komponentlerden kullandigin takdirde komponent sana bu tur hizmetleri (int vs) saglayacak fonksiyonlari barindiracaktir.

Gelelim benim yeni sorunuma.

FT232 dokumaninda  MPROG diye bir utlity programdan sozediliyor ve bu programin sitelerinde yeraldigini yazmislar.

Bir zamanlar hatirliyorum bu programi calistirdigimizda E2 icindeki bazi verileri degistirebiliyorduk.

Simdi adamlarin sitelerinin altini ustune getirdim bir turlu bu programi bulamiyorum.

Sozkonusu programin linkini yada kendisini gonderebilirmisiniz?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

OptimusPrime

şu günlerde bende ft232 nin ocağına düştüğümden, dün akşam al gülüm ver gülüm şeklinde yaklaşık 16K lık ufak bir data transferini usb üzerinden bir mikroya aktardım. her byte içinde mikrodan bunu aldım diğerine geç şeklinde bir yol izledim. sonuç hüsran. 16K yı mikroya 4.3 dakikada yollayabildim malesef.
iletişim hızı 4800bit/s idi. bunu 230400 yaparak tekrar denedim. hızın 48 katına çıkmasına karşın 16K lık veriyi yollama süresi pekde tatminkar şekilde azalmadı.
bunun sebebinin ft232 yi 1 byte al 1 byte ok bekle şeklinde kullanılmasından kaynaklandığını düşünüyorum. yani ft232 programda ayarlanan hızda veriyi aktarıyor fakat alma ve verme arasında geçiş yaparken gecikiyor. bunu da bu akşam deneyip sonucu yarın yazarım.
tüm bunları neden anlattım?
sanıyorumki z arkadaşında protokolden kaynaklanan bir sorunun var...
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

wsxwsx

ft232 , işini gayet iyi yapıyor. suç sizde  :)  

Mikro, ft232 'den gelen verileri usulunce alıp değerlendirememiş, eli ayağı dolaşmış...

OptimusPrime

başka bir yerde tekrar gelen datanın tümünü kontrol ediyorum. eli ayağı dolaşsa anında anlarım :)
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

wsxwsx

hız  230400 bit/ saniye ise bunu 10a bölelim (startbit, stop bit, ve data 8bit)
FT232 saniyede 23040 bayt göndermiş oluyor. denetleyici bu veriyi aynı hızda alıp bakabiliyor mu?

Önce hiç bir kontrol yapamadan gelen verileri alıp depolayalım. sonra kontrol edelim.

Ancak  pcden gönderirken de hata yapmış olabilirsiniz. nereden nasıl gönderiyoruz?