T0 anlayamadığım bir nokta var.

Başlatan ziyaretci, 14 Nisan 2015, 21:49:04

ziyaretci

Merhaba, elimde Orhan Altınbaşak'ın kitabı var.

Timer0 uygulamasına göz gezdiriyordum, bilgi eksikliğimden kaynaklıdır muhtemelen mantığıma yatmayan bir yer var, ilk önce şunu bilmek istiyorum:

1) Timer0 kesmesine izin verir vermez, 1 turluk (255 defa sayarak) kesmemi oluşturuyor?(daha timer 0 başlangıç değeri yüklemeden)
2) Eğer öyleyse kesme meydana geldiğinde FSR(0x004)saklayıcısından mı dallanıyor?

  Şimdi kitaptaki uygulama;

ORG 0x00   ;adresinden  başla
 GOTO BASLA  ; Bu etikette timer0 ayarları yapılıyor ve bu ayarlar biter bitmez program sonsuz döngüye sokuluyor.
 ORG 0x004   ; 
 GOTO kesme_alt_programi
BASLA
 ;; ayarlar;; burada timer0 'a herhangi bir değer yüklenmiyor. 
;;Kitapta okudum timer0 başlangıç değeri yükler yüklemez saymaya başlıyormuş. 
sonsuz
GOTO sonsuz 

kesme_alt_programı
;; timer 0 kesmesindeki ayarlar bayrak sıfırla şunu yap bunu yap vs.
retfie
END


Muhtemelen 1. maddede dediğim gibi oluyor. Eğer 1. maddede dediğim gibi olmuyorsa; sonsuz döngüden kesme alt programına nasıl gideceğiz de timer0 başlangıç değeri belirleyeceğiz?

En azından sonsuz döngügen önce timer0 için başlangıç değeri verse, sonsuz döngünün içerisinde de bayrağı kontrol edersin, kesme alt programına gidersin. Bilmediğim birşeyler var galiba, ilgililerle gidermek istiyorum.

Tagli

Timer0, varsayılan ayarlarla PIC ile birlikte çalışmaya başlar ve ilk taşmada - ki muhtemelen açılmasının ardından çok kısa bir süre sonra - ilgili kesme bayrağını 1 yapar. Kesmeler etkin olsa da olmasa da durum budur. Ama elbette kesmeler açık değilse, kesme bayrağının 1 olmasını PIC umursamaz.

Eğer Timer0 kesme izni verilmişse ve global kesmeler de açıksa (GIE), kesme bayrağı 1 olduğunda program 0x4 nolu program adresine dallanır. Sıra tam tersi de olabilir. Eğer kesme bayrağı 1 olmuş ama izin bitlerinden biri 0 kalmışsa, izin biti 1 yapıldığında kesme adresine gidecektir.

Timer başlangıç değeri belirlemeden önce kesme bayrağını temizle. Başlangıç değerini yaz ve sonra kesme iznini ver.

Şahsen ben timer'ları başlangıç değeri ile kullanmaktan hoşlanmıyorum. Bana biraz zorlama bir çözüm gibi geliyor. 8 bitlik PIC'lerde timer2'de bitiş değeri var, o şekilde kullanmak daha sağlıklı. Zaten gelişmiş işlemcilerde (mesela ARM tabanlı işlemcilerde) genelde timer'lar bu şekilde olur. Yani taşma sınırı kullanıcı tarafından belirlenir.

Program belleği ve kesme vektörü ile FSR'nin bir ilgisi yok. Kavramları birbirine karıştırma.
Gökçe Tağlıoğlu

ziyaretci

@Tagli:

Bilgiler için teşekkürler, yalnız içimi rahatlatacak cümle okuyamadım daha. :|

Emin olmak için:
Gie izin verildi, T0IE izin verildi. T0 başlangıç değeri verilmedi. Tam bu noktada 00h(ilk enerji verildiğinde bütün saklayıcılar 0 diye biliyorum.) dan başlayarak 255 değerine ulaştığında 0x004 adresine gidecek.(bayrak 1 ). Yani başlangıç için değer vermeye gerek yok? Bu soruları kitaptaki uygulamayı mantığıma yatırmak için soruyorum. Yoksa ben yaparsam kitaptaki gibi yapmam zaten. Mantık bu mudur?

"Program belleği ve kesme vektörü ile FSR'nin bir ilgisi yok. Kavramları birbirine karıştırma."
   Bu cümlenize karşılık kendi düşüncelerimi paylaşarak, yine eksikliklerimi gidermek istiyorum.
Şimdi banklar 0x00 adresinden başlıyor, tabi bunların arasında saklayıcı adresleride var, PORTx, TRISx , STATUS vs. kitapta 0x004 adresinden dallanacak yazıyor, bende direkt ilgili denetleyicinin bank içeriğine göz gezdirdim, 0x004 adresinde FSR vardı, o yüzden FSR'yi işin içine kattım. Biraz FSR 'ye göz attım, işaretçilerle ilgili bir saklayıcı galiba, yani pek bilgim yok.

