avatar_elektro77

Timer1 Control Register yöntemi ile Olay denetleme

Başlatan elektro77, 22 Mart 2025, 10:24:39

elektro77

T1CON=%00110000
KES = 2
BIR:
    TMR1H = $0B
    TMR1L = $DC
    PIR1.0 = 0
    WHILE PIR1.0 = 0
        ' Olaylar ve İşlemler
    WEND
    KES = KES - 1
    IF KES > 0 THEN BIR
   SN=SN+1
T1CON=0
Yukarıdaki kısa kod parçasında, 4hmz osilatör frekansında, (Fosc/4) ve 1:1 prescaller hesabı ile, her bir kesmenin 62.5mS olmasını istiyorum. KES=2 den, 2 kesmenin toplamı 125mS olmalı. Hal böyle iken, koddaki SN=SN+1 formülü ile 2 kesmede 1 saniye geçmiş olacak mı?
Bu durumda, T1CON=%00110000 bit ayarları ve TMR1H = $0B ve TMR1L = $DC hesaplamam doğrumu?
Eğer yanlış ise doğrusu ne olmalı?
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

alisumer

#1
hocam siz 1 saniye aralıklarla bişey mi yapmaya çalışıyorsunuz. eğer öyleyse neden kesmeyi 1:1 yapıp 65,5 ms kesme yapıyorsunuz.eğer öyle yapıyorsanız 4 mhz için tmr1l ve h ye 0 değeri vermeniz gerekiyor , neden 3036 değerini veriyorsunuz bu değer 1/8 bölme oranında 500ms gecikme yaratır doğrudur zaten yazdığınızın aksine  1/8 bölme kullanmışsınız SN=SN+1 formülü ne işe yarıyor sn yi 1 artırmaktan başka .ayarladığın bölme oranı eğer işlemcinin son limiti 1/8 ise normal iki kesmede yaklaşık 1 saniye geçecektir.fakat bu saniye artırma işlemi kesme rutininin içinde olmalı
eğer amacınız 1 saniye de bir kesme ile birşey yaptırmak gibi birşeyse bence kesmeyi bayrakla kontrol etmek yerine kesme adresine gönder orda ne yapacaksan yap ana program içinde bayrak kontrolü zaman hassasiyetini bozar zaten basic kendi kontrolünü yapıyor.birde bölme oranını eğer destekleyen işlemci ise 1/16 falan yapsan zaten 1 saniyede 1 kesmeyi başka kod falan bişey yapmadan da yapabilirsin eğer sınır 1/8 ise verdiğin tmr1 lere verdiğin değer doğru iki kesmede sn 1 artar oda yaklaşık 1 saniye. yalnız bir eleştirim olacak dediklerini çözmem 1 saatime mal oldu tessüf ederim :)
Hep meraktan

ete

Kriterlerin neler önce onlara bakalım;
- 1/1 bölme oranı istiyorsun T1CON=%00XX0000 burada XX ile gösterilen iki bitlik bilgi bölme oranını ayarlıyor.Bakalım parametrelerine bu T1CON un
T1CON=%00XX0000  %00=1/1 , %01=1/2  , %10=1/4  , %11=1/8
T1CON=%0000000X  X=ENABLE  %0=TİMER1 KAPALI %1=TIMER1 AÇIK
T1CON=%000000X0  X=Clk source bit %0=internal  %1=external

kesme süresi; 62,5ms, 4Mhz osc frekansında 1 clk palsi 1us olcağı için sana gerekli olan sayım miktarı 62500us olacaktır. Toplam Timer1 (16 bitlik sayıcı) sayacı sayım miktarı 65535 olduğu için sayacın saymaya 65536-62500=3036 değerinden başlaması lazım ki kesme oluştuğu anda sayac değeri 65535'i aşmış olsun.Elimizdeki değer 3036 dır ancak bu sayacı kurduğun anda işi yapacak komutların yaklaşık 7us lik bir gecikmesi olacaktır. Bu nedenle 3036-7=3043 değeri asıl başlayacağımız sayac değeri olacaktır. Buun Hex karşılığı $0BE3 dür. Bu durumda TMR1H=$0B, TMR1L=$E3 değerlerini verirsen ve T1CON sayac registerini , T1CON=%00000001 şeklinde ayarlarsan her bir kesmen 62,5ms veya 62500us olacaktır.

