Timer1 kesme

Başlatan eprom_20, 23 Aralık 2019, 15:35:21

eprom_20

Hocam merhaba,
Timer1 kesmesinde ön yükleme verilmeden kesmenin açılması ve kesme oluşunca Timer1 kesme hesaplaması konusunu yapamadım,
Netten aramalarımda Timer1 kesmesi ön yükleme değerleri verilerek devreler ve kodlar yapılmış ama çoğuda C dilinde
bildiğim kadarıyla birşeyler yapmaya çalıştım ama olmuyor hocam bir yol gösterirmisiniz..

ete

Hesaplama mantığını gösterebilirim ancak gerisini yine kendin halledeceksin.
Ama PicMultiCalc.exe isimli programı (küçük ve kıs bir pic yardımcı programıdır) bulursan her türlü hesabı senin adına yapar ve parametrelerini verir sana.
Gelelim işinmantığına.
T1CON registeri bu sayacı kontrol ediyor. 4-5 nılu bitleri bölme oranını ayarlıyor. 1-2-4-8 olabiliyor bölme oranı. Önce sana lazım olan kesme gecikmesine karar vereceksin.
Diyelimki her 100 ms de bir kesme yaratmak istiyorsun. Osilatör frekansın 4Mhz. Bu durumda timer1 sayacının her tık sayması 1us lik bir süre alacaktır. 1/1 bölme oranını alırsan 16 bitlik sayac olduğu için 65535us lik bir süre sonunda kesme bayrağı set edilecektir. Bunun için TMR1L=0 ve TMRH=0 verip T1CON=%00000001 vermen yeterlidir. Sıfır nolu bit sayacı enable yapıyor.
65535us aslında 65,35ms ediyor. Bize 100 ms (100.000us) lazım olduğu için daha uzun bir gecikme gerekiyor. O halde bölme kullanmak gerekecek demektir. 100.000us için 1/2 bölme kullanır isek aslında 50000 us saymak yeterli olacaktır. Zira 2 ye böldüğümüz için sistem saati 100.000us saydığında timer1 ,1/2 bölme oranı ile 50.000us sayacaktır. Şimdi sayac toplamda 50000us sayınca taşma yaratması için 65.535-50.000= 15.535 den başlatılırsa saymaya 50.000 saydığında 65535 e ulaşır. Kesme bayrağının set edilmesi için bir sayma daha yapıp 65535'i aşması gerekir. O halde sayma işlemine 15536 dan başlaması gerekir. Bu işi yaptırmak için biraz kod yazmakda gerekecek ve bu kodlarında bir gecikmesi olacağı için genellikle o 15536 rakamına 7 çevrim süresi daha eklenir. Bu 7us demektir. Ancak 1/2 bölme oranı kullandığımız için bunu 2 ye bölerek eklememiz gerekiyor. Yani 3 birim daha eklersek işimiz görülecek demektir. Böylece ön yükleme değerimiz 15536+3=15539 olacaktır. Diğer parametremiz ise 1/2 bölme oranı olup T1CON=%00010001 değerini vererek bu işi başarmış olacağız. Aslında kesme yaratmayıp kesme bayrağı ile kontrol da yapabilirsiniz. Böylece Program TMR1 kesmesi oluştuğunda kesme bayrağını set eder ve oradan sürenin sonuna gelindiğini anlarsınız.
Ama bir global kesme de yaratmak istiyorsanız;
INTCON.7 ve INTCON.6 aktif edilmelidir.
Ayrıca PIE1.0 biti set edilerek TMR1 kesmesi aktif edilmelidir.
Yine PIR1.0 kesmeside sıfırlanarak işleme başlanmalıdır.
Kesme oluştuğu zaman ayarlanmış süre geçmiş demek olur ve kesme içinde PIR1.0=0 yapılmalı, TMR1L ve TMR1H regsiterlerine gereken değer verilmelidir.
Hesaplamada 15539 değerinin verileceğini bulmuş idik. Bunu HEX formatına çevirirseniz (Windows hesap makinası bunu yapabiliyor) ortaya şu çıkar. $3CB3  bu durumda TMRH=$3C ve TMR1L=$B3 değerleri registerlere verilmelidir. Sayac 16 bitlik olmasına rağmen değer verilirken 8 er bit olarak veriliyor bu bir kural başka yolu yok maalesef.
Hesap makinası yok ise TMR1H=(15539/256)=60 ve TMR1L=15539-(60*256)=179 şeklinde de aynı işi yapabilirsin.
 
Hepsi bu kadar.

Ete


eprom_20

Çok teşekkür ederim hocam emeğinize sağlık,TİMER1 sayacını ön değer vererek sayma işini hiç yapmamıştım kesme derslerine daha bilinçli tekrar bakacağım artık takıldığım yerde sorarım yine önerdiğiniz doğrultuda çalışacağım hocam sağolun varolun

Powered by EzPortal