tmr0 gecikmesi

Başlatan efsanepoldem, 25 Kasım 2013, 08:20:44

efsanepoldem

  Sn. ETE. pic16f628  TMR0 kullanarak 40msn, 50msn,66msn,100msn,250msn. lik gecikmeler yapmak istiyorum. Bu değerleri elde etmem için  TMR0 değerleri ne olmalı. Bu nasıl hesaplanır.

ete

Alıntı YapSn. ETE. pic16f628  TMR0 kullanarak 40msn, 50msn,66msn,100msn,250msn. lik gecikmeler yapmak istiyorum. Bu değerleri elde etmem için  TMR0 değerleri ne olmalı. Bu nasıl hesaplanır.
Öncelikle nasıl hesaplandığını iyi bilmeme rağmen kolaylık olsun diye "PicMultiCalc" isimli basit programı kullanıyorum.
Program free dir ve linki ,  http://www.picbasic.co.uk/forum/attachment.php?attachmentid=1164&d=1162909841

Nasıl hesaplandığına gelince. Öncelikle işlemci frekansını bilmeniz ve bunun üzerinden bir komut çevriminin süresini hesaplamanız gerekiyor. Diyelimki 4 Mhz lik pic frekansı kullanıyorsunuz. Bu frekans 4/e bölünerek pic tarafından kullanılıyor. O halde bir komut çevrimi için önce 4.000.000/4=1.000.000 hz/sn olarak buluyoruz. T peryodu için T=1/F formülü ile hesaplamaya çalışacağız. Formülde yer alan 1 rakamı 1 sn yi ifade etmektedir. Bunu us cinsinden yazarsak (1SN=1000ms=1000.000us dir)
KOmut Çevrimi=1000.000/1000.000=1 us olarak bulunur.

Şimdi Zamanlayıcılara geri diönelim. Her bir zamanlayıcının birde değişik oranlarda bölücüleri vardır.
Şayet 1/1 bölme oranını kullanırsak önce TMR0 sayacını hesaplayalım. sayac sıfırdan başlayıp tekrar sıfıra dönmesi için tam tamına 256 kademe sayması gerekecektir. O halde her bir kademe 1us olacağına göre toplam geçecek süre 256us olacaktır.
Bölme oranını 1/2 alırsak her iki komut çevriminde Tmr0 bir sayacaktır. Bu durumda timer sıfırdan 256 ya gelebilmesi için 256*2=512 us lik bir süre geçecek demektir.
Şimdi senin örneklerine dönelim, İlk değer 40ms lik süre . Bunu us cinsine çevirirsek 40.000 us edecektir.
Bunu öyle bir sayıya bölmeliyizki sonuç 0-255 arasında kalsın. Önce 128 bölme oranını kullanalım ne oluyor görelim. 40.000/128=312 çıktı. BU sayı 255 den büyük olduğu için bir üst bölme oranını kullanmamız gerekecektir. O halde 40.000/256=156 elde edilir. Bu rakam 255 den küçük olduğu için kullanabiliriz demektir.
Bu sonuç bize şunu gösteriyor, Şayet ben 1/256 bölme oranını kullanırsam ve sayacımıda  156 birim saydırırsam 256x156=39936us lik bir süre elde edeceğim. Aslında bu işlemde komut gecikmeleride etkin rol oynarlar. Komutların gecikmeleri yaklaşık 7 komut çevrimi kadardır. Bu durumda gerçekte 156 birim değil 163 birim saymış gibi olur ve geçen süre de buna bağlı olarak uzar. Bu nedenle hesap yaparken saydırma adedini 156 değil 156-7=149 olarak kullanmamız daha doğru olur.
Sayacın 149 birim sayması için 256-149=107 rakamı ile saymaya başlaması gerekir. 107 den başlayarak 256 ya geldiği zaman 149 birim saymış olacaktır çünki.

Böylece Saymaya başlamdan evvel,
Option Registerinden bölme oranını 256 olarak ayarlarsan ve TMR0=107 değerini verirsen tmr0=0 olduğunda yaklaşık 40 ms süre geçmiş olacaktır.

Aynı hesabı 50ms için yapalım.
50.000us/256=195 , 256-(195-7)=68, ohalde bölme oranı yine 256 ve TMR0 başlangıç değeri ise 68 olacak demektir.
Aynı hesabı 66ms için yapmaya geçmeden önce TMR0 ile elde edilebilecek en uzun süreyi hesaplayalım istersen.
Bölme oranı 256 olunca ve TMR0 başlangıç değeri sıfır olursa en uzun süre  elde edilmiş olacaktır.
Buda 256 x 256 = 65.536us yani yaklaşık 65 ms dir. Buda gösteriyorki TMR0 sayacı ile 66ms ve üzeri değerleri yakalaman mümkün değil. Ne yaparsın peki, iki alternatifin var. Birincisi TMR0 yerine benzer mantıkla çalışan TMR1 sayacını kullanırsın. TMR1 sayacı 16 bitlik olduğu için ve maksimum bölme oranı 8 olabileceği için 8*65535=524.280 us lik gecikmeler yaratabilirsin demektir.
İkinci alternatif ise harici bir değişken sayacı kullanarak istediğin değerlere ulaşırsın. Diyelimki 66ms lik gecikme elde etmek istiyorsun. ulaşabileceğin en büyük değer 65 ms o halde 65535 değerine ulaşınca TMR0 sayacını 465 sayacak şekilde yeniden kurarsın ve sonuçta 66000us lik süreyi yakalarsın yada 66000/10=6600 eder. Bu durumda sayacı 6600 sayacak şekilde kurarsın ve sayac her sıfırlandığında sayac=sayac+1 dersin Sayac=10 olduğunda 66000us lik süre geçmiş demek olur.
Diğerlerini artık anlatmıyorum onlarıda benzer harici sayac kullanarak halledebilirsin. Yada en iyisi TMR1 sayacını kullanmaktır.

Ete

efsanepoldem

Açıklamalarınızdan dolayı çok teşekkür ederim.

Powered by EzPortal