16F877 hardware stack sorunu sanırım

Başlatan annubiss67, 01 Haziran 2005, 01:59:53

annubiss67

arkadaşlar herkese selam
yazdığım program bir yerede kadar güzel çalışıyo ama look up tablomda 182 tane değer var.simule ederken 120'ye kadar tablodan alabiliyorum fakat 120 den sonra program başka bir yere dallanıyor.başka bir alt programım var. o alt programda 8 kez test yapıyorum.bu alt programı sildiğimde normal çalışıyor.ama bu alt programda bana lazım.  .bu sorun sanırım hardware stack'dan dolayı meydana geliyor,sanırım fazla dallanmadan dolayı meydana geliyor ama bunu nasıl giderecem bulamadım.bu konuda fikri olan arkadaş yardımcı olabilirmi.şimdiden sağolun

bsivgin

fazla dallanmadan dolayı olmayabilir. Her sayfanın ilk 256'lık bölümünde look up table yapabilirsin.

Saygılarımla
Bülent ŞIVGIN
www.diyot.com

Petek

Her sayfada 256 nın da üzerinde lookup table yapabilirsiniz. Önce PCL yi toplayın, Carry varsa PCLATH'i arttırın ve yükleyin. PCL ye sanırım ilave 5 rakamı ekliyorsunuz carry tespiti ve varsa PCLATHin arttırımında geçen adımlar için.

Sizin sorununuz PCL 256yı aşınca PCLATHi arttırmamaktan kaynaklanabilir. Lookup Tableı ilk 256 bayt içerisinde tanımlayın, alt programı lookup tableın arkasına alın.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

optech

LookUp tablelarda PCL FF e kadar arttiktan sonra PCLATH table konumuna gore ayarlanmali. Ornegin program memory de bir table 0x145 adresine geliyorsa PCL ile toplama yapildiginda son iki byte i alir yani 45, verdiginiz rakamla toplar mesela 4, = 49 a dallanir. Neden Cunku PCLATH 0x00 dir. 0x01 olmalidir cunku 0x145 in ilk rakami PCLATH icindedir. PC yapisi 13 bittir. 8 i PCL 5i PCLATH. PCLATHin yuksek 2 bitine ulasilamaz. Son 3 bitine yukleme yapilarak boyle bir ayar yapilir.

Ayni sorun PAGE ayarinda da yapilmalidir. Mesela ilk page 0x000 ile 0x800 arasidir. Bu aralikta PCLATH degistirilmeden GOTO ve CALL komutlari ile dallanma yapilabilir. Ama farkli pageler arasindaki adreslere CALL veya GOTO ile PCLATH ayarlanmadan dallanma yapilamaz. Ornegin page2 ye gecmek icin PCLATH e 0x08 yuklenmelidir. (800 un 8 i).

Bu sorunlar benim de basima cok geliyor. Assemblyde uzun kodlar yazmayanlarin basina pek gelmez bu sorun ondan cok yaygin değil herhal. Ben bu isin bir kolayini ariyorum. Bilmiyorum bir yolu var midir. PCLATH e her seferinde 0x08  geri donmek icin de 0x00 yuklemeden dallanma yapamaz miyim. Sayfalar arsinda cok gecis yapmam gerekiyor.

Herkese calismalarinda basarilar.

DumrulBey

Merhaba,

Önce, bu forumda yukarıda yazılanlardan öncesine lafım olmadığını belirteyim. Belki başka başlıklarda daha çok bilimsel veya teknik konuşulmuş olabilir. Hatta ben de şu an biraz boş konuştuğumu söyleyebilirim. Yani yazıyorum ama bir şeyi belirtmeden geçemeyeceğim:

Yukarıda yazılanlar bana çok sevimli geldi. Bazen burada teknik düzeyi düşük o kadar çok laf ediyoruz ki. Bu yazılanları gördükçe ve seviyenin yükseliğinden dolayı gözlerim yaşardı...:)

Cevap veren arkadaşları tebrik ederim! Belki basit bir konu ama ne güzel açıklamalar getirmişsiniz. Umarım soruyu soran meslektaşımıza bir merhem olmuştur. Son olarak yazdıklarımızda Türkçe yazım kurallarına uygun davranırsak daha anlaşılır olacak. En azından Türkçe karakter kullanmaktan çekinmeyelim.

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

annubiss67

