arm da porta 8 bitlik veri yükleme?

Başlatan satilla, 22 Temmuz 2011, 09:56:39

satilla

örnegin p0.17 ile p0.24 çıkışlarına 8 bitlik veriyi direk yollamak istiyorum picte portb=0x55; yapmak yetiyordu :)

aklıma 8 bitlik veiriyi porta yükleyip istedigim yere kadar kaydırmak geldi ancak lpc1768 boardum yanımda olmadıgı için yazacagım program dogru çalışırmı emin olamadım

acaba bunun için ne yapabilirim

yamak

Yani söylediğiniz gibi kaydırarak yapılabilir. Örneğin 2 nolu porta 246 yazmak istiyosunuz.
LPC_GPIO2->FIOPIN|=0xF6<<17;

satilla

peki örn p0.20 ile p0.27 yi sanki 8 bitlik bir register gibi nasıl kullacgım
yani 220 sayısını at dedigimde p0.20 ile p027 arasındaki bitlere çıkış verecek?

yamak

#3
Üstteki yazdığımla söylediğiniz şey olur eğer sadece o pinlerden çıkış alıp geri kalan pinleri 0 olmasını istiyosanız;
LPC_GPIO2->FIOPIN&=(0xDC<<20); yazmanız yeterli olur. Ya da şu şekilde bi fonksiyon hazırlayabilirsiniz.
void pin_out(int pin)
{
    if(pin>255)
    LPC_GPIO2->FIOPIN&=(0xFF<<20);
    else
    LPC_GPIO2->FIOPIN&=(pin<<20);
}
bu fonksiyonlar girilen değeri p20 ile p27 arasına yazar eğer girililen değer 255 büyük olursa p20 ile p27 arasındaki tüm pinler 1 yapar.Geri kalan pinler de 0 olur.

satilla

msjı açmadan önce sanki vahiy geldi ve yazdıgınızın aynısını düşündüm

ilginize çok tşk ederim

ErsinErce

Alıntı yapılan: yamak - 22 Temmuz 2011, 11:21:29
Üstteki yazdığımla söylediğiniz şey olur eğer sadece o pinlerden çıkış alıp geri kalan pinleri 0 olmasını istiyosanız;
LPC_GPIO2->FIOPIN&=(0xDC<<20); yazmanız yeterli olur. Ya da şu şekilde bi fonksiyon hazırlayabilirsiniz.
void pin_out(int pin)
{
    if(pin>255)
    LPC_GPIO2->FIOPIN&=(0xFF<<20);
    else
    LPC_GPIO2->FIOPIN&=(pin<<20);
}
bu fonksiyonlar girilen değeri p20 ile p27 arasına yazar eğer girililen değer 255 büyük olursa p20 ile p27 arasındaki tüm pinler 1 yapar.Geri kalan pinler de 0 olur.
LPC_GPIO2->FIOPIN|=(0xFF<<20);

aradaki and işlemini or yapmak gerekli diğer türlü p20-p27 arası 1e geçemez

LPC_GPIO2->FIOPIN&=(0xFFFFFFFF&(pin<<20));
LPC_GPIO2->FIOPIN|=(pin<<20);


else kısmında ise 1lerin ve sıfırların portda sadece p20-27 arasına yüklenmesi için 2 adımda yapmak gerekiyor

yamak

#6
İlk olarak & işareti kullanmamın nedeni
Alıntı Yapeğer sadece o pinlerden çıkış alıp geri kalan pinleri 0 olmasını istiyosanız;
böyle bi cümle kurmuştum ondan dolayı. İkinci olarak da neden öyle bi işlem yaptınız anlamadım eğer sizin söylediğiniz gibi olursa p20-p27 arasındaki diğer  pinler 1 olur.

ErsinErce

anlattığınız kısmı uygulamışsınız hocam onda sorun yok, verinin o aralığa yüklenmesi denince 0xF0 gibi bir değerde & işlemiyle F harici bölümde kalan 28 pin 0 olurken F bölümünde kalan kısmın 1 olması sağlanmıyor, verdiğim kod ise diğer bölümlere dokunmadan verilen değeri ilgili yere aynen geçiriyor,
1 olması gerekenler 1 olurken, 0 olması gerekenler 0 oluyor.

yamak

