Frekans ,Periyot hesabı?

Başlatan samedkutuk, 18 Haziran 2020, 15:13:30

samedkutuk

Arkadaşlar merhabalar çok temel olacak belki ama bir konuda takıldım sizlere danışmak istemedim.
Harici kesme ile B0 pinine gelen bir kare dalganın periyodunu ölçmek istiyorum ve kendimce formdaki arkadaşlarında yardımı ile bir netice alabildim.
Aşağıdaki kod da harici kesmeye her yükselen kenar tetikleme geldiğinde timeri başlattım timer taşması 0.2 us ile ayarlanmıştı 1 saydığı anda taşma oluşuyor.
Kod um ;
/////////////////////////////////
#int_ext
void dis_kesme()
{
//output_toggle(pin_c0);
durum++;
if(durum==1){
output_high(pin_c0);
t1on=0;
//SET_TIMER1(3035);
SET_TIMER1(65535);
t1on=1;//timer1 i başlat
ext_int_edge(H_TO_L);// düşen kenar kesmeyi aktif et
}

if(durum==2){
output_low(pin_c0);
t1on=0;// kesmeyi kapat   
ext_int_edge(L_TO_H); // yükslen kenar tetikleme aktif
durum=0;
//lcd_gotoxy(1,1);
//printf(lcd_putc,"\fFrekns:%Lu",Frekans);
Frekans=0;

}

}
/////////////////////////////////
/////////////////////////////////
#int_timer1
void timer1_kesme(){
output_toggle(pin_c3);
Frekans++;// her taşma oluştuğunda frekansı bir arttır
}
Sorunum şu;
Proteusdan Rb0 pinine 1Hz sinyal veriyorum bu sinyalde 8 adet kesme oluşuyor sadece Gelen sinyalin High kısmında yani bu durumda ;
*  8x0.2= 1.6 uS Sinyalin high kısmı
*  1.6*2 = 3.2 us Sinyalin periyodunu veriyor
* F=1/T ;
  1Hz = 1/3.2 olmuyor sizde hatam nerede

osiloskop çıktım fotoğraftadır

samedkutuk

RaMu

#1
Simulasyon durmuşken pic üzerine tıkladığında çıkan ekranda mcu çalışma frekansı doğru girildi mi?

SETUP_TIMER_1(T1_INTERNAL|T1_DIV_BY_8);
Bu ayar ile timer1
1 / (Mcu Clock Frekansı / 4)
*
8 (prescaler T1_DIV_BY_8 kurulmuş)
her bir adımında bu kadar süre geçirir.
Her timer1 taşma kesmesinde timer1 i
SET_TIMER1(3035);
bu sayıdan başlatırsan
timer1
65535- 3035 adımda bir kesme verir.

Mesela mcu 4MHz ile çalışıyor olsun,
1/(4MHz/4) * 8 = 8us de timer 1 adım sayar,
her kesmede
(65535- 3035) * 8us
= 0.5 saniye geçiyor demek olur.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html


sadogan

SET_TIMER1(65535);
bu tmr kesmesi açıkken sakıncalı bir iş.

samedkutuk

Alıntı yapılan: RaMu - 18 Haziran 2020, 18:23:29Simulasyon durmuşken pic üzerine tıkladığında çıkan ekranda mcu çalışma frekansı doğru girildi mi?

SETUP_TIMER_1(T1_INTERNAL|T1_DIV_BY_8);
Bu ayar ile timer1
1 / (Mcu Clock Frekansı / 4)
*
8 (prescaler T1_DIV_BY_8 kurulmuş)
her bir adımında bu kadar süre geçirir.
Her timer1 taşma kesmesinde timer1 i
SET_TIMER1(3035);
bu sayıdan başlatırsan
timer1
65535- 3035 adımda bir kesme verir.

Mesela mcu 4MHz ile çalışıyor olsun,
1/(4MHz/4) * 8 = 8us de timer 1 adım sayar,
her kesmede
(65535- 3035) * 8us
= 0.5 saniye geçiyor demek olur.


Şimdi prescaleri 0 ladım artık ön bölme kullanmıyorum yani her bir sayma 0.2 us
samedkutuk

samedkutuk

Alıntı yapılan: sadogan - 19 Haziran 2020, 11:31:17SET_TIMER1(65535);
bu tmr kesmesi açıkken sakıncalı bir iş.

Peki başka nasıl bir saydırabilirim ?
samedkutuk