C Programlama diliyle şamatalar

Başlatan z, 23 Ekim 2011, 15:32:04

z

Bu başlık, Arm öğreniyoruz ders konusunun C Programlamaya giriş başlığıyla alakalıdır.  https://www.picproje.org/index.php/topic,35720.0.html

C dilinde hiç çalışmamış fakat ARM işlemcilerle henüz uğraşmaya başlayan arkadaşlar, burada C konusuyla ilgili sorularına cevap bulacaklar.

STM32F-Discovery örnek temel programlar  https://www.picproje.org/index.php/topic,35896.0.html başlığında geçen bazı satırlarda gördüğünüz

atama komutlarıyla ilk başlangıcı yapıyorum.

---------------------------------------------------------------------------------------------------
GPIOD->OSPEEDR= 0xFFFFFFFF; 

Yukarıdaki kod ne demek?

C programlamaya giriş https://www.picproje.org/index.php/topic,35720.0.html başlığında structure  ve structure  pointer yapısını göreceğiz.

Şimdilik GPIOD->OSPEEDR= 0xFFFFFFFF;   Satırını,  adı GPIOD_OSPEEDR olan registerin içine 0xFFFFFFFF hex sayısını yaz demek olduğunu düşünün.

---------------------------------------------------------------------------------------------------

İşletilen her C satırının sonu muhakkak ; ile sonlandırılmalıdır. (For, while gibi istisna komutlarlarda neden ; olmadığı daha sonra anlaşılacak)

---------------------------------------------------------------------------------------------------
Bir satırın en soluna // konursa o satır komut satırı olmaktan çıkar açıklama satırına dönüşür.
---------------------------------------------------------------------------------------------------

GPIOD->OSPEEDR |= 0xFFFFFFFF;

| OR işlemi demektir. Yukarıdaki komut  GPIOD_OSPEEDR registerinde saklanan veri ile 0xFFFFFFFF verisini OR işlemine tabii tutup sonucu gerisin geriye
GPIOD->OSPEEDR registerinin içine yazar.

Aynı satırı GPIOD->OSPEEDR = GPIOD->OSPEEDR | 0xFFFFFFFF;  olarak da yazabiliriz.

---------------------------------------------------------------------------------------------------

GPIOD->OSPEEDR &= 0xFFFFFFF0;

& AND işlemi demektir. Yukarıdaki komut  GPIOD_OSPEEDR registerinde saklanan veri ile 0xFFFFFFF0 verisini AND işlemine tabii tutup sonucu gerisin geriye
GPIOD->OSPEEDR registerinin içine yazar.

Aynı satırı GPIOD->OSPEEDR = GPIOD->OSPEEDR & 0xFFFFFFF0;  olarak da yazabiliriz.

---------------------------------------------------------------------------------------------------
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

fryrmnd


ilhan_mkp

hocam şimi neden and kullandık neden or kullandık ?

z

#3
Ne zaman OR ne zaman AND?

A adında degişkenimiz olsun. Bunun en düşük 2 bitine 10 verisi yükleyelim. Fakat A nın diğer bitleri değişmesin.

