c# ile ccs c arasında 32 bit yani 4 byte veri yollama ile ilgili destek talebi

Başlatan veliceylan, 31 Mayıs 2015, 17:52:41

veliceylan

Herkeze öncelikle kolay gelsin

bilgisi olandan yardım dileklerimle sorumu sormak istiyorum.

Micro controller olarak 18f4550 kullanmaktayım ccs c pic tarafı c# bilgisayar tarafında yazılım programlarını kullanıyorum istediğim pice 32 bit veriyi yollayıp işlemek bundaki amacım step motor sürmek. Eğer bilgisayardan direk byte byte yollarsam çalışıyor fakat çok yavaş oluyor ben hızlandırmak için atıyorum motorun bir tur atması için 4000 puls gerekse bunu bilgisayardan 4000 i direk yollamak istiyorum ama bilgisayarla pic arasında umng.dll sadece 1 bayt bilgi yolladğından sıkıntı oluyor. pic içinde bytları toplayıp işlem yaptırmak istedim ondada int8 den int 32 ye dönüşümde hata veriyor. bu konuda bilgisi olan varsa yardım beklerim.

veliceylan

Anlaşılan konu çözümsüz bir alanda kaldı. En mantıklısı tıkandığımız yerde mantığı tamamen değiştirmek bu sistemde step motor sürücüsünün puls değerllerini entegreye tanımlayıp bilgisayardan 1 ile 9 arasında bir değer yollayıp gerekli olan puls değerini seçmek daha mantıklı görünüyor şuan gitmesi gereken mesafeyide bilgisayarda hesaplatıp yollamak yerine 8 bit yani 1 baytlık değerler halinde 4 veya 5 işaret yollayıp entegre içinde işlem yaptırmak sorunu çözecektir diye düşünüyorum. sonucuu burada paylaşırım.

ete

Bütün dillerde Byte word çevrimi kolaylıkla yapılıyor. CCSC de yada C+ de de yapılması gerekir. Hiç bir şey yapamazsanız basit matematik yaparak bunu halledebiirsiniz. İşte yolu,
HByte (int olmalı) =4000/256=15
Lbyte=4000-(HByte*256)=160
Böylece karşı tarafa HByte,LByte şeklinde bilgileri yollayıp orada TOP=HByte*256+LByte şeklinde sayıyı yeniden oluşturabilirsiniz.

Ete

veliceylan

ete hocam bir deneyeyim. Birşey soracağım size b step motoru aynı paralel porttan idare edildiği gibi usb den de anlık puls göndermek istedim ama paralel portta dakikada 400 devir (4000*400=1600000 puls/ dakika) yollayabiliyorken 18f4550 ile anca 50-60 devir filan attirabiliyorum oda motorun bir tur için 4000 puls yerine 1800  pulsa göre ayarladığımda. step motor sürme ile ilgili çok araştırdım bir sürü örnek var ama onlar benim çıktığım hıza bile çıkamıyor bu konuda işlemcinin içinde hesaplatmadan sonuca varabilirmiyiz. çünkü micro işlemci aynı anda sensörlerden de veri alıp bilgisayara yolluyor işlemcinin içinde hesaplama yaptığımda sensörleri de işlemcinin içinde kontrol edip motoru durdurmam gerekiyor bu kadar iş (3 step motor + 2 dc motor +3 sensör) microcontrollerin ram ini % 30 civarlarında kullanıyor romunda %35 civarında dahada eklenecekler var .

ete

Mesajımda da belirtmiştim. Her derleyicinin bu tür fonksiyonu mutlaka vardır. Ben basic kullandığım için CCSC den yada C+ dan örnek veremedim. Ama basic de SAYI isimli 16 bitlik bir değişkeniniz var ise SAYI.Byte0 onun 8 bitlik low byte'ını , SAYI.Byte1 ise onun 8 bitlik High Byte değerini verir.  Benzer bir tanımlama CCSC de de olmalı direk bunları hesaplatmadan alabilmelisin.
Help 'inde araştır bence.

Ete

aoe

Alıntı yapılan: veliceylan - 31 Mayıs 2015, 17:52:41
Herkeze öncelikle kolay gelsin

bilgisi olandan yardım dileklerimle sorumu sormak istiyorum.

Micro controller olarak 18f4550 kullanmaktayım ccs c pic tarafı c# bilgisayar tarafında yazılım programlarını kullanıyorum istediğim pice 32 bit veriyi yollayıp işlemek bundaki amacım step motor sürmek. Eğer bilgisayardan direk byte byte yollarsam çalışıyor fakat çok yavaş oluyor ben hızlandırmak için atıyorum motorun bir tur atması için 4000 puls gerekse bunu bilgisayardan 4000 i direk yollamak istiyorum ama bilgisayarla pic arasında umng.dll sadece 1 bayt bilgi yolladğından sıkıntı oluyor. pic içinde bytları toplayıp işlem yaptırmak istedim ondada int8 den int 32 ye dönüşümde hata veriyor. bu konuda bilgisi olan varsa yardım beklerim.
ilk olarak; usbde hid classını kullanırsan 64 byte a kadar veri gönderip alabilirsin. ccs in kendi derleyicisini kullanıyorsan, derleyicinin klasörüne gidip picwizard yardımıyla usb projesi oluşturmak işini kolaylaştırabilir.
ikinci olarak; etehocanın bahsettiği lobyte hibyte konusunuda c de şu şekilde halledebiliriz:

adres okuması yaparak tüm c derleyicilerinde;

int16 i16_test = 0xAABB;
int8 lobyte = *(int8*)&i16_test; //BB /*i16_test değişkeninin adresinden 8 bitlik yani 1 bytelık değer okuduk lobyte değişkenine atadık. bu adreste i16_test değişkenimizin 1. basamağı tutulur.*/
int8 hibyte = *(int8*)(((int16)(&i16_test))+1); //AA
int16 i16_test_tekrar =(int8) lobyte;// i16_test_tekrar değişkeninin 1. basamağına lobyte değişkenini yazdırdık
*(int8*)( ((int16)&i16_test_tekrar) +1) =  hibyte; // i16_test_tekrar değişkeninin 2. basamağına hibyte değişkenini yazdırdık

veya

int16 i16_test  = 0xAABB;
int8 lobyte = (int8)i16_test; // BB
int8 hibyte = (int8)((i16_test >> 8) &0xFF); // AA
int16 i16_test_tekrar = ((hibyte << 8) | lobyte); // AABB

mantığıyla ilerleyebilirsin.

veya ccs c de var olan hazır fonksiyonlardanda yararlanabilirsin;

int16 i16_test  = 0xAABB;
int8 lobyte = make8(i16_test,0); // BB
int8 hibyte = make8(i16_test,1);//AA
int16 i16_test_tekrar = make16(hibyte,lobyte);

iyi çalışmalar.

Powered by EzPortal