Picproje Elektronik Sitesi

PICPROJE PROGRAMLAMA DERSLERİ => Arm Öğreniyoruz => Konuyu başlatan: z - 28 Ekim 2011, 18:48:32

Başlık: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: z - 28 Ekim 2011, 18:48:32
Bu baslık, projelerini BASIC dilinde geliştirebilen fakat C bilmeyen arkadaşların kısa yoldan C ye geçiş yapmaları için açılmıştır.

Einstein_54'ün vereceği BASIC kodları C ye çevireceğiz ve bu esnada kendisiyle ikili tartışma ortamı oluşturacağız.

Bu nedenle konuyu bölecek diger mesajları silmeme anlayış göstermenizi rica ediyorum. (31 Ekimden itibariyle bu durumu kaldirdik)

C Programlama diliyle şamatalar  https://www.picproje.org/index.php/topic,35908.0.html (https://www.picproje.org/index.php/topic,35908.0.html) başlığında konuları zaten hep birlikte tartışabileceğiz.

Eistain_54 şimdi Basic ile 1 den 100 e kadar sayıları toplayan örnek program yazacak.

2li tartışma yöntemi umduğum gibi olmazsa genele açık hale getiririz. (Amaç belli bir sırada dağılmadan konuları işlemek)
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: eistain_54 - 28 Ekim 2011, 19:37:47

    a var byte  'byte tipinde 8 bitlik değişken
bastan:
     a=1          'a'nın ilk değeri
basla:
        a=a+1         'a'yı bir arttır.degeri a'ya yükle
   if a=100 then    'a=100 ise
      goto bastan    'bastan etiketine git
   else         'değilse,yani 100 olmamışsa
     goto basla     'basla etiketine git
   endif             'else nin sonu
end
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: muhittin_kaplan - 28 Ekim 2011, 19:45:01
Buraya Bende Dahil Olmak İstiyorum.
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: z - 28 Ekim 2011, 19:54:07
Pekala fakat 2 kisiyi asmayalim.

a var byte  'byte tipinde 8 bitlik değişken
bastan:
     a=1          'a'nın ilk değeri
basla:
        a=a+1         'a'yı bir arttır.degeri a'ya yükle
   if a=100 then    'a=100 ise
      goto bastan    'bastan etiketine git
   else         'değilse,yani 100 olmamışsa
     goto basla     'basla etiketine git
   endif             'else nin sonu
end

Asagidaki de programin herseyiyle ayni C de yazilmis sekli

void main()
{
char a;

bastan: a=1;
basla:
           a=a+1;
           if (a==100)
             {
                goto bastan;
             }
           else
            {
               goto basla;
            }
}

Verilen BASIC programa ne kadar cok benziyor.

Bu programla ilgili akliniza gelen hersey sorun.
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: eistain_54 - 28 Ekim 2011, 19:55:20
Tamam da neden char tipinde a? int olması gerekmezmi?

Sen programda ne yaptiysan ben de aynisini yaptim. Degiskeni sen byte tanimlayinca bende mecburen C deki karisligi olan char tanimladim. (Su anda ARM ile calisiyoruz diye dusunmeyin.)

char denince akla karakterler yani a...z A...Z 0...9 vs geliyor.

char degiskeni, C de hem bu tip veriler icin hemde 8 bit sayisal degerler icin kullaniriz.

karakter dedigimiz veriler aslinda ASCI sayisal degerlerdir. Mesela A karakteri aslinda 0x41 demektir.

Programi asagidaki gibi de yazabiliriz.

void main()
{
char a;

bastan: a=1;
basla:
           a=a+1;
           if (a==100) goto bastan;
           else goto basla;
}

eger toplami integer (32 bit)  tanimlamak istersek


void main()
{
int a;

bastan: a=1;
basla:
           a=a+1;
           if (a==100) goto bastan;
           else goto basla;
}

Bu arada istedigim programi değil bir baska programi yazmissin.

Ben 1 den 100'e kadar olan sayilarin toplamini bulan programi yazmani istemistim. (1 dahil 100 haric)

Tekrar yazmayi dene.
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: muhittin_kaplan - 28 Ekim 2011, 20:04:56
evet neden Char

char denince akla karakterler yani a...z A...Z 0...9 vs geliyor.

char degiskeni, C de hem bu tip veriler icin hemde 8 bit sayisal degerler icin kullaniriz.

karakter dedigimiz veriler aslinda ASCI sayisal degerlerdir. Mesela A karakteri aslinda 0x41 demektir.

ayrıca 100 e kadar toplama yapan program. C de hata var mı ?

Dim A As byte
        Dim b As byte

        For A = 0 To 100
            b = b + A
        Next


int a,b;
      for (a=0;a<100;a++)
     {
        b=b+a
      }


B nin baslangic degerini sifirlamaliydin.



Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: eistain_54 - 28 Ekim 2011, 20:06:29
Doğru ya. O halde veri tiplerini seçrken dikkatli olmalı... hocam bu konudan bahsedermisiniz biraz. yani ne tür veriler için ne tür değişkenler oluşturalım...

char a;  // 8 bitlik a degiskeni demek
short b; // 16 bitlik b degiskeni demek
int c;    //  32 bitlik c degiskeni demek
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: DumrulBey - 28 Ekim 2011, 20:09:44
Bu çok güzel kollektif bir uygulama. Bülent hocamı tebrik ediyorum. Sizleri takip edeceğim...

Tesekkurler. Fakat mevcut bu baslik altinda sadece 3 kisi yazisacagiz. Cunku konu cok dagilir. Mesajlari silecegim.
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: z - 28 Ekim 2011, 20:27:03
void main()
{
char a;
short b;

        a=0;
        b=0;
AA:
        a=a+1;
        if (a & 0x04)
          {
              a=0;
              b++;
          }
        goto AA;
}

Bu program ne is yapar Programdaki AA etiketinin ustunden 10'uncu (10'@uncu) kez gecilinceye kadar A ve B sirayla hangi degerleri alirlar?

Atiyorum;

A=0 B=0
A=1 B=5
A=2 B=8

gibi ilk 10 degeri bulmanizi istiyorum.

Bu programi, C satirlarinin tamamen esdegeri olan Basic kodlarla BASIC de yazin.
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: eistain_54 - 28 Ekim 2011, 21:48:00
 ilk program için yanlış anlamışım inşallah bu kez yanlış anlamam
n var word
sonuc var word
sonuc1 var word
basla:
n=99
   sonuc1=n*(n+1)
   sonuc=sonuc1%2 ' Burada 3 kagit yapmissin fakat sonuc=sonuc1 / 2 olmasi gerekmezmi ( % bolme isareti mi demek? Sizin BASIC'i bilmiyorum cunku)
goto basla
end 
Alıntı yapılan: bunalmis - 28 Ekim 2011, 20:27:03
if (a & 0x04)
          {
              a=0;
              b++;
          }
benim anlamadığım bir nokta var. If şartının içeriği ne iş yapıyor ? Yani a ile 0x04 and işlemine tabi tutuluyo ya sonra ?

if komutuna ait parantezin icindeki islem yapilir bizdeki islem (a & 0x04).  Ardindan bu islemin sonuca bakilir. Eger a & 0x04'un sonucu sifirdan farkli ise karsilastirma dogru demektir. Eger sifir ise karsilastirma yanlis demektir.
0x04 hex sayisi 00000100 ikili sayisi demektir. O halde a degiskeninin sagdan 3. siradaki biti (0 nolu değil, 1 nolu değil 2 nolu olani) 1 olursa sonuc 0 dan farkli olur.

Bunun icin eger a 0x?4 yada 0x?C olursa 0x04 ile AND islemi sonucunda sonuc 0x04 olur.  (Burada ? yerine istedigin rakami koy)

C de if yapisi acisindan Bu cok onemli bir ornektir.

Bu aciklamadan sonra devamini sen getir ve basic programi yaz.

if (a & 0x04)  ile  if ((a & 0x04) !=0) ayni anlama gelir.
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: eistain_54 - 28 Ekim 2011, 22:29:43
hocm gç yazıyorum ama çözebilmş değiilim henüz ...
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: z - 28 Ekim 2011, 22:37:24
void main()
{
char a;
short b;

        a=0;
        b=0;
AA:
        a=a+1;
        if (a & 0x04)
          {
              a=0;
              b++;
          }
        goto AA;
}

a var byte
b var word

        a=0
        b=0
AA:
        a=a+1
        if (a AND 4)<>0 then
              a=0
              b=b+a
        endif


        goto AA

Bu asamada takilman normal. Yukarida yazdigim Basic programa bak. Sonra konusalim.

Cok onemli uyari

Eger kullandiginiz BASIC de byte ve word isaretsiz sayi tanimlamaya yariyorsa verdigim C orneklerinde char ve short onune unsigned eki getirmelisiniz.

Yani asagidaki gibi

unsigned char a;
unsigned short b;

Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: eistain_54 - 28 Ekim 2011, 22:45:38
İlk soru için o bölme işareti. Telefonda öyle gözüktü

ikinci için :
a var byte
b var word
a=0
b=0
main:
a=a+1
AA:
if (a and 4!=0) then
a=0
b=b+1
goto main
endif
goto main
end



ama ben nedense hala if içindeki şarta bi anlam veremedim?kusuruma bakmayın ne olur!kafamı bi türlü toparlayamıyorum...
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: z - 28 Ekim 2011, 23:00:49
O sarta anlam vermenız gerekmiyor. C de if komutunun bu özelliğini anlatabilmek için bu kafa karıştırıcı örneği verdim.
if (a & 0x04)
    {
        a=0;
        b++;
    }

if ((a & 0x04) !=0)
   {
       a=0;
       b++;
    }

Bunlar aynı anlama geliyor.

if komutunun bu kullanimini anlamadiysan kesinlikle ilerlemeyecegiz.

C programlama dili ile samatalarda tartismayi dene.  https://www.picproje.org/index.php/topic,35908.0.html (https://www.picproje.org/index.php/topic,35908.0.html)
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: eistain_54 - 28 Ekim 2011, 23:26:30
şimdi çözdüm.

AA nın üstünden geçerken alınan değerler

1   a=0 b=0
2   a=1 b=0
3   a=2 b=0
4   a=3 b=0
5   a=0 b=1
6   a=1 b=1
7   a=2 b=1
8   a=3 b=1
9   a=0 b=2
10 a=1 b=2   

a var byte
b var word
a=0
b=0
AA:
a=a+1
if (a & 0x04 )!=0 then ' (Sizin BASIC de eşit değil != mı?)
a=0
b=b+1
endif
goto AA
end

sonun bitti inşallah yanlış yoktur :)

Evet olay bu

O zaman bir de şu soruya bak.

if ((a&2)||(a==8))
{
......
......
}

a nın hangi değerleri için parantez içindeki .... kodları çalıştırılır.

Bunu gerçekleyen 10 tane  a değeri verebilirmisin?
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: eistain_54 - 28 Ekim 2011, 23:48:42
(a&2)==>degerler:
15,14,11,10,7,3,2
a==8==>degerler:
8 dir heralde sadece

2,3,7,10,11,14,15 bir de 8 etti 8 2 tane daha soyle ki 10 olsun.
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: eistain_54 - 29 Ekim 2011, 13:28:57
Daha varmı ki ben bulamadım ?
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: eistain_54 - 29 Ekim 2011, 13:37:10
0000#0
0001#1
0010#2
0011#3
0100#4
0101#5
0110#6
0111#7
1000#8
1001#9
1010#a
1011#b
1100#c
1101#d
1110#e
1111#f
dolayısıyla yukarıdaki sayılara 9 12 13 de dahil edilebilir. Ama ikinci şartta eşitlik olması gerekmezmi yani ikinci şart için sadece 8 olur sanıyorum ?

9,12,13 dahil edilemez cunku 2 ile AND isleminde 0 uretirler.