arkadaşlar ilginiz için teşekkürler.pclath'ın 256'yı aşmasından dolayı kaynaklandığını anladım.daha önce hiç başka sayfadan alt program çağırmadım.denedim ama alt program çağırmayı beceremedim :)
programım şöyle;

  .
  .
  .
  .
  call tablo
  .
  .
  .
  .


   tablo
   
     addwf PCL
  retlw h'99'
  retlw h..
 .
 .  
 .


programım da alt programı bu şekilde çağırıyordum.acaba tablo'yu başka sayfaya yazıp nasıl çağıracam.bunu yazabilirmisiniz .ayrıca kusura bakmayın, belki kendim bulmalıyım ama programım biraz acele. eğer yardımcı oluranız sevinirim.

optech

Ornek olarak pic16f877 icin 0-800 arasi page0, 800-1000 hex adres arasi page1,1000-1800 hex adres arasi page2, 1800-2000 hex adres arasi page3 tur. Diyelim "tablo" yu 0x83A adresiden baslayarak yazdiniz yani page1 e. "tablo" isimli tabloya page0 dan dallanmak istiyorsunuz diyelim. Bunun icin PCLATH e 0x08 yuklemelisiniz. Soyle:

   org 0x100; page0 da bir adres
....
....
    movlw 0x08
    movwf PCLATH ;page2 icin dusunseydik yani page2 de bir tabloya call veya goto ile dallanacak olsaydik 0x10 yukleyecektik. Aynen page3 icin 0x18
    call tablo 
....
....
    org 0x83A ; page1 de bir adres
tablo
    retlw 0x10
....
....

Burda dikkat edilmesi gereken sey alt programa dallanılıyorsa alt programdan ciktiktan sonra yazilimda devam eden kodlar icinde alt tarafta page0 icine dallanan bir call ya da goto komutu varsa PCLATH 0x08 olarak kaldigindan page0 a dallanmadan once PCLATH'e 0x00 yuklenmelidir.

Umarim aciklayici olmuştur. Kolay gelsin...

DumrulBey

Alıntı yapılan: "optech"...
Bu sorunlar benim de basima cok geliyor. Assemblyde uzun kodlar yazmayanlarin basina pek gelmez bu sorun ondan cok yaygin değil herhal. Ben bu isin bir kolayini ariyorum. Bilmiyorum bir yolu var midir. PCLATH e her seferinde 0x08 geri donmek icin de 0x00 yuklemeden dallanma yapamaz miyim. Sayfalar arsinda cok gecis yapmam gerekiyor.
Dostum neden BANKSEL derleyici komutunu kullanmıyorsun. Sanırım bu daha pratik olacaktır. Ne yazık ki 16F8xx ve bir bakıma 'assembly'i dili böyle uğraştırıyor. En iyisi 18F ailesine geçmek veya üst seviye bir dilde programlamak galiba...

Sanırım aşağıdaki dökümanlar işinizi görecektir. Bunları yukarıdaki http://www.dosyadepo.com/index.php?mode=viewupload&id=180 adresten paketlenmiş halini yükleyebilceğiniz gibi başlarındaki kod numaralarına göre Microchip'in resmi sitesinden tek tek edinebilirsiniz. Özellikle son dosyanın ikinci sayfasında olayı grafik ile anlatmış.

AN548 - Implementing Table Read and Table Write.pdf
AN556 - Implementing a Table Read.pdf
AN581 - Implementing Long Calls.pdf

Başarılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

annubiss67

optech arkadaş'ın dediği gibi yaptım ve programım şu ana güzel bir şekilde çalışıyor.yardımcı olduğun için teşşekkürler optech arkadaş ve ilgilenen diğerlerine de teşekkür ediyorum.hepinize kolay gelsin

bsivgin

banksel komutu registerlerin sayfalarını seçmek için kullanılır.
16f877'nin 2Kbyte lık sayfalarını seçmek için pagesel komutu uygun olacaktır.

örneğin

org 00
goto start
org 0x12
nop
nop
pagesel altprg
call altprg
pagesel start
...
....
...
...
....
org h'1002'
movlw 'A'
return
end


saygılarımla
Bülent ŞIVGIN
www.diyot.com

annubiss67

bülent bey. fakat programı compile ederken banksel,pagesel komutları için derleyici tarafından hata vermez mi.derleyici bu komutları derlerken nasıl tanıyacak.sonuçta bu register değil,derleyiciye nasıl tanıtacaz?

bsivgin

vermez bunlar MPASM'nin directive'leri. Program içinde org, equ gibi directive. Kullanabilirsin.


Saygılarımla
Bülent ŞIVGIN
www.diyot.com