C Programlama diliyle şamatalar

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

mfurkan7

GPIOD->MODER=0x55000000;           // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (Ledler bu pinlerde)

0x55000000 sayısını nasıl elde ettik?

z

#811
Moder registerinin anlatildigi sayfada 0x55000000 32 bit sayisinin 1 ve 0 olan olan bitlerinin registerde hangi bitlere karsilik geldigine bak ve buraya yaz.

Bu zahmete girmezsen bu isi ogrenemezsin. Buraya yaz kontrol edelim.

0x55000000 sayisinda 1 degerini alan bitlerin MODER registerindeki adlari nelerdir?

Bir ara binary hesap makinesi daha dogrusu verilen hex sayiyi bitler halinde gosteren bir uygulama programi vermistim. Bu programi bulup indir. isleri cok kolaylastirir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mfurkan7

Şimdi olayı anladım. Rehberi kullanmayı yeni öğrendim de diyebilirim. Bendeki Rehberin 278. sayfasına göre;

00: Input (reset state)
01: General purpose output mode
10: Alternate function mode
11: Analog mode


Böyle bir olay varmış. Yani sizin dediğiniz 15,14,13,12'yi OUTPUT yaptık derken. Moder 15, Moder 14, Moder 13, Moder 12'nin rw'lerini 1 0 olarak ayarlardım. Sonucunda da 01010101000000000000000000000000 böyle bir sayı elde ettim. Bu tabi binary bunu da Hex'e çevirince. 0x55000000 elde etmiş oldum.

0x55000000 sayisinda 1 degerini alan bitlerin MODER registerindeki adlari nelerdir? //Bu soruyu tam olarak anlayamadım?

z

Tamam iste olay bundan ibaret.

Anlayamadim dedigin kisim;

Atiyorum hex sayinin 1 olan bitlerinden birisi MODER registerinde 30 nolu bitine isabet ediyorsa katalogda MODER registerinde 30 nolu bite atiyorum M2 diye isim vermistir sen bu M2 yi cevap verecektin ama gerek kalmadi olayi cozmussun.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

sseedat

selamlar

bir karakter dizisine ASCII tablosundaki karakterleri random olarak yüklüyorum fakat dizinin ilk karakterine '\0'(NULL) atanabiliyor(dizi[0]='\0',dizi[1]='\0',dizi[2]='a'...)
bu diziyi ekrana string olarak basmak için ne gibi işlemler yapmalıyım

Görünmez bir mezarlıktır Zaman...

Tagli

String üzerinde işlem yapan kütüphane fonksiyonlarını kullanamazsın çünkü bunlar \0 karakterini görünce dururlar. Kendin bir döngü yazmalı diziyi karakter karakter bastırmalısın. printf("%c", karakter_adi) şeklinde yazarsan \0 için çalışır mı emin değilim ama çalışmaz ise, bir if bloğu içinde karakteri kontrol edip ekrana kendin elle "\0" yazdırabilirsin. Zaten unutma, ASCII tablosundaki bazı karakterlerin görsel karşılığı yoktur. Bunları hex kodu olarak bastırman gerekli.
Gökçe Tağlıoğlu

yamak

İlk karakteri kontrol edip '\0' olup olmamasına göre aşağıdaki gibi bi işlem yapsan olmaz mı?
if(dizi[0]==0)
 printf("%s",dizi+1);
else
 printf("%s",dizi);

sseedat

#817
karakter karakter basmada sorun yok (görsel karşılığı olmayanlara dikket ediyorum).tabi dediğiniz gibi string işlemleri yapan fonksiyonlar ilk karakterde işlemi sonlandırıyor.elle yapmak gerekecek.
Teşekkürler

mesaj birleştirme:: 23 Mayıs 2014, 14:22:06

Alıntı yapılan: yamak - 23 Mayıs 2014, 14:14:14
İlk karakteri kontrol edip '\0' olup olmamasına göre aşağıdaki gibi bi işlem yapsan olmaz mı?
if(dizi[0]==0)
 printf("%s",dizi+1);
