C18 değişken tanımlama ve fonksiyon yazma

Başlatan computerboy, 14 Aralık 2011, 14:40:15

computerboy

S.A Merhaba arkadaşlar;

void UsbVeriGonder(rom char *Veri)
{
int i;i=0;

     do
     {
     ToSendDataBuffer[i++] = (*Veri);
     }while(*Veri++);

                      if(!HIDTxHandleBusy(USBInHandle))
                  {
                     ADCON0bits.GO = 1;             
                      while(ADCON0bits.NOT_DONE);   
                           USBInHandle = HIDTxPacket(HID_EP,(BYTE*)&ToSendDataBuffer[0],64);
                         }               

}

Arkadaşlar C18 de fonksiyon yazmaya çalışıyorum usb üzerinden veri göndermek için yukarıdaki fonksiyonu yazdım sorunsuz veri gönderebiliyorum.
aşağıdaki kodda ise gelen veriyi buffer1 - buffer2 - buffer3 ..... şeklinde alıp if ile kontrol ediyorum ama benim istediğim gelen veriyi bir değişkene aktarıp
GelenVeri == "A1"; şeklinde kontrol ettirmek nasıl yaparım ? Yardımlarınız için teşekkür ederim.
            
if(ReceivedDataBuffer[0] == 'A' , ReceivedDataBuffer[1] == '1')
{
mLED_2_On();
UsbVeriGonder((rom char*)"Led-2 On!");
}
if(ReceivedDataBuffer[0] == 'A' , ReceivedDataBuffer[1] == '0')
{
mLED_2_Off();
UsbVeriGonder((rom char*)"Led-2 Off!");
}



justice_for_all

#1
typedef union _val
{
	unsigned int word;
	unsigned char byte[2];
}val;


val gelen_data[32];


if(gelen_data[0].word == "A1")
{



}
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

computerboy

#2
typedef union _val
{
    unsigned int word;
    unsigned char byte[2];
    byte[0] = ReceivedDataBuffer[0]; 
    byte[1] = ReceivedDataBuffer[1]; 

}
val;
				val GelenVeri[32];

				
				if(GelenVeri[0].word == "A")


nasıl adapte ederim hocam çözemedim.

GelenVeri[0].word = ReceivedDataBuffer[0] + ReceivedDataBuffer[1];
            
            if(GelenVeri.word = 'A')

değişik tarzlarda deniyorum hocam dene yanılma yöntemi :)

justice_for_all

unionun icinde oyle atama yapamazsini bana usbden data gelme kodunu yazarmisiniz yani usbden datalari alma kod satirini.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

computerboy

Teşekkürler hocam veri alma kısmı hallettim. püf noktası usb veri tanımlama satırında gelen datayı direk paket halinde aktarmak gerekiyormuş.

#pragma udata
#pragma udata USB_VARIABLES=0x500

//DATA_PACKET INPacket;
DATA_PACKET Veri;

//unsigned char ReceivedDataBuffer[64];
unsigned char ToSendDataBuffer[64];
#pragma udata

justice_for_all

benim programdaki gibi kullandiniz degilmi hocam ?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

computerboy

evet hocam çok sağolun. birde takıldığım nokta

sprintf ile glcd ekrana gelen kordinatı basmak istiyorum ama başaramadım kodum şöyle.

char    x_m;
unsigned char StringVeri[3];

x_m = 12351;  //Veri.kordinat.x_mod;
sprintf(StringVeri,x_m);
glcd_SetPos(0,42);
glcd_PutMessage((rom char*)StringVeri);


justice_for_all

#7
hocam glcd ile hic calismadim ama
unsigned char StringVeri[3];

su kodu

rom  char StringVeri[3];

diye yapip denermisiniz bide.

simdi su sekilde kullanabiliyomusunuz kodu

if(gelen_data[0].word == "A1")
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

haydarpasamikro

char    x_m;
unsigned char StringVeri[3];

x_m = 12351;  //Veri.kordinat.x_mod;
sprintf(StringVeri,x_m);
glcd_SetPos(0,42);
glcd_PutMessage((rom char*)StringVeri);

1) x_m karakter tipinde tanımlanmış. Ancak integer büyüklüğünde değer yüklenmiş.
2) glcd ye gönderilen mesajda verinin tip dönüşümü rom adreste tanımlanmış. bu işlem sadece design time da rom belleğe yüklenen karakter dizisinin adrsini göstermek için kullanılır. bu sebeple tip rom olmamalı.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

computerboy

if(gelen_data[0].word == "A1")

üstad bu şekilde deneme yapmadım tek harf alacak şekilde modifiye ettim kodu.

hocam bu şekildemi olması lazım anlayamadım nasıl yapacağımı interneti alt üst ettim kafa zor basıyor belli bir yaştan sonra

switch(Veri.kordinat.mod_select){

long x_m;
rom char* StringVeri[3];

case KES:

x_m = 200;  //Veri.kordinat.x_mod;
sprintf(StringVeri,"X = %d;",x_m);
glcd_ClearScreen();
glcd_SetPos(0,42);
glcd_PutMessage((rom char*)StringVeri);

//UsbVeriGonder((rom char*)OutString);
break;

} //stitch son

unutmadan glcd kütüphanesinde rom char olarak tanımlama yapılmış kütüphaneyimi modifiye etmeme lazım ayrıca.

justice_for_all

Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

computerboy

üstad long olarak tanımladım sonrada x_m = 423; atama yaptım ama anladığım kadarı ile benim lcd kütüphanesi rom char olduğu için göstermiyor nasıl çözerim kavrayamadım C dilini öğreniyorum yavaş yavaş araştırmaya devam.

long x_m;
far rom char* StringVeri[3];

case KES:

x_m = 423; 
sprintf(StringVeri,x_m);
glcd_ClearScreen();
glcd_SetPos(0,42);
glcd_PutMessage((rom char*)StringVeri);


justice_for_all

hocam sunu soruyorum

DATA_PACKET Veri; su sekilde degisken tanimlamissiniz burda data packet in yapisini soruyorum onu gorme imkanim olursa yukarida sordugunuz soruyu yanitlayabilirim.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

computerboy

sizin kodu modifiye ettim sadece hocam.


typedef enum
{
    TEST            = 'T',
    START            = 'S',
    KES            = 'K',
    ABOUT            = 'A'
   
}TYPE_CMD;

typedef union
{
    unsigned int word;
    unsigned char byte[2];
}data;


/** S T R U C T U R E S ******************************************************/
typedef union DATA_PACKET
{
    BYTE _byte[13]; 
    WORD _word[13/2];
   
    struct
    {
        BYTE mod_select;
      BYTE x_mod;
        data x_step;
      BYTE y_mod;
        data y_step;
      BYTE z_mod;
        data z_step;
        data step_delay;
      data end_delay;
    }kordinat;
} DATA_PACKET;


#pragma udata
#pragma udata USB_VARIABLES=0x500

//DATA_PACKET INPacket;
DATA_PACKET Veri;

//unsigned char ReceivedDataBuffer[64];
BYTE ToSendDataBuffer[64];
#pragma udata

justice_for_all

hocam yukaridaki switch case calismasi gerek bence once data alisverisini dogru duzgun calistirdiktan sonra lcdye gecin..
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay