PCL

Başlatan designer.21, 02 Şubat 2023, 15:58:29

designer.21

MErhabalar değerli hocalarım ve ustalarım. bu soruları sorup sormamak arasında çok kararsız kaldım, sorsam çok mu abes kaçar diye ama çok güçlük çektim ve son çare olarak ta sormaya karar verdim.

16F628FA ile assembly eğitimime devam ederken 7 segment display konusuna geçtim. Fakat bu bölümde çalıştığım kaynak kitapta PCL hakkında detaylı bilgiye girmemiş,


"Program Counter (PC) ile ilgili olarak işlenecek komutun bulunduğu program belleğinin adresini barındıran 13 bit'lik bir sayıcı olduğunu, PC'nin alt 8 bitine PCL, üst 5 bitine PCH adı verildiğini belirtmiş. "

(PCH bölümünü kullanmak için ekstra işlem gerektiğinden aklımı karıştırmamak içi şimdilik sadece PCL nin mantığını öğrenmek istiyorum.)

sormak istediğim, aşağıdaki kodda da göründüğü gibi bu;

ADDWF PCL,F             ;PCL=PCL+W(DALLAN)

komutunun nasıl çalıştığını mantığını anlatabilir misiniz. oadaki PCL nedir tam olarak, W'yi PCL'ye ekleyerek nasıl bir işlem gerçekleşiyor : )

....
....
BASLA
	MOVLW h'00'
	MOVWF DALLAN
	
DONGU
	MOVF DALLAN,W
	ANDLW b'00001111'
	CALL CEV7SEG
	MOVWF PORTB
	INCF DALLAN,F
	CALL GECIKME
	GOTO DONGU
	
CEV7SEG
	ADDWF PCL,F             ;PCL=PCL+W(DALLAN)
	RETLW h'3F'		;0
	RETLW h'06'		;1
	RETLW h'5B'		;2
	RETLW h'4F'		;3
	RETLW h'66'		;4
	RETLW h'6D'		;5
	RETLW h'7D'		;6
	RETLW h'07'		;7
	RETLW h'7F'		;8
	RETLW h'6F'		;9
	RETLW h'77'		;A
	RETLW h'7C'		;B
	RETLW h'39'		;C
	RETLW h'5E'		;D
	RETLW h'79'		;E
	RETLW h'71'		;F
	
GECIKME
	MOVLW h'FF'
	MOVWF SAYAC1
DONGU1
	MOVLW h'FF'
	MOVWF SAYAC2
DONGU2
	DECFSZ SAYAC2,F
	GOTO DONGU2
	DECFSZ SAYAC1,F
	GOTO DONGU1
	RETURN
	END


ve ikinci olarak;

ANDLW b'00001111'

bu satırdaki ilk 4 bitin "1" olması sayma işleminin dört bit olarak gerçekleşeceğini belirtmek için olduğu yazılmış. bu ifadeyi de açıklayabilirseniz çok sevinirim.

designer.21

#1
herkese tekrar merhabalar.
dün sorduğum yukarıdaki soru ile ilgili biraz daha yoğunlaştım ve 2. olarak sorduğum soru olan "neden AND'leme işlemi yapılıyor" sorusunun cevabını buldum. belki bu işe yeni başlayan başka kimse varsa onların da işine yarar diye yazıyorum.

0 - F arası saydırma işlemi 4 bit olarak gerçekleştiği için bize 8 bit'in ilk 4 biti lazım. yukarıdaki örnekte görüldüğü gibi bunu ilk olarak W'ye (DALLAN) 0 olarak yüklüyoruz, 0 dan F'ye doğru her seferinde INCF ile 1 arttırdığımızda son karakter olan F'de (00001111) sıfırlamamız gerek. yani 0000 1111 + 1 = 0001 0000 olacak ve bu sayı da AND işlemi tekrar b'0000 0000' (h'00') yapılıyor ve işlem baştan başlıyor.

alisumer

PCL "program belleğinden" adres seçmeye yarar çalışma mantığı her komut için program belleğinde tutulan sıralı adreslere geçmek için bir arttırılır org 0x00 program belleğinin başlangıç adresidir mesela sonrasında dallanmalar(call,goto) komutlarını görmezse "pic için"  her 4 saat darbesinde bir alt satıra geçer yani 1 arttırılır ki sonraki komut çalışsın.ANDLW 00001111 Demek değeri 15 ten büyük sayıyı adres olarak atama demek dikkat ederseniz retlw komutunun içerisinde 15 adres vardır CALL CEV7SEG dediğinizde pcl ye cev7seg in program hafızasında tutulduğu adres girilir ve program sayacı müdahale etmezsen o adresten itibaren 1 er artarak  saymaya başlar artık ADDWF PCL,F  komutu burda devreye girer mevcut komutun adresine 0 15 arası sayı vererek  o adresten sonra hangi satırın çalışacağını biz seçmiş oluruz diyelim CEV7SEG adresi 9 olsun pcl ye 0 verirsek herhangi bir dallanma görene kadar bir bir pcl yi arttırdığı için ilk retlw komutunu okur program hafızasında 10. adresteki veriyi w ye kaydedip geldiği yere geri döner
Hep meraktan

designer.21

cevabınız için çok teşekkür ederim. şimdi bu PCL'ye belleğindeki kaçıncı adrese gitmesi gerektiğini biz talimat veriyoruz değil mi ADDWF PCL,W diyerek. yani W'nin değerini PCL aktararak. yani W ne ise PCL de o sayı oluyor ve sayı değeri kaç ise o satıra geçiyor. biraz karışık oldu ama doğru mu anladım acaba

alisumer

#4
w yi pcl ye atmıyoruz pcl ile topluyoruz.w yi pcl ye atarsak ilk başta 0 değerini pcl ye vermiş oluruz o da bizi org 0x00 konumuna yani resete götürür. call ile çağırdığımız adres olan CEV7SEG un mevcut bulunduğu adrese 0 ile 15 arası sayı ekleyince örneğin o anki komut satırı adresi 10 ise 2 eklersek 17 adresine dallanıyor orada da retlw komutu olduğu için call komutunun kaydedildiği adresin.(call komutu verildiğinde bir altındaki adres STACK birimine kaydedilir return yada retlw komutu 2 çevrim sürer biri stakc tan geldiği adresi almak pcl ye yazmak diğeri "retlw için değişkeni w ye yazmak ",return için nop  . ve geldiği yere geri döner .örneğin ASM için goto $-1 komutu aslında movlw .1 subwf pcl ,f  gibi düşünebilirsiniz.
Hep meraktan

designer.21

alisumer hocam, şimdi kafamda bişeyler şekillenmeye başladı. PCL nin mantığını öğrenmek adına benim için gerçekten çok faydalı bilgiler oldu.

Powered by EzPortal