else
 printf("%s",dizi);


tüm karakterler önemli NULL dahil kesip atamıyorum diziden
Görünmez bir mezarlıktır Zaman...

mho

#818
merhaba arkadaşlar
stm ve keil ile çalışmaya başladım hafiften program yazıyorum.birkac takıldığım nokta var;

1-keilde int değişkeni tanımlarken uint32_C ifadesi nedir.

2-#define adr            (byte *) "clnt2"   burda adr ye clnt2 string ifadesinin adresini mi atıyoruz?

3-

int main()
{

char data[8];

while(*data)
{
  data++;   //burda left value hatası veriyor.neden verdiğini anlayamadım
}

}
fakat bunu fonksiyon olarak tanımlayınca sıkıntı olmuyor.örneğin
void fonk(char *data)
{
while(*data)
{
  data++;   //NORMAL
}

}

4-
int str[1];
sprintf(str,"%d",500);
printf("str:%s",str);       //burda str için ayırdığım alana nasıl oluyor 500 atayabiliyorum ??

bu konularda yardımcı olurmusunuz

picusta

Ilkinde data++ satiri söyle anlasiliyor :
data tablosu(8 uzunlugunda) =  data tablosu   + 1
bir tablo ile 1 degeri toplanamiyor.

Ikinci kodda data pointer'i 1 artiliyor, bir sonraki adrese geçiliyor.

mho

#820
Bunu main içinde tanımlayınca neden öyle anlaşıldı normal fonksiyonda neden istenilen şekilde anlaşılıyor?
hocam burrda tablo dediğiniz adres mi oluyor.(adress + değişken) gibi mi oluyor

Klein

#821
Main de data isimli bir array var.  Dikkat et bu bir işaretçi değil array. Adresi belli.
data++ ile işaretçinin gösterdiği  adresi artırırsın. Ama senin bir işaretçin yok. 
fonksiyona geilen parametre ise işaretçi. bu yüzden fonksiyonda sorun olmuyor.

char data[8]
ptr *= data;

while( *ptr)
{
   ptr++;
}
şeklinde yazsaydınız sorun olmazdı.

diğer soruda ise , durum şu.
sprintf(..) fonksiyonunun  ilk parametresi bir işaretçi.  printf  bu parametreye geçilen adresi bilir sadece. Kaç byte uzunluğunda olduğunu bilmez. yazar gidrer. 
İşaretilerle çalışmak güzeldir. Ama tüm sorumlulık programcıdadır.   Siz bileceksiniz onun 1 byte olduğunu ve "500" stringinin oraya sığmayacağını.


mesaj birleştirme:: 26 Mayıs 2014, 17:51:51



uint32_c  32 bit constant.
32 bit işlemci için aşağıdaki satıra eşit
const unsigned int

2-#define adr            (byte *) "clnt2"   burda adr ye clnt2 string ifadesinin adresini mi atıyoruz?
Tam olarak öyle değil.
adr tek başına kullanılabilir bir şey değil.   derleyici  adr gördüğü yere karşısındaki ifadeyi yerleştiriyor.

byte *ptr;

ptr = adr;

şeklinde bir  satır derlenirken, derleyici bu ifadeyi  ptr = (byte *) "clnt2" şekline çeviriyor. 

mho

Teşekkürler hocam  cevaplarınız için çok faydalı oldu.

mho

iyi akşamlar


void send(uint8_t byt)
{

.....
}

void send_data(uint16_t adres)
{
send((uint8_t)(adres>>7));

}
arkadaşlar 16 bitlik adres bilgisi  7 bit kaydırılıp sonra 8 bit olarak mı ayarlanıyor yoksa 8 bite dönüştürülüp sonra mı 7 bit kaydırılıyor

Klein

adress ve kaydırma komutu aynı parantezde olduğu için, önce kaydırma yapılıyor.