şimdi, tek tek açıklamaya çalışalım:TRISC = 4
burada TRISC kütüğünde 1 olarak ayarladığın bitler, o bacağı giriş, 0 olarak ayarladığın bitler ise çıkış olarak tanımlıyor. yani aslında ikilik tabanda yazsaydık...
TRISC = 0b000001
00;
sağdan başlayarak 0. biti çıkış, 1. biti çıkış, 2. biti giriş
ve diğer bitleri çıkış olarak ayarlamışız. sen istediğin bacak değerlerini 1 ya da 0 yaparak giriş ya da çıkış olacağına karar verebilirsin.CCP1CON = 0b00000100
0100, her düşen kenarda kesmeye girilmesi için kullanılıyor.
evet, dediğin gibi. diğer seçeneklerin ise; her yükselen kenarda, her 4. yükselen kenarda ve her 16. yükselen kenarda olarak belirlenmiş
"(Fosc/4)/8; dahili saat; zamanlayıcıyı başlat" gibi bir açıklaması var. 0. bit zamanlayıcıyı başlatıyor. 1. bit dahili(ne demek? neden?) yapıyor. 4. ve 5. bitler ise 1:8 ölçekli olmasını sağlıyor. Pekala burada 1.bitin ve 4 ile 5. bitlerin açıklamasına ihtiyacım var. Neden 1:8 ölçeğini kullanıyoruz ve neden dahili saati kullanıyoruz ve wth is fosc?
şimdi burada biraz duralım. aslında burada "dahili" demek belki biraz yanlış olmuş. bunun yerine "mevcut" demek daha doğru olabilirmiş. bu şu demek. senin pic'i çalıştırmak için halihazırda taktığın kristal aynı zamanda timer1 için de kullanılacak. ayrıca sen istersen T1OSI - T1OSO bacaklarına osilatör bağlayarak ya da T1CKI bacağına verdiğin kare dalgayla da zamanlayıcının artmasını sağlayabilirsin. fosc, bağladığın kristalin frekansıdır. normalde dışarıdan bir saat bağlamadığında zamanlayıcı bu frekansın 1/4 'ünde çalışır. 1/8 ölçeği ise zamanlayıcının bu asıl frekansı da kaça böleceğini ayarlar. örneğin 4MHz bir kristal kullanıyorsan ve 1/8 şeklinde ölçekleme yaptıysan saatin 125 kHz'de çalışacak demektir. bu da zamanlayıcının 1 saniyede 125000 'e kadar sayması demek (ancak pic16f ve pic18f serilerinde timer1 16 bitlik olduğundan 65535 (2^16 - 1) sayısını geçtiğinde zamanlayıcı taşacak ve sıfırlanacaktır) bu ölçeği tamamen sallıyoruz : ) tabi ki senin ölçmek istediğin hız ve hassaslık derecesi de bu ölçeği seçmek için etkenler.
(4) Zamanlayıcı kesmesi,bir taşma olduğu zaman üretiliyor. Peki zamanlayıcımız ne zaman taşıyor?
işte yukarıda da bahsettiğim gibi zamanlayıcı 0xFFFF değerini geçtiği anda sıfırlanıyor ve bir kesmeye giriyor. (tabi ki zamanlayıcı 16 bitlikse. örneğin timer0 8 bitlik olduğundan 0xFF değerini geçtiğinde kesmeye giriyor)
öncelikle kesmeye nasıl girdiğimiz ile ilgili açıklamaların tamamen doğru. her düşen kenarda kesmeye giriyoruz bu uygulamada. benim daha önce yazdıklarım yanlış : )
Artık ne kadar süre ile 5V - ya da ayarlarına göre 0V - geldiğini biliyoruz.
benim uygulamam biraz daha farklı olduğundan sanki aynısıymış gibi yazmışım. ayrıca düşen ya da yükselen kenar olması da fark etmez.
ekte gönderdiğim resme bakarsan daha rahat anlayacaksın. ben yine de anlatmaya çalışayım. şimdi zaman hesaplaması tamamen işlemcilerimizin 8 bitlik olmasından o şekilde : ) işlemcimiz 8 bitten büyük verileri işleyemediğinden veriler iki ayrı kütükte tutuyor. bu da yüksek anlamlı bitin aslında bir nevi "basamak değeri" olmasını sağlıyor.
peki madem CCP1 kütüğümüz var, neden TMR1 kütüğünü de kullanıyoruz? aslında uygulamaya göre dışarıdan bir kesme alıp TMR1 kütüğünü kesme sırasında okuyarak da aynı işi gerçekleştirebiliriz. yalnız şu var ki biz o kesmeye girip değeri yakalayana kadar bizim zamanlayıcımız hala artıyor olacak, çünkü o anda artma işlemi programdan bağımsız ve donanımsal olarak yürütülüyor. işte daha hassas uygulamalarda bu modül kesme geldiği anda donanımsal olarak o andaki TMR1 değerini başka bir kütüğe atıyor ve herhangi bir yanlışlığın olmasını engelliyor.
TMR1'i de şu sebepten 0'lıyoruz: diyelim ki Timer1 35000'e sayana kadar kesme geliyor. bu kütüğü sıfırlamadığımız durumda yine 35000 süre sonra bir kesme geldiğinde kütük taşacak ve okuyacağımız değer 5000 gibi bir şey olacak. bu durumda hızlanmamış olduğumuz halde sanki aniden 7 kat hızlanmışız gibi bir değer elde edeceğiz.
peki neden TMR1 kesmesine giriyoruz. diyelim ki tekerlek durdu. bu durumda bir daha kesmeye giremeyeceğiz ancak zamanllayıcımız saymaya devam edecek ve belli bir zaman sonra taşacak. biz bu taşmayı yakalayamazsak en son hızda devam ettiğimizi sanarız. ayrıca timer1 kesmesinin içinde zamanlayıcıyı sıfırlamaya gerek yok zaten kendisi 0'lanıyor : ) orada yalnızca tekerleğin durduğunu - ya da aşırı yavaşladığını - kullanıcıya göstermek gibi işlemler yapılabilir.
hız hesaplamasında ise örneğin 25000 gibi bir zaman değeri okuduysan yukarıdaki durumda 25000/125000 = 0.2 s ' de bir tekerlek aynı konuma geliyor. bu durumda (tekerlek çevresi) / 0.2 = (çizgisel hız) : ) ben tamamen attım tabi ki. hangi hızlara ulaşacağını bilmiyorum, tüm hesaplarını, kaçıncı yükselen kenarı seçmen gerektiğini, timer1 frekansını ne kadar ölçekleyeceğini, hatta fazladan bir sayaç koyarak - yazılımsal olarak - daha da hassas ölçümler yapmanın gerekliliği tamamen sana kalmış.
kolay gelsin.