PCLATH ile ilgili bir soru?

Başlatan camby, 18 Nisan 2010, 23:28:34

camby

PCLATH kullanarak sayfa değiştirme işini hallettim , diğer sayfalarda alt-program tablo vss kullanabiliyorum , fakat kafamı kurcalayan bir nokta var :

ANA		
		bsf       PCLATH,0
	
		movf		sayac,w
	
		CALL		TABLO
		
		movwf		PORTB

		clrf		PCLATH
		nop


Yukarıda örnekte sayfa0 içindeki alt-sayfa 0 'dan bir sonraki sayfadaki yani alt-sayfa 1 'deki tabloya erişiyorum. Bu kodlardaki ilk komutun program hafızasındaki adresi 0x14 ve bu komut alt-sayfa 0 'da yerleşmiş bulunuyor. Ama bu komut PCLATH 'ın içeriğini değiştirdiğinden bir anda başka bir sayfaya geçiyoruz ve bundan sonraki 0x15 adresine yerleşen komut , alt-sayfa 0'ın 0x15. adresine mi yerleşir yoksa alt-sayfa1'in 0x15. adresine mi yerleşir.

Mantıken PCLATH'ı değiştirdikten sonra yazılan her komutun ilgili alt-sayfaya yerleşmesi gerekiyor . Eğer alt-sayfa 1'in 0x15 'ine yerleşirse ve o sayfada kullandığım TABLO'nun uzunluğu da 21 elemandan fazla ise tablonun ilk satırı olan addwf   PCL,f işleminde bir çakışma meydana gelmezmi?

MPLAB'da bunun debug işlemini yaptım , PCLATH değiştirdikten sonra yazılan komut hala alt-sayfa 0'a yerleşiyor , PCLATH'ın değiştirdiği sayfada olması gerekmiyormuydu ?

Not: Mplab'ın komutlarını kullanmıyorum şimdilik....

;===============TABLO=====================================================
		ORG		0x0100
TABLO		addwf		PCL,f		; PORTB çıkış tablosu
		retlw		b'01111110'	; 0 
		retlw		b'00001100'	; 1
		retlw		b'10110110'	; 2
		retlw		b'10011110'	; 3
		retlw		b'11001100'	; 4
		retlw		b'11011010'	; 5
		retlw		b'11111010'	; 6
		retlw		b'00001110' 	; 7
		retlw		b'11111110'	; 8 
		retlw		b'11011110'	; 9 
		retlw		b'11101110'	; A
		retlw		b'11111110'	; B
		retlw		b'01110010'	; C
		retlw		b'01111110'	; D
		retlw		b'11110010'	; E
		retlw		b'11100010'	; F
		retlw		b'11110010'	; E
		retlw		b'01111110'	; D
		retlw		b'01110010'	; C
		retlw		b'11111110'	; B
		retlw		b'11101110'	; A
		retlw		b'11011110'	; 9
		retlw		b'11111110'	; 8
		retlw		b'00001110' 	; 7
		retlw		b'11111010'	; 6
		retlw		b'11011010'	; 5
		retlw		b'11001100'	; 4
		retlw		b'10011110'	; 3

Tagli

PCLATH konusunu daha önce burada ayrıntılı olarak açıklamıştım. Bir incele.

MPLAB, PCLATH'ı değiştiren bir komuttan sonraki satırı otamatik olarak konumlandırmaz, zaten buna gerek de yok. Ancak sen "org" ile adres belirlersen kodlar oraya konumlanır, diğer durumlarda hep bir sonraki adrestedirler (macrolar ve bazı directive'ler bunun istisnası). Ayrıca PCLATH'ın büyük iki bitini (daha doğrusu 3. ve 4. bitlerini) değiştirmediğin sürece GOTO ve CALL komutları etkilenmez, çünkü 0, 1 ve 2. bitler bu komutlar tarafından göz ardı edilir. PCLATH'ın 5 bitinin tamamı sadece PCL değiştirileceği zaman kullanılır.

Bu arada alt-sayfa dediğin şey 256'lık bloklar mı?

Örnek olarak verdiğin tabloya gitmek için aşağıdaki MPLAB directive'ini kullanırsan işin kolaylaşır:
pageselw TABLO
call TABLO

Sondaki "w"ye dikkat! pagesel sadece büyük iki bitle uğraşır, tabloya giderken yarı yolda bırakır.

Neyse, tekrardan belirtmek gerekirse, PCLATH sadece bir tampon register'dır. PCL'de olduğunun aksine değiştirilmesi o anda bir atlamaya sebep olmaz. Bu register'a sadece CALL, GOTO komutları ve PCL register'ına yazım işlemi yapan komutlarda bakılır.
Gökçe Tağlıoğlu

camby

Teşekkürler tagli , PCLATH sadece bir tampon register deyince oturdu tam olarak kafamda, ben direk o sırada sayfa hemen değişiyor sanıyordum.

alt-sayfa dediğim yerler evet 256'lık bloklar , bunlar arasında geçiş yaparken de PCLATH'ın 0. , 1. , 2. bitlerini değiştirmek gerekiyor diye biliyorum. ki değiştirmediğim zaman da hata veriyor...

Tagli

Doğru, tabi bu sadece tablolar için geçerli. Eğer sadece GOTO ve CALL kullanacaksan, alt-sayfalar arasında PCLATH'ı değiştirmeden dolaşabilirsin. Yani alt-sayfalar arasındaki geçişler PCL ile oynayacağın zaman önem kazanır.
Gökçe Tağlıoğlu

camby

yani , 1 sayfa daha doğrusu 2k'lık adres doğrudan kullanılabilir.  Fakat 0. alt-sayfa dışında bir alt-sayfada iken PCL ile oynadığımda program kendini bir anda 0. alt-sayfada buluyor. Bu durumda da PCLATH ın ilk 3 bitini değiştirmek yeterli oluyor.

camby