Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

unsigned long veri aktarımı

Başlatan computerboy, 04 Şubat 2013, 17:03:38

computerboy

Merhaba arkadaşlar C18 kullanıyorum. Netten yardım bulurum diye sabahtan beri inceliyorum beynim durdu artık çalışmıyor :) YARDIM.

Bilgisayar programı kod kısmı. (Visual Basic 6.0)
X = 12345678

BufferOut(3) = Int(X / 256)
BufferOut(4) = X - (BufferOut(3) * 256)
BufferOut(5) = Int(X / 256)
BufferOut(6) = X - (BufferOut(5) * 256)



Denemelerim arasında 8 adet rakamı teker teker aldım pic'e gönderdim. pic'e çarptırdım toplattım ama yapamadım. şimdide high byte ve low byte olayına gireyim dedim :) gerçi tam anlamıyla kavrayamadım olayı.


Pic kod kısmı. (C 18)

typedef enum
{
    TEST		   		= 'T',
    START				= 'S',
    ABOUT				= 'A',
    CUT				= 'C'
};

typedef union 
{	
	unsigned long kordinat;
	BYTE _byte[4];
}data;

/** S T R U C T U R E S ******************************************************/
typedef union DataPaket
{
    BYTE _byte[24];  
    struct
    {
        BYTE mod_select;	//1 Byte
      	BYTE x_mod;		 	//1 Byte
        data x_step;	 	//4 Byte
      	BYTE y_mod;		 	//1 Byte
        data y_step;	 	//4 Byte
      	BYTE z_mod;		 	//1 Byte
        data z_step;	 	//4 Byte
      	data step_delay;	//4 Byte
        data end_delay;	 	//4 Byte
    }kordinat;
} DataPaket;


#pragma udata
#pragma udata USB_VARIABLES=0x500


DataPaket usbdatapaket;


//----------------------------------------------------------

	switch(usbdatapaket.kordinat.mod_select)
		{	

char        x_m;
unsigned long	x_s;

//-------------------------------------------------------------------------------------------------------------
            case CUT:
            {

	x_s = atol(usbdatapaket.kordinat.x_step.kordinat);


burada x_s 4 byte long veri olması gerekmiyormu nasıl yaparım. çok çeşitli yöntemler denedim denemediğim bi kendim kaldım :)

iyildirim

vb6 kısmında long sayıyı bellekte durduğu gibi 4 byte şeklinde göndermeye çalışıyorsunuz sanırım. Ama gelen bilgi decimal string olmadığı halde C18 de atol ile bunu tekrar sayısal değere çevirmeye çalışıyorsunuz.

Ya C18 de atol kullanıp VB6'da  trim(x)  ile string değer elde edip bu stringi gönderin, ama bu durumda gelen bilginin uzunluğunun sayısal değerine bağlı olacağını da dikkate almak gerek..

Yada C18 de gelen değeri olduğu gibi kullanın.  x_s = usbdatapaket.kordinat.x_step.kordinat;..
Bu şekilde yapacaksanız VB6 da ki kodda da hata var. Sırasıyla 2^24, 2^16, 2^8 'e bölmelisiniz. Birde C18 little-endian olduğu için hesaplanan en son değer dizide  3 elemana, 2^24 ün sonucu ise 6 elemana yerleşmeli..

Hayırdır cnc kontroller gibi birşeyle mi uğraşıyorsun..  :)


computerboy

#2
Cevabınız için teşekkür ederim.

İşlerimden vakit bulduğum sürece yarım kalan hobby cnc kontroler kartı üzerinde çalışıyorum.

hocam bölme olayını anlayamadım örnekle açıklayabilirmisiniz.

Mesela 

x = 12345678

bu rakamı dört parçaya ayrıp her ayırdığım parçayı sırasıyla 8,16,24 böleyim ve decimal değer olarakmı göndereyim. önceki denemelerimde decimal değer olarakta göndermiştim ama bölme yapmamıştım.

iyildirim

