- Katılım
- 24 Şubat 2018
- Mesajlar
- 24,643
Elimdeki orijinal Arduino UNO Rev3 ün kristal osilatörünün kararlılığını nasıl ölçebiliriz bakalım. Bunun üzerinde ayrı, kendi başına çalışan bir kristal osilatör yok, 16 MHz lik bir kristal doğrudan Atmega328 e bağlı ve içeride işlemcinin saat frekansı üretiliyor. Şimdi bu kristalin üzerinde ölçüm yapsam, devreyi yükleyip ya frekansı değiştirmiş olacağım, yada kapasitif yükleme aşırı fazla ise saat frekansı hiç üretilmeyecek. O yüzden bu şekilde ölçemeyiz.
Atmega'yı özel olarak programlayarak belki saat sinyalinin dışarı çıkması sağlanabilir, ayrıntılarına bakmadım, ama bununla uğraşacağımıza, doğrudan saat frekansına senkron olarak çalışan bir program yazıp bu programın çalışma timing'ini gözlemleyebiliriz. Bunun için aşağıdaki basit programı kullanacağım. Bu program 10 ms de bir kesme rutininin çağrılmasını sağlıyor. Bu rutin içerisinde de, 12 numaralı pinde bir pals üretiyorum.
Atmega'yı özel olarak programlayarak belki saat sinyalinin dışarı çıkması sağlanabilir, ayrıntılarına bakmadım, ama bununla uğraşacağımıza, doğrudan saat frekansına senkron olarak çalışan bir program yazıp bu programın çalışma timing'ini gözlemleyebiliriz. Bunun için aşağıdaki basit programı kullanacağım. Bu program 10 ms de bir kesme rutininin çağrılmasını sağlıyor. Bu rutin içerisinde de, 12 numaralı pinde bir pals üretiyorum.
Kod:
/* tanimladigimiz kesme fonksiyonunun saniyede kac defa
cagirilacagini belirleyen degisken */
int isr_rate = 100;
void setup()
{
/* 12 numarali pini cikis olarak tanimliyoruz */
pinMode(12, OUTPUT);
/* Atmel 328 in birinci timer'ini kesme kaynagi
olarak yapilandiriyoruz */
TCCR1A = 0;
TCNT1 = 0;
OCR1A = 16000000 / (isr_rate * 64) - 1;
TCCR1B = (1 << WGM12) | (1 << CS11) | (1 << CS10);
TIMSK1 |= (1 << OCIE1A);
}
ISR(TIMER1_COMPA_vect)
{
/* daha once cikis olarak tanimladigimiz 12 numarali pin'de,
osiloskop'ta kesmenin olusumunu gozlemlemek icin bir pulse uretiyoruz */
digitalWrite(12, 1);
delayMicroseconds(100);
digitalWrite(12, 0);
}
void loop()
{
/* ana programda hicbir sey yapmiyoruz, sadece tanimladigimiz
kesme fonksiyonu belirli araliklarla cagiriliyor */
}