Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

Acil yardım İnt_rb

Başlatan oguzmania, 03 Temmuz 2008, 10:47:32

oguzmania

CCS C derleyicisi kullanıyorum.Durumumu özetle anlatacak olursam;
Elimde 4 adet mikrofon devresi var bunlar sesi algılayınca Lojik 1
çıkışı veriyorlar,diğer durumda lojik 0 çıkışı veriyorlar.
Bu 4 adet mikrofon devresi çıkışı 16F877'in RB:4-7 arasında bağlı yani
int_rb interruptunu kullanıyorlar.

Devremde harici timer 1 kristali de kullandım 32,768 K'lık.

Şimdi esas meseleye gelince ben sesi yolluyorum ve ses bu 4 mikrofona
da ayrı ayrı zamanlarda ulaşıyor.
Ama ben hangisine ne zaman ulaştığını bilmiyorum.Her mikrofona bir
zaman değeri atıyorum örneğin;
rb4:sbt2
rb5:sbt3
rb6:sbt0
rb7:sbt1

Ses ilk mikrofona gelince timer1 64536'dan itibaren saymaya
başlıyor(64536'yı biz seçiyoruz).atıyorum ses ilk rb7'ye gelsin o anda
saymaya başladığı için sbt1'in değeri get_timer1()-64536 dan 0
oluyor.Bu arada sayma devam ediyor sonra atıyorum ses rb5'e geldi
sbt3= get_timer1()-64536'dan yine bulunuyor bu arada sayma devam
ediyor tabii ki bu sayma işlemi ses son mikrofona ulaşıncaya kadar
devam ediyor.(Bu arada int_rb nin temizlenmesi için ayrı bir işlem de
varmış) Yani işlem sonunda birbirinden farklı 4 adet time değerimiz
var.

Benim sorunum sesin hangi sırayla mikrofonlara ulaşacağını bilememem
acaba bunu nasıl hallledebiliriz bana yardımcı olabilir misin?
Ses ilk mikrofona ulaşıyor zamanlayıcı başlıyor o ilk mikrofonun
değeri de 64536 olduğu için;64536-64536=0 oluyor
ve onun sahip olduğu time(x) değeri 0 oluyor.Sayma 1 kere başladıktan
sonra tüm mikrofonlar aktif oluncaya kadar devam ediyor.(bu tüm
işlemler maksimum 25 msn sürüyor)

Durumuma göre aradaki kesmeyi nasıl yazabilirim? Çok kısıtlı zamanım var yardımlarınızı bekliyorum...

Anlatmayı beceremediğim yerler olmuşsa elimden geldiğince buradan
açıklamaya çalışırım.

Cevabınızı bekliyor olacağım , ilginiz için çok teşekkürler , saygılarımla...
/*****************************************************************
      PIC16F877 ile Ses Kaynağının Yerini Belirleme Projesi
******************************************************************/

#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#include <math.h>

// Denetleyici konfigürasyon ayarları
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=20000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

//#use fast_io(b) //Port yönlendirme komutları B portu için geçerli
//#use fast_io(d) //Port yönlendirme komutları D portu için geçerli

#include <lcd.c> // LCD.c dosyası programa ekleniyor

int16 degisken;
float sbt0,sbt1,sbt2,sbt3,sbt4,sbt5,sbt6,sbt7,sbt8,A,B,C,D,L1,L2,L,x,y;

#int_TIMER1                                
void TIMER1_isr()                          
{                       
   set_timer1(64535);
}


//*** Port B RB4, RB5, RB6 ve RB7 pinleri değişiklik Kesme Fonksiyonu ***
?????????????????????????????????????????????????????????*
#int_RB            // PORTB de B4...B7 pinlerinde meydana gelen değişim kesmesi
void  B_degisiklik ()   // Kesme fonksiyonu ismi
{
   
      } 
   } 
}
????????????????????????????????**
/********* ANA PROGRAM FONKSİYONU********/
void main ( )
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_d(0x00);   // D portu pin'leri komple çıkış
   set_tris_b(0xF0);
   
   
   lcd_init();         // LCD kurulumu yapılıyor

    printf(lcd_putc,"\f 031202039"); 
    printf(lcd_putc,"\n Oguz Aslan");
     delay_ms(2000);
   
   
   setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1); // Timer1 ayarları yapılıyor
   set_timer1(64535);   // TMR1 değeri belirleniyor 
   
   enable_interrupts(int_timer1);
   enable_interrupts(INT_RB);     // int_RB kesmesini aktif yapar
   enable_interrupts(GLOBAL);     // Aktif edilen kesmelere izin ver
  
  #priority rb, timer1
   
   while(1)      // Sonsuz döngü
   {
      
      sbt4=(sbt1-sbt0)/2;
      sbt5=(sbt1+sbt0)/2;
      sbt6=(sbt3-sbt2)/2;
      sbt7=(sbt3+sbt2)/2;
      sbt8=1-(sbt4*sbt5);
      
      A=(sbt4)*(sbt4)+(sbt6)*(sbt6)-1;
      B=2*((sbt6)*(sbt6)*sbt7-(sbt4*sbt8+sbt0));
      C=(sbt8)*(sbt8)+(sbt6)*(sbt6)*(sbt7)*(sbt7)-(sbt0)*(sbt0);
      
      D=(B*B)-(4*A*C);
      
       
      L1=(-B+sqrt(D))/(2*A);
      L2=(-B-sqrt(D))/(2*A);
      
      if (L1>0)
      
      L=L1;
      
      else
      
      L=L2;
      

      x=L*sbt4+sbt4*sbt5;
      y=L*sbt6+sbt6*sbt7;
      
      printf(lcd_putc,"\f X ekseni=%f",x);
      printf(lcd_putc,"\n Y ekseni=%f",y);
      
      delay_ms(2000);
   }
   
}