piclerde GPR kullanımı

Başlatan salih_arel, 14 Ağustos 2011, 10:21:57

salih_arel

Merhaba. Ben mikroişlemcilere daha yeni giriş yapmış bir elektrik eletronik mühendisliği öğrencisiyim. Elimde bir proje var ve çözmeye çalışıyorum. Acaba piclerde GPR(genel amaçlı register) nasıl kullanılıyor. mesela 0x20 den snra biz kendimiz özel isimli registerlar oluşturabiliyormuyuz. Bu konu hakkaında yardımcı olursanız çok sevinirim.

-Hasan-

GPR dediğiniz şey; programcının istediği amaçta kullanabileceği, RAM ' daki boş alanlardır. Siz hangi programlama dilini kullanıyorsunuz?

pikomemet

oluşturursun.

c de int, short,long, float, char vb. değişkenleri kullanınca GPR de kaydediyor. Hangi dil ile programı yazıyorsun?

salih_arel

assembly dili kullanılan bir programı çözmeye çalışyorum. peki bu kullanılan alanda kaç byte lik yer kaplıcağını ayarlayabiliyormuyuz. birde karşıma çıkan bir değişik uygulamada şu: komut ismi:.50 bu ne demek yani (:.sayı) ne anlama geliyor.

camby

Dostum assembly uygulama yazanlar bile belli bir süre geçtikten sonra kendi kodlarını anlamakta zorluk çekiyorlar zaman harcıyorlar.

Sen ki hele pic ve assembly konularına hakim olmadığın halde başkasının kodunu çözmeye çalışıyorsun , vaktini böyle harcama derim . Sıfırdan assembly kitabı alıp başlasan aynı uygulamayı kendin yapmaya çalışsan çok daha iyi sonuç alırsın.

salih_arel

Bunun için picin içini iyi bilmem gerekiyor. Aslında bir kursa yazılcam daha sağlıklı olur sanırım ama benim bu projeyi eylülün sonuna kadar bitirmem gerekiyor. Bu yüzden bu kadar araştırma yapıyorum..

camby


salih_arel

bir led küp projesi.5x5 lik bir küp kurdum çalışıyor fakat yazılımını dışardan bulduğum için geliştirmem gerekiyor.

-Hasan-

#8
Alıntı yapılan: camby - 20 Ağustos 2011, 21:59:57
Dostum assembly uygulama yazanlar bile belli bir süre geçtikten sonra kendi kodlarını anlamakta zorluk çekiyorlar zaman harcıyorlar.

Sen ki hele pic ve assembly konularına hakim olmadığın halde başkasının kodunu çözmeye çalışıyorsun , vaktini böyle harcama derim . Sıfırdan assembly kitabı alıp başlasan aynı uygulamayı kendin yapmaya çalışsan çok daha iyi sonuç alırsın.

camby ' e katılıyorum. Hazır bir ASM programı pek bir işinize yaramaz. Eğer amacınız programı istediğiniz gibi yapmak ise direkt ASM öğrenip programı kendiniz yazmanız daha mantıklıdır, hafiften başlayarak, zora doğru bu işi çözersiniz.

Konu başlığında GPR ' yi sormuşsunuz. Daha önce de dediğim gibi GPR; programcının istediği amaçla kullanabileceği, RAM ' daki boş alanlardır. Örneğin; 16F84A ' da, BANK0 ' da, 0x0C adresinden, 0x4F adresine kadar GPR ' dir. Yani programcı bu alan programcıya ayrılmıştır, programcı istediği şekilde kullanabilir.

Bakınız PIC16F84A Datasheet Sayfa : 6

ASM ' de tüm komutlarda, adres kullanılır. Örneğin; 0x0C adresine 0xAA verisini yazalım:

MOVLW 0xAA
MOVWF 0x0C --> Eğer 0x20 yazsaydık, 0x20 adresine 0xAA yüklenirdi.

Bu şekilde adresleri kullanarak program yazmak oldukça kafa karıştırıcı olacağından, ASM ' de adreslere isim verilir. İsim verme işlemi EQU tanımlaması ile yapılır. Örneğin yine 0x0C adresine 0xAA yükleyelim:

VERI EQU 0x0C

MOVLW 0xAA
MOVWF VERI --> Eğer 0x20 yazsaydık, 0x20 adresine 0xAA yüklenirdi.

VERI EQU 0x0C

Bu tanımlamadan sonra artık programda nereye VERI yazarsak 0x0C yerine geçecektir. Bu tanımlamada farklı isimler de verilebilir (TEMP, SAYI, SAYAC vs), aynı şekilde farklı adresler de verilebilir (0x10, 0x2A, 0x4F vs).