A= A & 0xFFFFFFFC;  yada  A&= 0xFFFFFFFC; En düşük bitleri sil (Diğer bitleri 1 ile AND'lediğimiz için değişmez)

A= A | 0x00000002;  yada   A|= 0x00000002; Silinmiş bitler 00, bunu 10 ile OR'la ve yerine yaz.

Böylece diğer bitler aynen kaldı fakat en düşük bitler 10 yapılmış oldu.

Eğer A registerine doğrudan A=0x00000002 yazsaydık en düşük 2 bit 10 olacaktı fakat diğerleri de 0 olacaktı. (Bunu istemeyiz)

-----------------------------------

Şimdiye kadar görmediğimiz NOT operatörü ile de aynı işlemi yapabiliriz.

A&= ~0x00000003; En düşük 2 biti (A1 A0) sil (Diğer bitleri 1 ile AND'lediğimiz için değişmez)
A|=    0x00000002; Silinmiş bitler 00, bunu 10 (Decimal 2) ile OR'la ve yerine yaz.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

gambit1244

Alıntı YapGPIOD->OSPEEDR |= 0xFFFFFFFF;

| OR işlemi demektir. Yukarıdaki komut  GPIOD_OSPEEDR registerinde saklanan veri ile 0xFFFFFFFF verisini OR işlemine tabii tutup sonucu gerisin geriye
GPIOD->OSPEEDR registerinin içine yazar.

hani insanın kafasında ampul yanar ya,
şu ufacık bilgi acayip yol aldırdı bana cok onemli noktalara degindiniz hocam
empatinin anlamını biliyosunuz.
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

z

#5
#include "xxx.h"

Sıkı sıkı kalıplaşmış tanımlar yapmadan bazı konuları açıklayacağım.

#include "xxx.h"

Ne demek?

Mesela bir programın içinde aşağıdaki kirmizi ve mavi renkte yazdigim satırlar olsun.

int topla(int a, int b)
{
  return(a+b);
}

int cikart(int a,int b)
{
  return(a-b);
}

Bu programı böyle yazmak yerine şu şekilde de yazabilirim.

#include "xxx.h"

int cikart(int a,int b)
{
  return(a-b);
}

Topla programını sakladım. Nereye sakladım?

Eğer notepad ile xxx.h dosyasını açarsanız içinde aşağıdaki satırları göreceksiniz.

int topla(int a, int b)
{
  return(a+b);
}

#include dahil et demek. Neyi dahil edecek  iki " içine alınmış dosyayı.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#6
int a;
int b, c;
unsigned int d;

Bunlar ne demek?

ARM CM3 ve CM4 işlemcilerimizde, int,  32 bitlik işaretli tam sayılar demek.

int a;  a değişkenim 32 bit uzunlukta ve işaretli tam sayı saklayabilir demek.

int b, c;  b ve c değişkeni, 32 bit uzunlukta ve işaretli tam sayı saklayabilir demek.

o halde

int a;
int b, c;

yerine   int a, b, c;  yazabilirim.

İşaretli sayı ne demek?
İşaretli sayılar asm de de basic de de C de de kullanılmaktadır. Bu nedenle bu soruya cevap vermeyeceğim. Eğer işaretli sayı (2' complement numbers) ne demek bilmiyorsanız ARM kursuna katılabilecek seviyede bilgi birikiminiz yok demektir.

unsigned int a;  ne demek?

a değişkeni 32 bit ve işaretsiz sayıları saklayabilir demek.

32 bitlik 0xFFFFFFFF sayısını, int a tanımlı değişkene yazarsam a ya decimal kaç sayısını yazmış olurum?
0xFFFFFFFF  -1 demektir. Demekki a değişkenine -1 yazmışım.

32 bitlik 0xFFFFFFFF sayısını, unsigned int a tanımlı değişkene yazarsam a ya decimal kaç sayısını yazmış olurum?

0xFFFFFFFF  (2^32) - 1 demektir. Demekki a değişkenine çok büyük bir sayı yazmışım.



Bana e^st de diyebilirsiniz.   www.cncdesigner.com

CoşkuN


z

#8
short char  long  ve long long ne demek

short a;   

a değişkeni 16 bit ve işaretli tam sayı saklayabilir demek.

unsigned short a;   

a değişkeni 16 bit ve işaretsiz tam sayı saklayabilir demek.

char a;   

a değişkeni 8 bit ve işaretli tam sayı saklayabilir demek.

unsigned char a;   

a değişkeni 8 bit ve işaretsiz tam sayı saklayabilir demek.

long a; a değişkeni 32 bit ve işaretli tam sayı saklayabilir demek.

long ile int aynı fakat ince bir trick varsa  bilmiyorum.

long long a; a değişkeni 64 bit ve işaretli tam sayı saklayabilir demek.

unsigned long long a; a değişkeni 64 bit ve işaretsiz tam sayı saklayabilir demek.


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

teknikelektronikci

hocam baslik yorumlara kapali olsa olmazmi yoksa gene 15-20 30 sayfa sürecek arada bilgielre ulasmak zor olacak ya da ilk 1. sayfada bilgiler olsa 2.sayfadan itibaren de yorumlar ne dersiniz ?
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

z

#10
C konusunda anlatımların olacağı başlık ayrı. O kısım yorumlara kapalı. Burada şamata yapacağız.

Soruları olan varsa burda tarışırız.

Eğer, koyu renklı kırmızı yeşil ve siyah karakter kullanımını bana bırakırsanız bu başlıktaki anlatım mesajları bakınca hemen soru cevap mesajlardan ayırtedilir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

teknikelektronikci

Alıntı yapılan: bunalmis - 24 Ekim 2011, 13:46:01
C konusunda anlatımların olacağı başlık ayrı. O kısım yorumlara kapalı. Burada şamata yapacağız.

Soruları olan varsa burda tarışırız.

tamam hocam peki bir soru bir ara c ile azda olsa ugrasmisdim
simdi c programi yazarken basicdeki gibi
goto lcd_yaz veya goto ana_dongu nasil yapilir?

bildigim kadariyla mutlaka main_void olmali ve bu anadongu yani ana programdir
diger fonsiyonlar
fonsiyon_1();
fonsiyon_2();
seklinde peki bu fonksiyonlari ben ana döngüde nasil cagirirm yani goto fonksiyon_1 nasil yaparim acaba?
saygilar
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

z

Basicde 5..10 satırlık kısa anlamlı bir kod yaz onu C'ye çevirelim.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

teknikelektronikci

Alıntı yapılan: bunalmis - 24 Ekim 2011, 13:51:29
Basicde 5..10 satırlık kısa anlamlı bir kod yaz onu C'ye çevirelim.

uzun zamandir basic ile yazmiyorum ama hemen yazmayi deniyeyim

start:
gosub led_yak
delayms 1000
gosub led_sondur
goto start



led_yak :
portb=%00000001
return


led_sondur :
portb=%00000000
return
end
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

z

Basic programın 1/1 C karşılığı

start:
gosub led_yak
delayms 1000
gosub led_sondur
goto start

led_yak :
portb=%00000001
return


led_sondur :
portb=%00000000
return
end


#include "Reglist.h"

void led_yak()
{
      Portb=0x01;
}

void led_sondur()
{
      Portb=0x00;
}

void delayms(int Dly)
{
    .....
    .....
}


int main()
{

      while(1)
         {
            led_yak();
            delayms(1000);
            led_sondur();
         }
      return(0);
}

yada C ustadlari goto sevmese de

int main()
{

Start:
            led_yak();
            delayms(1000);
            led_sondur();
            goto Start;
            return(0);               
}

Bana e^st de diyebilirsiniz.   www.cncdesigner.com