a 8 bit olduguna gore 0x12, 0x13, 0x16,... 0xF2 vs eklenebilir.
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: z - 29 Ekim 2011, 14:08:30
if komutunda birde su ornegi vermek istiyorum.

if (a==0)
  {
  }

if (!a)
  {
  }

Yukaridaki iki yazim sekli de ayni anlama gelir.

a sifir ise a==0 sorusunun cevabi dogrudur.

if(a) komutunda a=0 ise yanlistir. a sifirdan farkli ne olursa olsun dogrudur.

Fakat a nin onune ! koyarsan bu unlem yanlisi dogru, dogruyu da yanlis yapar.

yani if (!a) a=0 ise dogrudur.

Şu ana kadar öğrendiğiniz if komutu ile karşılaştırma, goto ile de dallanma yaparak proje bile yapabilecek durumdasınız.

Şimdi ilk başlarda sorduğum 1 ve 99 dahil aradaki sayıları toplayan aşağıdaki örnek programa bakın.

void Soru()
{
int i, Toplam;

     Toplam=0;

     for(i=1;i<100;i++)
        {
           Toplam=Toplam+i;
        }
}

Bir de 2 ve 98 dahil aradaki cift sayıları toplayan aşağıdaki örnek programa bakın.

void Soru()
{
int i, Toplam;

     Toplam=0;

     for(i=2;i<100;i=i+2)
        {
           Toplam=Toplam+i;
        }
}

Programlari inceleyerek varsa for komutu ile ilgili sorularinizi sorun.

Toplam=Toplam+i;  yerine Toplam+=i; de yazabilirsiniz
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: muhittin_kaplan - 29 Ekim 2011, 16:59:31
Soru değilde Bir yerden öğrendiğim konuyu yazmak istiyorum.
Biz Basit ciler hep
if A=0 saya alışmışızdır. C de bu hatalara neden olur muş (Atama Öperatörü =, == operatörünün Eşitmi anlamına geldiğinden)
bunu engellemek için önce sayıyı sonrasında değişken ismini yazmamız öneriliyor
if 5=A gibi. Aslında Bu yazım şekli Derleyicide Hata veriyor ve biz bu hatayı Düzeltiyoruz.
if 5==A yapıp kodlarımızın tadına bakıyoruz.
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: z - 29 Ekim 2011, 18:07:45
Soru olmadığına göre her şey yolunda.

Şimdi de 1 ve 99 dahil ara sayıların toplamını while komutu ile yazın.
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: muhittin_kaplan - 29 Ekim 2011, 18:41:03
1 ile 99 un arasının toplamı mı ?

1 + 2 + .... + 97 + 98 + 99
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: eistain_54 - 29 Ekim 2011, 18:45:11
c ile:

int toplam,i;
toplam=0
while (i=0;i<100;i++)
{
toplam=toplam+i
}


basic:

i var word
toplam var word
i=0
toplam=0
while i<100
toplam=toplam+i
i=i+1
wend
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: muhittin_kaplan - 29 Ekim 2011, 18:47:25
        Dim A As Byte                  ;8 Bitlik A
        Dim Toplam As Word       ;16Bitlik Toplam

        While A < 100                 ;A 100 den küçükse Bunları Yap
            Toplam = A + Toplam
            A = A + 1
        Wend

Yazdığın programda, A ve Toplamı  en başta sıfırlamak gerekmezmi?

Aşağıdaki de C deki programimiz

int a,Toplam;

        a=1;
        Toplam=0; 

        while(a<100)
           {
               Toplam+=a;
               a++;
           }
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: z - 29 Ekim 2011, 19:02:17
eistain_54 while for gibi değil.

Şimdi while komutunu, soracağım soruda uygun şekilde kullanın.

Port1 ve Port2 adında değişkenlerim var. Aslında bunlar donanımsal bir port.

Bu portların C'de int Port1, Port2; şeklinde tanımlandığını varsayın.

Port1 den okunan verinin 7. biti 1 ise data hazır anlamına gelmektedir. Eger data hazırsa datayı Port2 portundan okuyabilirsiniz.

Portların en düşük bitinin numarası 0 dır.

Data gelinceye kadar bekleyen, ve gelen data 0x55 ise Buldum adındaki etikete gidip sonsuz döngüye giren Basic ve C kodlarını yazın.

(Gelen Data 0x55 degilse yeni Datayı beklesin)
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: muhittin_kaplan - 29 Ekim 2011, 19:03:27
Yeni Tanımladığım bir değişkeni sıfırlamam.
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: muhittin_kaplan - 29 Ekim 2011, 19:13:37
Dim Port1 as byte
Dim Port2 as byte

while=1
   if Port1.7=1
   if Port2=$55
            goto Buldum
   endif
    endif
wend
     
Buldum: goto Buldum

Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: z - 29 Ekim 2011, 19:14:08
Peki C de nasıl yazarız?

Farklı bir kaç örnek istiyorum.
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: eistain_54 - 29 Ekim 2011, 19:26:39
bana biraz zaman verin ekran klavyesiyle yazıyoum...
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: muhittin_kaplan - 29 Ekim 2011, 19:29:00
Alıntı yapılan: bunalmis - 29 Ekim 2011, 19:14:08
Peki C de nasıl yazarız?

Farklı bir kaç örnek istiyorum.
Hocam Burada Ben Bekleyeyim. Ben Olsam Bir Fonksiyonlar Oluşturur Kontrol Eder Dönerdim.
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: z - 29 Ekim 2011, 19:38:39
Su anda amac programın yakışıklı olması vs değil.

Tüm amacımız C Komutları örnek kodların içinde anlamaya çalışmak.

Cevap olacak programları istediğiniz gibi yazabilirsiniz.

Fonksiyon yazımını şu ana kadar göstermedik.

Kısaca değineyim

int main()
{
int A,B,C,D,Y,Z;

          A=1;
          B=2;
          C=3;
          D=4;

          Y=A+B;
          Z=C+D;
}

Yukarıdaki programı şu şekilde de yazabiliriz.

int Topla(int T1, T2)
{
     return(T1+T2);
}

int main()
{
int A,B,C,D,Y,Z;
     
          A=1;
          B=2;
          C=3;
          D=4;

          Y=Topla(A+B);
          Z=Topla(C+D);
}

Bu yazdığımız programda Topla adında bir fonksiyon tanımladık ve toplama işlemi gerektiğinde bu fonksiyonu çağırdık.
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: muhittin_kaplan - 29 Ekim 2011, 19:52:02
PIC basic gibi dillerde Fonksiyon kavramı yoktur hocam. Sadece Alt Program Vardır.Bu alt programlarda Argümant alamazlar. Yaptığınız Değişken Tanımlaması Programın heryerinde Yaşar.
Peki ben Fonksiyon Alt Programı nereden Biliyorum. VB den.
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: muhittin_kaplan - 29 Ekim 2011, 19:53:04
Yukardaki nedenlerden Dolayı PIC basic vb dilleri bilenlerden biraz ayrılıyorum. Ondan Dolayı Yazmadım.
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: z - 29 Ekim 2011, 19:57:35
Fonksiyon kullanmadan yaz o zaman.
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: muhittin_kaplan - 29 Ekim 2011, 20:04:19
int Port1;
int Port2;


while (1)
   if (Port1.7==0x01<7)
    {
     if (Port2==$55)
       {     
            goto Buldum;
       }
    }
}
     
buldum: goto buldum;


Hocam herhalde böyle olurdu
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: z - 29 Ekim 2011, 20:27:53
Hataları kırmızı ile işaretledim.

int Port1;
int Port2;


while (1)
{
   if (Port1==0x01<<7)
    {
     if (Port2==0x55)
       {     
            goto Buldum;
       }
    }
}
     
Buldum: goto Buldum;


Goto olayına takılmayın. Fakat kullanmayın derler. Kullanırsanız da Keil çok güzel icabına bakar.


Programı aşağıdaki gibi de yazabiliriz.


int Port1;
int Port2;

    while (1) if (Port1&0x80) if (Port2==$55) goto Buldum;

     
Buldum: goto Buldum;