#8
tamam söylediğinizde haklısınız ama ben sadece o kısım istenilen değerlerde olsun geri kalan da 0 olsun diye yazdım zaten üste yazarken bundan bahsettim.Arıca söylediğiniz şey sadece LPC_GPIO2->FIOPIN|=(pin<<20);  kodu kullanılarak yapılmaz mı 0xFFFFFFFF&(pin<<20) işlemi ile (pin<<20) işlemi arasındaki fark ne? mesela 3 ü 20 bit kaydırdığımızda 00000000000000000001100000000000 sonucu çıkmaz mı? daha sonra bunu 0xFFFFFFFF ile and ler ise yine aynı sonuç çıkar?Yoksa ben yanlış mı biliyorum.Mesela sadece 27.biti geri klana bitlere ise dokunmamak gerektiğinde LPC_GPIO2->FIOPIN|=1<<27; yazmak kafi değil mi ben hep böyle yapıyorum.

ErsinErce

LPC_GPIO2->FIOPIN&=(~(0x000000FF<<20)|(pin<<20));


pardon işlemi karıştırmışım bu şekilde verilen 8 bit harici yerler 1 olarak kalıp pin değerine bağlı yerdeki yerler 0 olarak geçicektir.

sadece 1 yaparken dediğiniz gibi or işlemi ile tek bitlik kullanılabilir, fazla kafa karıştırmadan aşağıda tek bit için şuanlık kullandığım tanımlamaları vereyim, kullanımlarıyla daha açıklayıcı olur

/* p9 is P0.0 */
#define p9_SEL_MASK     ~(3UL <<  0)
#define p9_SET_MASK     (1UL <<  0)
#define p9_CLR_MASK     ~(p9_SET_MASK)
#define p9_AS_OUTPUT    LPC_PINCON->PINSEL0&=p9_SEL_MASK;LPC_GPIO0->FIODIR|=p9_SET_MASK
#define p9_AS_INPUT     LPC_GPIO0->FIOMASK &= p9_CLR_MASK; 
#define p9_SET          LPC_GPIO0->FIOSET = p9_SET_MASK
#define p9_CLR          LPC_GPIO0->FIOCLR = p9_SET_MASK
#define p9_IS_SET       (bool)(LPC_GPIO0->FIOPIN & p9_SET_MASK)
#define p9_IS_CLR       !(p9_IS_SET)
#define p9_MODE(x)      LPC_PINCON->PINMODE0&=p9_SEL_MASK;LPC_PINCON->PINMODE0|=((x&0x3)<<0)    
#define p9_TOGGLE       p9_IS_SET?p9_CLR:p9_SET

satilla

Alıntı yapılan: cynetron - 25 Temmuz 2011, 18:32:33
LPC_GPIO2->FIOPIN&=(~(0x000000FF<<20)|(pin<<20));


pardon işlemi karıştırmışım bu şekilde verilen 8 bit harici yerler 1 olarak kalıp pin değerine bağlı yerdeki yerler 0 olarak geçicektir.

sadece 1 yaparken dediğiniz gibi or işlemi ile tek bitlik kullanılabilir, fazla kafa karıştırmadan aşağıda tek bit için şuanlık kullandığım tanımlamaları vereyim, kullanımlarıyla daha açıklayıcı olur

/* p9 is P0.0 */
#define p9_SEL_MASK     ~(3UL <<  0)
#define p9_SET_MASK     (1UL <<  0)
#define p9_CLR_MASK     ~(p9_SET_MASK)
#define p9_AS_OUTPUT    LPC_PINCON->PINSEL0&=p9_SEL_MASK;LPC_GPIO0->FIODIR|=p9_SET_MASK
#define p9_AS_INPUT     LPC_GPIO0->FIOMASK &= p9_CLR_MASK; 
#define p9_SET          LPC_GPIO0->FIOSET = p9_SET_MASK
#define p9_CLR          LPC_GPIO0->FIOCLR = p9_SET_MASK
#define p9_IS_SET       (bool)(LPC_GPIO0->FIOPIN & p9_SET_MASK)
#define p9_IS_CLR       !(p9_IS_SET)
#define p9_MODE(x)      LPC_PINCON->PINMODE0&=p9_SEL_MASK;LPC_PINCON->PINMODE0|=((x&0x3)<<0)    
#define p9_TOGGLE       p9_IS_SET?p9_CLR:p9_SET


hocam aslında pek bişey anlamadım

sonuç olarak p0.20den itibaren 0x55 verisini diger pinlere müdahale etmeden nasıl gönderecegim

yamak

LPC_GPIO2->FIOPIN|=(0x55<<20); şeklinde yapın bence.Zaten @cynetron un da kastettiği böyle bişey heralde.

satilla

Alıntı yapılan: yamak - 26 Temmuz 2011, 13:48:26
LPC_GPIO2->FIOPIN|=(0x55<<20); şeklinde yapın bence.Zaten @cynetron un da kastettiği böyle bişey heralde.

sonunda bordda bi devre yaptım led dizdim üstüne bu şekilde sorun yok şimdilik konu boşa uzadı biraz ama cok teşekkür ederim sizlere