2.sayfada interup gelirse neolur

Başlatan supermakarna, 07 Mart 2006, 00:24:04

Ziya

Alıntı yapılan: "ismetelk"1. sayfada altrutin çağırmak için pclath'a 1 değerini ataman gerek. geri döndükten hemen sonrada (hangi  sayfaya dönersen dön) pclath'ı sıfırlaman gerekli yoksa program abuk sabuk yerlere gider...
Ben bunu anlamadım, biraz açabilirmisin?
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

Veli B.

Alıntı yapılan: "ismetelk"assembly resmen hamallıkmış ben basic'e geçtim tavsiye ederim.
Ben bunu da anlamadım :!:

bsivgin

ben bir hamalım  :D

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

Petek

Alıntı yapılan: "süpermakarna"Arkadaşlar bir sorum daha olcak ben 1.sayfadan altrutini çağırıyorum orası tamam fakat dönmek için pclatch ile oynamama gerek yok olması lazım çünkü stack 13 bitlik adresi hafızada tutabiliyo ama olmuyo
4.3.2 STACK

The PIC16F62X family has an 8 level deep x 13-bit wide hardware stack (Figure 4-1 and Figure 4-2). The stack space is not part of either program or data space and the stack pointer is not readable or writable. The PC is PUSHed onto the stack when a CALL instruction is executed or an interrupt causes a branch. The stack is POPed in the event of a RETURN, RETLW or a RETFIE instruction execution. PCLATH is not affected by a PUSH or POP operation.

The stack operates as a circular buffer. This means that after the stack has been PUSHed eight times, the ninth push overwrites the value that was stored from the first push. The tenth push overwrites the second push (and so on).

Note 1: There are no STATUS bits to indicate stack overflow or stack
underflow conditions.

Note 2: There are no instructions/mnemonics called PUSH or POP. These are actions that occur from the execution of the CALL, RETURN, RETLW and RETFIE instructions, or the vectoring to an interrupt address.
---------------------------------------------------

---------------------------------------------------
2.9 YIĞIN (STACK)

PI16F84 8 adet 13 bit genişliğinde donanım yığınına sahiptir. Yığın alanı, ne data alanının ne de programın parçası değildir. Yığın işaret edicisi okunamaz ve yazılamaz.

Tüm 13 bit PC; RETURN, RETLW veya RETFIE komutu gerçekleşmesi halinde CALL komutu gerçekleştirildiği yada kesici doğrulandıdğı zaman yığın üzerine itilir. PCLATCH itme veya patlama operasyonu tarafından etkilenmez.

Yığın dairesel tampon olarak operasyon yapar. Yani yığın sekizinci kez itilmeden sonra, onuncu itme ilk itmeden stok edilmiş değeri fazladan yazar. Onuncu itme ilk itmeyi yeniden yazar ve bu şekilde devam eder. Eğer yığın etkili bir şekilde on kez itilirse, PC değeri ilk patlamadan sonraki değeri ile aynıdır. Yığın üst ve alt akış durumlarını göstesmek için hiçbir hal biti yoktur. İtme veya patlama denen hiçbir hatırlatıcı ipucu komutu yoktur. CALL, RETURN, RETLW ve RETFIE komutlarının gerçekleşmesinden veya kesici vektörlemeden meydana gelen aksiyonlar vardır.
-----------
NOT: pop kelimesini patlama olarak çevirmiş vatandaş. Herhalde çeviri yaparken popcorn atıştırıyordu.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

CaFFeiNe

Alıntı yapılan: "süpermakarna"Arkadaşlar bir sorum daha olcak ben 1.sayfadan altrutini çağırıyorum orası tamam fakat dönmek için pclatch ile oynamama gerek yok olması lazım çünkü stack 13 bitlik adresi hafızada tutabiliyo ama olmuyo

öncelikle uzun zamandır asembly kullanmıyorum