Bu arada  int Port1 ve Port2; tanımını volatile unsigned int olarak tanımlamalıyız.
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: z - 29 Ekim 2011, 20:56:28
@eistain_54 (https://www.picproje.org/index.php?action=profile;u=17738)

Ne durumdayız?

Anlaşılmayan birşey varmı?
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: eistain_54 - 29 Ekim 2011, 21:31:52
Yok hocam anlaşılmayan bişey sadece while (1) ilemi sadece döngü kurulur.yani parantezin içi başka bir şekilde doldurulamazmi yani karşılaştırma tarzında

Eğer sonsuz döngü kuracaksan o zaman parantez içine her zaman doğru olan bir ifade yazmalısın. Bu durumda while içine sıkışıp kalırsın. while(1) while (2) gibi.

Yani:

      goto Yani

gibi bir durum oluşur.


while (0) dersek while içine girilmez.

Aşağıdaki program parçası for(i=0;i<10;i++)[/b] ile bire bir aynı anlama gelir.

    i=0;
    while(i<10)
       {
          i++;
       }

Burada i<10 ise ifade doğrudur. i=10 yada i>10 olduğunda i<10 sorgusu yanlış olur ve while dan çıkılır.
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: eistain_54 - 29 Ekim 2011, 21:51:55
peki while içinde lojik işlemler yapılabilirmi yani sorudaki gibi port1&0x55 gibi

Sonucu doğru yada yanlış olan her türlü işlemi while'a ait parantezin arasında kullanabilirsin.

Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: eistain_54 - 29 Ekim 2011, 22:22:39
Anladım. O halde yukarıdaki soru için

while (port2&0x55)
{
buldum:

}

Bu yazdığın kod parçası port2 yi okur ve 0x55 ile AND yapar.

Eğer porttan okunan değerin 6, 4, 2, 0 bitlerinin hepsi de 0 ise while dönügüsünden çıkar. (Mesela 0x80 yada 0xAA vs okunursa while dan çıkılır)
Bu bitlerden en az birisi 1 ise tekrar port2 yi okuyarak döngü içinde kalmaya devam eder ve aynı kontrolleri tekrar tekrar yapar.


Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: eistain_54 - 29 Ekim 2011, 22:53:24
ben konuyu anladım gördüm ki o döngü içinde lojik kıyaslama da oluyormuş benim için önemli olan bu teşekkür ederim
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: z - 29 Ekim 2011, 23:03:03
Islemcilerin port ayarlamalari vs yi bir kenara biraksak;

Simdiye kadar ogrendiklerinle program yazabilirmisin?
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: eistain_54 - 29 Ekim 2011, 23:42:18
bir deneyelim istersen hocam birde fonksiyon olayından bahsedelimmi biraz
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: z - 29 Ekim 2011, 23:45:23
Fonksiyonlara kisaca yukarida degindik.

https://www.picproje.org/index.php/topic,35980.msg257964/topicseen.html#msg257886 (https://www.picproje.org/index.php/topic,35980.msg257964/topicseen.html#msg257886)

C de anlamli bir seyler yapan yaklasik 20-30 satirlik bir program yazmaniz isteyecegim.

Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: eistain_54 - 30 Ekim 2011, 00:14:07
şamata yaptığımız yerde anlamadığımı ifade ettiğim konular dahil olmayacak diymi birde onları sonraya mi bıraktınız ?

Structure ve union çok zor değil. Yarın C yi bitireceğiz. Basic bilen 2 günde C ye geçer demiştim beni haksız çıkarma.

Yarın diğer konularla örnekler yaptıktan sonra structure vs ye bakarız.
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: eistain_54 - 30 Ekim 2011, 01:39:01
Yoo kesinlikle haklısınız yatağa yattığından beri düşünüyorum programı bitiremedim kafamda tam olarak. Yani dediğiniz gibi c ile yazmaya başladım.
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: DumrulBey - 30 Ekim 2011, 23:14:38
Hocam Array'ler ile ilgili mevzuları merak ediyorum da... C'de PHP kadar çok şey yapabiliyor muyuz? Örneğin şu kodlar ile başlasak ki basit bir kesmeli dizi örneği:

void interrupt(){
if(INTCON.RBIF){
kesme_hesaplama();
PORTB=kesme_tablo[kesme_port_degeri];
kesme_port_degeri=0;
INTCON.RBIF = 0;
}

}
void main() {
ayarlar();
for(;;) {
         for(sayac=0;sayac<7;sayac++){
                  PORTA=yuru_tablo[sayac];
                  delay_ms(1000);
         }

}
}
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: eistain_54 - 31 Ekim 2011, 11:59:19

#include<stdio.h>
#include<conio.h>

int main( void )

{

    int kilo;
    int boy;
    float sonuc;
    float deger1;
          printf ("Lutfen Kilonuzu Girin:");
          scanf("%d",&kilo);
          printf ("Lutfen Boyunuzu Girin:");
          scanf("%d",&boy);
          deger1= (float) boy / 100;
          deger1= deger1*deger1;
          sonuc = kilo/deger1;
          printf ("Sonuc: %2f\n",sonuc);
          if ( sonuc >24.9 && sonuc <29.9 ){
             printf ("Sanirim Biraz zayiflamalisiniz! \n");
             }
          if ( sonuc == 24.9 ){
               printf ("Tehlike canlari caliyor... \n");
               }
          else if ( sonuc >=19.9  &&  sonuc < 24.9){
               printf ("Harika!Formunuzdasiniz!!! \n");
               }
          else if ( sonuc > 29.9 ){
               printf ("Uzgunum.Bunu yerken dusunmeliydin... \n");
               }
          else if ( sonuc < 19.9 ){
               printf ("Neyin var senin?Biraz istah hapi falan kullan bari \n");
               }
          getch();
          return 0;
}

Bunu bir tren yolculuğu sırasında abimin icası üzerine yazmıştım.Staj yerinden eve dönerken yazdığım bir programram.Dev C++ ile yazmıştım.Fonksiyon falan yok.Hepsini içeren bir program tasarlıyorum ama çok gecikeceğim.O yüzden bununla yetineyim dedim...Sizce bişeyler kapabilmişmiyim?
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: z - 31 Ekim 2011, 13:42:37
Kafa geçiyor olmalısın?

Bunu sen mi yazdın? Yazdıysan bu başlıkta mesajlaşmak için Basic bilen fakat hiç C bilmeyen birini aramıştık. Sen de C bilmiyorum demiştin.

Sen yazdıysan yukarıda anlamayıp sorduğun sorular neydi?

Gerçekten kafam karışık şimdi.

Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: eistain_54 - 31 Ekim 2011, 14:17:18
yok ya gerçekten dalga geçmek maksatlı yazmadım. Zaten sorduğum sorularla bilmediğim belli olmuyormuydu. Ben daha önce c çalışmıştım ama aradan bir kaç gün geçince unutmuştum. Gerçekten cokmu profosyonel bir çalışma ben şimdi yazmak istesem böyle bir çalışmaya giremem. Korkarım. Halen ccs ile lee yakıp söndürecek kod yazmaya korkuyorum. Kafamı karıştıran bir sürü şey var. Birde sizin yaptığınız if tanımlaması benim kafamı karıştırmıştı. Ama şuan bir sorun yok. Sakin beni yanlış anlamayın gerçekten böyle bir niyetim yoktu olamazda...
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: z - 31 Ekim 2011, 15:49:29
Basic bilenlerin bu satira kadar olan mesajlarda anlatilanlari mantik suzgecinden gecirirlerse Basicden aliskin olduklari komutlarin bire bir C karsiligi oldugunu ve C de ayni sekilde program yazabileceklerini farketmis olmalilar. Bunun icin sadece C'ye ozgu kurallara uysunlar yeter.

Bu hemen C ye gecmeniz icin yeterli ve zaman icinde BASICdeki dar mantiktan kurtulup C de daha hur  olmaya baslayabilirsiniz.

Array kullanimi

Dim A(10)

y=0     

Rem  0,1,2,3,4,5,6,7,8,9,10 icin deneyelim

for x=0 to 10   
    A(x)=x
    y=y+A(x)
next x

Programi ile C de yazilmis asagidaki programa bakalim.

int A[10];   // (A degiskeninin icerigine gore int yada char yada short tanimlayabilirsiniz)
int x,y;

y=0;     

for (x=0; x<=10;x++) // 0,1,2,3,4,5,6,7,8,9,10 icin deneyecek
    {
      A[ x ] =x;
       y+=A ; // y=y+A de yazabilirsiniz
      }

Gordugunuz gibi Array degiskenler acisindan da hic fark yok.

Ornek programda

int A[10];   // (A degiskeninin icerigine gore int yada char yada short tanimlayabilirsiniz)
int x,y;

olarak tanim yaptigimiz gibi C de kullanacaginiz her degiskeni muhakkak tanimlamalisiniz.

C de Hazir fonksiyonlarin kullanimi

BASIC'de A degiskenini print komutu ile ekranda gosterebiliriz.

A degiskenini ekranda gostermek icin Goster adinda bir program parcasi yazip bunu gosub ile de cagirabilirsiniz.

C'de de ayni durum gecerli.

Ya printf yada benzeri hazir fonksiyonu cagirirsiniz yada ornegin Goster adini vereceginiz bir fonksiyonu siz yazar ve bunu cagirirsiniz.

Aslinda her ikisi de benzer seylerdir. Birisinde daha onceden birilerinin yazdigi ve kutuphane icine yerlestirdigi fonksiyonu kullanirsiniz yada kendi yazdiginiz
fonksiyonu.

Eger hazir fonksiyonlari kullanacaksaniz bununla ilgili tanimlamalarin yapildigi header dosyayi programin tepesine #include komutu ile tanimlamaniz gerekir.

Asagidaki program yukarida ornek olarak verdigimiz programdaki y degiskeninin sonucunu ekrana yazacaktir.

#include "stdio.h"  // printf fonksiyonunu kullanabilmek icin ekledik
int A[10];   // (A degiskeninin icerigine gore int yada char yada short tanimlayabilirsiniz)
int x,y;

int main()
{
      y=0;     

      for (x=0; x<=10;x++) // 0,1,2,3,4,5,6,7,8,9,10 icin deneyecek
          {
         A[ x ]=x ;
            y+=A ;  // y=y+A de yazilabilir.
           }
   printf("Toplama Sonucu=%d",y);
   return(0);
}

Buradaki printf("Toplama Sonucu=%d",y);satirinda%d ne anlama geliyor diye sorabilirsiniz. Bu sorunun cevabi printf fonksiyonunun helpinde mevcuttur.

#include "stdio.h" ile printf fonksiyonunu nasil alakalandirdin bunu include edecegimizi nereden bildin diye de sorabilirsiniz.

Bu bilgiler satin alacaginiz bir C kitabinda mevcuttur yada forumda sorabilirsiniz. Fakat en pratik olani baskalarinin yazdigi ornek programlari incelemek olabilir.


Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: muhittin_kaplan - 31 Ekim 2011, 15:56:58
Burada Bir Soru Sorabilirmiyim.
Basicde tek derinlikli Array lar oluşturabiliyoruz. C de 2-3 olduğunu biliyorum
Yani int A[10;10] gibi
Bunun Nasıl bir avantajı vardır?
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: z - 31 Ekim 2011, 16:04:16
Hayal gucunuzu kullanin.

Iki boyutlu dizileri ornegin ekranla ilgili rutinlerinizde x ve y coordinati icin kullanabilirsiniz.

Matris hesaplamasi icin kullanabilirsiniz.

Ekran[100], Ekranin 100.cu pixel.

Ekran[10,20], Ekranin x=10, y=20 noktasinda ki pixeli gibi
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: z - 31 Ekim 2011, 16:14:05
Pointer kullanımı

Pointer, Basic'de olmayan fakat C'de karşımıza çıkan önemli bir özelliktir.

XX=10 ataması ile karşılaşan derleyici,  Ramda X in saklı olduğu adrese 10 değerini yazacak kodları uretir.

Peki hangi 10 sayısını?

X char olarak tanımlandıysa Rama 0x0A
X short olarak tanımlandıysa Rama 0x000A
X int olarak tanımlandıysa Rama 0x0000000A

O halde bir degiskenin sadece adresini bilmek yetmez, degiskenin uzunlugunu da bilmek gerekir.

Normalde X=10 yazdigimizda C derleyicisi, X in daha onceki ust satirlarda ne tipte tanimlandigini bildigi icin

X=0x0A mı?, yoksa;
X=0x000A mi? yoksa;
X=0x0000000A mı? yazacağını bilir.

Işte C'de değişkenlerin char, short, int gibi tanımlanması ihtiyacının sebebi de budur.

Yukarıdaki satırlarda "X=10 ataması ile karşılaşan derleyici,  Ramda X in saklı olduğu adrese 10 değerini yazacak kodları uretir." demiştim.

Eger X=10 yazmak yerine program yazan kişi olarak Ramda X in saklı oldugu adrese 10 değerini biz yazmak isteseydik ne yapardık?

Bazı Basic derleyicilerinde Peek ve Poke komutu ile ramdaki veriler üzerinde oynamak yada verileri okumak mumkun olsa da artık bu noktadan sonra BASIC dilinden bahsetmeyeceğim.

C'de int*p tanımı yaparak integer verilerin bulunduğu adreslere erişebilen adı p olan POINTER tanımlamış oluruz.

int x;  // Bunun zaten, x bir integer değişken oldugu anlamına geldiğini biliyoruz.

Eger  p=&x; dersek p pointerine x değiskeninin adresini yerleştirmiş oluruz.

Artık *p=10; dersek x in Ramda işgal ettiği yere 0x0000000A yazmış oluruz.

eğer int x yerine char x, int*p yerine de char *p demiş olsaydık,

bu durumda  *p=10; dediğimizde x'in ramda işgal ettiği alana 0x0A yazmış olurduk.

Yukarıdaki kısmi çok iyi anlamadan aşagıdaki satırları okumaya geçmeyin.

Pointer kullanımı ne işimize yarar?

Örneklerle cevap vereceğim.

Bir fonksiyonun geri döndürebileceği değer sadece bir tanedir.

int MyFunc(int a, int b) fonlsiyonunu ele alalım.

Bu fonksiyona, a ve b verilerini kullanarak istediğimiz işlemi yaptırıp sonucunu int olarak çağıran koda bildirebiliriz.
Fakat sadece bir tane sonuç bildirebiliriz.

int MyFunc(int a, int b)
{
int s1,s2,s3,s4;

    s1=a+b;
    s2=a-b;
    s3=a*b;
    s4=a/b;
   
    buradaki s1,s2,s3,s4 sonuçlarını MyFunc fonksiyonunu çağıdan komuta nasıl bildirebiliriz?
}

Çözümlerden birisi global değişken kullanmaktır.

int s1,s2,s3,s4;

// Global değişken tanımı yaptıktan sonra

int MyFunc(int a, int b)
{
    s1=a+b;
    s2=a-b;
    s3=a*b;
    s4=a/b;

}

// Buradaki s1,s2,s3,s4 sonuçlarını MyFunc fonksiyonunu çağıran programa nasıl bildirdiğimize bakalım.

int main()
{
int a1,a2,a3,a4;
int b1,b2,b3,b4;
int c1,c2,c3,c4;

        MyFunc(10, 2); a1=s1; a2=s2; a3=s3; a4=s4;
        MyFunc(12, 3); b1=s1; b2=s2; b3=s3; b4=s4;
        MyFunc(15, 4); c1=s1; c2=s2; c3=s3; c4=s4;
        return(0);

}

Bu işlemi pointerle yapmak istersek

MyFunc fonksiyonuna, sonuçların yazılacağı değişkenlerin adreslerini bildirmemiz yeterli olur.

MyFunc sonuçların yazılacağı adresleri bildiğinden a+b, a-b, a*b, a/b işlemlerinin sonuçlarını doğrudan yazılması gereken değişkenlerin içine yerleştirir.

Bu durumda yazılımız aşağıdaki gibi olacaktır.

void MyFunc(int a, int b, int*s1, int*s2, int*s3, int*s4)
{
      *s1=a+b;
      *s2=a-b;
      *s3=a*b;
      *s4=a/b;
}

int main()
{
int a1,a2,a3,a4;
int b1,b2,b3,b4;
int c1,c2,c3,c4;

     MyFunc(10,2, &a1, &a2, &a3, &a4);
     MyFunc(12,3, &b1, &b2, &b3, &b4);
     MyFunc(15,4, &b1, &b2, &b3, &b4);
   
     return(0);
}

Ilk programı ve yapılan işlemleri, bir de yeni yazdığımız pointer kullanılmış programı ve ara işlemleri mukayese ederseniz C de Pointer kullanmanın avantajı kolayca anlaşılacaktır.

Yazı editlenerek devam edecek.
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: Klein - 31 Ekim 2011, 16:52:44
Alıntı yapılan: muhittin_kaplan - 31 Ekim 2011, 15:56:58
Burada Bir Soru Sorabilirmiyim.
Basicde tek derinlikli Array lar oluşturabiliyoruz. C de 2-3 olduğunu biliyorum
Yani int A[10;10] gibi
Bunun Nasıl bir avantajı vardır?

Çok boyutlu dizi ile bir çok şey yapılabilir. Eğer display kullanıyorsanız ve menü yapıyorsanız En sık ihtiyaç duyacağınız kullanım yeri
menü yapmak olacaktır.

const char mainmenu_header[][17]={
  "[  ANA  MENU   ]\0",
                    "[  MAIN  MENU  ]\0",//0
   };
const char mainmenu_titles[][34]={
  "Sistem          \0System          \0",//0
  "Gorunum         \0View            \0",//1
  "Genel ayarlar   \0Global settings \0",//2
  "Pompalar        \0Pumps           \0",//3
  "Servis ayarlarI \0Service settings\0",//4
   };

Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: z - 31 Ekim 2011, 17:05:52
En son yukaridaki pointer basligi altinda structure ve uniondan bahsedecegim.

Simdi, konuyla ilgilenen tum arkadaslari bu basliga davet ediyorum.

Basic bilip C ile calismamis fakat bu basligi takip edenlerin C diline gecis icin dusuncelerini merak ediyorum.

Bundan sonraki konulari ele almak uzere, ornegin proton basliginda tartismaya acilmis BASIC programlarini C diliyle yeni bastan yazmak icin zaten Hitech ile kodlama yazan arkadaslari da davet ediyorum.

Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: a.zorba - 31 Ekim 2011, 18:01:09
 yazıları takip edmeme ragmen birazda konunun pişmesini bekleyerek üzerlerinde çok durmadım ama basic den C ye geçişde en buyuk sıkıntı
delay.c 
delay.h
lcd.c
lcd.h
yani include ler in çeşidliligi ve anlaşılmasının zorlugu biraz bu konuyu açarmsınız
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: z - 31 Ekim 2011, 18:18:44
Bahsettiğiniz dosyalar hakkında en ufak bilgim yok.

Amacımız ARM işlemcilere geçişte Basic kullanan arkadaşların C sorunu yok etmek.

Keil konusunun işlendiği Keil programının kurulumu ve kullanılması https://www.picproje.org/index.php/topic,35719.0.html (https://www.picproje.org/index.php/topic,35719.0.html) başlığına ardından da

STM32F-Discovery örnek temel programlar  https://www.picproje.org/index.php/topic,35896.0.html (https://www.picproje.org/index.php/topic,35896.0.html) başlığına bir göz atıp

sorularınızı örnek programlarda include edilen dosyalardan da seçebilirsiniz.

Yularıdaki sorunuza cevap için diğer arkadaşları beklemek gerekecek.
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: DumrulBey - 31 Ekim 2011, 18:48:41
Alıntı yapılan: bunalmis - 31 Ekim 2011, 18:18:44Amacımız ARM işlemcilere geçişte Basic kullanan arkadaşların C sorunu yok etmek.

Keil konusunun işlendiği Keil programının kurulumu ve kullanılması https://www.picproje.org/index.php/topic,35719.0.html (https://www.picproje.org/index.php/topic,35719.0.html) başlığına ardından da

STM32F-Discovery örnek temel programlar  https://www.picproje.org/index.php/topic,35896.0.html (https://www.picproje.org/index.php/topic,35896.0.html) başlığına bir göz atıp sorularınızı örnek programlarda include edilen dosyalardan da seçebilirsiniz.
Bu vesileyle ben de yeni bir döneme giriyorum. Eski PIC Assembly'den uzaklaşmayı ve C'ye daha çok alışıp kuvvetli sistem kaynakları olan donanımlara geçmek istiyorum. Dolayısıyla yönetilmesi gereken kaynaklar fazla olunca işleri kolaylaştırmak için zemin hazırlamalı diye düşünmekteyim. Tam bu kritik dönemde bir kaç şeyi merak ediyorum:

PIC17 instruction set'deki fazladan komutlar C'ye göre uyumlu olduğunu hatırlıyorum. Bu durumda BASIC gibi dillere göre öne çıktığını söyleyebilir miyiz? Ayrıca ARM'deki instruction set hakkında bilgi var mıdır? Yoksa object code salt C ile mi oluşmaktadır?

Teşekkürler...
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: z - 31 Ekim 2011, 19:04:03
Aslında bu tip sorular bizi amacımızdan saptırır.

Alıntı YapPIC17 instruction set'deki fazladan komutlar C'ye göre uyumlu olduğunu hatırlıyorum. Bu durumda BASIC gibi dillere göre öne çıktığını söyleyebilir miyiz? Ayrıca ARM'deki instruction set hakkında bilgi var mıdır? Yoksa object code salt C ile mi oluşmaktadır?

Bir işlemcinin C ye uyumlu komut kümesinin olması ne kadar doğru bir tabir tartışılır. C'deki While, for gibi komutların arka planında koşacak makine kodlarının daha kolay ve daha optimize yazılmasına yarayan ve bu amacla olusturulmus komut seti, sadece C de değil, Basic'de de ASM'de de çok işe yarar.

Örneğin ARM'ın CBNZ yani Compare and Jump Not Zero makine komutu, C deki While yada For tipi komutlar için olduğu kadar Basic ve ASM için de biçilmiş kaftandır.

Basic derleyici yazanlar bu komutları kullanarak Basic'in while ve for döngülerini daha optimize  hale getirecek kodlar ürettirebilir.

ARM CM3, CM4 vs işlemcilerin komut seti ARM sitesinde mevcut.

Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: ilhan_mkp - 31 Ekim 2011, 19:23:15
hocan ben farkettim ki basicle işlemciyi tanımaktan kaçıyormuşum oysa basic kütüphaneleri kullanmadığımız kodlarla dolu dün bascom avr nin lcd kütüphanesinin kaynak koduna baktım ben çeyreğini bile kullanmıyorum

sanırım birde programlama mantığımızda sorun varmış register programlama dediğiniz olay zor ama alişabilirsek iyi bir yöntem 

derslere gelirsek anlatımlar çok güzel

c nin devamında birazda program kurguları üzerine taktikler verirseniz ve hala arm ile işe yarar bir ürün yapamadıysam sorun sizde değil bendedir ;D
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: z - 31 Ekim 2011, 19:33:40
Alıntı yapılan: ilhan_mkp - 31 Ekim 2011, 19:23:15
hocan ben farkettim ki basicle işlemciyi tanımaktan kaçıyormuşum oysa basic kütüphaneleri kullanmadığımız kodlarla dolu dün bascom avr nin lcd kütüphanesinin kaynak koduna baktım ben çeyreğini bile kullanmıyorum

sanırım birde programlama mantığımızda sorun varmış register programlama dediğiniz olay zor ama alişabilirsek iyi bir yöntem 

derslere gelirsek anlatımlar çok güzel

c nin devamında birazda program kurguları üzerine taktikler verirseniz ve hala arm ile işe yarar bir ürün yapamadıysam sorun sizde değil bendedir ;D

Yalnız bir konuda yanlış anlaşılmak istemem.

ARM gibi gizemli  bir işlemci, biraz olsun yakından tanınsın istedim.

Yoksa bu işelmciye paldır küldür program yazmak da mümkün. Yani registerlere hiç ama hiç bulaşmadan C de kod da yazabiliriz.

Ben o konuya girmeyeceğim  fakat anlatımı ileride birileri devralabilir.

Register programlamaya girme sebebim donanımda neler var bilinsin adınaydı.

ARM'ı diğerlerinden farklı ve üstün kılan nedir sorusunun cevabı ancak işlemci ve çevrebirimleri anlaşılırsa anlaşılabilir.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: ilhan_mkp - 31 Ekim 2011, 19:45:33
hocam yanlış anlaşılan bir durum yok evet paldırt diye kodu yazardık öyle yapsaydınız ben bunun mimarisi nasıl bişimiş diye bakmazdım hex sistemden öcü diye kaçardım bu arada 32bit hesaplayıcı windowsun hesap makinasından daha pratik onun içinde teşekkürler
Başlık: Ynt: BASIC kullanıcılarını C ye alıştırma turları
Gönderen: DumrulBey - 31 Ekim 2011, 19:50:59
Alıntı yapılan: bunalmis - 31 Ekim 2011, 19:04:03
Aslında bu tip sorular bizi amacımızdan saptırır.

Bir işlemcinin C ye uyumlu komut kümesinin olması ne kadar doğru bir tabir tartışılır. C'deki While, for gibi komutların arka planında koşacak makine kodlarının daha kolay ve daha optimize yazılmasına yarayan ve bu amacla olusturulmus komut seti, sadece C de değil, Basic'de de ASM'de de çok işe yarar.

Örneğin ARM'ın CBNZ yani Compare and Jump Not Zero makine komutu, C deki While yada For tipi komutlar için olduğu kadar Basic ve ASM için de biçilmiş kaftandır.

Basic derleyici yazanlar bu komutları kullanarak Basic'in while ve for döngülerini daha optimize  hale getirecek kodlar ürettirebilir.

ARM CM3, CM4 vs işlemcilerin komut seti ARM sitesinde mevcut.
Sitesinde Thumb diye bir şeyden bahsedildiğini gördüm. Kodlara baktım da bununla oluşacak object code çok başarılı olacaktır: http://infocenter.arm.com/help/topic/com.arm.doc.qrc0001l/QRC0001_UAL.pdf

Sevgiler, saygılar...
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: eistain_54 - 31 Ekim 2011, 20:26:26
hocam benim anlamadığım pointerler unionlar çok fazla anlamadığım konular bir değişkenin tipini zaten biliyorken neden pointerlere ihtiyacımız var? Sonuçta bir değişkene değer verirken aslında değişkenin adresine erişmiş oluyoruz neden ?
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: z - 31 Ekim 2011, 21:05:24
Pointer kullanmadan da karşılaşılan sorunları çözebilirsin. Fakat bu çözümler dolaylı dolayısı ile de zaman alıcı olur.

Yukarıdaki Pointer yazısı bittiğinde daha iyi anlayacaksın.

Not: Yazıyı tamamladım. Sorun hala devam ediyormu?

Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: muhittin_kaplan - 31 Ekim 2011, 22:18:01
Aslında Bir Kısıtlamadan Kaynaklı Bir Çözüm Yaratmış Pointer.
Fonksiyonun Sadece bir değer Döndürmesi bir kısıtlama. Bunu Pointer kullanarak Değişkeni değilde Değişken Adresini Kullanarak Aşıyoruz.
Peki Değişkenler RAM de belli bir yer tutar Tanımlanan Pointer ların böyle bir durumu varmı ?
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: ilhan_mkp - 31 Ekim 2011, 22:58:31
doğru anladımmı bilmiyorum ama fonksiyondan dört defa sonuç istemek yerine bir defeda işin içinden çkmış oluyoruzdoğrumudur ?
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: ilhan_mkp - 31 Ekim 2011, 23:11:29
değişkenlerin olduğu örnkte örneğin a1 önce s1 yazıldı oradan a1 e yazıldı

pointerli örnekte direkt a1 =s1 oldu
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: muhittin_kaplan - 31 Ekim 2011, 23:21:15
Alıntı yapılan: gerbay - 31 Ekim 2011, 22:30:32
pointer lar platform kaç bitlik ise o kadar uzunlukta yer tutarlar. burada 32-bit = 4 byte yer tutuyor.. 1 byte lık bir karaktere pointer bile 4 byte tutar ama bu sizi şaşırtmasın. pointer çok ama çok faydalıdır
Elimdeki Silah Ne kadar Çoksa O kadar iyi Savaşırım.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: isikyasar - 31 Ekim 2011, 23:22:24
önerebileceğiniz proton+ gibi C dili kitabı varmı.
teşekkürler.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: muhittin_kaplan - 31 Ekim 2011, 23:24:12
ftp://79.123.147.210/Bilgisayar_Teknolojisi_ve_Prog/C/CKITABI/CKITABI.PDF
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: eistain_54 - 01 Kasım 2011, 00:32:31
O zaman şöyle diyebilirmiyiz? Biz değer değer döndürmek istediğimiz bir fonksiyon yazıyoruz. Burda bir kaç değişken oluşturuyoruz. Ancak istiyoruz ki hem o değişkenler kalıcı olmasın (çünkü fonksiyonun başında void olursa değer döndürmüyor ve burada tanımlanan değişken geçici oluyor) hemde fonksiyon değer döndürmesin bu yüzden void fonks () gibi bir tanım yapıyoruz ve değişkenleri tanımlarken *p gibi bir ifadeyle değişkenin olduğu adrese erişip orda isim saklamak yerine direk değeri tutuyoruz. Halen nden buna ihtiyaç duyacağımı anlamadım. Ama bu yarının kullanımını anladım sanki...
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: mozkan87 - 01 Kasım 2011, 00:40:28
*p ile değişkenin içeriğine erişiriz. Yani ister yazarız ister okuruz.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: z - 01 Kasım 2011, 02:12:15
Alıntı yapılan: ilhan_mkp - 31 Ekim 2011, 23:11:29
değişkenlerin olduğu örnkte örneğin a1 önce s1 yazıldı oradan a1 e yazıldı

pointerli örnekte direkt a1 =s1 oldu


Pointerli örnekte hiç bir ara atama yapılmadan direk a1=a+b; oldu. Bu ayrıntı çok önemli. !!! Pointerin güzelliği burda zaten. !!!

*s1=a+b; demek s1 de saklı olan adrese yani Ramın s1 gözüne a+b sonucunu yaz demek. s1 içine mainde &a1 yazmıştık.

void MyFunc(int a, int b, int*s1, int*s2, int*s3, int*s4)
   {
      *s1=a+b;
      *s2=a-b;
      *s3=a*b;
      *s4=a/b; 
   }
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: z - 01 Kasım 2011, 02:31:43
Alıntı yapılan: muhittin_kaplan - 31 Ekim 2011, 22:18:01
Aslında Bir Kısıtlamadan Kaynaklı Bir Çözüm Yaratmış Pointer.
Fonksiyonun Sadece bir değer Döndürmesi bir kısıtlama. Bunu Pointer kullanarak Değişkeni değilde Değişken Adresini Kullanarak Aşıyoruz.
Peki Değişkenler RAM de belli bir yer tutar Tanımlanan Pointer ların böyle bir durumu varmı ?

Eğer pointeri aşağıdaki örnekteki gibi tanımlarsan pointerin kendisi de Ram'da yer kaplar.

int* pointer1;
char* pointer1;

Fakat pointer yada değişkeni aşağıdaki gibi fonksiyonun parametre kısmında tanımlarsan Ram'da yer kaplamaz.

void Fonksiyon(int* Adr1, char* Adr2, Var1, Var2) // Buradaki pointerler ve değişkenler doğrudan CPU registerlerimiz oluyor.

Pointer, yüksek düzeyli bir dilde aslında bir riskdir. Yanlış kullanımlarla tüm Ram içeriğini değiştirebilirsiniz.
Pointer, C daha icat edilmemişken de vardı. (ASM yazanlar zaten buna mecbur.)
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: eistain_54 - 01 Kasım 2011, 10:45:48
Alıntı yapılan: bunalmis - 01 Kasım 2011, 02:31:43

(ASM yazanlar zaten buna mecbur.)

Hocam biz okuldayken asm ile yazıyorduk pic için ama ben iç pointer kulanımı görmemiştim.Belkş mevzuyu çok uzattım ama ne olur anlayış gösterin.Şimdi bir örnekle açıklayım...

'1-)asm ile
Degisken  equ 0x20
degisken1 equ 0x21

'2-)basic ile
degisken var byte
degisken1 var byte

'3-)ccs c ile
int8 degisken,degisken1;


Şimdi hepsindeki temel mantık aynı değilmi?Yani sırayla gidersek
1-)"0x20 adresine degisken adını koydum.Programın her yerinde adresi kullanmak istemiyorum.Ben degisken deyince sen o adrese git gerekeni yap." demektir.Yani derleyiciye bunu söylüyoruz.Dimi?
2-)Benim için bir yer ayarla.Byte tipnde olacak.Uygun yeri sen bul.Ben oraya değer yazacam.Beni sürekli adreslerle uğraştırma.Sen ayarla.
3-)Benim için bir yer ayarla.8 bit olacak.Uygun yeri sen bul.Ben oraya değer yazacam.Beni sürekli adreslerle uğraştırma.Sen ayarla.
Burada hepsi için temel felsefe sanıyorum şu;Ben belirttiğim adresin giriş kapısına o ismi verdim.İçeriği o kapı numarasını verdiğim kişiye götür yaz.Yani değişken isimleri sadece kapı numarası oluyor.içerik değil.Değişkenin tipi ise o kapının içindeki aile doktor mu bürokratmı bunu belirliyor.Yanılıyormuyum?Peki durum buyken ben pointer kullanarak değişkenin olduğu adrese erişiyorum.Neden zaten değişkenin ismiyle ben o adrese rahatça işlem yapabiliyorum.Ha birde void Fon() yada int fonk() olayı var.Sanıyorum her şey burda değişiyor.
int fonk() ile içeride tanımladığım değişkenler kalıcı olurken void fonk() ile tanımladığım değişkenler sadece fonksiyon içindemi geçerli oluyor.Yani o fonksiyon çalışınca değişken olşuyo sonra yok.Pointer ile void () fonksiyonu içinde tanımladığım değişkenler geçici ama o fonksiyon sonucu elde ettiğim değerleri ben ram de bir alanda tutuyorum.Hem fonksiyon çin yer ayırmış olmak zorunda değilim.Bu mu?
Lütfen izah eden biri olsun.Anlamadım gerçekten...
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: z - 01 Kasım 2011, 12:03:02
Alıntı yapılan: eistain_54 - 01 Kasım 2011, 10:45:48
....Hocam biz okuldayken asm ile yazıyorduk pic için ama ben iç pointer kulanımı görmemiştim.Belki mevzuyu çok uzattım ama ne olur anlayış gösterin....

