bit RB7@ (unsigned)&PORTB*8+7; komutu

Başlatan LukeSkywalker, 27 Ağustos 2011, 11:31:47

LukeSkywalker

Şimdi bu komtta anlamadığım şeyler var. Görebildiğim kadarı ile RB7 isimli değişken,ROMda PORTB'nin adresi alınarak ve 8 ile çarpılıp, 7 eklenerek oluşturulan yeni adrese yerleştirilmiş. Peki uC bu adresin portb'nin 7. pini olduğunu nerden anlıyor? Normalde o adres genel amaçlı bir adres değil mi?

LukeSkywalker

Anladım olaı.
Struct ile tanımlamışlar daha sonra RB7'yi PORTB'nin pini olarak...

LukeSkywalker

#2
Teşekkürler... Bu açıklama taşları oturttu yerlerine...
bit olarak tanımlandığı için doğrudan adreslemeyi de bit olarak yapıyoruz yani. 48. bit gibisinden... Yani değişkenin cinsi "bit" olduğu için adres de mecburen bit olarak yazılmalı. Bunu bilmiyordum bit adreslemesini öğrendiğim iyi oldu. Bir de struct yapısı var byte adresin bitlerini tanımlamak için. Ama bu şekilde daha kolay.

papsukkal

#byte kbd = 6   (ccs c library den)

bu tanımlamada kbd yi byte olarak tanımladığımız için mi portB olarak alıyor? 

bit tanımlama olsaydı ve portB.1 için
#bit kbd = 6*8+1 diyebilir miydik?  doğru mu anlamışım?
ya da
#bit kbd = 49

LukeSkywalker

buradan da şu çıkıyor ki bit bit adresleme yapılabiliyor.
                   

LukeSkywalker

ASM byte'a çeviriyor fakat C ile yazarken @ operandı ile bit adreslemesi yapılabiliyor.
Örneğin
"bit ali @ 48" gibi..

LukeSkywalker

RB0'ı  örnek olsun diye verdim. Mühim olan bit olarak adreslemenin yapılışını öğrenmek.

LukeSkywalker

Hocam sizi yakalamışken bir soru daha sorayım izin verirseniz.
printf komutu çok yer kapladığından kendim usart_yaz("string"); gibi bir fonksiyon tanımlayacağım. Bu fonksiyondaki stringi putch ile veri gönderen fonksiyona nasıl algılatırız?

void usart_yaz(char a [] )
 {
  while(TXIF) ; 
   putch(*a++);
}


gibi bir şey denedim olmadı..
     

LukeSkywalker

Kafam allak bullak oldu.
Şimdi fonksiyon içerisindeki değişkeni const olarak derleyince normal çalışıyor.
Peki direkt char olarak derleyince neden çalışmıyor?

LukeSkywalker

Hocam bunları nereden öğrenebiliriz? Kitap var mı bu tür incelikleri anlatan?

mufitsozen

Alıntı yapılan: gerbay - 29 Ağustos 2011, 02:39:47
hocam kitap bilmiyorum, bence yazılmış kaliteli kodları incelemek de fayda var..
@gerbay dogru soyle.... (bilmeyenler icin; kendisini cok yakindan taniyip, cok degerli buldugumdan takilip, mahcup etmek icin boyle yaziyorum, hemen bende senin .... diye cevap yazmayiniz!)

bu konuda tecrube ve ne oldugunu anlamak ve nasil yani bu programin calismasi lazim yaaaa.... diye ayni ekrana(yazicidan cikan sonuca 8-9 saat bos bos bakmak en etkili yontem.

bunun disinda sunlar yapilabilir;

- Andrew Koenig in C traps and Pitfalls kitabi okunur http://www.literateprogramming.com/ctraps.pdf

- Feuer in The C Puzzle Book daki ornekler cozulur/ anlamaya calisilir http://depositfiles.com/en/files/3sapg3s2t

- yazdiginiz program ne kadar kucuk ve kolay gozuksede derleyicinizin en fazla bilgi verecegi opsiyon secilir ve butun warningler buda nereden cikti diye incelenir ve giderilir.

- kaynak programiniz Lint (veya turevi) bir program ile kontrol edilir.

simdi sira sende @gerbay
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

mufitsozen

@gerbay nazik sozlerin icin bende tesekkur ederim ama keske bende senin kadar c++ bileydim... neyse recursiona girmeden ret edelim :-)

@maytere c ile ilgili kitaplar sordugu icin bu ornekleri verdim. c++ icin verdigin ornekler cok temel kitaplar, bir nevi olmazsa olmaz!

C ile duzgun kod ornekerine bakmak icinde Plaugerin C Standard library si cok guzel hem standard librarydeki fonksiyonlari ogrenip hemde kaynak kodunu incelemek insana cok sey ogretiyor (hos bir zamanlar borland MS gibi derleyicilerde standard library kaynak kodunu verirlerdi)

Lint konusunda haklisin hitech ve ccs gibi mcu c derleyicileri kullaniciya kolaylik saglamak adina yaptiklari ile Lintden cok false  error mesaji alabilirler

Boost diyince aklima geldi boostun python librarysini hic kullandinmi? bayramdan sonra C++ programlarini python ile beraber kullanmam gereken bir proje var, yardimini isteyebilirim. :-)

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

mufitsozen

Alıntı yapılan: gerbay - 29 Ağustos 2011, 19:11:22
siz python kullanarak yazıcı için bir kod yazmıştınız, hatırlıyormusunuz; ben en son python u o zaman görmüştüm. o gün bugündür C++ (az biraz assembly, delphi, java, c#) dışında hiç bir dil ile yazmadım..

gerçi okur yazar olmak gibi, önemli olan programlama tekniği; elimden gelen birşey olursa seve seve yardımcı olmaya çalışırım
printera kim yazdi ne yazdiyi cabuk ve kolay bir sekilde yapmak icin python kullanmistim, sen deyince hatirladim. Gencken insan boyle akillica kucuk fakat etkin cinlikler yapabiliyor, simdilerde kahvaltida ne yedin desen onu hatirlamiyorum :-)


bu vesile ile sende python expert olursun fenami. Bence gec bile kaldin :-)

python ile c zaten cok iyi ilintili ama c++ ile problem var cunki pythonda variablelar typeless ve garbage collection otomatik. dikkat edilmezse c++ ile python karisinca bolca pointer problemleri yuzunden abend oluyor.

boostcularda JPL icin bir kutuphane gelistirmisler bu isi kolaylastiran. (bilirsin, zaten smart pointerlar filan gibi bir suru cingozce icatlari vardi zaten, C++ icin)
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

LukeSkywalker

Hocam muhabbetinizi bölmek istemem ama.Dünden beri kafamı kurcalayan birşey var.
char ali[]="Veli"; olarak tanımlayabiliyoruz bir değişkeni hata olmadan.
Peki bir fonksiyon içerisinde işlemek gerekirken dışarıdan fonksiyona string veri aktarmak için neden const olarak tanımlamak zorunda kalıyoruz?
yani 
veri_yaz(const char data[])
  {
    .
    .
    .
 }

Fonksiyonunu dışarıdan veri_yaz("veli"); diyerek çağırdığımızda fonksiyonu yukarıdaki gibi oluşturmak gerekiyor.

LukeSkywalker

Peki
char * ali = "Veli";

Bunu nasıl yazabiliyoruz? "Veli" sonuçta const bir değer değil mi?