Picproje Elektronik Sitesi

DERLEYİCİLER => Microchip MPLAB C serisi => Microchip C18 => Konuyu başlatan: computerboy - 14 Aralık 2011, 14:40:15

Başlık: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 14 Aralık 2011, 14:40:15
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!");
}


Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: justice_for_all - 14 Aralık 2011, 15:14:43
typedef union _val
{
unsigned int word;
unsigned char byte[2];
}val;


val gelen_data[32];


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



}

Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 14 Aralık 2011, 16:08:13
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 :)
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: justice_for_all - 14 Aralık 2011, 16:19:09
unionun icinde oyle atama yapamazsini bana usbden data gelme kodunu yazarmisiniz yani usbden datalari alma kod satirini.
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 23 Aralık 2011, 13:44:17
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
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: justice_for_all - 23 Aralık 2011, 15:08:29
benim programdaki gibi kullandiniz degilmi hocam ?
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 23 Aralık 2011, 17:06:33
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);

Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: justice_for_all - 23 Aralık 2011, 17:09:41
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")
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: haydarpasamikro - 23 Aralık 2011, 18:59:38
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ı.
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 23 Aralık 2011, 19:51:53
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.
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: justice_for_all - 23 Aralık 2011, 20:38:23
hocam veri nasil bir degisken?
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 23 Aralık 2011, 20:49:14
ü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);

Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: justice_for_all - 23 Aralık 2011, 20:54:07
hocam sunu soruyorum

DATA_PACKET Veri; su sekilde degisken tanimlamissiniz burda data packet in yapisini soruyorum onu gorme imkanim olursa yukarida sordugunuz soruyu yanitlayabilirim.
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 23 Aralık 2011, 20:58:10
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
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: justice_for_all - 23 Aralık 2011, 21:02:30
hocam yukaridaki switch case calismasi gerek bence once data alisverisini dogru duzgun calistirdiktan sonra lcdye gecin..
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 23 Aralık 2011, 21:25:57
switch case çalışıyor zaten hocam "K" komutu gelince case KES: kısmını işliyor. GLCD görmek istememin sebebide zaten kordinat datası doğru gelmişmi gelmemişmi ona bakacağım.
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: justice_for_all - 23 Aralık 2011, 21:30:29
hocam calistigini ne ile kontrol ediyosunuz?
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 23 Aralık 2011, 21:46:47
Hocam kendi tasarladığım devre üzerinde test ediyorum, usb arayüz programı ile sorunsuz bağlanıp veri gönderebiliyorum. ah basic gibi C yide kullanabilsem ama öğrenecem inatlaştım :)
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: justice_for_all - 23 Aralık 2011, 21:49:04
yani similasyondami test ediyosunuz yoksa devreyi yaptinizmi?
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 23 Aralık 2011, 22:05:45
evet hocam gerçek devre üzerinde test ediyorum. burdaki devre

http://www.sahibinden.com/ilan/alisveris-elektronik-devre-montaj-pic-18f4550-usb-gelistirme-karti-cnc-43353137/detay/
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: justice_for_all - 23 Aralık 2011, 22:13:26
hocam lcd pinlerini devrenize gore modifiye ettiniz dimi?
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 23 Aralık 2011, 22:25:10
tabiki hocam lcd ekranda istediğim veriyi yazdırıyorum.  ama usbden gelen verileri yada kodda tanımladığım değişkenleri yazdıramıyorum.
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: justice_for_all - 23 Aralık 2011, 22:33:22
hocam o zaman usb alisverisinde datalarla ilgili bir problem olabilir..
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 23 Aralık 2011, 22:37:41
yok hocam onda sıkıntı olsa if yada switchle yaptığım kontrolde başarılı olamaz. mesela usb üzerinden char olark K verisini birinci buffer ile gönderiyorum K verisi gelince işlem yapmaya yada lcd ekranda komut geldi şeklinde yazdırabiliyorum. benim istediğim sprintf ile değişkene atadığım veriyi glcd'de göstermek.
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: justice_for_all - 23 Aralık 2011, 22:40:04
sprintf(StringVeri,x_m); bu satirmi calismiyor hocam?
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 23 Aralık 2011, 22:44:50
aynen hocam örnek x_m atadığım veriyi sprintf ile glcd'de göstermeye uğraşıyorum ama yapamadım onun sebebide glcd için yazılan kütüphanenin rom char olarak ayarlanması nasıl yaparım anlayamadım.
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: justice_for_all - 23 Aralık 2011, 22:52:11
sprintf nasil calisiyor hocam?
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 23 Aralık 2011, 22:56:03
derlemeyi yapıyor ancak grafik lcd de sprintf ile göstermeye çalıştığım yerde anlamsız karakterler çıkıyor.
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: justice_for_all - 23 Aralık 2011, 22:59:22
hocam simdi strinfveri bir dizi oldugu icin olabilirmi acaba ??? siz dizinin tamamiyla islem yapiyosunuz dizinin birinci elemanini alip yapmayi denediniz mi?
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 23 Aralık 2011, 23:01:12
her şekilde denedim hocam :) hatta usb kodlarını tamamen ayrıştırdım denedim gene tık yok:)
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: justice_for_all - 23 Aralık 2011, 23:05:31
sprintf yapınca mı calısmıyor hocam normal gonderince calısıyor degil mi?
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 23 Aralık 2011, 23:17:38
Normal fonksiyon olarak gönderince çalışıyor hocam. mesela   

