tmr1 sayaç hızını ayarlama.

Başlatan acemdiyarı, 22 Temmuz 2014, 17:35:34

acemdiyarı

Hocam ben bir şey merak ediyorum ve sormak istedim datashette baktım ama anlamadım 16f877a da tmr sayacını program yazarken SAYAC=SAYAC+1 dediğimizde timer kaç ms yada us yada ns ile sayıyor ve bu süreleri bizim istediğimiz bir sürede saydırmak istersek  nasıl hesap edip ayarlayabiliriz, hesap şekli nasıl olmalı  bu konuda bilgi verebilirseniz memnun olurum hocam.
Teşekkürler.

ete

Sistem osilatöründen tetik alarak sayma yaparken iki parametre etkilidir.
Birincisi T1CON registeri ile ayarlanan Bölme oranı, diğeride işlemci frekansıdır.
Biliyorsunu bir komut çevrimi işlemci frekansının 4'e bölünmesi ile bulunuyor.
4 Mzhlik bir kristal yada dahili osilatör hızında bir komut çevrim süreci ;
4.000.000/4=1.000.000 hz dir. Bunun peryodu ise 1/1.000.000 =0,000001 sn veya 1.000.000/1.000.000=1 us dir.
Bu aynı zamanda TMR1 sayacının bir sayması için geçecek süredir.
Bölme oranına bakacak olursak seçenekler 1/1 , 1/2, , 1/4 ve 1/8 dir. Bu durumda bölme oranını 1/1 alırsan, her komut çevriminde sayac da 1 sayar. Bölme oranını 1/2 alırsan 2 komut çevriminde TMR1 tek sayar. Bölme oranını 1/4 alırsan 4 komut çevriminde sayac 1 sayar. Benzer şekilde bölme oranı 1/8 olursa 8 komut çevriminde sayac 1 sayar.

Ete

acemdiyarı

Hocam anlattıklarınızı anlıyorum ama uygulayamıyorum, bir örnekle tekrar gösterirmisiniz 10Mhz kristal kullanılırsa 100us de bir pals tetikleme istersem T1CON=%  ? ne olmalı ve bu değeri programın başına değilde program içine farklı hızda palsler ile dallandırıp değişik hızlar seçilirse programın çalışmasında bir sorun teşkil edermi.?

ete

Her zaman söylüyorum , PIC MULTICALC denilen basit bir program parçası mevcut. Bu sitede link de vermiştim yada dosyanın kendisini direk yükledim sanıyorum. Bunu kullanın bu tür hesaplamalar için.
Programı çalıştırıyorum. İkinci sıradaki Timer Helper seçeneğini seçiyorum. Açılan sayfada sol tarafta duram OSC seçeneğine 10 (Mhz) yazıyorum. Sağ tarafta yer alan interrupt frequency seçeneğine 100us yazıyorum.
ENTER e basınca hemen bana hem 8 bit timer (TMR0) hemde 16 bit timer (TMR1) için seçenekleri sıralıyor.
TMR1 seçeneğinde şunlar mevcut;
-  Ön yükleme değeri 65292, bölme oranı 1/1, T1CON=%00001001
- Ön yükleme değeri 65414, bölme oranı 1/2 , T1CON=%00011001
- Ön yükleme değeri  65475, bölme oranı 1/4, T1CON=%00101001
- Ön yükleme değeri 65505, bölme oranı 1/8 , T1CON=%00111001

T1CON registerin 4 v 5 nolu bitleri bölme oranını ayarlıyor;
%00 = 1/1
%01 = 1/2
%10 = 1/4
%11 = 1/8

Aynı registerin sıfır nolu biti ise sayacı aktif hale getiriyor. Bu bit sıfır olduğu müddetçe TMR1 saymayacaktır. Saymaya başlaması için sıfır nolu biti 1 yapılmalıdır. Ben yukarıdaki ayarlamada hepsinde bu biti 1 olarak verdim. Genelde sayac saymaya başlayacağı zaman bu bit 1 yapılır bunuda unutmayın.
Ön yükleme değeri ne demek onuda açıklayayım. TMR1 in kesme oluşturması için değerinin 65535 den sonrasına ulaşması gerekir.  10 Mhz osc frekansında bir komut çevrimi 10/4=2,5 Mhz ve 1000.000/2500.000=0,4 us dir.
100us lik süre için (100/0,4=250 komut çevrimi gerekecektir.) O halde sayacın 250 sayıp kesme oluşturması çin 65536-250=65286 ön yükleme değerinin verilmesi gerekir. Buna 6 adet komut gecikmesi eklersek 65286+6=65292 değerini bulmuş oluruz. Buda bizim 1/1 bölme oranına göre hesapladığımız ilk değer olur.
Şimdi bölme oranını 1/2 alalım, Bölme oranını 1/2 alınca sayacın 250 yerine 250/2=125  kadar sayması gerekecektir. Bu durumda hesap 65536-125+6/2=65414 ön yükleme değeri verilecektir.
Bölme oranını 1/4 alırsak 250/4=62 , o halde hesap (1 adet komt gecikmesi ile birlikte ) 65536 -62+1=65475 olacaktır.
1/8 olanı da sen hesaplarsın artık.

Ete

acemdiyarı

Hocam ayrıntılı cevabınız için teşekkür ederim elinize sağlık.

Powered by EzPortal