Timer interrupt kullanımı ??

Başlatan gazel, 05 Eylül 2006, 14:51:07

gazel

merhaba arkadaşlar

pic programlamaya yeni başladım ve sitenize yeni kayıt oldum. böyle bir site forum kurup bilgilerinizi esirgemediğiniz için hepinize teşekkür ediyorum.

benim sorum şu:
timer interrupt kullanarak 1 HZ kare dalga üremek istiyorum. amacım interruptın nasıl çalıştığını öğrenmek. bu konuyu açmadan önce foruma biraz baktım bişeyler buldum ama anlayamadım. biri bana örnek bir kodla açıklayarak anlatabilir mi?

iyi çalışmalar.

Logan

Aramıza hoşgeldin gazel.Programcılığa yeni başladığına göre bulduğun konuları anlayamaman gayet doğaldır.Piclerde bulunan timer, işlemcinin clock frekansını baz alarak arka planda çalışır. Eğer programda gerekli kesme bitlerini aktif edersen, timer saymasını bitirdiğinde kesme oluşturur ve kesme alt programına dallanır.Bunu daha iyi anlaman için OPTION_REG ve INTCON registerlerine incelemen gerekir. Piclerdeki bu dahili timerlerin bir de prescaler değerleri vardır. OPTION registerinin 0-1 ve 2. bitleri prescaler değerini ayarlamak için kullanılır.Eğer bu bitleri 110 olarak ayarlarsan prescaler değeri TMR0 için 128 olur.Yani 128 clock sinyalinden sonra TMR0 değerini 1  arttırır ve bu işlem 255 olana kadar devam eder.Yani 128x255=32640 olur.Burada 4 Mhz kristal kullanılırsa işlem süresi 1 mikroS olacağından bu ayarlar ile TMR0 her kesme oluşturduğunda yaklaşık 32 milisaniyelik bir zaman geçtiği anlamına gelir. Sana ise tam 1 sn lazım olduğuna göre prescaler değerini en uygun şekilde ayarlaman gerekir.Fakat şunu unutma, tam olarak 1 sn tutturman hiçte kolay olmayacaktır.Hesapladıkça daha iyi anlayacaksın.Kolay gelsin.
İmza.

gazel

merhaba Logan hocam. kullandığım crystal 12 mhz. senin verdiğin örnekte prescalar değeri 110 için sanırım 96 ms gecıkme yapacağı anlamına mı geliyor. yani 96 ms saniye sonra int fonksiyonundaki kodlar işlem görecek?

benim bu presaclar değerini nasıl atamam gerekiyor. pic c de yazılmış örnek kodlar verebilir misiniz?

Logan

@gazel, benim uzmanlık alanım C değil, asm ve basic. 12 Mhz kristal kullandığına göre işlem süresi yaklaşık 333 nanosaniyedir.Şimdi 1hz üreteceğimize göre ve prescaler değerini max. 256 yapabildiğimize göre 256x256=65.536 saykıl demek oluyor.Her saykıl 333 nanosaniye olduğuna göre de 333x66.536=22.156.488 nanosaniye zaman kaybı demektir.Bunu saniyeye dönüştürecek olursak 22.156.488/1.000.000.000=0,022156488 saniye eder.Yani 22.156 mikrosaniye zaman kazanırsın.Bize lazım olan ise 1.000.000 mikrosaniye olduğuna göre 1.000.000/22.156=45,134 olur.İnterrupt alt programını 45,134 kere tekrar edemeyeceğine göre 45 kez tekrar edeceksin. Bu da 45x22.156=997020 eder ve tam olarak 0,997 saniyeye denk gelir. İşte TMR0 hesabı bu şekilde yapılır.

Prescaler değerini nasıl ataman gerektiğine gelince, datasheetleri aç ve option registerini incele.



Seni ilgilendiren kısmı sadece 5.-3.-2.-1. ve 0. bitleridir.5. bitte TMR0'ın clock frekansını mı yoksa tocki pininden gelen sinyalimi sayması gerektiğine karar veriyorsun.Gördüğün gibi bu biti "0" yapmalısın.3. bitte ise ayarladığın prescaler değerinin WDT için mi yoksa TMR0 için mi kullanacağını seçiyorsun.bu bitide "0" yapmalısın ki prescaler değeri TMR0 için aktif olsun.2-1 ve 0. bitleri ise yukarıda zaten anlatmıştım.TMR0 8 bitlik bir registerdir ve maximum 255 değerini alabilir.Her 255'ten 0'a geçtiğinde kesme oluşturur.Umarım yeterince açıklayıcı olmuştur.Kolay gelsin.
İmza.

gazel

Teşekkürler Logan hocam. Sonunda çalıştırabildim. :)

CaFFeiNe

12Mhz kristal kullandığında saniyede (12.000.000/4) 3.000.000 komut işletebilirsin yani prescaler kullanmazsan timer değerini saniyede 3milyon kez arttırabilirsin, prescaleri 64' e ayarlarsan timer değerini saniyede (3.000.000/64) 46.875 kez arttırabilirsin, timerı her kesmede 131 ile (256-125) yüklersen saniyede 375 kesme elde edersin C'de long tipinde bir değişken tanımlayıp her kesme geldiğinde bu değişkeni arttırırsın 375 değerine ulaştığında istediğin işlemi yaptırırsın (yani tam 1sn. aralıklarla)  

12.000.000 / 4 / 125 / 64 = 375