Ö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:
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.