Asm ile Tablo

Başlatan ahmetinrodisi, 14 Ekim 2005, 00:07:32

ahmetinrodisi

Merhaba arkadaşlar.Yazdığım programda, 4 mikro switch'in kombinasyonları na göre LCD ye mesaj gondermek istedim. Tablolarımı ise DT komutunu kullanarak yaptım.Fakat program 4 tablodan sonra 5. ve diğer tabloları okumuyor.Mesala 5. tabloyu alıp 4. tablonun yerine koyduğumda ve isimlerini de değiştirdiğimde Tablo4(Yani Eskiden Tablo5 olan)  okunuyor.Ilk 4 Tablom şöyle:

Tablo1 addwf PCL,1   ;Bu tablo ve verileri tanımlandı
     Dt 'B','A','L','Y','A',' ','S','A','Y','I','S','I','='

Tablo2 addwf PCL,1   ;Bu tablo ve verileri tanımlandı
     Dt '0','1','2','3','4','5','6','7','8','9'

Tablo3 addwf PCL,1   ;Bu tablo ve verileri tanımlandı
     Dt ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '

Tablo4 addwf PCL,1   ;Bu tablo ve verileri tanımlandı
     Dt 'K','I','R','M','I','Z','I',' ','A','L','A','R','M','!',' ','H','E','M','E','N','M','A','K','I','N','E','Y','I',' ','D','U','R','D','U','R','!'

Tablo5 addwf PCL,1   ;Bu tablo ve verileri tanımlandı
     Dt 'A','R','K','A',' ','K','A','P','A','K',' ','A','C','I','L','D','I','!','B','A','L','Y','A',' ','B','O','S','A','L','T','I','L','I','Y','O','R','!'


Acaba Tablo 4 den sonra Assembly'in koyduğu belli bir limit mi var? yoksa Benmi bir yerlerde hata yapıyorum arkadaşlar.çözüm için fikirlerinizi bekliyorum arkadaşlar.Şimdiden hepinize teşekürler.Sağlıcakla kalın...

refik1

Tabloyu programının baştarafına koy

org 5
tablo1
tablo2

ahmetinrodisi

Nasıl Yani? Tablolar zaten programın başında.Şöyle:

org 0x000
goto Basla
org 0x004
goto Kesmeye_git
;**********************************************************************************************************
;                                    ALT PROGRAMLAR
;***********************************************************************************************************
#include "E:\PIC\Lcd.inc"
#include "E:\PIC\EEPROM_Okuma_Yazma.inc"
#include "E:\PIC\iki ve 3 digiti okuma.inc"
;************************************************************
;         LCD YE YAZILACAK DEĞERLERİN TABLOSU
;************************************************************

Tablo1
Tablo2
...

Biraz daha açıklayabilirsen çok sevinecem.Ne yaptıysam kabul ettiremiyorum programa.Yardımlarınızı bekliyorum arkadaşlar, herkese şimdiden teşekürler..

refik1

org 0x000
goto Basla
org 0x004
goto Kesme_alt_programı
org 0x005
tablo1
tablo2
tablo3
;------------------------
Kesme_alt_programı
.
.
.
.
RETFIE
;-----------------------

CaFFeiNe

tablolar programın başında diyorsun ama include komutu ile dahil ettiğin dosyalar sayesinde bayağı bir ileriye gidiyor sanırım problemin 2K sayfa problemine benziyor mplab da PAGESEL komutunu incele birde tablon tam 2K sınırlarından birine geliyor olabilir yarısı alt sayfada yarısı üst sayfada olabilir yani

HEXF2

Hangi PIC'i kullanıyorsun arkadaşım.Eğer 877 gibi belleği büyük bir PIC ila çalışlıyorsan tablolarını her zaman program belleğinin başka sayfalarına at derim ben bunu yapıyorum ve hiç sorun yaşamadım

halilkarageci