glcd_PutMessage((rom char*)"\x16\x29\x28 Mustafa ATALAY");

bu şekilde gayet güzel çalışıyor.
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: justice_for_all - 23 Aralık 2011, 23:26:41
buyuk ihtimal tamsayiyla alakasi var hocam ya arastirmak lazim..

https://www.picproje.org/index.php?topic=14130.0

bu linke bir bakin hocam belki biseler cikar..
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 23 Aralık 2011, 23:43:14
karıştırıyorum hocam. inşallah işe yara bişeyler çıkar. teşekkürler ilgine.
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: justice_for_all - 24 Aralık 2011, 00:09:07
ne demek hocam bende arastiriyorum biseler bulabilirsem paylasirim..
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 26 Aralık 2011, 15:15:17
Arkadaşlar anlamadım gitti normalde bu şekilde çalışması lazım değilmi bu kodun ? acaba programda sıkıntı olabilirmi ?
char buffer[];
long x_int;
CMCON=7;
glcd_Init();

glcd_ClearScreen();

x_int=(long)5689;
sprintf(buffer,(const far rom char*),(long)x_int);

glcd_ClearScreen();
glcd_SetPos(2,20);
glcd_PutMessage((rom char*)*buffer);
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 27 Aralık 2011, 07:59:09
gerbay hocam aynen dediğiniz şekilde ve farklı şekillerde denedim. ama yapamadım. herhalde kurulu olan c programım bozuk yenisini edinip tekrar denicem. teşekkürler.
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 27 Aralık 2011, 12:38:49
olmadı gene  :'(

bende bişiler var basmıyor kafam bu işe :)
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: JKramer - 27 Aralık 2011, 12:56:57
Sonucu glcd yerine seri port'dan kontrol etmeyi deneseniz? Belki glcd kodlarıyla ilgili bir durum vardır. Ya da debug şansınız varsa Mplab'dan buffer'ı kontrol edebilirsiniz sanırım.
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 27 Aralık 2011, 13:16:32
Usb üzerinden verileri bilgisayar yazılımına gönderiyorum yazılımada bozuk geliyor. mplabdan bufferi nasıl kontrol edeblirim hocam. debug yapmadım hiç. nerden bakmam lazım.
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: JKramer - 27 Aralık 2011, 13:46:30
Tam hatırlamıyorum, kesin konuşmayayım ama yukarıda debugger menüsü var, Mplab Sim (software debugger) ya da Pickit2 gibi donanımınızı seçiyorsunuz. Daha sonra bir yerlerde watch window olacak, oradan istediğiniz değişkenleri ya da register'ları ekleyip adreslerine ve içeriklerine bakabilmeniz lazım. Bir de tüm icsp kablolarını hedef devreye bağlamak gerekiyordu sanırım. Dediğim gibi pek yardımcı olamadım ama olmazsa bilen biri cevap yazar.
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 27 Aralık 2011, 14:44:55
Evete hocam buldum. buffer boş gözüküyor. x_int dolu sprintf fonksiyonu görevini yerine getirmiyor. :) internettei bir çok örneği denedim gene olmadı gözden kaçırdığım bir püf noktası var herhalde.
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: JKramer - 27 Aralık 2011, 15:09:14
C18'de long 32 bit'likmiş, gerbay'ın verdiği kodda %d yerine %Ld yazmayı dener misiniz?
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 27 Aralık 2011, 15:40:08
olmadı gene hocam. bu C dilini  çok zor öğreneceğim heralde bide deneme yanılma yöntemi ile çalışıyorum olacak iş değil :) türkçe kitap almam lazım.
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 27 Aralık 2011, 16:26:28
Üstad bu debug olayı mütiş bişyemiş, yeni haberim oldu :) teşekkür ederim. buffer kısmını doldurmayı başardım yani sprintf çalışıyor ama glcdye karakter basma kısmı sorunlu bi sürü anlamsız karakter çıkıyor. acaba glcd karakterleri romdan aldığı içinmi ? bunun için nasıl bir işlem yapmalıyım ?

glcd_PutMessage((unsigned char)buffer);