X in değerini C18 de atol kullanmadan direkt olarak kullanabilmek için
X = 12345678
BufferOut(6) = Int(X / 2^24)
X = X - BufferOut(6) * 2^24

BufferOut(5) = int(X / 2 ^ 16)
X = X - BufferOut(5) * 2^16

BufferOut(4) = Int(X / 2^8)
BufferOut(3) = X - BufferOut(4) * 2^8

veya
dim sTmp as string 
sTmp = right("00000000"& hex(x))
BufferOut(6) = chr(val("&h" & mid(sTmp , 1,2)))
BufferOut(5) = chr(val("&h" & mid(sTmp , 3,2)))
BufferOut(4) = chr(val("&h" & mid(sTmp , 5,2)))
BufferOut(3) = chr(val("&h" & mid(sTmp , 7,2)))

şeklinde bir kod kullanabilirsin.  BufferOut dizisinin 3-6 elemanları C18 in istediği şekilde long veri tipine uygun veriyi içeriyor olacak.

Öte yandan string iletişim yapmak bana daha sağlıklı geliyor. henüz tanımlamadığın komutları ileride eklemek daha kolay olur. Direkt g-code  gönderebilirsin gibi avantajları olur.  Ayrıca decimal string göndermek iletişim açısından daha sağlıklı da olabilir. Örneğin max 8 digit olacaksa başına sıfır ekleyip 8'e tamamlayıp göndermek C18 de struct kullanmanı sağlar, parse etmeni kolaylaştırır. Bu durumda union data gereksiz ve decimal string atol kullanarak sayısal değere çevrilecek.

Bu kontroller kartı motor da sürüyormu, yoksa sadece indexer mi?. Zamanında bende uğraşmıştım. Keyifli iş..

computerboy

#4
Teşekkürler anladım üstad en kısa zamanda deneyeceğim. Şimdilik sadece indexer kartı. vakit bulursam A4988 entegresi ile tasarım yapacağım.

ayrıca sitring iletişim banada daha mantıklı geliyor C18 de gelen veriyi struct ile ayrıştırıp direk atol komutunu kullanarak okuyabilirmiyim. birde chr(val("&h" & mid(sTmp , 1,2))) burdaki &h hex kodunun başına 0 koymak içinmi çözemedim mantığı nedir bu işin biraz anlatabilirsen çok menun kalırım.

iyildirim

Alıntı yapılan: computerboy - 05 Şubat 2013, 11:01:54

ayrıca sitring iletişim banada daha mantıklı geliyor C18 de gelen veriyi struct ile ayrıştırıp direk atol komutunu kullanarak okuyabilirmiyim. birde chr(val("&h" & mid(sTmp , 1,2))) burdaki &h hex kodunun başına 0 koymak içinmi çözemedim mantığı nedir bu işin biraz anlatabilirsen çok menun kalırım.

"&h"  string değişkenin sayısal değere çevirirken stringin içerdiği verinin hex olduğunu belrtmek için gerekli.
sTmp içeriği "1234AABB"  olsun. mid(sTmp , 1,2))) ile elde edeceğimiz "12" değeri.  Bunun val() ile alınan sayısal karşılığı normalde 12. Başına "&h" ekleyince "&h12" nin sayısal karşılığı ise 18. 

Ama iletişimi tamamen string yapacaksan zaten bu şekilde kullanmayacaksın. 
Sayısal değerleri stringe çevirip C18 deki struct yapısında tanımlanmış uzunluğa eşit olacak şekilde başına "0" ekleyip gönderebilirsin.
sTmp = right("00000000"& trim(x),8) gibi.. Bu şekilde başında 0 olan, sayısal bilgiyi içeren sabit 8 karakter uzunluğunda string elde ederiz.