PIC'in 16 serisine işlemci gözüyle bakmamak lazım. Yanlış hatırlamıyorsam PIC'de Indx diye bir register vardı. Bu registeri hiç kullanmadınmı? Bunu kullanmadıysan Ram'a pointerle erişim işlemi de yapmamışsın demektir.

PIC'de RAM'ın tamamını silen kodu ASM ve C de ayrı ayrı yazarmısın?

Sorunun diğer kısmını anlamadım. Cevap gelmezse daha anlaşılır şekilde tekrar yazmayı dene.




Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: eistain_54 - 01 Kasım 2011, 12:24:20
Ram'in tamamını silen bir kod mu?İlk kez duyuyorum.silmek istediğiniz yerin adresini yazarsınız ve clrf komutu kullanılır.Ben böyle biliyorum.Ders notlarımda ve aldığım kitapta bölye yazıyor.
clrf 0x20 gibi bir komut kullandığımızı hatırlıyorum.
c içinde 0x20==0 gibi bir şey yazılabilir sanıyorum.yukarıda Anlaşılmayan kısmı alıntı yaparsanız orayı tekrar sormak isterim.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: z - 01 Kasım 2011, 13:03:01
Abartayım, ASM programında diyelimki  1000 tane değişken tanımladın. Her birini silmek için her bir değişkeni silen satırın benzerini 1000 kez alt alta mi yazacaksın?