Pic işlemcisi hangi sınıfta olursa olsun(16,18..) program bellek ten program kodlarını okurken sayfalama yapar.

addwf PCL,1 komutu ile look up tablosunun içeriğini program counter a ekliyorsun ama sayfalama yapmayı unutuyorsun.

sayfalama yapman için PCLATH register'ına sayfa numarası eklemen gerekir.PCLATH ve PCL ikisi program counter ı oluşturur.ve bellek'e erişim sağlar.

sonuç:   movlw high tablo1  'high , PC nin anlamlı byte ını yükler
           movwf PCLATH
           call tablo1

kodları ile PC içeriğini oluşturup sayfalama yapmış olursun.

silence_yener

arkadaşlar, pcl ile başım dertte 256 ya ulaştığında program başa dönüyor yazı tam çıkmadan yarıda kesiliyor.

PCLATH komutuyla alakalı galiba bana yarımcı olursanız sevinirim.İşin içinden çıkamadım.



                            SaygılaR...

sertac2003

256-512 nci byte arasında tablo okuma işlemi yapmak için
bsf pclath,0
bcf pclath,1
call tablo

512-768 arasında ise :
bcf pclath,0
bsf pclath,1
call ilgili_tablo

768-1024 arasında :

bsf pclath,0
bsf pclath,1
call ilgili_diger_tablo

.
.
.

yaparak lookup tabloları çağırırsan sorun oratadan kalkacaktır...
Şirketteki herkes en üst yöneticinin müşterisidir.

ahmetinrodisi

Çok sağolun arkadaşlar. Son denemelerimi sadece Tablo 1-5 arasında yapıyordum.Refik1 in dediği gibi yaptım Tablolarımı en başa koydum. az önce denedim artık switch durum değiştirdiğinde tablo5 i okuyor, saçmalamıyor. Geri kalan tabloları artık akşama deneyecem.Heralde bir sorun çıkacağını sanmıyorum.Ama pagesel olayı hakkındada bilgi araştıracam.Asm yi öğrendiğim kitapda bu konular hakkında pek az bilgi olduğu için benimde bu konular hakkında bilgim az.Ama sizler sayesinde hiç olmasa öğrenmiş olduk.Tekrar teşekürler hepinize...

silence_yener

sertac 2003, ilgin ve faydalı bilgin için tşk ederim...

ahmetinrodisi

Tekrar merhaba arkadşalar. org 0x005 yapmak ile Tablo 5 ve birkaç tanesini daha okudu.Fakat hala daha okuyamadığı tablolar var.Kitaplar dan öğrendiğim kadariyle PAGE 0 (000h-7FFh) arası.Benim programım MPLAB ın Program Memory kısmından veya IC-Prog daki adreslerden kontrol ettiğimde bu sınırların anca yarısına geliyor.Yani yazdığım program hala page 0 içinde.Eğer hatalıysam belirtin lütfen.Peki Page 1'e geçmediysem niye tabloların bir kısmını okuyor,bazılarını ise hala okumuyor. Tablo olan kısmı org 0x900 den başlattım ve her call tablo yazdığım yerin üstüne;
bcf PCLATH,4
bsf PCLATH,3       ;Select page 1 (800h-FFFh)

komutlarını koydum..Yine olmadı.kullandığım pic 16F877.Program da ayrıca RB port değişimi kesmesini kullanıyorum(RB4-RB7).Bu yollardan geçen arkadaşlar tam açıklamalı bu programa benzer bir örnek verirse çok sevinecem.Gerekirse size zipli olarak programı gondereyim.Yeterki olsun.sağlıcakla kalın...

memed52