Gelen veri uzunluğu bu şekilde sabitlenirse unıon-struct yapısında direkt olarak ayrıştırılabilir.
C18 de struct yapısında sayısal bilgi içeren bu string değerlerin uzunluğu PC den gelecek veriye uygun tanımlanmalı.
Struct ile , struct'ın toplam uzunluğu kadar char array union ile tanımlandığında gelen bilgiyi char arraya atıp struct dan parse edilmiş bilgiyi okuyabilirsin. İletişim tamamen string olacaksa sayısal değeri elde etmen için atoi, atol vs. kullanman gerekecek.
Örnek kodlarda üretildiği gibi sayısal veriyi C18 belleğinde durduğu gibi gönderirsen atol gerekmeden direkt kullanılabilir. Hız açısından daha avantajlı olur.

computerboy

#6
Üstad çok teşekkür ederim. bu bilgileri sizin anlattığınız şekilde örneklendiren bir kitap varmı acaba yada sora, sora bizmi keşfedeceğiz. ilk deneme kodlarını paylaşıyorum decimal olarak denedim string olarak denemeyi vakit bulunca yapacağım gayet sağlıklı çalışıyor.

Visual Basic kodları.
Public Sub BufferGönder(ByVal Command As String, ByVal XMode As String, ByVal X As Long, _
ByVal YMode As String, ByVal Y As Long, ByVal ZMode As String, ByVal Z As Long, _
ByVal SD As Long, ByVal ED As Long)

X = Right("00000000" + Trim(Val(X)), 8)
Y = Right("00000000" + Trim(Val(Y)), 8)
Z = Right("00000000" + Trim(Val(Z)), 8)
SD = Right("00000000" + Trim(Val(SD)), 8)
ED = Right("00000000" + Trim(Val(ED)), 8)

On Error GoTo Hata
'------------------------------------------------------ Komut
BufferOut(1) = Asc(Command)
'------------------------------------------------------ XMod
BufferOut(2) = Asc(XMode)
'------------------------------------------------------ XKordinat Bilgisi
BufferOut(6) = Int(X / 2 ^ 24)
X = X - BufferOut(6) * 2 ^ 24

BufferOut(5) = Int(X / 2 ^ 16)
X = X - BufferOut(5) * 2 ^ 16

BufferOut(4) = Int(X / 2 ^ 8)
BufferOut(3) = X - BufferOut(4) * 2 ^ 8

'------------------------------------------------------ YMod
BufferOut(7) = Asc(YMode)
'------------------------------------------------------ YKordinat Bilgisi
BufferOut(11) = Int(Y / 2 ^ 24)
Y = Y - BufferOut(11) * 2 ^ 24

BufferOut(10) = Int(Y / 2 ^ 16)
Y = Y - BufferOut(10) * 2 ^ 16

BufferOut(9) = Int(Y / 2 ^ 8)
BufferOut(8) = Y - BufferOut(9) * 2 ^ 8
'------------------------------------------------------ ZMod
BufferOut(12) = Asc(ZMode)
'------------------------------------------------------ ZKordinat Bilgisi
BufferOut(16) = Int(Z / 2 ^ 24)
Z = Z - BufferOut(16) * 2 ^ 24

BufferOut(15) = Int(Z / 2 ^ 16)
Z = Z - BufferOut(15) * 2 ^ 16

BufferOut(14) = Int(Z / 2 ^ 8)
BufferOut(13) = Z - BufferOut(14) * 2 ^ 8
'------------------------------------------------------ Step Delay Bilgisi
BufferOut(20) = Int(SD / 2 ^ 24)
SD = SD - BufferOut(20) * 2 ^ 24

BufferOut(19) = Int(SD / 2 ^ 16)
SD = SD - BufferOut(19) * 2 ^ 16

BufferOut(18) = Int(SD / 2 ^ 8)
BufferOut(17) = SD - BufferOut(18) * 2 ^ 8
'------------------------------------------------------ End Delay Bilgisi
BufferOut(24) = Int(ED / 2 ^ 24)
ED = ED - BufferOut(24) * 2 ^ 24

BufferOut(23) = Int(ED / 2 ^ 16)
ED = ED - BufferOut(23) * 2 ^ 16

BufferOut(22) = Int(ED / 2 ^ 8)
BufferOut(21) = ED - BufferOut(22) * 2 ^ 8

