G

PIC ile kare dalga sayma

Başlatan gkhn_, 13 Ocak 2013, 02:33:58

gkhn_

Merhaba arkadaşlar, pic girişine uygulanan kare dalga sinyalinin sadece 1dklık kısmındaki 0'dan 1'e geçişleri saydırmak istiyorum pic c ile . saydırdığım veriyi LCD'ye sürmek istiyorum. nasıl yapabileceğime dair yardımcı olursanız sevinirim örnek uygulamaları ile.

ete

Bu işi yapmanın bir kaç yolu var. Sıralarsak;
- PORTB.0 kesmesi kullanarak ve kesmeyi düşen kenardan yükselen kenara doğru ayarlarsak aynı zamanda 1000 ms süre ile zaman tutarsak bu süre içinde gelen pulsleri saydırabiliriz.

- TMR0 sayacının harici kaynaktan beslenerek saydırmasını sağlayan bir sistem vardır. Giriş pini Open Collector olan PortA.4 pinidir. Yine zaman tutup bu sire zarfında gelen pulsleri TMR0 sayacına saydırabiliriz. Ancak sayaç 8 bitlik olduğu için ancak düşük frekanslarda işe yarayabilir. Gerçi onunda kesmesini açarak sayı 255 i geçtiğinde kesme oluşmasını sağlayarak bir başka sayacı bir artırabiliriz.

- EN son alternatif en doğrusu gibi gözüküyor. TMR1 sayacı 16 bitliktir. Onunda harici giriş pini bulunur ve bu pinden gelen pulsleri zaman tutularak sayabilir. Bütün yapılması gereken iş, TMR1 sayacını sıfırlayıp zamanı tutmak . Süre soununda TMR1 değerini bir başka değişkene aktarmak hepsi bu.

Kısaca örnek vermek gerekir ise;
- Önce TMR1 sayacını 1/1 bölme oranı ile aktif hale getirmek gerekiyor.
T1CON registeri bu işi yapmaktadır.
T1CON=%00000111         'PORTB.6/T1OSO/T1CKI pininden beslenecek.
- TMR1 sayacını sıfırlıyoruz. 
  TMR1L=0:TMR1H=0
- Zamanı Tutuyoruz.
  Pause 1000
- Süre bitti TMR1 sayacını önce durduruyoruz.
  T1CON.0=0
- Sonra Tm1 değerini bi başka değişkene geçiriyoruz.
  Sayac.Byte0=TMR1L: Sayac.Byte1=TMR1H   '(Sayac değişkeni word cinsinden olmalıdır)

Böylece artık Sayac değişkeninde 1 sn içinde kaç puls girdiğine ait değer yer alacaktır. Bunun ötesinde bu değerle ne yapacaksanız onu yapmanız gerekiyor.
Hepsi bu kadar.
Ete

pwm.c