Bu düşüncelerime yönelik kafamdaki soru işaretleri zihninizde canlanmıştır. Bu konuda da bilgi alabilir miyim sizden?




Tagli

İlk paragrafta yazdıkların doğru. Şu hariç:
Alıntı Yap(ilk enerji verildiğinde bütün saklayıcılar 0 diye biliyorum.)
Bunun garantisi yok. İşlemci modeline ve register'a, hatta bitlere göre değişir. İşlemci datasheet'inde her register ve her bit için başlangıç değerleri tablo halinde verilir. x olarak gösterilenler, başlangıçta değeri bilinmeyen bitlerdir. TMR0 için durum nasıldı unuttum. Kullandığın işlemcinin datasheet'ine bakmalısın.

Kesme durumunda dallanılacak olan 0x4 adresi program belleği adresidir. Senin bahsettiğin FSR'nin de aralarında olduğu özel fonksiyon register'ları (SFR) ve diğer genel amaçlı register'lar, program belleğinde değil veri belleğinde bulunur. Yani işlemcinin 3 tür belleği var: Program belleği, veri (data) belleği ve EEPROM (bazı modellerde olmayabilir).

Bu arada, FSR, C dilindeki pointer (işaretçi) benzeri bir iş yapıyor. Dolaylı adreslemede hangi register'a erişileceğini belirliyor.
Gökçe Tağlıoğlu

ziyaretci

#4
Zaman ayırdığınız için teşekkür ederim, uygulama hakkındaki soru işaretlerimi giderdim. Yalnız canımı sıkan nokta var. Şöyleki; tabi daha ayrıntılı bir araştırma yapmadığımdan karşıma çıkmadı muhtemelen ama paylaşacak olursam, kitaptaki timer0 ile ilgili bilgilerin arasında 0x004 adresiyle ilgili bir açıklama göremedim. Bu adresi detaylı bir şekilde araştırabileceğim bir kaynak var mıdır? Veya kısaca sizden rica etsem?

  Eğer bu adres timer0 ile ilgili tanımlı bir adres ise, t1, t2 .. gibi zamanlayıcıların kesme adreslerini nereden öğrenebilirim?

Datasheet'lerde mutlaka yazar ama ingilizce seviyem kayda değer olmadığı için bazı temel bilgiler hariç modüllerin açıklamalarından pek fazla yararlanamıyorum. 

RaMu

İlgili mcu nun datasheet ine bakmak lazım,
emin olarak söyleyebileceğim 16f serisi için:
datasheet ten fotoya bakalım önce


Program memory nin 0x0004 nolu adresi kesme için ayrılmıştır,
yani mcuda kesme üretebilen herhangibir donanım
kesme ürettiği anda program 0x0004 adresine gider,
sanki biz call 0x04 demişiz gibi oluyor
(call  alt_prog demek aslında alt_prog program memoryde hangi adresdeyse
o adresi çağır call 0xXXX demektir, 0xXXX en fazla 11 bitlik bir adresdir)
ve mcu kesmeye gitmeden önce program memoryde hangi satırı işliyorsa
o satırın adresini stack dediğimiz hafızaya alıyor
ve kesmede işin bitip retfie dediğinde aynı returnda olduğu gibi
kaldığı program memory satırına geri gidiyor.


Kısaca herhangibir kesme gelirse
pic 0x0004 adresine gider.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

ziyaretci

  Gerçekten çok sağol @RaMu, şuanda bir üst cevabımda yazdığım soru işaretlerim gitti.
@Tagli, @RaMu çok teşekkür ederim.



RaMu

Benim için zevk hocam,
daha fazla soru varsa beklerim.
Kesme için açtığım bir konu var onada gözat istersen
güzel bilgiler var,
artık asm ile uğraşanda yok öyle yatıyor konu:
https://www.picproje.org/index.php/topic,58682.msg453034.html#msg453034
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

ziyaretci

#8
  Şahsen güncel dillere göre ASM ile program hazırlamak hamallık gerçekten. ASM'yi, CCS C 'de kendi ihtiyacım olan kütüphaneleri yazmak için kullanıyorum diyebilirim.

   Bir insan bilmem kaç tane programlama dili bilirse bilsin, o dillerin arasında asm'nin kesinlikle yer alması gerekir. Kendi tecrübelerime dayanarak söylüyorum, ben bu yazılım merakına ccs c ile başladım. İnanın asm hakkında bilgiler edinmeye başlarken taşlar yerine oturmaya başladı. Haylile bu şekilde nereye bastığını görebiliyor insan, sonuç olarak daha sağlam ve kararlı ilerliyor.
 
  Ek olarak verdiğiniz bağlantıya göz gezdirdim, paylaşım için sağolun. Bilgiler masaüstümde.  ;)


ziyaretci