PCLATH ve PCL

Başlatan transistor, 29 Ağustos 2008, 19:54:36

transistor

arkadaşlar aklım durmuş durumda yardımlarınızı bekliyorum.

4.sayfada iken aşağıdaki metni lcd ye yazdırmak istiyorum

CUMLE_YAZM	"<MENU3=MENU> 24SAAT=O & SURELI=A MOD:",.37


CUMLE_YAZM makrosuda bu

CUMLE_YAZM MACRO MT,MT1
LOCAL MS,MS1
	CLRF TEMP_CUMLE_YAM
MS1	MOVLW HIGH MS
	MOVWF PCLATH
	CALL MS
	CLRF PCLATH

	PAGESEL	0
	CALL GON_KAR
	
	PAGESEL	3
	
	INCF TEMP_CUMLE_YAM
	MOVF TEMP_CUMLE_YAM,0
	XORLW MT1
	BTFSS STATUS,Z
	GOTO MS1
	GOTO $+3+MT1

MS	MOVF TEMP_CUMLE_YAM,0
	ADDWF	PCL,F
	DT MT
	ENDM


bu makro ile 4 . sayfanın 255 . adresine kadar lcd ye yazı yazabiliyorum

makroya baktığımız zaman sayfa 4 ün başını ayarlıyor

bununda farkındayım fakat bi türlü 4. sayfadayken pc ve pclath i buna göre ayarlayamadım

yardımlarınızı bekliyorum
Herşey Vatan İçin.

mucit07

pclath ataman lazım 4 sayfaya

transistor

evet haklısın sayfayı atamak lazım orasını biliyordum fakat çözdüm aslında olay çok basit.

yazdığınız program 1. sayfayı taşıyor yada 1 den fazla sayfa kullanıyorsanız durum karışık gibi görünüyor bende karıştırdım

özetle

herhangi bi sayfada program akışı devam ederken

call ile bi rutin çağıracaksanız mutlaka pclath ona göre ayarlamak lazım
ve yine bu alt rutiinden dönerken tekrar dallanacağınız yer önemli

örnekle açıklarsak;

PAGESEL	TUS_YUKARIMI        ;  Call için adresi pclath'e atıyoruz
	CALL	TUS_YUKARIMI
.
.
.
TUS_ASAGIMI
       .
       .
       .
       
       RETURN              ;


Alıntı Yap
    sadece pagesel ile sayfa seçmek işe yaramıyor call ile çağıracağımız rutinin adresini de belirtmek gerekiyor bunun içinde en kolay yol alt rutinin labelini pagesel ile belirtmek.

   alt rutinden başka bi yere tekrar return ile dallanacaksak returnden öncede mutlaka oranın adresini pagesel ile belirtmek lazım.
  alt rutinden ilk çağırılan yer için ise pagesel ile adres belirtmeye gerek kalmıyor.

saygılar....
Herşey Vatan İçin.

Tagli

Öncelikle MPLAB'ı hiç kullanmadığım için (ilaçlanmış PIC Simulatör IDE diye birşey kullanıyorum) sorayım: PAGESEL nedir?

Olayı zaten çözmüşsünüz ama yine de ben konuyu bir özetleyeyim dedim (arama motorunu kullanarak bu başlığa erişen diğerlerinin işine yarar belki diye):

16 (sanırım 10 ve 12 de) serisi PIC'lerin program hafızası 13 bitlik değerlerle adresleniyor. Ancak sorun şu ki CALL ve GOTO komutları zaten toplamda 14 bitlik ifadeler ve bunların içine gömülmüş olan adres değeri 11 bitlik. Bu durumda kalan 2 bitin (ki bunlar yüksek bitler, 11. ve 12. bitler yani) bir yerden gelmesi gerekiyor, ki bu yer PCLATH. GOTO veya CALL komutları çalıştırıldığında bu komutların içinden gelen 11 bit ve PCLATH'daki 3. ve 4. bit birleştirilerek 13 bitlik adres elde ediliyor ve eğer komut CALL ise bu 13 bitlik adres hardware stack'ın (HS) da üstüne atılıyor. Eğer PC'ı kendimiz değiştirmek istersek durum biraz daha farklı. Bizim doğrudan erişebildiğimiz PC'nin düşük 8 biti PCL register'ında saklanıyor ve buraya müdahele ettiğimizde bu 8 bit PCLATH'ın 4:0'dan gelen 5 biti ile birleştirilip o adrese atlanıyor. RETURN komutunda ise bu türden bir sorun yok, 13 bitlik adres doğrudan HS'ten alınıp PC'ye yazılıyor çünkü. Ancak dikkat edilmesi gereken nokta şu ki RETURN'den sonra PCLATH sıfırlanmaz veya eski haline gelmez, onu eski haline sizin getirmeniz gerekir, yoksa bir sonraki ilk CALL veya GOTO komutunda acayip yerlere gidebilirsiniz.
Gökçe Tağlıoğlu

transistor

evet anlattıklarınız doğru

PAGESEL PCLATH ın 3 ve 4 ncü bitlerini değiştiriyor. örneğin;

PAGESEL 0 komutu allttaki işlemi yapıyor.

BCF    PCLATH,0x3
BCF    PCLATH,0x4
 
benim yanıldığım nokta aslında şurasıydı,

2 nci sayfada program ilerlerken 1 nci sayfadan bir rutin çağırmak için sayfa düzenlemesi yapıp call ile çağırıp tekrar 2. sayfaya dönüyordum buraya kadar sıkıntı yok,

fakat,

2. sayfaya döndüpte 255 satırın üzerinde bi yerden call ile 2. sayfadan bi rutini çağırdığım zaman dönüşte farklı yerlere dallanıyordu.


buraya kadar 2 nci sayfadayız.

	PAGESEL	0             ; 1 nci sayfa
;
	MOVLW	B'11100110'		; CURSOR ADRESI
	CALL	GON_KOMUT    ; 1 nci sayfadaki alt rutin
	MOVLW	B'00001101'		; DISPLAY ON CURSOR ON
	CALL	GON_KOMUT    ;; 1 nci sayfadaki alt rutin
	
1 nci sayfadan tekrar buraya 2 nci sayfaya döndük 

	MOVLW	'O'
	MOVWF	TUS_Y
	
	MOVLW	'M'
	MOVWF	TUS_A

ŞUAN TAM BU NOKTADA 2 NCİ SAYFANIN 256 NCI SATIRINDAYIZ

	PAGESEL	TUS_YUKARIMI ; 2 nci sayfaki alt rutin için "pclath" 
	CALL	TUS_YUKARIMI         ; 2 nci sayfada alt rutin
Herşey Vatan İçin.