Merhaba arkadaşlar. BMP180 basinc sesnorunun datasheetine bakarak. nasil kutuphane yazabiliriz. ve diger sensorlerde kutuphane yazmak istesek hangi methot yontem kullaniliyor. Hic yazmadim bilmiyorum yazi veya video varmi ogrenmek istiyorum.
Normalde sensörün haberleşmesi için protokoller teknik dökümanda anlatılır. Kütüphanelerde bu haberleşmenin gerçekleşmesi için gerekli protokoller gerekli matematiksel hesaplar yapılır. Bunn fonksiyonlar yazılır. Bmp180 için sıfırdan kütüphane yazmaya gerek yoktur. Hazır birçok kütüphane bulabilirsiniz. Bu kütüphaneleri inceleyip mantığını kavramak ve kendi platformunuza uydurmanız daha doğru olur.
Sıfırdan yazmak için neleri öğrenmem gerekli. herhangi bir sensörün kütüphanesini yazmak istesek. video veya belge var mı. örnek bakabileceğimiz
Hangi dili hangi derleyiciyi kullanıyorsun?
CCS C kullanıyorsan kütüphanesinde yüzlerce örnek var. O örneklerdeki kodları ve kodları yazılan malzemelerin datasheetlerini inceleyebilirsin.
Asm kullananların sürekli yaptığı şey aslında tamda bu her program için harici donanıma kütüphane yazmak.ilk önce harici donanımın hangi haberleşme yöntemini kullandığını bilmeli ve ona hakim olmalısın daha sonrasında harici donanımın zorunlu "register,At,gibi" ayarlarını yapacak kadar bilgiyi ürünlerin data sayfasında bulabilirsin onları bir alt program ile yazar ve ana program başlangıcında çağırırsın Pic asm için örnek koyayım aşağıya belki işine yarar
;//////////////////////ADXL345//////// STANDART AYARLAR///////////////////////////
;////////////////////////////////////////////////////////////////////////////////////////////
;
ADXL_BEGIN MACRO ; CSN PORT VE BACAK SEÇİMİ
BANKSEL TRISA
; MOVLW 0X10
; IORWF TRISB ,F
BSF TRISB ,4
BCF TRISB ,6
BCF TRISC ,7
BCF TRISC ,6
MOVLW 0XC0
MOVWF SSPSTAT
BANKSEL SSPCON
MOVLW 0X30
MOVWF SSPCON
BSF CSN
CALL ADXL_PAUS1
BCF CSN
MOVLW 0XFF
MOVWF SSPBUF
CALL ADXL_SEND
CALL ADXL_PAUS100
BSF CSN
CALL ADXL_PAUS1
BCF CSN
MOVLW 0X27
MOVWF SSPBUF
CALL ADXL_SEND
MOVLW 0X00
MOVWF SSPBUF
CALL ADXL_SEND
BSF CSN ;100 HZ DATA ÇIKIŞ HIZI
CALL ADXL_PAUS1 ;DOKUNMA SENSÖRÜ İPTAL
BCF CSN
MOVLW 0X2D
MOVWF SSPBUF ;SÜREKLİ ÖLÇÜM MODU
CALL ADXL_SEND
MOVLW 0X08
MOVWF SSPBUF
CALL ADXL_SEND
BSF CSN
CALL ADXL_PAUS1
BCF CSN
MOVLW 0X31 ;2G ÖLÇÜM. / SAĞA YASLI 10 BİT ÇÖZÜNÜRLÜK/4 KABLO SPİ MODU
MOVWF SSPBUF
CALL ADXL_SEND
MOVLW 0X00
MOVWF SSPBUF
CALL ADXL_SEND
BSF CSN
CALL ADXL_PAUS100
GOTO ADXL_EXT
ADXL_PAUS100:
movlw .186
movwf R0
movlw .4
movwf R1
movlw .2
movwf R2
decfsz R0,F
goto $-1
decfsz R1,F
goto $-3
decfsz R2,F
goto $-5
RETURN
ADXL_PAUS1:
movlw .6
movwf R0
decfsz R0,F
goto $-1
nop
RETURN
ADXL_SEND:
BTFSS PIR1 ,SSPIF
GOTO $-1
BCF PIR1 ,SSPIF
RETURN
ADXL_EXT:
ENDM
;******************************************************************************************
;//////////////////ADXL OKUMA///////////////////////////////////////////////////////
;/////////////////ADXL_READ X,Y,Z
ADXL_READ MACRO ?0,?1,?2
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
BSF CSN
CALL ADXL_PAUS1
BCF CSN
MOVLW 0XB2
MOVWF SSPBUF
CALL ADXL_SEND
MOVLW 0X88
MOVWF SSPBUF
CALL ADXL_SEND
MOVF SSPBUF ,W
MOVWF ?0 ;X
BSF CSN
CALL ADXL_PAUS1
BCF CSN
MOVLW 0XB3
MOVWF SSPBUF
CALL ADXL_SEND
MOVLW 0X88
MOVWF SSPBUF
CALL ADXL_SEND
MOVF SSPBUF ,W
MOVWF ?0+1 ;X+1
;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
BSF CSN
CALL ADXL_PAUS1
BCF CSN
MOVLW 0XB4
MOVWF SSPBUF
CALL ADXL_SEND
MOVLW 0X88 ;DUMMY
MOVWF SSPBUF
CALL ADXL_SEND
MOVF SSPBUF ,W
MOVWF ?1 ;Y
BSF CSN
CALL ADXL_PAUS1
BCF CSN
MOVLW 0XB5
MOVWF SSPBUF
CALL ADXL_SEND
MOVLW 0X88
MOVWF SSPBUF
CALL ADXL_SEND
MOVF SSPBUF ,W
MOVWF ?1+1 ;Y+1
;ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
BSF CSN
CALL ADXL_PAUS1
BCF CSN
MOVLW 0XB6
MOVWF SSPBUF
CALL ADXL_SEND
MOVLW 0X88
MOVWF SSPBUF
CALL ADXL_SEND
MOVF SSPBUF ,W
MOVWF ?2 ;Z
BSF CSN
CALL ADXL_PAUS1
BCF CSN
MOVLW 0XB7
MOVWF SSPBUF
CALL ADXL_SEND
MOVLW 0X88
MOVWF SSPBUF
CALL ADXL_SEND
MOVF SSPBUF ,W
MOVWF ?2+1 ;Z+1
BSF CSN
CALL ADXL_PAUS100
ENDM
kodda SPI ile haberleşen ADXL345 için ayarlar ve okuma makrosu yer alıyor dosyayı .inc dosyası olarak kaydedip ana programa INCLUDE "sensor.INC" olarak eklediğimizde artık ana programda sadece" ADXL_BEGIN"yazdığımızda adxl nin ayarları yapılır.ADXL_READ x,y,z yazdığımızda x,y,z değişkenlerimize okunan veriler yazılır .kütüphane böyle olur.bu diğer diller için de aynı aşağı yukarı donanımın pdf sini okumak anlamak ve ayarlarını yapabilecek kadar iletişim protokolüne hakim olmak zorundasınız.tabi hazır kütüphaneler de çözüm
Tabi birde C cilerin körelmiş pdf okuma paradoksunu aşmaları gerekir. ;) ::op
Nettenden arastirdim. kimse bu konu hakkinda yazi veya video cekmemis. Çok onemli alan diye dusunuyorum. örnek ds18b20 veri tablosuna gore bir kutuphane gerekli. bunu yazmam icin asama asama ilerleme ve yazilan bir örnek bilgi.
04 Ekim 2023, 10:58:27
Hazir kutuphaneler isimize tabiki yariyordur. ama kendimiz neden yazamiyoruz.
Bir ara
@Tagli hocam uğraşmıştı
Eski konular var
https://www.google.com/search?q=k%C3%BCt%C3%BCphane+yazma+picproje+site%3Awww.picproje.org&oq=k&gs_lcrp=EgZjaHJvbWUqBggBEEUYOzIGCAAQRRg8MgYIARBFGDsyBggCEEUYOzIGCAMQRRg8MgYIBBBFGDwyBggFEEUYPTIGCAYQRRg5MgYIBxBFGDsyFggIEAAYgwEYiwMYpgMYqAMYsQMYigUyDQgJEC4YgwEYsQMYigXSAQgxNzcwajFqN6gCALACAA&client=ms-android-meizu&sourceid=chrome-mobile&ie=UTF-8
Prg.bilgim yok ama basit kütüphaneleri ve malzemenin datasheet dosyası incelenerek çözülebilir.
Birde ingilizce ve rusca arama yapın
bunun ayrı bir eğitimi yok da ondan paylaşmıyor kimse birde Arduino, c falan hazır kütüphaneleri çok olduğu için kimse uğraşmıyor.ASM için kütüphane çalışması ben yapıyorum videolar da çekiyorum ama o da belliki işinize yaramayacak. Ama bir programlama dili biliyorsanız kullanacağınız harici ekipmanla iletişimi zaten kütüphane olmadan da sağlayabilmeniz gerekiyor. kütüphane kullanmadan bağlantı yapabilmek için de kullanacağınız harici donanımı mecburen tanımanız gerekiyor .bilgi sayfasında iletişimi nasıl kuracağınız hangi registerlere hangi değerleri vereceğiniz açıkça yazılı oluyor. bence açın pdf dosyasını bir dil biliyorsanız en fazla 1 haftanızı alır ama sonrasında rahat edersiniz.
Merhaba,
Kütüphane nedir bilmem. Bir işi yapacaksam kafamda tasarlar yaparım. Örneğin geçmiş yıllarda MPX57xx basınç sensörünü kullandım. 0-5 volt arası Analog çıkış vermektedir. Hangi basınç değerinde hangi değeri veriyor bilmiyordum. Ben de 0-6 bar arasında çıkan analog değerleri 00-FF arası dijitale çevirip kurduğum düzenekle okudum ve de hangi barda ne göstermem gerektiğinin programını yazdım. Böylece dijital bir manometre ortaya çıkmıştı. Tabiidir ki bayağı bir yazılım ortaya çıktı. Kütüphane dediğiniz bu mudur? videoda displayin ondalık (nokta) ledi yanmamaktadır https://www.youtube.com/shorts/L2-pvJRkWcE
Alıntı yapılan: alikeskinkilic - 04 Ekim 2023, 10:52:09Tabi birde C cilerin körelmiş pdf okuma paradoksunu aşmaları gerekir. ;) ::op
Her "C" ci değildir. 8-)
Alıntı yapılan: mehmet - 04 Ekim 2023, 14:38:00Her "C" ci değildir. 8-)
söylediklerinin %20 diyelim mehmet hocam.aslında kastettiğim her sensöre,mikro işlemciye özel birileri video çekip nasıl reg ayarlarının yapıldığını anlatmazki.işin mantığı bellidir mevcut kütüphane isteklerini karşılamıyor ve kütüphane yazmak istiyorsan.donanımın isterleri bellidir kütüphanenin farklı bir dili yokki programını yazdığın aynı dil ile bir alt program yazmalısın ha bunu üniversal tüm işlemcilerde çalışacak falan gibi birşey yapacaksan dile ve algoritma kurmaya iyi derecede hakimiyet gereklidir farklı osc değerleri için farklı gecikmeler kurmalı falan tatavası çok,asıl önemli olan ise mecburen kullanacağın donanımın nasıl çalıştığını bilmelisin.yoksa başka birinin bildiği karadı ile yetinmeli ve onun kütüphanesini kullanmalısın. tavsiyem üniversal kütüphanelerin birsürü parametreyi if leyerek kontrol etme zorunluluğundan çok yavaş olması yüzünden işlemciye özel kütüphaneyi kendiniz yazmanız
İyi bir kütüphane farklı işlemcilerle kullanılacak şekilde tasarlanmalı. Gene de ben sadece STM32 ile çalıştığım için bir kütüphane arayacak olursam direkt STM32 için olanı bulmaya çalışıyorum. Buglarını kontrol ediyorum, özellikle programımın çakılmasına sebep olacak "while" döngülerine timeout ekliyorum, hardfaulta sebep olabilecek sıkıntılar varsa önlemini alırım, gereksiz delay'lerden kurtulurum. Donanım hazır olmadan okuma/yazmanın sıkıntı çıkaracağı durumların önlemini alırım.
Örneğin i2c kullanan bir sensör için STM32'ye kütüphane yazacak olalım. Kolaya kaçarsak HAL Library için basitçe sadece init fonksiyonuna hangi i2c'yi kullanacağımızı parametre vererek yazabiliriz. Geri kalan her fonksiyonda bu parametreyi kullanırız. Sensör iletişimi nasıl olacaksa komutlar tek tek yanlarında açıklamalarıyla "define" edilir. örneğin kodda 0x07 adresine bir şeyler yolladığınızı veya okuduğumuzu düşünelim, okuyan adam ne olduğunu anlamakta zorlanır, ama yukarıda #define SICAKLIK_REGISTERI 0x07 derseniz kodu okuması da kolaylaşır.
Son olarak fonksiyolara @brief, @param, @return gibi açıklamarı da mutlaka yazmak gerekiyor, 3 ay sonra kendiniz yazdıysanız bile bir şey anlaşılmıyor.
Cok guzel bilgiler. Tesekkurler arkadaslar.
ASM'yi bırakalı çok oldu. Zamanında garip garip şeylerle uğraşmışım demek :)
Konu hakkındaki güncel görüşüm şu: Gömülü sistemlerde işlemci donanımına bağlı şeylerin kütüphanesi yazmak pek mümkün değil. Bu ancak işlemciniz belli ve sabit ise, veya altta STM32 HAL veya Arduino gibi ek bir donanım soyutlama katmanı varsa yapılabilir. Onu da zaten bir yerden diğerine taşıyamazsınız. Yani mesela Arduino için yazılmış MCP4922 DAC çipi kütüphanesi STM32 HAL altyapısı üzerinde çalışmayacak, çünkü SPI'ya erişim tamamen farklı.
Kaldı ki ben artık tüm gömülü sistem projelerimi olay tabanlı düşündüğüm ve inşaa ettiğim için kütüphanelerde alışık olduğumuz fonksiyon çağrısı mantığı işimi görmüyor. Bu tür sistemlerde fonksiyon çağrılarının yerini, bir "olay" (event) oluşturup bunu ilgili state machine'e atmak alıyor.
Bu arada bence üreticiler de sadece kendi işlemcileri için bile her derde deva kütüphane oluşturamıyorlar çünkü tek bir firmanın işlemcileri bile kendi içlerinde aileden aileye epey değişiklik gösterebiliyor. CubeMX gibi sistemlerin çıkmasının sebebi de bu bence: Parametrelere göre kütüphane sentezlemek. Ben sevemedim bir türlü bu tür şeyleri. İşe yararlıkları da tartışılır.
Donanımdan bağımsız şeylerin kütüphanesi olabilir tabi. Örneğin bir JSON string'i içinden belirli bir parametreyi falan çekmek veya CRC hesaplama gibi işler, donanımdan bağımsız fonksiyon çağrıları şeklinde ifade edilebilir.
Alıntı yapılan: Tagli - 04 Ekim 2023, 22:57:15ASM'yi bırakalı çok oldu. Zamanında garip garip şeylerle uğraşmışım demek :)
Konu hakkındaki güncel görüşüm şu: Gömülü sistemlerde işlemci donanımına bağlı şeylerin kütüphanesi yazmak pek mümkün değil. Bu ancak işlemciniz belli ve sabit ise, veya altta STM32 HAL veya Arduino gibi ek bir donanım soyutlama katmanı varsa yapılabilir. Onu da zaten bir yerden diğerine taşıyamazsınız. Yani mesela Arduino için yazılmış MCP4922 DAC çipi kütüphanesi STM32 HAL altyapısı üzerinde çalışmayacak, çünkü SPI'ya erişim tamamen farklı.
Kaldı ki ben artık tüm gömülü sistem projelerimi olay tabanlı düşündüğüm ve inşaa ettiğim için kütüphanelerde alışık olduğumuz fonksiyon çağrısı mantığı işimi görmüyor. Bu tür sistemlerde fonksiyon çağrılarının yerini, bir "olay" (event) oluşturup bunu ilgili state machine'e atmak alıyor.
Bu arada bence üreticiler de sadece kendi işlemcileri için bile her derde deva kütüphane oluşturamıyorlar çünkü tek bir firmanın işlemcileri bile kendi içlerinde aileden aileye epey değişiklik gösterebiliyor. CubeMX gibi sistemlerin çıkmasının sebebi de bu bence: Parametrelere göre kütüphane sentezlemek. Ben sevemedim bir türlü bu tür şeyleri. İşe yararlıkları da tartışılır.
Donanımdan bağımsız şeylerin kütüphanesi olabilir tabi. Örneğin bir JSON string'i içinden belirli bir parametreyi falan çekmek veya CRC hesaplama gibi işler, donanımdan bağımsız fonksiyon çağrıları şeklinde ifade edilebilir.
Bir alanda ilerlemek gerekli ileri seviye olmaliyiz.
Alıntı yapılan: Tagli - 04 Ekim 2023, 22:57:15ASM'yi bırakalı çok oldu. Zamanında garip garip şeylerle uğraşmışım demek :)
Konu hakkındaki güncel görüşüm şu: Gömülü sistemlerde işlemci donanımına bağlı şeylerin kütüphanesi yazmak pek mümkün değil. Bu ancak işlemciniz belli ve sabit ise, veya altta STM32 HAL veya Arduino gibi ek bir donanım soyutlama katmanı varsa yapılabilir. Onu da zaten bir yerden diğerine taşıyamazsınız. Yani mesela Arduino için yazılmış MCP4922 DAC çipi kütüphanesi STM32 HAL altyapısı üzerinde çalışmayacak, çünkü SPI'ya erişim tamamen farklı.
Kaldı ki ben artık tüm gömülü sistem projelerimi olay tabanlı düşündüğüm ve inşaa ettiğim için kütüphanelerde alışık olduğumuz fonksiyon çağrısı mantığı işimi görmüyor. Bu tür sistemlerde fonksiyon çağrılarının yerini, bir "olay" (event) oluşturup bunu ilgili state machine'e atmak alıyor.
Bu arada bence üreticiler de sadece kendi işlemcileri için bile her derde deva kütüphane oluşturamıyorlar çünkü tek bir firmanın işlemcileri bile kendi içlerinde aileden aileye epey değişiklik gösterebiliyor. CubeMX gibi sistemlerin çıkmasının sebebi de bu bence: Parametrelere göre kütüphane sentezlemek. Ben sevemedim bir türlü bu tür şeyleri. İşe yararlıkları da tartışılır.
Donanımdan bağımsız şeylerin kütüphanesi olabilir tabi. Örneğin bir JSON string'i içinden belirli bir parametreyi falan çekmek veya CRC hesaplama gibi işler, donanımdan bağımsız fonksiyon çağrıları şeklinde ifade edilebilir.
Hocam bu kadar karamsar olmanıza gerek yoktu :) donanım bağımsız kütüphane yazma konusunu gömülü sistemlerde ZephyrRTOS çözdü diyebiliriz. Devicetree Overlays ön işlem katmanı sayesinde gerekli donanım makroları üretlip soyutlanmış kütüphane koduna derleme zamanında bağlanabiliyor.
Hiçbir kod değiştirmeden derleme yapabildiğimiz aşağıdaki supported board listesine bir göz atmanızı öneririm.
https://docs.zephyrproject.org/latest/boards/index.html
Zephyr, linux büyük geldiye bunu kullanın mottosuyla birkaç yıl önce çıktı ve çok tutuldu. Resmi olarak üreticilerinde desteğini alıyor.(NXP,Nordic vs.)
Artık işlemciye özel IDE kullanıp, mimariye özel kod yazmayı bırakmak lazım.
Yeni arkadaşlara kütüphane yazmak yerine Makefile gibi bağımsız derleme araçlarını iyice anlayıp öğrenmelerini tavsiye ediyorum.
Merhaba,
Genel bir kütüphane yazımı için yazılacak c fonksiyonları tüm c derleyicilerinde derlenir burada problem platformda dolanımın ve haberleşmenin farklı olmasıdır. Bunun için kütüphane yazarken haberleşme vb. durumlarda bu olayı gerçekleştiren fonksiyonun olay güdümlü çalışması beklenir (interrupt event).
Mikroe firması bunu yapıyor farklı platformları var ve tüm click bordları yazilim fonksiyonları aynı.
peki biz nasıl yapabiliriz ?
Evrensel kütüphaneler yazılırken fonksiyon pointerlardan yararlanılabilinir.
aşağıdaki linkte ads131m serisi 24 bit adc entegresinin kütüphanesine bakacak olursak
https://github.com/MahdaSystem/ADS131
biraz incelersek
typedef struct
ADS131_Handler_s {
void (*ADC_CS_HIGH)(void); // Must be initialized
void (*ADC_CS_LOW)(void); // Must be initialized
void (*ADC_Transmit)(uint8_t Data); // Must be initialized
uint8_t (*ADC_Receive)(void); // Must be initialized
void (*ADC_START_HIGH)(void); // Can be initialized (If you don't want to use software start, the START pin must be pulled down then pass this as NULL)
void (*ADC_START_LOW)(void); // Can be initialized (If you don't want to use software start, the START pin must be pulled down then pass this as NULL)
void (*ADC_RESET_HIGH)(void); // Can be initialized (If you want to use software reset, the RESET pin must be pulled up then pass this as NULL)
void (*ADC_RESET_LOW)(void); // Can be initialized (If you want to use software reset, the RESET pin must be pulled up then pass this as NULL)
uint8_t (*ADC_DRDY_Read)(void); // Can be initialized
void (*ADC_Delay_US)(uint32_t); //! Must be initialized If You do not use Macro Delay (Place here your delay in MicroSecond)
ADS131_OneSample ChannelsData[8]; // !!! DO NOT USE OR EDIT THIS !!!
} ADS131_Handler_t;
ADS131.h header dosyasında yükarıdaki struct tanımlanmış ve içerisinde function pointerlar var. Bunlar bu kütüphanenin donanım ile ilgili bölümlerin
GPIO SPI vb. olay kesmelarini(eventları) oluşturuyor.
kütüphanenin ADC_CS_HIGH bölümününü stm32 ile kullanmak için söyle bir kod yazabiliriz
#include "ADS131.h" // kütüphaneyi import ettim
ADS131_Handler_t myADS131; //kütüphane evetlarını almak için kendime struct oluşturuyorum.
void stm32_ADC_CS_HIGH_func() // stm32 içi cs portunu high yapan fonksiyon tanımlıyorum. diğer IO durumlarını oluşturmadım oluşturdum varsayın.
{
printf("cs_low");
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);
}
void main()
{
myADS131.ADC_CS_HIGH = stm32_ADC_CS_HIGH_func; //stm32 için yazmış olduğum fonksiyonu kendi struck fonksiyon pointer bölümüne kanalize ediyorum.
myADS131.ADC_CS_LOW = .... // diger IO lar vs.
.
.
ADS131_Init(myADS131,...) //şeklinde kendi struck ile parametrelerimi giriyorum.
ADS131_ReadData(myADS131, ...) //şeklinde parametrelerimi girerek ilgili okumalarımı yapıyorum.
}
Görüldüğü üzere kütüphane içeriği ile oynamadan kütüphane header dosyasını kullanarak ve ilgili işlemci ailesi için stm32_ADC_CS_HIGH_func() adında basit bir ara fonksiyonlar ile kütüphaneni benden istemiş olduğu fonksiyonları yazdım. Kütüphane içeriğinde bulunan ADC_Handler->ADC_CS_HIGH() fonksiyonu çağırıldığında artık burada benim stm32_ADC_CS_HIGH_func() fonksiyonum çağırılacak. Örnekte diğer fonksiyonları yazmadım tabi gerçekte yazmak gerek.
Buda arduino, nuvoton, pic vb platromlarda bu fonksiyonları yazabilirsiniz. Geriye kütüphaneyi init etmek ve dataları okumak kalıyor. Basit bir şekilde evrensel bir kütüphane nasıl yazılır anlatmaya çalıştım. Bu yöntem windows ve linux işletim sistemlerinde bolca kullanılmaktadır. C struct yapıları ve fonksiyon pointer(callback function) gibi konulara çalışmak önem arzediyor.
bmp180 örnek kütüphane yazma (https://www.youtube.com/watch?v=wUfSkmA9W9c)
https://youtu.be/DrjkF5n-pqY?si=oPhuGBnWdDuu2Zkm
Arduino için lcd kütüphanesi yazma aşamaları. Adım adım. İncele.
ccs c compiler kullaniyorum ardunio hic kullanmadim.Bilgi icin Tesekkur ederim.