glcd_PutMessage((rom char*)buffer);

glcd_PutMessage(buffer);

bu şekillerde deneme yaptım olmadı bunun mantığı nedir nereleri değştirmem lazım.
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: JKramer - 27 Aralık 2011, 16:39:26
Glcd ve rom ile ilgili bir şey diyemeyeceğim, yalnız sprintf'de sorun neymiş? Buffer'ı doldurmayı nasıl başardınız?
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 27 Aralık 2011, 16:44:30
unsigned long x_int;        // main'den önce tanımlanacak // tanımlamayı neden main içine alamıyoruz anlayamadım.
unsigned char buffer[9];  // main'den önce tanımlanacak
void main(void)
{

x_int=(unsigned long)254589;
sprintf(buffer,(const far rom char*)"X: %ld",(unsigned long)x_int); //(const far rom char*) ve veri tipleri (unsigned long) v.b veri tipleri eklenecek,


bu şekilde bufferin sağlıklı bir şekilde dolduğunu debug modda görebiliyorum.
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: JKramer - 27 Aralık 2011, 16:55:35
Unsigned için muhtemelen %Lu olması gerekiyor.
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 28 Aralık 2011, 13:28:57
Yardımlarınız için çok teşekkür ederim arkadaşlar.


static char rom data;
char buffer [8];
float x=20.25539;
unsigned int x_int, x_dec;

void main(void)
{

x_int = (unsigned int)x;
x_dec = (unsigned int)(((float)x - (float)x_int) * 100000);
sprintf(buffer,(const far rom char*)"%d.%04d", x_int, x_dec);
data=(rom char rom)buffer;

glcd_Init();
InitLEDs();
glcd_ClearScreen();
glcd_SetPos(3,14);
glcd_PutMessage((rom char*)data);
glcd_Box(0,0,127,63);
}


data=(rom char rom)buffer;
data=(char)buffer;
data=(rom char*)buffer;

data atamalarını bu şekilde denedim ama grafik lcd'den hala bir sonuç alamadım nasıl yaparım anlayamadım bir türlü ?
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 28 Aralık 2011, 14:03:04
Şimdi denedim olmadı hocam. Debug penceresinden bufferin içeriğini görebiliyorum tam istediğim gibi ama bufferi glcdye aktaramıyorum.
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 28 Aralık 2011, 16:42:04
char buffer[11];
float x=20.25539;
unsigned int x_int, x_dec,i;

void main(void)
{
x_int = (unsigned int)x;
x_dec = (unsigned int)(((float)x - (float)x_int) * 100000);
sprintf(buffer,(const far rom char*)"X: %d.%04d",x_int, x_dec);

glcd_Init();
InitLEDs();
glcd_ClearScreen();
glcd_Box(0,0,127,63);

glcd_SetPos(3,14);
i=0;
while(buffer!=0)
{glcd_PutChar(buffer[i++]);}
}

arkadaşlar istediğim şekilde glcd' ye veri yazdırmayı başaramadım ama bu şekilde bir çözüm buldum. belki birinin işine yarar. herkese çok teşekkür ediyorum.
Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: haydarpasamikro - 05 Ocak 2012, 00:01:14
c18 derleyici stdio.lib kütüphanesini kullanırken dikkat etmek lazım. Çünkü:
sprintf(dizi,"format",long sayı) şeklinde sayı long kabul etmez. Sonuç hatalı veya hiçtir.
Kısaca long bir değeri ascii stringe çeviremezsiniz. Sadece integer değerli çevirebilirsiniz. c18 için böyle. zayıf yanı.

Metod diğer:

stdlib.h kütüphanesindeki ultoa(long sayı, dizi) fonksiyonunu kullanınız. unsigned long tan ascii dizi üretir.

Başlık: Ynt: C18 değişken tanımlama ve fonksiyon yazma
Gönderen: computerboy - 06 Ocak 2012, 15:57:12
Aydınlatıcı bilgin için teşekkür ederim üstad. hocam bu kod çok uzun uzadıya gidiyor. nasıl bir fonsksiyon ile sadeleştiririm bu kodları. bunun gibi 5 tane daha kod ekleyiince up uzun oluıyor :)


char x_kor[8];char x_buf[11];unsigned long x_long;int xi;int xxi;

void main(void){
glcd_ClearScreen();

for(xi=0;xi<8;xi++)
{x_kor[xi]=veri.paket.x_step.byte[xi];}
x_long = atol(x_kor);
//sprintf(x_buf,(const far rom char*)"X: %lu",x_long);
ultoa(x_long, x_buf);
glcd_SetPos(0,7);
xxi=0;
while(x_buf[xxi]!=0)
{glcd_PutChar(x_buf[xxi++]);}
delay_100us(1);
UsbVeriGonder((rom char*)"OK!");
}