Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Cortex ARM => Konuyu başlatan: satilla - 22 Temmuz 2011, 09:56:39

Başlık: arm da porta 8 bitlik veri yükleme?
Gönderen: satilla - 22 Temmuz 2011, 09:56:39
ö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
Başlık: Ynt: arm da porta 8 bitlik veri yükleme?
Gönderen: yamak - 22 Temmuz 2011, 10:41:18
Yani söylediğiniz gibi kaydırarak yapılabilir. Örneğin 2 nolu porta 246 yazmak istiyosunuz.
LPC_GPIO2->FIOPIN|=0xF6<<17;
Başlık: Ynt: arm da porta 8 bitlik veri yükleme?
Gönderen: satilla - 22 Temmuz 2011, 10:53:19
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?
Başlık: Ynt: arm da porta 8 bitlik veri yükleme?
Gönderen: 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.
Başlık: Ynt: arm da porta 8 bitlik veri yükleme?
Gönderen: satilla - 22 Temmuz 2011, 11:27:18
msjı açmadan önce sanki vahiy geldi ve yazdıgınızın aynısını düşündüm

ilginize çok tşk ederim
Başlık: Ynt: arm da porta 8 bitlik veri yükleme?
Gönderen: ErsinErce - 22 Temmuz 2011, 12:20:38
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
Başlık: Ynt: arm da porta 8 bitlik veri yükleme?
Gönderen: yamak - 22 Temmuz 2011, 12:56:48
İ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.
Başlık: Ynt: arm da porta 8 bitlik veri yükleme?
Gönderen: ErsinErce - 22 Temmuz 2011, 22:21:10
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.
Başlık: Ynt: arm da porta 8 bitlik veri yükleme?
Gönderen: yamak - 22 Temmuz 2011, 22:51:52
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.
Başlık: Ynt: arm da porta 8 bitlik veri yükleme?
Gönderen: ErsinErce - 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
Başlık: Ynt: arm da porta 8 bitlik veri yükleme?
Gönderen: satilla - 26 Temmuz 2011, 11:57:21
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
Başlık: Ynt: arm da porta 8 bitlik veri yükleme?
Gönderen: 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.
Başlık: Ynt: arm da porta 8 bitlik veri yükleme?
Gönderen: satilla - 26 Temmuz 2011, 14:34:23
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