Alıntı YapDaha açık yazılmasını istediğim kısım ;

Kod: [Seç] (https://www.picproje.org/javascript:void(0);)
'1-)asm ile Degisken  equ 0x20 degisken1 equ 0x21 '2-)basic ile degisken var byte degisken1 var byte '3-)ccs c ile int8 degisken,degisken1; 

Şimdi hepsindeki temel mantık aynı değilmi?Yani sırayla gidersek
1-)"0x20 adresine degisken adını koydum.Programın her yerinde adresi kullanmak istemiyorum.Ben degisken deyince sen o adrese git gerekeni yap." demektir.Yani derleyiciye bunu söylüyoruz.Dimi?
2-)Benim için bir yer ayarla.Byte tipnde olacak.Uygun yeri sen bul.Ben oraya değer yazacam.Beni sürekli adreslerle uğraştırma.Sen ayarla.
3-)Benim için bir yer ayarla.8 bit olacak.Uygun yeri sen bul.Ben oraya değer yazacam.Beni sürekli adreslerle uğraştırma.Sen ayarla.
Burada hepsi için temel felsefe sanıyorum şu;Ben belirttiğim adresin giriş kapısına o ismi verdim.İçeriği o kapı numarasını verdiğim kişiye götür yaz.Yani değişken isimleri sadece kapı numarası oluyor.içerik değil.Değişkenin tipi ise o kapının içindeki aile doktor mu bürokratmı bunu belirliyor.Yanılıyormuyum?Peki durum buyken ben pointer kullanarak değişkenin olduğu adrese erişiyorum.Neden zaten değişkenin ismiyle ben o adrese rahatça işlem yapabiliyorum.Ha birde void Fon() yada int fonk() olayı var.Sanıyorum her şey burda değişiyor.
int fonk() ile içeride tanımladığım değişkenler kalıcı olurken void fonk() ile tanımladığım değişkenler sadece fonksiyon içindemi geçerli oluyor.Yani o fonksiyon çalışınca değişken olşuyo sonra yok.Pointer ile void () fonksiyonu içinde tanımladığım değişkenler geçici ama o fonksiyon sonucu elde ettiğim değerleri ben ram de bir alanda tutuyorum.Hem fonksiyon çin yer ayırmış olmak zorunda değilim.Bu mu?
Lütfen izah eden biri olsun.Anlamadım gerçekten...
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: ErsinErce - 01 Kasım 2011, 13:31:29
asm öğrenenlerin FSR yazmacından pek haberleri yok malesef, PIC öğretiyoruz diyen kitaplarda da bu konuyu göstermiyorlar
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: z - 01 Kasım 2011, 13:41:30
Evet tam hatırlayamadığım dediğim registerin adı Indx değil FSR idi.

Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: CLR - 01 Kasım 2011, 13:57:07
8085, 8051 ve Z80 tabanlı işlemcilerde index register olarak geçiyordu. 8085 ve Z80'de X ve Y index registerleri mevcuttu. Pic16 serisinde 1, pic18 serisinde 3 tane pointer gösterebilecek FSR register var. Zaten asm'nin yapamadığı işlemi C yapamaz. C sadece kolaylıktır, yüksek seviyeli dil tanımı buradan geliyor.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: eistain_54 - 01 Kasım 2011, 13:58:10
Alıntı yapılan: bunalmis - 01 Kasım 2011, 13:03:01
Abartayım, ASM programında diyelimki  1000 tane değişken tanımladın. Her birini silmek için her bir değişkeni silen satırın benzerini 1000 kez alt alta mi yazacaksın?