ASM öğrenmek için, eğer biraz ingilizceniz var ise, çalışacağınız PIC ' in datasheeti fazlasıyla yeterli olacaktır.

Faydalı olması dileğiyle...

salih_arel

ya aslında ben onu düşünüyorum bir kursa falan yazılıcam ama adam gerçekten çok sağlam programlar yazmış. yani şöle anlatıyım adam kendi kütüphanesini kendisi oluşturmuş. bir çok .inc uzantılı dosyalar yazmış ve ana programıda bunun üzerine yazmış. bunu benim yeni baştan yazmam için çok sağlam bir pic bilgisine ihtiyacım olur. elektrik elektronik müh. 3. sınıf örencisi olmama rağmen daha bu alanda ders almadım. bu yüzden sitelerden falan araştırıyorum fakat dediğiniz gibi kişilerin yazdıkları kodu çözmek daha zor gibi gözüküyor.

-Hasan-

Alıntı Yapkişilerin yazdıkları kodu çözmek daha zor gibi gözüküyor.

salih_arel; aynen öyle. Başka bir kişinin yazığı ASM programını çözmek oldukça zor bir iştir. Bunun sebebi herkesin programlama tekniğinin farklı olmasıdır. Örneğin; birisi ilk ayarları veya değerleri (TRIS, PORT tanımlamaları vb) program başında verir, bir başkası da alt program olarak yazar, programın başında çağırır.

Ben orta düzeyde PIC Assembly bilgimin olduğunu düşünüyorum. Şu anda PIC18 ' ler ile çalışıyorum. Yeterli ASM bilgim olmasına rağmen ben bile bir başkasının yazdığı programı çözemiyorum, artık denemiyorum bile. Sadece basit, kısa, temel ASM uygulama programlarını çözebiliyorum.

Kendi istediklerini yapmak istiyorsan, mutlaka temelden başlayarak, ASM ' yi öğrenmelisin. Başka birinin yazdığı ASM programını çözmeye çalışmak, boşa kürek çekmek gibidir.

Tagli

#11
Adres atamaları konusunda bir not:

Adres ataması elle yapmayın. Kodu relocatable olarak yazın, linker kendisi yerleştirsin uygun adrese. Erişmek için de banksel kullanılabilir. Bu şekilde işler biraz daha kolaylaşır.

Bu tür bir alan tanımlaması udata komutu ile yapılıyor. MPASM'nin resmi rehberinde ayrıntılı bilgi mevcut.
Gökçe Tağlıoğlu

salih_arel

   ; return with W = X bit position
x.bit.pos   movlw   HIGH x.lookup
   movwf   PCLATH
   movfw   vox.x
   addwf   PCL,F
x.lookup   retlw   1<<4
   retlw   1<<3
   retlw   1<<2
   retlw   1<<1
   retlw   1<<0

;--------------------------------------------------------------------------


; Need for speed, so we do these with in-line code rather than a loop.
voxel.all.set   movlw   b'00011111'
voxel.all.clr   movwf   buffer.draw
   movwf   buffer.draw+.1
   movwf   buffer.draw+.2
   movwf   buffer.draw+.3
   movwf   buffer.draw+.4
   movwf   buffer.draw+.5
   movwf   buffer.draw+.6
   movwf   buffer.draw+.7
   movwf   buffer.draw+.8
   movwf   buffer.draw+.9
   movwf   buffer.draw+.10
   movwf   buffer.draw+.11
   movwf   buffer.draw+.12
   movwf   buffer.draw+.13
   movwf   buffer.draw+.14
   movwf   buffer.draw+.15
   movwf   buffer.draw+.16
   movwf   buffer.draw+.17
   movwf   buffer.draw+.18
   movwf   buffer.draw+.19
   movwf   buffer.draw+.20
   movwf   buffer.draw+.21
   movwf   buffer.draw+.22
   movwf   buffer.draw+.23
   movwf   buffer.draw+.24
   return


kodlarının karşılıklarınında yartdımcı olabilirmisiniz.

Tagli

İlk kod parçası ile ilgili daha önce bu başlıkta açıklama yapmıştım.

İkinci kod parçasında ise, 25 adet register içine b'00011111' değeri atılmış. Adam kendisi için hızın çok önemli olduğunu, bu sebeple atamaları bir döngü ile değil, tek tek elle yazarak hallettiğini söylemiş.
Gökçe Tağlıoğlu

salih_arel

   cblock 0xA0
   buffer.disp:.25   
   addr.stack:.16   
   user.stack:.33

burda örneğin buffer.disp registerına belirli bir alan mı atıyor. yardımcı olabilirmisiniz.