Arduino Timer ISR kullanımı

Katılım
1 Şub 2020
Mesajlar
5
Puanları
1
Yaş
37
Arkadaşlar iyi çalışmalar diliyorum.

Arduino ile Timer ISR konusunu öğrenmeye çalışıyorum. İşin mantığını anlamaya çalışıyorum.
Neyi neden yaptığımı anlamak için sizlere bir kaç soru sorma ihtiyacı duydum.


Timer0 da kullanılan 8 bitlik TCNT0 registeri

0 dan başlayıp 255 TOP değerine kadar sayıp sıfırlanıyor;

TCTN0 registerinin her bir değer değişimi ne kadar sürede yapılıyor.

Bunu nasıl hesaplayoruz.

Bazı şeyleri anladım ama kafam biraz karışmış durumda.

Örneğin Uno için yazacak olursam.

Kristal Hızı 16.000.000 ( 16 MHZ )
Kiristalin 1 Hertz sinyal üretmesi için gerekli süre
1 Hertz = 1/16.000.000 = ‭0,0000000625‬ saniye ;

Bu değere göre 1 mikrosaniye için Kristal 16 kez sinyal üretmesi gerekir.

1 um= ‭0,0000000625 * 16 = 0.000001

Bunları anladım ama TCNT0 değeri 250 değerine geldiğinde ne kadarlık bir süre geçmiş oluyor.
Örneğin 400 milisaniyede bir kesme oluştururken neye göre hesap yapıyoruz gibi sorulara kafamda
cevap bulamadım.

Timerların kesme (interrupt) konularında kafam bayağı karıştı. Hesaplamaların nasıl yapıldığını ve fomüllerin nereden geldiğini anlamadan bir şeyler yapmayı pek sevmiyorum. Şunu şuraya yazın çalışır şekilinde çokca kaynak var ama işin çalışma sistemini detaylı ve açıklayıcı anlatan bi kaynak bulamadım. Neyi neden yaptığımı anlamaya çalışıyorum.

Bilgili arkadaşlardan benim gibi cahil insanların anlayabileceği şekilde açıklayıcı olarak cevap yazmalarını rica ediyorum. Tüm cevaplar için teşekkür ederim.
 
Öncelikle öğrenmek istediğiniz konu Arduino'ya ait bir konu değil, Arduino'da kullanılan Atmega328p Mikrodenetleyicisi ile alakalı bir konudur. Dolayısı ile başvuracağınız ilk ve en önemli kaynak Atmega328p nin datasheeti olmalıdır. Datasheette timer0 ile alakalı bölümü incelerseniz "modes of operation" başlığındaki CTC modunda işin mantığını ve kullanmanız gereken formülü vermiş bize:

61235

http://www.lojikprob.com/ bu sitede ise "AVR Programlama" başlığında bu ve başka konular hakkında ayrıntılı türkçe kaynak bulabilirsiniz.
400 ms 0,4 sn yapar. Bu da 2.5 hz demektir. formüle göre;
2.5 = 16000000/ (2*N*(1+OCRnx)) hesaplamasından; Saat frekansı bölme faktörü
N = 1024 olursa OCRnx değeri = 3124 olmalıdır.
N = 256 olursa OCRnx değeri = 12499 olmalıdır.
Yani TCNT saymaya başlayacak, OCR'ye yazdığımız değer ile karşılaştırma yapacak. (CTC modu için) Eşleşme olunca kesmeye gidecek (istediğimiz kadar gecikme olmuş demektir.)
Hesapta gördüğünüz gibi N küçüldükçe OCR'ye yazılacak değer büyür. Ama timer0 8-bit olduğu için bu değerleri yazamayız. 400 ms gecikme istiyorsanız 1 ms lik gecikme yaparsınız. Her 1 ms de bir kesmeye gider, oluşturduğunuz bir sayaç değerini bir artırırsınız. sayaç 400 olunca 400ms gecikme olmuş olur.
Ben kabataslak hesap yaptım. OCRnx dediği OCR0A veya OCR0B registerı. Hangisi olduğunu tam bilmiyorum şu an. Bakmam lazım benimde. Siz datasheetten daha doğrusunu inceleyin. İngilizce kaynak sorun oluyorsa verdiğim sitede direkt dahasheetten türkçe olarak anlatılmış. Çok faydasını görürsünüz.
 
Son düzenleme:
cemalb hocam ilgin için sağol. Zahmet edip yazmışsın.
2.5 = 16000000/ (2*N*(1+OCRnx)) formülden birşeyler anlamaya kapmaya başladım.
Yavaş yavaş bu kesme olaylarını datasheete bakıp uygulama yaparak anlamaya çalışıyorum.

Bu konuda pek tutarlı türkçe kaynak bulamadım. Şu şurdan gelir bu burdan diye anlatan biri yok sanırım. birazda örnek kod inceleyerek mantığını anlamaya çalışıyorum. Bu şeyleri tam anlamak için sanırım önce bu micro controllerın nasıl çalıştığını anlamak gerekiyor. Yoksa herşeyi ezbere yapmak zorunda kalıyoruz. Bu şekilde de ilerde daha zor şeyler karşımıza çıktığında takılıp kalıyoruz.

Şimdiye kadar öğrendiğim tüm kolay şeyler beni hep daha zor şeyleri öğrenmek zorunda bıraktı. Hep geriye dönüp aynı konunun daha derin kapsamlı olanını öğrenmek zorunda kaldım. Bu aslında kısır bir döngü gibi. Hayat çok kısa. Öğrenmek bir şeyde uzman olmak insan hayatına sığacak kadar kısa bir süre değil. En azından bunu öğrendim.
 

Forum istatistikleri

Konular
128,149
Mesajlar
915,478
Kullanıcılar
449,892
Son üye
bekmezci

Yeni konular

Geri
Üst