Evet.Benim bildiğim başka bir yöntem yok.Ben galiba iyice bocalamaya başladım.Alıntı yapılan kısımda ise ben olayı karikatürize etmek için senaryo gibi yazmak istedim.yani değişken dediğimiz şey bellekteki adrese isim vermekten ibaret değilmi?Bunu açıklamak istedim sadece.

@ErsinErce evet kitabın giriş kısmında GPR'ı anlatırken kısaca değinmiş.GPR erişemebilmek için File Select Register yazmacı kullanılır demiş ve programda kullanılacak değişkenler bu GPR alanına atılabilir demiş.Bir banktaki yazmaca erişebilmek için bank değiştirmek gerek bunu da status yazmacıyla yaparız falan filan diye devam ediyo...


Ya galiba herkeze mani oluyorum.Affedin ne olur.Ama şimdi anladım ki bu işe girerken yanlış yerden başladım ve bireyler eksik...Ama ne olduğunu bilmiyorum..
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: Mujdat117 - 01 Kasım 2011, 14:01:55
bunalmış hocam dolaylı adreslemeden bahsediyor sanırım
yani pic in fsr ve indf regestirilerini kullanarak. ram alanındaki istinlen bölegelrin değerleri okunabilir veya yazılablir.
asm olarak küçük bir örnekle açıklarsak. 0x20 adresinden başlayarak 5 adet pointer adresinin içeriğini sıfırlamak istediğimiz farzedelim

cblock 0x20
degısken1 ;silinmesini istediğimiz değişkenler 1-5 kadar
degısken2
degısken3
degısken4
degısken5
cnt           ;sayaç değişkenimiz. silinmesini istediğimiz adeti berlirtir.
endc

movlw      degısken1 ;degısken1 regestirisinin adresini wreg yükler
movwf      FSR ;degısken1 değişkenini adresi yüklenir ve degısken1 değişkenine ulaşmamızı sağlar.
clrf           INDF ;fili bir regestirir değildir. FSR ye yüklenen adresin içeriği INDF sanal adresinden okunur/yazılır.
incf FSR
decfsz    cnt;sayıyı bir azalt
goto     $-4;başa dön
maın
goto maın

bu şekilde isterseniz 255 tane ram adresini okuyabilir veya yazablirsiniz.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: muhittin_kaplan - 01 Kasım 2011, 14:20:13
ASM de (8051 olur PIC olur) adresleme modları vardır. Genel olarak yazarsam direk adresleme dolaylı adresleme, dolaylı indisli adresleme vs mikrodenetleyicinin gücüne göre bu sayı artar. şimdi adreslemedn kasıt olan olayı Kodlar üzerinde durmadan anlatayım.

0x08 adresine bilgi yazmak için
Yaz 0x08,AAh  ;
08 adresine AA yaz dedik bu doğrudan adreslemedir.

Yaz 0x01,08h  ;01 adresine 08 yaz buda doğrudan adreslemedir
Yaz @0x01,AAh ;dersek 01 e bak buradaki bilgiyi adres olarak (08) al ve o aldığın adresin içerisine AA yaz. bu
Dolaylı adreslemedir.

Pointer bu bağlamda dolaylı adresleme gibi çalışır.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: ErsinErce - 01 Kasım 2011, 14:21:29
Alıntı yapılan: eistain_54 - 01 Kasım 2011, 10:45:48
Burada hepsi için temel felsefe sanıyorum şu;Ben belirttiğim adresin giriş kapısına o ismi verdim.İçeriği o kapı numarasını verdiğim kişiye götür yaz.Yani değişken isimleri sadece kapı numarası oluyor.içerik değil.Değişkenin tipi ise o kapının içindeki aile doktor mu bürokratmı bunu belirliyor.Yanılıyormuyum?Peki durum buyken ben pointer kullanarak değişkenin olduğu adrese erişiyorum.Neden zaten değişkenin ismiyle ben o adrese rahatça işlem yapabiliyorum.Ha birde void Fon() yada int fonk() olayı var.Sanıyorum her şey burda değişiyor.
int fonk() ile içeride tanımladığım değişkenler kalıcı olurken void fonk() ile tanımladığım değişkenler sadece fonksiyon içindemi geçerli oluyor.Yani o fonksiyon çalışınca değişken olşuyo sonra yok.Pointer ile void () fonksiyonu içinde tanımladığım değişkenler geçici ama o fonksiyon sonucu elde ettiğim değerleri ben ram de bir alanda tutuyorum.Hem fonksiyon çin yer ayırmış olmak zorunda değilim.Bu mu?

Hepsindeki temel felsefe elinde bir veri var ve bunu saklayacak bir yer lazım, bu veriyi koyacağın yere bir isim veriyorsun ve sığması için belirli bir boyut ayarlıyorsun
bütün dillerde adresi sen ayarlıyorsun aslında yazma sıran adres numarasını değiştiriyor
asm de -cblock-, C de -int char vs- ve Basic -var dim vs- ile direk belirtebiliyorsun

Bunalmis hocanın dediğini gibi veri bloklarıyla uğraşırken pointer kolaylık sağlıyor ve yazacağın kod miktarını düşürüyor

void terimini bariyer olarak düşünebilirsin, fonksiyon tanımının yapısı
çıkış_değişkeni Fonksiyon_ismi( giriş_değişkenleri )
şeklindedir. void koyarak çıkışı kapatırsan geri dönüş, girişe koyarsan giriş değerin olmaz.

Değişkenleri global konuma ( yani fonksiyonların dışına ) yazmazsan hepsi local (sadece fonksiyon içinde geçerli) değişkendir.

yani

int global_degisken;

int main(void){

int local_degisken;

}
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: eistain_54 - 01 Kasım 2011, 14:40:37
Çok  teşekür ederim.Şimdi biraz daha iyi durumdayım.Yani taşlar yavaş yava oturuyor.Sanırım örnek programlar daha iyi kavramama yardımcı olacaktır.Bir ricada bulunsam?
Bu konuya dair örnek olabilecek uygulamalar nelerdir?Bi kaç satırla kodları paylaşsak?Gerçekten minnettarım.Kusuruma bakmayın lütfen biraz geç anlıyorum sanırım...
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: ErsinErce - 01 Kasım 2011, 14:55:27
Bunalmis çok güzel örneklerle tek tek anlatmış, aklına gelen herşeyi bu şekilde yapabilirsin, bundan sonrası senin algoritma kurgulamana bağlı
burada yazılmış yazıları tekrardan okursan şu an çok daha farklı algılacaksın, bir tekrar yaparsan senin için herşey yerine oturmuş olacak,
Kurgu yeteniğinde farklı program ihtiyaçlarına ihtiyaç duydukça gelişecektir zaten.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: eistain_54 - 01 Kasım 2011, 15:00:22
Anladım.Gerçi bugğn bile en az 10 kez okuduğum o satırları bir 10 kez daha okurum.Dediğiniz doğru ihtiyaçlara göre kendi programımı yazdıkça duru değişecektir zaten.Çok teşekkür ederim.Sanırım bu baaşlık altından yapılacak başka paylaşım kalmadı.Yani daha c konusu varmı anlatılacak?
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: z - 01 Kasım 2011, 16:29:22
Unutmadığımzı bir şey varmı bilmiyorum en sona bıraktığımız structure  ve union konusuna https://www.picproje.org/index.php/topic,35908.50.html (https://www.picproje.org/index.php/topic,35908.50.html)  linkinden erişebilirsiniz.

Fakat burada sorularınızı tartışalım.

Burada eistain_54 e bir sorum olacak.

Tamam

int A,B;
char x;
gibi tanımlar yaparak C bana Ramda yer ayarlıyor. Sen de örneğin A=10; diyerek bunları kullanıyorsun.
Burada A değişkeninin adresi her şey olabilir.

Eğer   

int A,B;
char x;

Tanımı yerine

int Z,A,B;
char x;

Tanımı yaparsan biraz önceki A değişkeninin adresi ile şimdi yaptığımız tanımdaki A değişkeninin adresi farklı olur.

Fakat çiplerde bazı değişkenlerimizin adreslerinin sabit olması gerekir. Buna örnek olarak portları verebiliriz.

Peki nasıl olacak da olacak Örneğin adına PA dediğimiz portun C'deki adresini gerçek donanımdaki adresi olarak tanımlayacağız?

Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: eistain_54 - 01 Kasım 2011, 17:57:55
Ben bu soruyu anlamadım.Yani bir donanımsal port var.Porta gibi.Bunun C deki adresini nasıl buluruz?Soru bu mu?Buysa bişey anlamadım...
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: muhittin_kaplan - 01 Kasım 2011, 18:05:22
Biraz ben açayım.
int A,B
şeklinde tanımlama yaptık ce derleyici A değişkeni olarak 0x05 Ram Bölgesine, B değişkeni olarak ta 0x06 Ram bölgesine bunları atadı.
Peki int Z,C,A,B yaparsak ne olur örnek olarak
Z   0x05
C   0x06
A   0x07
B   0x08
Adreslerine atar.

Burada A nın hep Aynı RAM adresine ayrılması istiyoruz. (Örneğin PORTlar öyle)
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: eistain_54 - 01 Kasım 2011, 18:20:54
Anladım.O halde sıralamaya dikkat edeceğiz.Başka br yöntem olarak adreslerini yazabiliriz belki.#org komutu belki bir işe yarayabilir?Heralde bu konu pointer ile ilgili.Yanılıyormuyum?En son çare de pointer kullanmak olacaktır.?
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: muhittin_kaplan - 01 Kasım 2011, 18:52:51
Bunalmış hocanın sorusu istediğimiz herhangi bir değişkenin hep aynı RAM adresine denk gelmesini nasıl ayarlarız ? Sanırım.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: eistain_54 - 01 Kasım 2011, 18:58:31
Bilmiyorum.Ve açıkçası merak ediyorum...
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: z - 01 Kasım 2011, 19:01:44
Mesela PA portu çipin 0x1000 adresinde yer alıyor olsun.

C'de PA diye bir değişken tanımlayın. Bu değişkenin adresi 0x1000 de olsun.




Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: eistain_54 - 01 Kasım 2011, 19:10:02
Gerçekten bilmiyorum.Daha evvel böyle bir ugulamaya ihtiyacım olmadı.Nasıl yapılır?
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: eistain_54 - 01 Kasım 2011, 19:18:32
Buldum geçmişi karıştırırken fakettim.Ama bumu değilmi emin değlim.
https://www.picproje.org/index.php/topic,35908.60.html
[quote]
[]code
#define  // Tanım yapmak için kullanırız.

  //Ornekleri inceleyin.

#define  AlarmLediniYak 0x10


    GPIO.PORTA.ODR |=AlarmLediniYak;

    // Yukarıdaki ifade
GPIO.PORTA.ODR |=0x10;  //komut satırına eştir.

     //Ancak
     GPIO.PORTA.ODR |=AlarmLediniYak;  //okunaklığı ve anlaşılırlığı yüksektir.

//Yada aşağıdaki örneğe bakın

#define Yan GPIOD->ODR= 0x0000F000
#define Son GPIOD->ODR= 0x00000000

    if (LedFlag) Yan;     // Ledler yansin
      else Son;                  // Ledler sonsun

//Yukarıdaki iki satır aşağıdaki satırlarla aynı anlama gelir.

     if (LedFlag) GPIOD->ODR= 0x0000F000;     // Ledler yansin
       else GPIOD->ODR= 0x00000000;                  // Ledler sonsun

