Dtmf'den gelen doğru şifre karşılaştırmasını yapmakta güçlük çekiyorum.

Başlatan abstruse, 31 Mayıs 2014, 09:27:22

abstruse

Kolay gelsin. VHF bandından aldığım dtmf sinyalini pic ile kontrol edip istediğim şifre geldiğinde çıkışlarda değişiklik yapmak istiyorum lakin sıkıntım bu verileri tam anlamı ile karşılaştıramıyorum mesela;

PortA yı okuyorum o sıra dtmf entegresinden 1,2,3,4,5,6,7,8,9 verisi gelmişse güzel hoş yapıyorum güzel bi program ama dtmf de "0" değeri "1010" olarak "#" değeri "1100" olarak "*" değeri "1011" olarak çıkışa yani benim PortA registerime geliyor. aşağıdada göreceğiniz üzere ben karşılaştırmaya 2513# değerini 241312 olarak yazmak zorunda kalıyorum ( burada # ----> 1100------>12 olduğundan)  şimdi benim bu eksikliğim nasıl düzelecek burda bir hexadecimal karşılaştırmal problemi yaşıyorum şu an programım çalışıyor ama geliştirmek istediğimde bu sayılarlabaşım derde giriyor yardımlarınız için teşekkür edrim...
2513# gelince bir çıkış
2514# gelince diğer bir çıkış
0000 gelince ikiside kapalı.

#use fast_io(a)
#use fast_io(b)

#use delay(clock=4000000)


/* 2513#*/ //bu şifreyi alınca b6 1 olsun
/* 2514#*/ //bu şifreyi alınca b7 1 olsun
/* 0000 */ //bu şifreyle tüm çıkışlar kapansın

int8 dtmf;
int kod;
int a;
int kapat;


#ZERO_RAM


#int_EXT
void  EXT_isr() 
{

dtmf=input_a();

if(dtmf==10)
{
kapat++;
}


if(dtmf<10)
{
kod=kod*10+dtmf;
}
else
{
kod=kod*100+dtmf;
}

/* bu kısımda kod değişkeninin son 6 hanesini seçmeye çalıştım*/
if(kod>999999);
{
a=(kod/1000000);
kod=kod-a*1000000;
}

}



void main ()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_ccp1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   set_tris_b(0x0F);
   output_b(0);
   ext_int_edge(H_TO_L);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   
   
   
   
   
   
   
   while(1)
{


if(kod==251312)
{
output_high(PIN_b6);
output_low(PIN_b7);
}


if(kod==251412)
{
output_high(PIN_b7);
output_low(PIN_b6);
}



if(kapat==4)
{
kapat=0;
output_low(PIN_b6);
output_low(PIN_b7);
}
}
}




Kabil ATICI

5 tane değişken tanımla bu dizide olabilir.
elemanları deg1,deg2,deg3,deg4,deg5 olsun. bu değişkenlerin ilk değeri  0 olsun.

kesme bölümünde
//dtmf girişini değişkenlere yükle ve değişkenleri kaydır.
deg5=deg4;
deg4=deg3;
deg3=deg2;
deg2=deg1;
deg1=dtmf;


kod karşılaştırma bölümünde

if((deg5==2) &&(deg4==5) && (deg3==1) &&(deg2==3) &&(deg1==12) )
{
output_high(PIN_b6);
output_low(PIN_b7);
}

if((deg5==2) &&(deg4==5) && (deg3==1) &&(deg2==4) &&(deg1==12) )
{
output_high(PIN_b7);
output_low(PIN_b6);
}

if((deg4==0) && (deg3==0) &&(deg2==0) &&(deg1==0) )
{
output_low(PIN_b7);
output_low(PIN_b6);
}

ambar7

abstruse

Kardeşim çok teşekkür ederim üstümden bi yük aldın tebrik ederim kıvrak zekan için  ;) 

Ben portb nin yüksek değerlikli 4 bitini  nasıl okuyabilirim tek şansım >> kaydırma mı.

x=input_b() >> 4; b portu bu işlemden etkileniyor mu ?


Kabil ATICI

swap() komutuna bakabilirsin. Bu ilk dört bit ile sonraki 4 biti blok olarak yer değiştirir. Sonra "0x0F ile "VE" işlemine tabi tutabilirsin.


İstiyorsan kaydırma ile de yapabilirsin. bit içeriği değişmez sadece bitlerin yerleri değişir.
ambar7

sadogan

Alıntı yapılan: aliemremen - 31 Mayıs 2014, 11:38:16
Kardeşim çok teşekkür ederim üstümden bi yük aldın tebrik ederim kıvrak zekan için  ;) 

Ben portb nin yüksek değerlikli 4 bitini  nasıl okuyabilirim tek şansım >> kaydırma mı.

x=input_b() >> 4; b portu bu işlemden etkileniyor mu ?


PortB etkilenmez.