pcl 0-255 arası değerler alır. Tablonuzu 255 lik dilimlerden birini başına yerleştirin. Örnegin.
tablonuz 256 satırdan uzunsa, 257. satır cağırılacağı zaman pclath değerini düzeltmeniz gerekir.
Kulandığınız işlemciye göre page değerlerinide degiştirmeniz gerekebilir.

   Movlw   .3
   movwf   pclath   (Program counter ın 9 ve 10 cu bitlerin değeri) org 300h ile tanımladıgınız değer.

   movlw   .XXX   (Geri dönüş almak istediginiz tablonun adres değeri, movwf ile degişkende kullana bilirsiniz.)
   call   tablo1
   .
   .
   .


   Movlw   .4
   movwf   pclath   

   movlw   .XXX   
   call   tablo2
   .
   .
   .



   Org 300h   ;tablo başlangıcı

tablo1   addwf   pcl,f
   dt   ...........
   dt   ...........
   retlw   .......
   .
   .
   .


   Org 400h   ;tablo başlangıcı

tablo2   addwf   pcl,f
   dt   ...........
   dt   ...........
   retlw   .......
   .
   .
   .
İyi çalışmalar.

bigbey

Arkadaşlar bildiğim kadarıyle tablo okumalarında RETLW komutu 255 satıra kadar işlem yapıyor.
16f877 için şöyle bir işlem yapılabilir. 4 sayfadan herbirinin sayfa başına tablolar yerleştirilebilir.
DATAADRES     EQU       0X20
;alınacak olan datanın sıra nosu yüklenecek
;diyelimki sayfa 2 deki 15. datayı alacağız.


               MOVLW .15
               MOVWF      DATAADRES          ;Alınacak tablo datasının adresi
               PAGESEL    TABLO2
               CALL          TABLO2

;SAYFA1
	ORG	0X800

TABLO2
               MOVF       DATAADRES,W
               CALL        DATA1
               PAGESEL   0
               RETURN
DATA1
               ADDWF     PCL,F
	RETLW	B'00111111'	;0
	RETLW	B'00000110'	;1
	RETLW	B'01011011'	;2
	RETLW	B'01001111'	;3
	RETLW	B'01100110'	;4
	RETLW	B'01101101'	;5
	RETLW	B'01111101'	;6
	RETLW	B'00000111'	;7
	RETLW	B'01111111'	;8
	RETLW	B'01101111'	;9
	RETLW	B'01111001'	;E
	RETLW      B'01010000'	;r
	RETLW	B'01110011'	;P               

;SAYFA2
	ORG	0X1000

;               Aynı mantıkla buraya ekleme yapabilirsiniz
;SAYFA3
	ORG	0X1800


;               Aynı mantıkla buraya ekleme yapabilirsiniz
TA6R

ahmetinrodisi

Verdiğiniz bilgiler için çok sağolun arkadaşlar. Fakat bir türlü sorunu halledemiyorum. Tabloları dediğiniz gibi birkaç sayfaya attım. bigbey in dediği gibi tabloları çağırdığım yerlere tekrar eklemeler yaptım. Fakat yine olmadı. Bazı tabloları page 0 a bazılarını page 1 e bazlarını ise page 2  ye yerleştirdim.MPLAB hata vermiyor, debug ediyor. Fakat IC-PROG yüklerken ya 801h adresinde hata veriyor, yada 1800h adresinde hata veriyor.Yani bir türlü yükletmiyor.ORG 1800 i silip ORG 800 ün altına koyduğumda programı yükleyebiliyorum fakat yine sondan birkaç tablo okunmuyor.Toplam 12 tane Tablom var ve hepsinde yaklaşık 20 karakter var. Yani 255 satırlık değil.Birde memed52 bir örnek verdi:

Org 300h ;tablo başlangıcı

tablo1 addwf pcl,f
dt ...........
dt ...........
retlw .......

Acaba bu yazım doğrumu?çünkü benim öğrendiğim kitabda Dt nin altına retlw komutu yazılmıyor.Doğrumu diye denedim fakat MBLAP bende hata verdi.Lütfen yardım edin arkadaşlar, bir türlü programa okutamıyorum gitti bu tabloları. Hepinize tekrar çok teşekürler....