[/quote]
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: eistain_54 - 01 Kasım 2011, 19:19:59
Yani #define ile yapılır.


#define PA 0x1000

şeklide yapılır.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: z - 01 Kasım 2011, 19:37:03
Alıntı Yap#define PA 0x1000

Eğer böyle yaparsan C derleyici, PA gördüğü her yere 0x1000 değeri yazmaya kalkar. Dolayısı ile yapmak istediğimiz bu değil.

PA portu, 8 bitlik bir port olsun.

Bu durumda bu porta unsigned char tipinde veriler yazacağız yada okuyacağız demektir.

unsigned char* PA;

tanımı yaptıktan sonra

PA=(unsigned char*)0x1000; diyebiliriz. Böylece PA pointerine 0x1000 değerini yüklemiş oluruz.

Artık *PA=78; dersek 0x1000 portundan 78 sayısını çıkmış oluruz.

Fakat burada PA nın önünde * görmek hoş olmuyor. Bunu görünmez yapalım. Üstelik bu şekilde tanımladığımız PA, RAM'da da yer kaplamaktadır. Bu sorunları da yok edelim.

Fakat yukarıdaki örnekte şu zamana kadar hiç bahsetmediğimiz type casting işlemi yapıldı.

Önce type casting sonra da define tanımını açıklayalım daha sonra da Bu sorunları da yok edelim dediğimiz konuya geri dönelim.

Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: eistain_54 - 01 Kasım 2011, 19:54:44
Alıntı yapılan: CKITABI date=1320169023



int i,j;
int *ig,*jg;
ig=&i;
jg=&j;
//Bu yazım şekli ig isminde integer tipinde tanımlanmış pointerın içerisine i isminde integer tiindeki deişkenin adresini yazar ve bu adres erişilebilir adres durumundadır.Yani içerisine değer yazabilir yada okuyabiliriz.Birde şu yazım şekli vardır ki;
ig=i; // Böyle bir yazımda i adresini ig ye koyacaktır ve ancak i değişkeni içindeki tam sayı bir adres olarak kullanıldığında işe yarayacaktır.C standardına uygun derleyiciler böyle bir durumda uyaracaklardır , çünkü değişkenlerin tipleri uymamaktadır.

C Kitabından alıntıdır.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: ErsinErce - 01 Kasım 2011, 23:01:26
herkes beklemede galiba ben cevap vereyim;
linker'a belirttiğimiz adrese istediğimiz ismin verilmesini sağlamamız gerekli
çoğu linker @ işaretini kabul ediyor ama keil  __attribute__((at(0x8000))) ve ya .ARM.__at_0x00008000
dizelerinden birini istiyor. ( bunların kullanımı arasında da fark varmış aslında ama ilk seçeneği default olarak kullanabiliriz =) )

int reg @0x8000 =0;
int reg __attribute__((at(0x8000))) =0;

şeklinde de kullanılıyor
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: z - 02 Kasım 2011, 04:18:09
@ErsinErce

Guzel bir bilgi vermissin.

Ancak hedef adresin içeriğini, nasıl byte olacağını belirleyeceğimizi anlamadım. Verdiğin örnekler hedefi int tanımlıyor.

Fakat biz simdilik isimizi linker ile değil de C derleyicisi ile cozelim.

Eğer sabit adresdeki 8 bitlik bir hedefe örneğin 0x10 sayısını yüklemek istersek aşağıdaki şekilde pointer yapısı ile ulaşabiliriz.

      *(unsigned char*)0x1000=0x10;

Burada yapılan;

unsigned char yani 8 bitlik bir adresi, işaret eden hayali bir pointere 0x1000 değerini ata ve bu pointerin gösterdiği yere0x10 değerini yerleştir

Fakat bu yazım, çok üstü kapalı ve okunaklığı zayıf bir gösterim olduğundan #define ile bu adres ifadesine özel bir isim verilebilir.

#define Reg  *(unsigned char*)0x1000

Bu durumda Reg=0x10 dersek derleyici Reg gördüğü yere *(unsigned char*)0x1000 yerleştirip öyle derleyecektir.

olası optimize işlemleri sonucu ortaya çıkacak sorunları kaldırmak için volatile ön ekini de getirirsek;

#define Reg    *(volatileunsigned char*)0x1000

aradığımız cevaplardan birisi olacaktır.

#define tanımlayıcısını anlamak

#define Carp *

y=a*b; ile  y=a Carp b; aynı anlama gelir.

Bu satırlara kadar olan kısımlar, BASIC kullanıcısı olarak artık size bir şeylerler ifade ediyorsa, https://www.picproje.org/index.php/topic,35908.0.html (https://www.picproje.org/index.php/topic,35908.0.html) linkine muhakkak gözatın.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: z - 02 Kasım 2011, 08:02:24
Bir konuda hatırlatma yapmak istiyorum.

Ben kart elime ulaşınca bu konuları takip edeceğim düşüncesindeyseniz konulara yetişemez çok geride kalırsınız. Bu nedenle kursumuzu takip edecekseniz ve C sorununuz varsa bunu mümkün olan en kısa zamanda kartlar size ulaşmadan halletmeye bakın.

C yi mükemmel kullanmak gibi bir hedefimiz yok. Bu aşamada kafamızdan geçen bir işlemi C satırlarına dökebilelim yeter.

Konuları kart olsun olmasın takip edebilir ve Keil'de denemeler yapabilirsiniz.

Keil'de basit kod parçacıkları yazıp derleyip debug etme konusunda sıkıntısı olanlar varsa https://www.picproje.org/index.php/topic,35719.0.html (https://www.picproje.org/index.php/topic,35719.0.html) linkindeki
Keil programının kurulumu ve kullanılması (https://www.picproje.org/index.php/topic,35719.msg254346.html#msg254346) başlığına gözatmaları yeterli olacaktır.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: ErsinErce - 02 Kasım 2011, 08:54:21
bunalmis hocam vereceğimiz adres mecburen byte adresi olacak, bu yapı PIC'de de aynı ARM'da da
RAM'de 0x02 adresinde char varsa 0x03 adresinden itibaren kullanıyoruz ama long bir yapı varsa 0x06 adresinden itibaren kullanıyoruz,
yani adresleme her zaman standart byte sayısına bağlı

char tanımlamak istersek aşağıdaki gibi kullanabiliriz, farklı tipler için sadece ön eki değiştirmek yeterli

char reg @0x8000;
char reg __attribute__((at(0x8000)));
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: subram - 24 Aralık 2011, 01:25:42
hocam merhaba konuyu daha yeni gördüm. çok güzel bir uygulama olmuş. ilk sayfasına baktım konunun zamanla tüm sayfalara bakarım. ama 2 kasımdan sonra ilerleme olmamış. devam edecek misiniz bu başlığa yoksa yeterlilik mi verdiniz?
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: z - 24 Aralık 2011, 01:32:45
Devam ederiz de katilim olmayinca icimden yazmak gelmiyor. Kendim calip kendim oynuyorum gibi oluyor.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: eistain_54 - 24 Aralık 2011, 01:45:45
Hocam tekrar meraba.Hala buralardamısınız?Benim anlamadığım bir konu var.Tam olarak C dili ile mi ilgili bilmiyorum ve bu başlıkta konuşulmalımı bilmiyorum.Acaba sorsammı ? :)
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: z - 24 Aralık 2011, 01:48:58
@Gerbay su anki zamanı kasdetmiyordum.

@Einstein_54

ARM öğreniyoruz projesinde tüm diller eninde sonunda C'ye varacak. Amacımız zaten C idi. Sen sor sorun olmaz.

Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: eistain_54 - 24 Aralık 2011, 01:59:54
GPIOD->ODR= 0x0000F000
bu sayı 32 bit.En soldan başlarsak bu sayı şöyle mi olur:

0x00000000000000001111000000000000 mü?
Bunun daha kolay bir yolu var mı?Yani daha farklı sayılarda kavraması zor oluyor da.

0xfdaecb0a gibi...
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: z - 24 Aralık 2011, 02:07:33
32 bit sayıların bit karşılıklarını görmek, yada bitlerin 32bit karşılığını bulmak için calc.exe diye bir program linki vermiştim.

Bu program örnek  programlarda elimiz ayağımız. Normalde registerlere bu şekilde hex değer atamak yerine (1<<13)|(1<<2) gibi kaydirma komutlari da kullanilabiliyor.

Fakat ben hex sayi kullanmayi tercih edıyorum. Bu yüzden de örnek programlar malesef hex formattaki sayıların atamasından oluşuyor.

İlerleyen dönemlerde alternatif yazım şekillerine alışacak hatta header dosyalardaki hazır kelimelerle daha okunaklı register değer atamaları yapabileceksiniz.

CALC.exe nin linki http://www.cncdesigner.com/STM/Calc.rar

Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: eistain_54 - 24 Aralık 2011, 02:18:58
abi öğrenmek istediğim bir şey daha var ama sanırım şamatalarda sorsak daha iyi. Ama şansımi demeyeceğim. Örnek temel programlarda verdiginiz registerler varya aynı isimdeki registerin farklı donanımları harekete geçirdiğini gördüm. Pic deki options register gibimı acaba? Yani sadece registerin bit değiştirmesi yeterli oluyo diğer donanıma erişmek için. Birde bir register katologu falan hazırlasak... Çünkü veri kataloğu ıngilizce ve benim gibi bir çok kişinin ki gibi yetersiz. Gerçi register listesi orada mi acaba ?
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: z - 24 Aralık 2011, 02:29:26
Alıntı yapılan: eistain_54 - 24 Aralık 2011, 02:18:58
Örnek temel programlarda verdiginiz registerler varya aynı isimdeki registerin farklı donanımları harekete geçirdiğini gördüm.

Bir örnek ver mesela. Nerede farklı donanımlar harekete geçiyor?

Malesef dokumanların Türkçesi yok. Bunları tercüme edip katalog oluşturacak gönüllü çıkacağını da sanmıyorum. Bu dokümanları anlamak için vasat bir ingilizce yeterli.
Sen şimdi böyle dedin ya kafamda bir ampul yandı. İzle gör.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: subram - 24 Aralık 2011, 03:00:35
hafif bir dürtmek gerekiyormuş herhalde konu canlandı birden :)
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: eistain_54 - 24 Aralık 2011, 09:32:12
Alıntı yapılan: bunalmis - 24 Aralık 2011, 02:29:26
Bir örnek ver mesela. Nerede farklı donanımlar harekete geçiyor?

Malesef dokumanların Türkçesi yok. Bunları tercüme edip katalog oluşturacak gönüllü çıkacağını da sanmıyorum. Bu dokümanları anlamak için vasat bir ingilizce yeterli.
Sen şimdi böyle dedin ya kafamda bir ampul yandı. İzle gör.
şuan telefondan bağlandığım için örnek vermem mümkün değil. Son cümlemizi okuyunca gerçekten ürkütm açıkçası. Ama açtığınız yeni konuyu görünce hem çok rahatladım hemde çok sevindim çünkü gerçekten bir şeyler yapma çabanız var. Eğer emeklerd layık olamazsam hakkımızı helal edin ne olur. Biliyorum şahsıma yapılan bir hizmet değil ama yinede düşüncelerimi belirtmek istedim. Bu arada bu mesajı silin lütfen...
GERÇEKTEN TEŞEKKÜRLER!!!
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: rree - 24 Aralık 2011, 11:57:28
    Basic den C geçeli 1 sene oldu.CCS kullanıyorum.
Sorum şu olacak
                                         #define Reg    *(volatileunsigned char*)0x1000
tanımı ile
                                          char reg @0x1000;
