Bilgi tazeleme - PIC girişindeki kare dalga frekansı hakkında.

Başlatan tayyar, 13 Ağustos 2010, 12:05:08

tayyar

timer1 hızlı sayıcısını kullanmanın ne gibi bir dez avantajı vardır peki?
--EGEMENLİK KAYITSIZ ŞARTSIZ MİLLETİNDİR--

JKramer

...
int1 calc=0;

#int_timer2
void timer2_kesme()
   {
      disable_interrupts(INT_timer2);
      disable_interrupts(GLOBAL);
      s++;
         if(s==20)
         {
            calc=1;
            set_timer1(0);
         }
         
   }
void main()
{
...
         while(true)
            {
              enable_interrupts(INT_timer2);
            enable_interrupts(GLOBAL);
             if(calc)
            {
                x=x/2;
                printf(LCD_PUTC, "\f%Lu",x);
                s=0;
                calc=0;
            }
               x=get_timer1();
            }

}


cynetron'un dediği gibi kesme içinde mümkün olduğu kadar kısa süre kalın.

Ekleme:

Sizin verdiğiniz kodda timer2 ayarlamasında bir hata var. Aşağıda verdiğim kod her saniyede bir sayılan değeri ekrana yazıyor:

#include "main.h"
#include <LCD.C>
#use fast_io(b)
#use fast_io(d)

long x=0;
int8 s=0;
int1 calc=0;

#int_timer2
void timer2_kesme()
{
   s++;
   if(s==100) //10 ms*100=1000 ms= 1 s
      calc=1;
}

void main()
{
   set_tris_c(0x0F);
   set_tris_d(0x00);
   lcd_init();

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
   setup_timer_2(T2_DIV_BY_4,249,10); //10 ms'de bir kesme oluşacak
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   enable_interrupts(INT_TIMER2);
   clear_interrupt(INT_TIMER2);
   enable_interrupts(GLOBAL);
   set_timer1(0);
   while(true)
   {
      if(calc)
      {
         //x=x/2;
         printf(LCD_PUTC, "\f%Lu",x);
         s=0;
         calc=0;
         set_timer1(0);
      }
   
      x=get_timer1();
   }
}

[IMG]http://img718.imageshack.us/img718/5328/99568028.png[/img]

Bir de header dosyanızda fuse'lerde osilatör için LP seçmişsiniz, XT olacak.

tayyar

#int_timer2
void timer2_kesme() 
  { 
     disable_interrupts(INT_timer2);   
   disable_interrupts(GLOBAL);   
   s++;       
  if(s==20)     
    {       
     calc=1;      
      set_timer1(0);      
   }          
  }


timer2 yi 60ms ye kurmustum (yaklasık)
kesme alt programında da 20 defa döndürüyordum 60x20=1200ms 1.2 sn
yani demek istediğim 1.2 saniye olmasını özellikle ayarladım çünkü hıza geçerken sadece 2 ye bölmem yeterli oluyordu

ama 1 saniyelik zaman dilimi istenirse dedğiniz doğru
--EGEMENLİK KAYITSIZ ŞARTSIZ MİLLETİNDİR--

JKramer

Ben sadece bugünkü mesajlara bakıp gelen sinyalin frekansını bulmak istediğinizi sandım, haklısınız.

tayyar

Ayrıca bahsettiğiniz gibi kesme alt programında sadece koşullandırmalar yapılıpta ana program içerisinde hesaplamalar yapılınca işler daha stabil olmaya başladı sağolun :)

Şimdi çözmem gereken problem dönüş hızı 300 oldugunda ekranda 299 görüyorum x=(x/2)+1; diye bir satır ekledim bu seferde 60 la giderken 61 görüyorum :)

Kolay çözüm 10 un katları olan ve sık çıkılan hız basamaklarında (60-100-150-200-250-300-350-400-450) her birisi için bir if bloğu yazmak tabi bu durum programı gereksiz şişireceği için hoş değil.

daha stabil bir çözüm varmıdır aceba ?


yazılımsal kısım ufaktan sonlanmaya yaklaştı şimdi sırada fabrikadaki leaper-10 paralel port programlayıcıyı çalıştırmaya geldi Allah'tan verdikleri laptop eskide üzerinde paralel port var :) (ibm R50e)
--EGEMENLİK KAYITSIZ ŞARTSIZ MİLLETİNDİR--