Bu değerleri almanın diğer bir yolu da PicMultiCalc.exe isimli programı kullanmaktır.
Menüdeki ikinci seçeneği (TimerHelper) seçersen açılan ekranda ;
OSC altına 4Mhz,  Interrup/Frequency altına 62.5 yazıp ms kutusunu işaretlemen yeterli olacaktır.
Entere bastığın anda altta 16Bit Timer tablosunda seçenekleri görebilirsin artık. Prescaler seçeneğin 1/1 olduğu için ilk sıradaki senin değerin olacaktırki buda zaten 3043 olarak aynı değeri vermiş olacak.

Şimdi gelelim kod kısmına,
Sayac çalışmaya başladığında ilk kesme sonunda 62,5ms geçecek ve kes=1 değerini alacaktır.
İkinci kesmede oluştuğunda 125ms geçmiş olacak ve kes=0 olacak ve ardından SN=SN+1 olacaktır.
Yani bu kod ile her 125ms de bir sn değerini artırmış oluyorsun. Halbuki ne istiyorsun her 1 sn yani 1000 ms de bir saniye değerin artırılması gerekiyor. Bu durumda yeniden bir hesap yapmak gerekir.
1000 /62,5=16 demekki 1000 ms (1sn) geçebilmesi için senin kesme adedin 16 olması gerekir.
Bu durumda en üstte Kes=2 yerine Kes=16 yazmak sureti ile Her saniye artışın 1 sn yeye denk gelecektir.

Burada sormak gerekir. Neden 62.5ms lik zaman dilimini kullanıyorsun. Yukarıda verdiğin kod aslında 500ms lik kesme süresine denk gelen bir kod. Şayet kesme süren 500 ms olsa Kes=2 değeri sıfıra geldiğinde 1 sn geçmiş olacaktır.

Peki 500 ms lik kesme süresi nasıl ayarlanır?. Zaten verdiğin kod buna uygun. Timer1 bölme oranını 1/8 alırsan 62,5*8=500 ms lik kesme süresine ulaşırsın demektir.
Bak ne yaptım 1/1 bölme oranındaki 62.5ms lik kesme süresini 8 ile çarptım. Çünki 1/8 bölme oranını alırsan sayacın her 8 clk palsine bir sayacaktır yani 8 kat yavaş sayacaktır. Buda 62,5x8=500 ms lik süreye tekabül eder kesme oluşturma açısından.
T1CON=%00110001 şeklinde vereceğin ayarla bunu verdiğin kod ile sağlayabilirsin.

Ete

alisumer

#3
ete hocam ben bi yazdım da yazıyı anlamadım düzeltene kadar makale yazmışsın ;D  ;D  :o  gerçi hala daha anlamamış olabilirim
Hep meraktan

elektro77

Cevaplarınız için teşekkür ederim.
Şimdi ise merak ettiğim veya bilmediğim şu; kesme icindeki olayları ve işlemleri ve ayrıca kesme içinden gosub veya goto ile dışarıya dallanmalari en hızlı şekilde hiç bir şey kaçırmadan nasıl yaparım. Bunun için ve işlerin denetimi için 62,5 MS kesme oluşturup saniyeyi de 16 kesmede bir mi saymak, yoksa işlerin denetimi icin 500 MS lik kesmeler oluşturmak mı daha doğru olur. Bunun mantığı nedir?
Alisumer programin tamaminda ekstra 2 kesme daha var. Pwm ve usart olmak üzere.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

alisumer

hocam 3 kesmen varsa mecburen kesmeye girince ilk önce hangi kesme diye bayrak bakman gerekecek bu da her kesme için extra kısmen öngörülemez gecikme demek yani işini ne kadar çok kesme ile yaparsan o kadar fazladan öngöremediğin gecikmen olur. kesme içinde ne kadar az oyalanırsan o kadar az şey kaçırırsın. eğer kesmelerin önemi  çok ise kesme içindeyken kesime neden olan bayrağı indirip tekrar kesmeyi açabilirsin yazılımsal bir bayrak registeri ayarlayıp hangi bayrak kaç kere kalkmış kesme içinde mi kalkmış kesme dışında mı kalkmış sayabilirsin ASM için mümkün basic için bilmiyorum nekadar işlevsel olur
Hep meraktan

elektro77

Ete Hocam;
Kesmeleri 125 ve 250mS lik olacak şekilde gerçekte denedim.
İşlemci kesme ile çok meşgul olunca diğer işlemleri daha çok kaçırmaya başladı.
En uygunu yine 500mS lik dilimler oldu.
Demekki işlemciyi kesme ile de çok meşgul etmemek gerekiyormuş. Bunu anladım.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

Powered by EzPortal