Aynımıdır.
İkiside  reg  char değişkenin  adresi 0x1000 oluyor.
Farklı bir yapımı
char reg @0x1000;   Bu tanımı anlatırmısınız.


Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: z - 24 Aralık 2011, 13:46:30
Keilde daha dogrusu standart C de @ kullanimi varmi?
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: fryrmnd - 24 Aralık 2011, 15:09:05
bunalmış hocam sorularınızın tartışmasını hangi başlıktan yapıyorsunuz?
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: z - 24 Aralık 2011, 15:13:45
Evet onun icin ayri bir baslik acalim. Basliklar kisa zamanda kabariyor okumasi zorlasiyor.

https://www.picproje.org/index.php/topic,36908.0.html  linkinde tartisiriz.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: rree - 10 Ocak 2012, 10:21:16
#define P1TCON    *(volatile unsigned char*)0x01C0

Main:
     P1TCON =0;  //Hata verdi CCS bu tanım geçersimi veya nerdede yanlış yaptım.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: muhittin_kaplan - 12 Ocak 2012, 20:31:09
eğer a=1 ve b=0 a eşit değilse yi nasıl yazıyorsunuz ?
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: ErsinErce - 12 Ocak 2012, 20:34:15
mantıksal olarak başka türlü yorumlanarak da yazılabilir ama dediğinizin birebir karşılığı şu şekilde

if(!((a==1)&&(b==0))){

}
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: omereliusuk - 12 Ocak 2012, 23:19:23
Alıntı yapılan: muhittin_kaplan - 12 Ocak 2012, 20:31:09
eğer a=1 ve b=0 a eşit değilse yi nasıl yazıyorsunuz ?
burada bir virgül eksik gibi geliyor.
if((a==1)&&(b!=0)){}

if(!((a==1)&&(b==0))){}
ikisi farklı şeyler değil mi?
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: ErsinErce - 12 Ocak 2012, 23:30:08
evet ikisi farklı, biraz koşulların netleşmesi lazım, yazılı kısmı olayın parantezi gibi görüp o cevabı yazdım
ama sizin dediğiniz gibide olabilir
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: muhittin_kaplan - 13 Ocak 2012, 12:54:04
eğer (a=1 ve B=0) değilse, sorunun doğrusu
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: omereliusuk - 13 Ocak 2012, 22:59:58
Alıntı yapılan: muhittin_kaplan - 13 Ocak 2012, 12:54:04
eğer (a=1 ve B=0) değilse, sorunun doğrusu
if(!(a && !b));
bir de a sadece 1 mi olacak yoksa 0 harici herhangi bir sayı mı? bu da önemli. çünkü a değeri 0 değilse her zaman 1 dir. ama sadece 1 durumu biraz daha farklı.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: omereliusuk - 13 Ocak 2012, 23:01:30
bir de biz neden yazdığımız metni değiştiremiyoruz? ben bazen düzeltme yapmak istiyorum ama değiştirme butonu yok. bu benim için ciddi bir sorun.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: muhittin_kaplan - 13 Ocak 2012, 23:07:37
00
01
10----Bunun dışında bir olasılıkta işlemi yapsın
11
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: omereliusuk - 13 Ocak 2012, 23:30:20
if(!(a && !b));
a=1;
b=0;
sonuç olarak a=1 olduğu zaman durum doğru; b=0 olduğu zaman değilini aldığımız için durum doğru;
her iki durum doğru olduğu için sonuç doğru;
bütün bunların değilini aldığımız için durum yanlış; parantez dışına çıktı.

diğer hallerde durum doğru işlem yapılıyor.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: rree - 14 Ocak 2012, 00:20:46

#include <16F628A.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#use delay(clock=20000000)

#define PortB    *(volatile unsigned int8*)0x06
#define B0       *(volatile unsigned int1*)0x30
#define TrisB    *(volatile unsigned int8*)0x86

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_ccp1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   //TODO: User Code
   TrisB=0x00;
     While(True)
      {
         
         B0=0;
         Delay_ms(1000);
         B0=1;
         Delay_ms(1000);
      } 

}

  CCS 4.110 hatasız derliyor.Proteus da  portb de hiçbir değişiklik yok.
Asmbler kotları şöyle
....................          B0=1;
0046:  BSF    30.0
Ben hala   burada kaldım.  #define B0       *(volatile unsigned int1*)0x30  burayı anlamadım. ikinci * görevi nedir.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: fahri- - 14 Ocak 2012, 01:00:05
CCS de

portb b0' ı 1ve 0 yapmak için:

output_high(pin_b0);// high yapar
output_low(pin_b0); //low yapar.

Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: z - 14 Ocak 2012, 01:07:32
Alıntı yapılan: rree - 14 Ocak 2012, 00:20:46
Ben hala   burada kaldım.  #define B0       *(volatile unsigned int1*)0x30  burayı anlamadım. ikinci * görevi nedir.

P diye int bir pointer tanimla
A diye int bir degisken tanimla

P ye A nin adresini ata

Sonra da P nin point ettigi yere 0x10 sayisini yukle.

Bu kodu yaz ben sana ikinci * in gorevini aciklayayim.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: rree - 14 Ocak 2012, 12:22:54
volatile unsigned int8 *P,A;

void main()

    P=&A;
   *P=0x10;
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: Klein - 14 Ocak 2012, 13:27:57
Peki P integer pointer , A ise long olsaydı

*p = 0x10 atamasını yine yapabilir miydin?
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: z - 14 Ocak 2012, 15:22:24
Alıntı yapılan: rree - 14 Ocak 2012, 12:22:54
volatile unsigned int8 *P,A;

void main()

    P=&A;
   *P=0x10;

Senin yazdigin bu programda da 2 tane * var.

Simdi bu yildizlarin hangisi, #define B0       *(volatile unsigned int1*)0x30  satirindaki yildiza denk geliyor?
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: rree - 14 Ocak 2012, 19:36:20
Birinci yıldız   
     volatile unsigned int8 *P,A;
     P diye bir pointer tanımlıyor.
İkinci yıldız
     *P=0x10;
     Pointerin gösterdiği adrese 0x10 atıyor.

Sırayla aynı anlama geldiğini düşünsem.
   #define B0       *(int1*)0x30
   ikinci yıldız niçin parentrez içinde

Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: Klein - 14 Ocak 2012, 20:48:08
C esnek bir dil. nereye ne yazarsanız kabul eder. Ama konu Pointer olunca bir anda tüm kurallar katılaşır. Bu yüzden pointerler üzerinde işlem yaparken, pointer'e adresini atacağınız verinin tiplerinin aynı olması gerekir. Hatta bu aynılık sadece verinin kapladığı alanla bile sınırlı değildir. Tiplerinin bir'e bir aynı olması gerekir.
Örneğin:
int a;
unsigned int *b;

her ikisi de bellekte aynı yeri kaplıyor olmasına rağmen

b= &a; diyemezsiniz. Derleyici hatası oluşur. Halbu ki bellekte aynı uzunlukta yer kaplarlar. gerçekte hiç bir sıkıntı çıkarmadan çalışabilir. Ama C buna izin vermez.
Ama bazen bizim bu adreslerdeki veriye , tipfarkı olsa da ulaşıp veri üzerinde işlem yapmamız gerekir.
C'ye bu farkı görmezden gel, ben ne yaptığımı biliyorum, bu seferlik idare et dememiz gerekir.
bunun için kasıt operatörünü kullanırız.

eğer yukarıdaki adres atamasını şu şekilde yaparsak :

b = (unsigned int *) &a; dersek derleyici bu işe izin verecektir.

Peki tipleri farklı verilerde ne olacak.
diyelim ki :

char *ptr;
char a;
int b;

değişkenlerimiz var. 
bizim b değişkeninin alt 8 bitlik kısmını almamız gerek. Örneğin I2C eeprom'a yazacağız ve eeprom'a veriyi 8 bit olarak gönderiyoruz.
Verimiz 16 bit ama almamız gereken değer 8 bit.

derleyiciye ptr = &b dersek, derleyici kızar. Senin istediğin adres tek baytlık ama sen iki baytlık bir adres istiyorsun. Ben bunu vermem.
Derleyiciyi ikna etmek için  ptr = (char *) &b dememiz gerekir.

Peki kasıt operatörünü kullanmazsak derleyici niye kızar.

bir array düşün.
int arr[3]; bu aray bellekte şu şekilde yerleşmiş olsun:
char *ptr;
int a;
arr[0] 0x0000 adresine , arr[1] 0x0002 , arr[2] de 0x0004 adresinde olsun.  İçerikleri de 0x4600,0x2739,0x1678 olsun.
bellek düzeni ise şöyle olacaktır
0x46,0x00,0x27,0x39,0x16,0x78

ptr = &arr[0] dersek ve derleyici buna kızmazsa ptr işaretçimizin içeriği 0x0000 olur.

a= *ptr dersek a'nın içeriği  0x4600 olur. Buraya kadar sorun yok.
peki  ptr++ dersek ne olur? ptr nin gösterdiği adres 0x01 olur. Çünkü işaretçimizin tipi char.

şimdi a= *ptr dediğimizde a'nın içeriği 0x0027 olur. Çünkü a değişkenimiz 2 byte ve biz buna bir atama yaptığımızda 2 byte atanır.
Bu değeri bir program içinde bir yerde kullanmaya kalktığımızda başımıza iş alabiliriz.
İşte bu yüzden derleyiciye , ben ne yaptığımı biliyorum dememiz gerekir.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: rree - 14 Ocak 2012, 23:24:13
Eline sağlık güzel açıklama oldu.
fahri-  arkadaşımın out fonksiyonunu biliyorum. pointer konusunda anlamadığım noktaları öğrenmek istedim.
Bir sorum daha olacak.

#include <main.h>
#include <mainSetup.c>

#define PortB    *(volatile unsigned int8*)0x06
#define B0       *(volatile unsigned int1*)0x06
void main()
{ msetup();
   set_tris_b (0b00000000);
   PortB=0b01010111;
   B0=0; 
  While(True){}
}


Bu yöntem ile  PortB nin 2. bitinini yani B1 tanımlayabilirmiyim.
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: LukeSkywalker - 08 Temmuz 2012, 19:13:11
Merhaba.
GPIOD->MODER

Şe4klindeki bir yazımdan derleyici tam olarak ne anlıyor?
İşlemcinin dökümanında "GPIOx_MODER" adında bir register zaten var.
GPIOD->MODER=0x55000000;
yerine
GPIOD_MODER=0x55000000;
yazamaz mıyız?
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: muhittin_kaplan - 10 Kasım 2012, 17:52:34
Cevabı Basit bir sorudur muhtemelen ama aklıma takıldı.

PC de program yazarken uygulanan yöntem ;

Public HerhangiFonksiyon(Port as SerialPort,  Kanal as integer)
     OkunacakPort(Port)
     OkunacakKanal=Kanal
End Function
yukardaki sözde fonksiyonda serial port olarak önceden tanımlanmış bir nesneyi fonksiyona parametre olarak gönderebiliyorum. Bunu C de nasıl yapacağım.

örneğin

void ADC_Port_Config (Port,Pin)
{
   GPIO_InitTypeDef GPIO_InitStructure;
   GPIO_InitStructure.GPIO_Pin = Pin;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(PORT, &GPIO_InitStructure);
}

Şeklinde nasıl yapabilirim
Başlık: Ynt: BASIC kullanıcılarını C'ye alıştırma turları
Gönderen: Klein - 10 Kasım 2012, 18:10:35
ST nin standart kütüphanesini veya  daha önce verdiğim alternatif header veya C++ öneklerini incelersen, cevap orada var. Ama kısaca bahsedeyim.

Stm32f4xx.h dosyasında portlar için

GPIO_TypeDef  isimli bir struct var.
Ayrıca tüm donanımlar için benzer tapılar var.  Bu yapıyı fonksiyonuna pointer olarak geçeceksin.

void ADC_Port_Config (GPIO_TypeDef *port , uint32_t Pin)
{
uint32_t pin_mask = 1 << pin;
   GPIO_InitTypeDef GPIO_InitStructure;
   GPIO_InitStructure.GPIO_Pin =pin_mask;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(PORT, &GPIO_InitStructure);
}