hidWriteEx VendorID, ProductID, BufferOut(0)
Hata:
If Err = 6 Then MsgBox "Lütfen 'SCALE' ayarını küçültünüz.", vbCritical, "HATA!"
Debug.Print "Error: " & Err & " # " & Error(Err)
End Sub


C18
switch(usbdatapaket.kordinat.mod_select)
		{	

char    		x_m;
unsigned long	x_s;
char    		y_m;
unsigned long	y_s;
char    		z_m;
unsigned long	z_s;

unsigned long	s_d;
unsigned long	e_d;
//-------------------------------------------------------------------------------------------------------------
            case CUT:
            {

			x_m = usbdatapaket.kordinat.x_mod;
			x_s=usbdatapaket.kordinat.x_step.kordinat;

			y_m = usbdatapaket.kordinat.y_mod;
			y_s=usbdatapaket.kordinat.y_step.kordinat;

			z_m = usbdatapaket.kordinat.z_mod;
			z_s=usbdatapaket.kordinat.z_step.kordinat;

			s_d=usbdatapaket.kordinat.step_delay.kordinat*20;
			e_d=usbdatapaket.kordinat.end_delay.kordinat;
			
			line3d(s_d, e_d, 0, 0, 0, x_m|x_s, y_m|y_s, z_m|z_s); 
			//stepdelay, enddelay, x1, y1, z1,  to   x2, y2, z2 
			
			mLED_2_Toggle();

				UsbVeriGonder((rom char*)"*");
			
                if(!HIDTxHandleBusy(USBInHandle))
                {
                    USBInHandle = HIDTxPacket(HID_EP,(BYTE*)&ToSendDataBuffer[0],64);
             	}
				break;
			}

computerboy

#7
Üstad bişey daha soracağım 12345678 şeklinde long veriyi gönderiyorum sorun yok. 12345678, in hex karşılığı 00BC614E  olarak picde görebiliyorum ben eksi değerde göndermek istiyorum mesela (-12345678) gibi. bunun hex değeride FF439EB2 picde bu değeri göremiyorum. rakamların başına eksi koyduğum halde (-) işaretini sıfırlıyor ve normal 12345678 long verisini gönderiyor bu sorunu nasıl aşarım.

unutmadan picdeki tanımlamaları signed long ve sadece long olarakta denedim. visual basic yazılımı ile hallolacak ama nasıl

iyildirim

Yazacaktım ama araya bi şeyler girdi..
long değeri stringe çevirip tekrar  long yapan bu kısım gereksiz.
X = Right("00000000" + Trim(Val(X)) 
Y = Right("00000000" + Trim(Val(Y))
Z = Right("00000000" + Trim(Val(Z))
SD = Right("00000000" + Trim(Val(SD))
ED = Right("00000000" + Trim(Val(ED))


Alıntı yapılan: computerboy - 07 Şubat 2013, 15:50:13
Üstad bişey daha soracağım 12345678 şeklinde long veriyi gönderiyorum sorun yok. 12345678,2 in hex karşılığı 00BC614E  olarak picde görebiliyorum ben eksi değerde göndermek istiyorum mesela (-12345678) gibi. bunun hex değeride FF439EB2 eksi koyduğumda picde bu değeri göremiyorum. rakamların başına eksi koyduğum halde (-) işaretini sıfırlıyor ve normal 12345678 long verisini gönderiyor bu sorunu nasıl aşarım.

BufferOut(6) = Int(X / 2 ^ 24) 
X = X - BufferOut(6) * 2 ^ 24 
BufferOut(5) = Int(X / 2 ^ 16) 
X = X - BufferOut(5) * 2 ^ 16 
BufferOut(4) = Int(X / 2 ^ 
BufferOut(3) = X - BufferOut(4) * 2 ^ 8

yerine aşağıdaki şekilde kullanabilirsin,
dim sTmp as string 
sTmp = right("00000000"& hex(x)) 
BufferOut(6) = chr(val("&h" & mid(sTmp , 1,2))) 
BufferOut(5) = chr(val("&h" & mid(sTmp , 3,2))) 
BufferOut(4) = chr(val("&h" & mid(sTmp , 5,2))) 
BufferOut(3) = chr(val("&h" & mid(sTmp , 7,2)))


PC tarafı şöyle olacak.
Public Sub BufferGönder(ByVal Command As String, ByVal XMode As String, ByVal X As Long, _
ByVal YMode As String, ByVal Y As Long, ByVal ZMode As String, ByVal Z As Long, _
ByVal SD As Long, ByVal ED As Long)

dim sTmp as string 


On Error GoTo Hata
'------------------------------------------------------ Komut
BufferOut(1) = Asc(Command)
'------------------------------------------------------ XMod
BufferOut(2) = Asc(XMode)
'------------------------------------------------------ XKordinat Bilgisi
sTmp = right("00000000"& hex(X))
BufferOut(3) = chr(val("&h" & mid(sTmp , 7,2)))
BufferOut(4) = chr(val("&h" & mid(sTmp , 5,2)))
BufferOut(5) = chr(val("&h" & mid(sTmp , 3,2)))
BufferOut(6) = chr(val("&h" & mid(sTmp , 1,2)))
'------------------------------------------------------ YMod
BufferOut(7) = Asc(YMode)
'------------------------------------------------------ YKordinat Bilgisi
sTmp = right("00000000"& hex(Y))
BufferOut( = chr(val("&h" & mid(sTmp , 7,2)))
BufferOut(9) = chr(val("&h" & mid(sTmp , 5,2)))
BufferOut(10) = chr(val("&h" & mid(sTmp , 3,2)))
BufferOut(11) = chr(val("&h" & mid(sTmp , 1,2)))
'------------------------------------------------------ ZMod
BufferOut(12) = Asc(ZMode)
'------------------------------------------------------ ZKordinat Bilgisi
sTmp = right("00000000"& hex(Z))
BufferOut(13) = chr(val("&h" & mid(sTmp , 7,2)))
BufferOut(14) = chr(val("&h" & mid(sTmp , 5,2)))
BufferOut(15) = chr(val("&h" & mid(sTmp , 3,2)))
BufferOut(16) = chr(val("&h" & mid(sTmp , 1,2)))
'------------------------------------------------------ Step Delay Bilgisi
sTmp = right("00000000"& hex(SD))
BufferOut(17) = chr(val("&h" & mid(sTmp , 7,2)))
BufferOut(18) = chr(val("&h" & mid(sTmp , 5,2)))
BufferOut(19) = chr(val("&h" & mid(sTmp , 3,2)))
BufferOut(20) = chr(val("&h" & mid(sTmp , 1,2)))
'------------------------------------------------------ End Delay Bilgisi
sTmp = right("00000000"& hex(ED))
BufferOut(21) = chr(val("&h" & mid(sTmp , 7,2)))
BufferOut(22) = chr(val("&h" & mid(sTmp , 5,2)))
BufferOut(23) = chr(val("&h" & mid(sTmp , 3,2)))
BufferOut(24) = chr(val("&h" & mid(sTmp , 1,2)))


hidWriteEx VendorID, ProductID, BufferOut(0)
Hata:
If Err = 6 Then MsgBox "Lütfen 'SCALE' ayarını küçültünüz.", vbCritical, "HATA!"
Debug.Print "Error: " & Err & " # " & Error(Err)
End Sub

Takrarlayan kısımları ayrı bir func vs. de yapabilirsin..

computerboy

chr bende hata veriyor hocam. visual basic 6.0 kurulu ama asc kabül ediyor. str' de hata veriyor.

iyildirim

hata verdiği değer ne ?
Yoksa hiç mi derlenmiyor


computerboy

bu kodda debug hatası veriyor hocam.

BufferOut(6) = chr(val("&h" & mid(sTmp , 1,2)))

ayrıca right komutu ,8 atmadığımız sürece çalışmıyor.

sTmp = Right("00000000" & Str(X), 8)


iyildirim

8 konusunda haklısın. kodu direkt burda yazınca gözümden kaçmış.
Ama sTmp = Right("00000000" & Str(X),   8 )  satırında str yazan yerde hex olmalı.. sTmp = Right("00000000" & HEX(X),   8 )  gibi..
chr kısmında hata vermesinin nedeni Bufferout un byte array olmasından kaynaklı olabilir. Eğer string e atayacaksan chr olmalı.. Byte ,int vs. sayısal değişkene atayacaksan chr olmamalı..

Son Hali.. Bu sefer denedim..
Public Sub BufferGönder(ByVal Command As String, ByVal XMode As String, ByVal X As Long, _
ByVal YMode As String, ByVal Y As Long, ByVal ZMode As String, ByVal Z As Long, _
ByVal SD As Long, ByVal ED As Long)

Dim sTmp As String
'Dim BufferOut(30) As Byte

On Error GoTo Hata
'On Error GoTo 0
'------------------------------------------------------ Komut
BufferOut(1) = Asc(Command)
'------------------------------------------------------ XMod
BufferOut(2) = Asc(XMode)
'------------------------------------------------------ XKordinat Bilgisi
sTmp = Right("00000000" & Hex(X),

BufferOut(3) = Val("&h" & Mid(sTmp, 7, 2))
BufferOut(4) = Val("&h" & Mid(sTmp, 5, 2))
BufferOut(5) = Val("&h" & Mid(sTmp, 3, 2))
BufferOut(6) = Val("&h" & Mid(sTmp, 1, 2))
'------------------------------------------------------ YMod
BufferOut(7) = Asc(YMode)
'------------------------------------------------------ YKordinat Bilgisi
sTmp = Right("00000000" & Hex(Y),
BufferOut( = Val("&h" & Mid(sTmp, 7, 2))
BufferOut(9) = Val("&h" & Mid(sTmp, 5, 2))
BufferOut(10) = Val("&h" & Mid(sTmp, 3, 2))
BufferOut(11) = Val("&h" & Mid(sTmp, 1, 2))
'------------------------------------------------------ ZMod
BufferOut(12) = Asc(ZMode)
'------------------------------------------------------ ZKordinat Bilgisi
sTmp = Right("00000000" & Hex(Z),
BufferOut(13) = Val("&h" & Mid(sTmp, 7, 2))
BufferOut(14) = Val("&h" & Mid(sTmp, 5, 2))
BufferOut(15) = Val("&h" & Mid(sTmp, 3, 2))
BufferOut(16) = Val("&h" & Mid(sTmp, 1, 2))
'------------------------------------------------------ Step Delay Bilgisi
sTmp = Right("00000000" & Hex(SD),
BufferOut(17) = Val("&h" & Mid(sTmp, 7, 2))
BufferOut(18) = Val("&h" & Mid(sTmp, 5, 2))
BufferOut(19) = Val("&h" & Mid(sTmp, 3, 2))
BufferOut(20) = Val("&h" & Mid(sTmp, 1, 2))
'------------------------------------------------------ End Delay Bilgisi
sTmp = Right("00000000" & Hex(ED),
BufferOut(21) = Val("&h" & Mid(sTmp, 7, 2))
BufferOut(22) = Val("&h" & Mid(sTmp, 5, 2))
BufferOut(23) = Val("&h" & Mid(sTmp, 3, 2))
BufferOut(24) = Val("&h" & Mid(sTmp, 1, 2))


hidWriteEx VendorID, ProductID, BufferOut(0)

Exit Sub ' burada fonksiyondan çıkılmalı. yoksa hata satırı normalde de çalışacak 

Hata:
If Err = 6 Then MsgBox "Lütfen 'SCALE' ayarını küçültünüz.", vbCritical, "HATA!"
Debug.Print "Error: " & Err & " # " & Error(Err)

End Sub

computerboy

Teşekkürler üstad. kodların üzerinde çalıştıkça anlıyorum. sıra geldi bresenham kısmına