datasheete biraz baktım CALL, GOTO gibi komutlar 11bitlik adres bilgisini içerilerinde barındırıyorlar (ki bu max 2K lık bir adres olurki sayfa olayıda buradan kaynaklanıyor sanırım) bir CALL veya GOTO komutu işlendiğinde program sayacına ilk 11bit bu komutların opcode undan alınıp yerleştiriliyor

yani
   CALL  BurayaGit

dediğinizde aslında BurayaGit adresinin ilk 11biti program sayacına işleniyor dolayısı ile kalan üst 2 biti (13-11=2) sizin PCLATH yazmacının 4 ve 3.bitlerine yazmanız gerekli böylece doğru bir şekilde BurayaGit adresine gittik

geri dönerken ise RETURN, RETFIE, RETLW gibi komutlar kullanırsak PCLATH ı ayarlamaya gerek yok çünkü bu komutlar stackin en üstteki adresi program sayacına yerleştiriyorlar fakat bunlar yerine yine CALL, GOTO yaparsak yine PCLATH ı ayarlamak gerekir

bu PCLATH ile uğraşmak istemiyorsan önceki mesajımda yazdığım gibi PAGESEL olayını araştır

kodunun problemli kısmını yazarsan belki daha fazla yardım alabilirsin

ismetelk

@ziya
aşağıdaki gibi bi programım var ve sayılar etiketinin olduğu program memory adresi 255 i geçmiş napcaz;???yani ben program counter'ı alıp  350. program memory adresine gönderecem. pcl 8 bit olduğu için 256 bayt kontrol edebilir.  o zaman pcl ile birlikte pclath'ı kullanıp pclath'a 01 değerini atacaz program memory adresi sayılar kısmında 512'yi geçerse pclath'a 10 değerini atacaz bunu biliyorsunuzdur sanırım. yanlış anlaşılma tekrar dönüce pclath'ı sıfırlayın dediğim içinse, sıfırlamakta fayda var demek istemiştim kesinlikle gerekmeyebilir ama orneğin pcl yi bir değil iki yerde kullanmanız gerekti ve biri 1. sayfada yani 255. adresin ustunde diğeri 0. sayfada.  1. sayfadakı altrutin için pclath'a değer atayıp silmezseniz 0. sayfadaki altrutini çağırdığınız zaman karışıklıklar olur.
                  :
:
               MOVF   SAYAC, 0
   CALL   SAYILAR
   BCF   PCLATH, 0
   MOVWF   PORTB
                     :
                     :
                     

SAYILAR
   BSF   PCLATH, 0
   ADDWF   PCL, F      
   RETLW   h'7E'         
               RETLW   h'0C'
   RETLW   h'B6'
   RETLW   h'9E'   
   RETLW   h'CC'
   RETLW   h'DA'   
   RETLW   h'FA'
   RETLW   h'0E'
   RETLW   h'FE'
   RETLW   h'DE'
:
@katana
kusura bakma senin neyi anlamadığını tam anlamadım.
pic'i üst düzey diller yerine assembly kullanarak programlamaya çalışmak zaman ve emek kaybına neden oluyo bence. örneğin 1 saniye gecikme yapabilmek için assembleyde
:
GICIK
   MOVLW   h'05'      
   MOVWF   SAYACE      
GICIK1
   MOVLW   h'FF'
   MOVWF   SAYACF
GICIK2
   MOVLW   h'FF'
   MOVWF   SAYACG
GICIK3
   DECFSZ   SAYACG
   GOTO   GICIK3
   DECFSZ   SAYACF
   GOTO   GICIK2
   DECFSZ   SAYACE
   GOTO   GICIK1
   RETURN
   END
:
gibi bi dongü düzenlemek gerekirken basic'de

PAUSE 1000

yazmak yeterli oluyosa bu hammallık değilde nedir.

Veli B.

-Asm ne kadar alan harcıyor, basic ne kadar harcıyor.
-Asm de kaç kesme kaçırırsın, basicde kaç kesme kaçırırsın.
Amatörce çalışmaksa tamam.
Profesyonelce çalışmak için basic kesinlikle en son tercihler arasında yer almalı.Bu hamallık değil sadece hızlı ve sorunsuz çalışan kodlar için profesyonelliktir.

