timer0 kesmesi

Başlatan Mr.Java, 01 Aralık 2012, 00:19:40

Mr.Java

Timer0 öndeğer(TMR0L) esaplanması nasıl oluyor..

Örnek kod
unsigned cnt;

void interrupt() {
  if (TMR0IF_bit) {
    cnt++;           
    TMR0L  = 158;
    TMR0IF_bit = 0;
  }
}

esensoy

bir çok pic te timer0 8 bitlik,
yani 0 dan 255 e kadar sayıyor
255 iken 0 oluyor ve kesme bitini set ediyor (TMR0IF)
yazdığınız fonksiyon da kesme fonksiyonu,
her 255-158=97 pals te bir kesme oluştruyor,

siz timer0 ın hangi osilatorden saydırılacağını (dahili-internal mı harici-external mı) ve prescaler değerini ilgili registerlardan ayarlayarak ne kadar zamanda artacağını hesaplıyorsunuz,
TMR0L yi de 0-255 arasında istediğiniz değerden başlatabiliyorsunuz
En tehlikeli an "zafer" anıdır.

Mr.Java

Alıntı yapılan: esensoy - 01 Aralık 2012, 11:26:45
bir çok pic te timer0 8 bitlik,
yani 0 dan 255 e kadar sayıyor
255 iken 0 oluyor ve kesme bitini set ediyor (TMR0IF)
yazdığınız fonksiyon da kesme fonksiyonu,
her 255-158=97 pals te bir kesme oluştruyor,

siz timer0 ın hangi osilatorden saydırılacağını (dahili-internal mı harici-external mı) ve prescaler değerini ilgili registerlardan ayarlayarak ne kadar zamanda artacağını hesaplıyorsunuz,
TMR0L yi de 0-255 arasında istediğiniz değerden başlatabiliyorsunuz

evet doğrudur sormak istediğim hesaplanması nasıl oluyor ?

esensoy

#3
1x (256-TMR0)xPRESCALER/(FOSC/4)
diyelim ki;
TMR0=0, PRESACALER=2,FOSC=4MHz
1x256x2/(4000000/4)=512 mikro saniyede bir interrupt oluşur

TMR0=158, PRESACALER=4,FOSC=20MHz
1x98x4/(20000000/4)= 78.4 mikro saniyede bir interrupt oluşur

daha hassas hesaplama yapmak için interrupt rutinine girdikten çıkana kadar işletilen kodun da ne kadar vakit aldığını hesaplamak gerekir

http://tehnikservice.net/2009/06/30/mister-pic-multi-calculator/
Bu programla hesabı yapabilirsin
En tehlikeli an "zafer" anıdır.

Mr.Java

anladım yardım için teşekkürler...


xoom

#5
Arkadaşlar bir yerde hata yapıyorum ama kafama durdu sanırım.. size danışıyorum bu A.0 portundaki led kaç us/ms/sn 'de yanar ?
Hesaplama Şeklini gösterebilecek birisi var mı?
//Ben 25,6ms buldum ?

Frekans:20Mhz
Timer Sıfır Setup ayarı Şu Şekilde
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1|RTCC_8_bit);

#int_TIMER0
void  TIMER0_isr(void) 
{
  x++;
 if (x==500)  {x = 0; output_high(pin_a0);}
}

JKramer

#6
1/(Frekans/4)=1/(20/4)=1/5=0,2 us'de bir Timer0 bir artacak. (RTCC_DIV_1 yani çarpan 1 olduğu için)

Eğer Timer 8 bit'likse 0-255 arası sayar, 255'den tekrar 0'a geçerken kesme oluşur: 0,2 us * 256=51,2 us'de bir kesme olacak.

Kesme içindeki değişken 500 olduğunda; 51,2 us * 500=25600 us zaman geçmiş olacak.

Ekleme: Az önce 640 ms'di, mesajı düzenlediğinizde neyi değiştirdiğinizi yazmayı unutmayın :).

xoom

Yanıt için tşkler.. Ben matematiksel hata yapmışım.. Ben Mesajımı editlerken Cvp verilmemişti diye Not düşmemiştim.. Pardon..