Timer_1 ve Harici kesme kullanarak bir kare dalganın periyodunu bulma

Başlatan samedkutuk, 18 Haziran 2020, 01:31:08

yas

Sanki yanlış bir kurgu var gibi.
-İstenen şey INT0 ile kesme geldikten sonra sürekli yada bir defa çalışacak timer kesmesi mi kurmak.
-Yoksa INT0 ile kesme geldiğinde timer içeriğini okuyup (işleyip) çıktı olarak almak mı?

-Eğer birinci ise her INT0 kesmesinde timer kurulmalı (bölücü oranı, clock kaynağı, 8/16 bit modu ve timer set değeri). Daha sonraki bütün timer kesmelerinde bayrak temizlenmeli.
-Eğer ikinci ise her INT0 kesmesinde timer okunduktan sonra timer içeriği sıfırlanmalı.

Yapılmak istenilen frekans sayıcı gibi bir şeyse. Bence gidiş yolu farklı olmalı. INT0 kesmesi hiç olmamalı. Onun yerine iki tane timer kesmesi olmalı ve birincisi okuma periyotu için kesme üretmeli diğeri ise harici kaynaktan clock alan okumada kullanılan timer da hata yada taşma olduğunda bölücü oranını değiştirmeli.

10f200.h

Alıntı yapılan: samedkutuk - 18 Haziran 2020, 15:30:09Nasıl yani kesme fonksiyonu içerisinde ;
#int_timer1
void timer1_kesme(){
set_timer1(65535);
output_toggle(pin_c3);
Frekans++;// her taşma oluştuğunda frekansı bir arttır
}

bu şekilde mi yapmam gerekiyor
Evet aynen bu şekilde. Eğer bunu eklemezsen  kesme oluştuğunda timer 3035 ten 65535 e kadar saymaya devam eder.

samedkutuk

Alıntı yapılan: 10f200.h - 18 Haziran 2020, 16:07:13Evet aynen bu şekilde. Eğer bunu eklemezsen  kesme oluştuğunda timer 3035 ten 65535 e kadar saymaya devam eder.

Peki bunu harici kesmenin içine de eklemem gerekir mi
samedkutuk


samedkutuk

samedkutuk

aliveli

#include <16f877.h>     
#fuses XT,NOWDT,NOLVP
#use delay (clock=4000000)  
#include "lcd.c"   
void main ( )
{  
   int16 zaman=0;
   ext_int_edge(L_TO_H);
   setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_1 );
   lcd_init();   
   printf(lcd_putc,"\f Baslama");
   delay_ms(100); 
   while(1) {
      while (!interrupt_active(INT_EXT));
      clear_interrupt(INT_EXT); 
      set_timer1(0);
      ext_int_edge(H_TO_L); 
      while (!interrupt_active(INT_EXT));
      zaman=get_timer1();
      printf(lcd_putc,"\fZaman=%Lu us",zaman);
      delay_ms(100); 
      clear_interrupt(INT_EXT); 
      ext_int_edge(L_TO_H); 

   }}