#2
RB0 ve timer kesmesi ile derleme kodlarla elimden geldiği kadar bişeyler yapmaya çalıştım. umarım istediğini doğru anlamışımdır.
buyur:
#include <16F628.h>
#FUSES NOWDT, INTRC_IO, NOMCLR, NOBROWNOUT, NOLVP, NOPUT, NOCPD,
#use delay (clock=4000000)
#define LCD_RS_PIN      PIN_B1
#define LCD_RW_PIN      PIN_B2
#define LCD_ENABLE_PIN  PIN_B3
#define LCD_DATA4       PIN_B4
#define LCD_DATA5       PIN_B5
#define LCD_DATA6       PIN_B6
#define LCD_DATA7       PIN_B7
#include <lcd.c>
//------------------------------------------------------------------------------
int   durum=0;
int16 value_timer1=0x3CAF;
int16   sayac_tmr1=0;
int   sure=0;
int   san=0;
int   sayac0=0;
int   sayac1=0;
int   sayac2=0;
int   sayac3=0;
int   sayac4=0;
char  sayac0_lcd;
char  sayac1_lcd;
char  sayac2_lcd;
char  sayac3_lcd;
char  sayac4_lcd;
//------------------------------------------------------------------------------
int   kesme_tmr1(void);
int   kesme_ext(void);
int   duzenle(int);
//------------------------------------------------------------------------------
// 1 sn lik timer1 kesmesi
//------------------------------------------------------------------------------
#INT_TIMER1
int   kesme_tmr1()
{
   sayac_tmr1++;
   sure++;
   if(sayac_tmr1==1200)
   {
      sayac_tmr1=0;
      lcd_gotoxy(8,1);

      sayac0_lcd=duzenle(sayac0);
      sayac1_lcd=duzenle(sayac1);
      sayac2_lcd=duzenle(sayac2);
      sayac3_lcd=duzenle(sayac3);
      sayac4_lcd=duzenle(sayac4);
     
      lcd_putc(sayac4_lcd);     
      lcd_putc(sayac3_lcd);     
      lcd_putc(sayac2_lcd);     
      lcd_putc(sayac1_lcd);     
      lcd_putc(sayac0_lcd);
      lcd_putc(" /dk");


      sayac0=0;     
      sayac1=0;     
      sayac2=0;     
      sayac3=0;     
      sayac4=0;     
   }
   if(sure==20)
   {
   sure=0;
   san++;
   if (san==60){san=0;}
   lcd_gotoxy(8,2);
   printf(lcd_putc,"%d ",san);
   }
   set_timer1(value_timer1);
}
//------------------------------------------------------------------------------
#INT_EXT
int   kesme_ext()
{
   sayac0++;
   if(sayac0==10)
   {
      sayac0=0;
      sayac1++;
      if(sayac1==10)
      {
         sayac1=0;
         sayac2++;
         if(sayac2==10)
         {
            sayac2=0;
            sayac3++;
            if(sayac3==10)
            {
               sayac3=0;
               sayac4++;
               if(sayac4==10)
               {
                  sayac4=0;
               }
            }
         }
      }
   }
}
//------------------------------------------------------------------------------
int   duzenle(int a)
{
   if(a==0)
   {
      return   '0';
   }
   if(a==1)
   {
      return   '1';
   }
   if(a==2)
   {
      return   '2';
   }
   if(a==3)
   {
      return   '3';
   }
   if(a==4)
   {
      return   '4';
   }
   if(a==5)
   {
      return   '5';
   }
   if(a==6)
   {
      return   '6';
   }
   if(a==7)
   {
      return   '7';
   }
   if(a==8)
   {
      return   '8';
   }
   if(a==9)
   {
      return   '9';
   }
}     
//------------------------------------------------------------------------------
int main()
{
      set_tris_b(0x1);
      setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_1 );
      set_timer1(value_timer1);
         
      lcd_init();
      lcd_putc("SAYAC: ***** /dk");
      lcd_putc("\nSURE : ** sn");

      enable_interrupts(INT_EXT);
      enable_interrupts(INT_TIMER1);
      enable_interrupts(GLOBAL);

      while(TRUE);{}
}


dosyalar:
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

gkhn_

Çok teşekkür ediyorum iki bilgide çok işime yaradı. Yazılan kod istediğim gibi RB0 ucuna clock pulse uyguladığımda rahatlıkla sayabiliyor. Son bir sorum olacak sadece 15 sn sayıp onu 4'le çarparak ekrana yazdırmak istiyorum bunun için tam olarak nereyi değiştirmem gerekir. PIC C kullanmakta yeniyim assembly kullanmıştım ancak bunda acemi olduğum için bu kadar sorgu içerisindeyim =) yardımınızı bekliyorum.

gkhn_

Birde programı kendi derleyicimde derleğimde lcd.c kütüphanesinde hata veriyor "set_tris_lcd(LCD_READ);" tanımlanamayan belirteç diye nedir bu ?

Powered by EzPortal