timer0 kesme problemi

enexs

Üye
Katılım
4 Kas 2008
Mesajlar
99
Puanları
1
Yaş
39
merhaba arkadaşlar
ben bir projede timer0 kesmesi kullanmak istiyorum. ama kesmenin 200 mikro saniyede bir gelmesi lazım kesme zamanın hesabı için gerekli olan formül malum
Tkesme=1/f*bölme oranı*(256-timera yazılan değer)
bu formüle göre picin osilatörü fosc=4Mhz/4=1Mhz bölme oranını 2 seçersem timer a da herseferinde 156 atarsam 200 mikro saniyede bir kesmenin gelmesi lazım buraya kadar teorik olarak bi rproblem yoktur heralde?
bundan sonra uygulamaya geçince kesme 200 mikro saniyeden farklı bir zamanda oluşuyor mesela 60 milisaniye gibi. bölme oranın değiltirince kesmenin oluşma zamanıda değişiyor yani kesme oranını yazdığım fonksiyonda çalışıyor
AMA timer0 için
set_timer0(156);
şeklinde tanımlanan fonksiyon çalışmıyor yani bu fonksiyona 0 yazmakla 254 yazmak arasıdna bir fark olmuyor. tabii bu fonksiyonu kesmenin içinde de yazıyorum.
soru 1 sizce 200 mikro saniye hassasiyetle kesme üretilebilirmi(bu arada çok fazla kod var yaklaşık olarak 10 kbyte bu problem olabilirmi)
soru 2 set_timer0() fonksiyonu niye bir halta yaramıyor
her türlü yoruma fikre ihtiyacım var bu konuda şimdiden teşekkürler
 
setup_timer0 işe yarıyor ve çok ta güzel yarıyor. en azından ben kullandım ve hiç bir sorunla karşılaşmadım. kesmeler de tam istediğim zamanlarda üretildi.
setup_timer0(56); dediğinizde ve hiçbir prescalar işlemi yapmadığınızda 200us'de bir gecikme yapmalı. çünkü 4mhz'de, timer0'ın her bir sayma işlemi arasında geçen süre 1us olmakta. o zaman timer0'a 200 defa işlemden sonra kesme yapacak şekilde ( yani 56 atanırsa geriye 200 kalmış olur [ 256-56 = 200 ] ) değer atanırsa o süre sonunda kesme üretecektir.

onun için, içine yazılan değerler arasında fark vardır :) yani bu fonksiyon bir halta yarar.

tabi kesmeleri de açmış olmanız gerekir. kesmeleri açtıktan sonra timer0'ı kurun. çalışacaktır. benim yaptığım projelerde çok ta güzel çalıştı. eğer olmuyorsa kodunuzu gönderin bakalım.
 
hocam bu problemi aştık
şimdi elimizde nur topu gibi yeni bir problem var bu işi timer 1 ile yapmaya karar verdik ve set_timer1() fonksiyonunun işe yaradığını gördük:D. yalnız proje gereği timera 30 farklı değer atamamız gerekecek yani mesela 1. durum için timeri 3000 den , 2. durum için 5000 den başlatmamız gerekiyor bu böyle 30 a kadar gidiyor her durum için kesmenin içinde durum karşılaştırması yapamıyacağımıza göre ve ya en azından bunun mantıklı bir yol olmadığı aşikar olduğuna göre en basitinden bu problemi bir değişkenle halletmemiz lazım yani bir global değişken tanımlarız mesela 'a' ondan sonra main fonksiyonu içinde a=3000 deriz timer kesmesi içerisindede set_timer1(a)dediğimizde problemin aşılmış olması gerekir diye düşünüyorum ama böyle olmuyor malesef
acaba set_timer1 fonksiyonuna bir parametre aktarabilirmiyiz yada sabit bir intiger atanması şartmıdır? ne dersiniz
teşekkürler
 
arkadaşlar belki işinize yarar yukarda bahsettiğim set_timer1 fonksiyonuna değer atama problemini çözdüm
timer1 malum 16 bitlik bir sayıcı ccs c de int tipinde bir değişken ise 8 bitlik bir değişken bu yüzden int tipinde bir değişkeni timer1 e parametre olarak atayamıyoruz ama int16 tipinde bir değişken atarsak problem çözülüyor bunuda öğrenmiş olduk
 

Forum istatistikleri

Konular
128,292
Mesajlar
916,505
Kullanıcılar
450,127
Son üye
furkan680

Yeni konular

Geri
Üst