Ziya

http://techref.massmind.org/techref/microchip/pages.htm Bu adreste konu ile ilgili detaylı açıklama var.
Alıntı yapılan: "ismetelk"@ziya
aşağıdaki gibi bi programım var ve sayılar etiketinin olduğu program memory adresi 255 i geçmiş napcaz;???yani ben program counter'ı alıp  350. program memory adresine gönderecem. pcl 8 bit olduğu için 256 bayt kontrol edebilir.  o zaman pcl ile birlikte pclath'ı kullanıp pclath'a 01 değerini atacaz program memory adresi sayılar kısmında 512'yi geçerse pclath'a 10 değerini atacaz bunu biliyorsunuzdur sanırım.
Bunda bir sorun yok. istendiğinde 8 k lık alanın tamamının hesaplanmış goto ile tablo gibi kullanabilirsin.
Alıntı Yapyanlış anlaşılma tekrar dönüce pclath'ı sıfırlayın dediğim içinse, sıfırlamakta fayda var demek istemiştim kesinlikle gerekmeyebilir
Evet bu kısım içindi.
Alıntı Yap
ama orneğin pcl yi bir değil iki yerde kullanmanız gerekti ve biri 1. sayfada yani 255. adresin ustunde diğeri 0. sayfada.  1. sayfadakı altrutin için pclath'a değer atayıp silmezseniz 0. sayfadaki altrutini çağırdığınız zaman karışıklıklar olur.
Altrutinlere geçişlerde sorun yok, zira call komutu pclathin ilk üç bitini de set ediyor ve alt rutin hangi sayfada ise o sayfayı PCLATH e girip call yapıyorsun. Ama altrutinden dönüşlerde PCL ile oynamak sakıncalı sonuçlar doğurabilir. Zira Program Sayacı PCLATH ve PCL den değil Stacktan geri dönüş bilgisini alır. PCLATH içeriği altrutinde en son kaldığı şekildedir. farklı sayfalardaki altrutinler çağırılmış ise alt programdan geri dönüşte bulunulan page PCLATH te düzeltilmelidir. Bu GOTO, CALL komutlarının yanlış çalışmasını önler. PCL i kullanmadan önce GOTO PC+1 yaparsanız PCLATH içeriği düzelmiş olur ve bundan sonra PCL i kullanarak hesaplanmış goto yu rahatlıkla kullanabilirsiniz.

Uzun zamandır program yazmadığım için (1 yıldan fazla oldu) ve 2.5-3 yıldan fazladır da assembler ve Jalden uzak kaldığım için bu konuları yanlış hatırlıyor olabilirim. Assemblercılar (varsa) yanlışımı düzeltirlerse sevinirim.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

supermakarna

Arkadaşlar bence asm en profesyonel çalışma ama hamallık oldugu söylenebilir. Neden asm derseniz basic ve C de programa tam olarak hakim olamıyoruz o bişeyler yapıyo ama biz onu bilmiyoruz.  Pic reset alırsa program kendini toplayabilcekmi sorun yaratcakmı nerden belli. ama asmde bu sorunu çözebiliyosun her komut satırını yazarken burda reset alırsa program gümlermi diye işlem yaparsan sorun yok. Ben bu yüzden C ve basic'e geçmeyi düşünmüyorum. Sonuçta prgram bir kez yazılıyo. Sonuçta mp3 player veya video oynatan bi program yazmıyoz. ben 2kblık bir asm programı 20 günde bitiriyom bu kıyaslama saçma ama sadece örnek bide alt rutinleri bir kez yazdıktan sonra diğer programlar kullancağım zaman tekrar alt rutin yazmana gerek yok. Mesela bir seri haberleşme alt rutini yaparsın birkere gönder dersin gönderir sadece ve her prgramda kullanırsın.

 Sizinde yorumlarınızı bekliyorum özellikler bu reset olayı ile ilgili