DTMF KONTROL

Başlatan ta7om, 16 Mayıs 2004, 10:37:40

ta7om

Arkadaşlar aşağıdaki gibi bir programım var. c yi çok iyi bilmiyorum bu programın yazılmasında bana yardımcı olan arkadaşım askerde ve bana  program üzerinde yazdığım satıda 4sn gecikme eklemem gerekiyor ama başaramadım  yardım edebilirmisiniz.


**********************************HI-TECH PICC LITE & MPLAB **********************************

*/
//#include   <pic1684.h>

   #include   <pic.h>

///////////////////PORTA/////////////////////////////////////////
static volatile bit   StD   @ (unsigned)&PORTB*8+6;         //RB6
static volatile bit   Role   @ (unsigned)&PORTA*8+1;         //RA1 ROLE CIKISI
/////////////////////// GLOBAL SABYTLER ////////////////////////
const   unsigned char   RingCountAdres=0x04;
const    unsigned char   bir=1;
const   unsigned char   iki=2;
const   unsigned char   uc=3;
const   unsigned char   dort=4;
const    unsigned char   bes=5;
const   unsigned char   alti=6;
const   unsigned char   yedi=7;
const   unsigned char   sekiz=8;
const   unsigned char   dokuz=9;
const   unsigned char   yildiz=10;
const   unsigned char   kare=11;
const   unsigned char   sifir=0;
const   unsigned char   a=12;
const   unsigned char   b=14;
const   unsigned char   c=15;
const   unsigned char   d=16;
const   unsigned char   g=17;
const   unsigned char   TimeOut=13;
//////////////////// GLOBAL DE?Y?KENLER////////////////////////////
unsigned char   Temp;
unsigned int   tmr_say=0;      //Zaman registeri her interrupt ta bir artar.
unsigned int   i;         //Geçici register
/////////////////////////FONKSYYON TANIMLARI////////////////////////
char    DtmfEncode(unsigned char);               //dtmf sinyalini devreye uygun hala getiren fonksiyon
////////////////////////////////////////////////////////////////////


__CONFIG   (WDTDIS & XT & PROTECT & PWRTEN);

static void interrupt isr(void)         // Here be interrupt function - the name is
            // unimportant.
{
      T0IF=0;
      tmr_say++;
}
main()
{
   INTCON=0b10100000;
   OPTION=0X87;
   TRISA=0X00;   //porta çyky?
   TRISB=0xFF;   //giri?
   PORTA=0;
   while(1)
   {
      kapali:
      Role=0;
      Temp=DtmfEncode(155);
      if (Temp!=kare | Temp==TimeOut)   goto kapali;
      Temp=DtmfEncode(155);
      if (Temp!=uc | Temp==TimeOut)   goto kapali;
      Temp=DtmfEncode(155);
      if (Temp!=alti | Temp==TimeOut)   goto kapali;
      Temp=DtmfEncode(155);
      if (Temp!=dokuz | Temp==TimeOut)goto kapali;
*****BU ARAYA ALT PROGRAMA GEÇİŞ İÇİN 4SN KADAR BEKLEMESİ LAZIM AMA YAPAMADIM*************
   acik:
      Role=1;
      Temp=DtmfEncode(155);
      if (Temp!=yildiz| Temp==TimeOut)   goto acik;
   }
}

char    DtmfEncode(unsigned char delay)   //   
{
   unsigned char Dtmf;
   tmr_say=0;
   while(!StD)
   {
      if (tmr_say==delay)
      {
      //break;
      Dtmf=TimeOut;
      goto   cikis;
      }
   }
      Dtmf=(PORTB & 0X0F);
      while(StD);
      switch (Dtmf)  {
            case   0x01:
               Dtmf=bir;
               break;
            case   0x02:
               Dtmf=iki;
               break;
            case   0x03:
               Dtmf=uc;
               break;
            case   0x04:
               Dtmf=dort;
               break;
            case   0x05:
               Dtmf=bes;
               break;
            case   0x06:
               Dtmf=alti;
               break;
            case   0x07:
               Dtmf=yedi;
               break;
            case   0x08:
               Dtmf=sekiz;
               break;
            case   0x09:
               Dtmf=dokuz;
               break;
            case   0x0A:
               Dtmf=sifir;
               break;
            case   0x0B:
               Dtmf=yildiz;
               break;
            case   0x0C:
               Dtmf=kare;
               break;
            case    0x0D:
                    Dtmf=a;
                    break;
            case    0x0E:
                    Dtmf=b;
                    break;
            case    0x0F:
                    Dtmf=c;
                    break;
            case   0x00:         
                    Dtmf=d;         
                        
                        
                          
                          
                    break;
                 default:
               Dtmf=TimeOut;
               break;
            }
cikis:
   return   (Dtmf);
}

DumrulBey

Merhaba,

Böyle basit bir soru nasıl cevaplanmamış hayret ettim. Muhtemelen gözden kaçmış olacak. Belki boşa cevaplamış olacağım çünkü aradan geçen zaman zarfında cevabı bulmuş olmalısın. Hatta arkadaşın askerden bile gelmiştir...:)

Neyse cevap delay_ms(4000) olacak. Bu komut parantez içerisine yazılı değer kadar gecikme yapar. Dolayısıyla 1 mili saniye saniyenin binde biriyse, 4 x 1000 sonucu bizim ihtiyacımız olan gecikmeyi verecektir.

Başarılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

Erol YILMAZ

@dumrulbey
Yazdıgınız kod CCS derleyicisi icin. HiTech te fonksiyonun kullanımı biraz daha farklıdır.

DumrulBey

Hmm...

Evet haklısın. Farklı derleyiciler için farklı kategoriler olmadığı için böyle yanlışlıklar olabiliyor. Bu vesileyle kategorileri gelişen yazılımlar göz önüne alarak değiştirmenin gerekliliğini dile getirmiş olalım. Yönetici arkadaşlar ben söylediğim için değilde gerekliliği olduğu için değişikliğe gidersek sevinirim. Sadece bu kategori için değil bir çok yeni kategoriye ihtiyaç vardır.

Bu arada inceledim de unutmadan düzeltmemi yapayım. Diğer derleyici de alt çizgi yokmuş. Birleşik kullanıyormuşsunuz. Bu araştırmayı yaparken aşağıdaki başlık ile karşılaştım. Konuyu dolaylı yoldan ilgilendiriyor:

https://www.picproje.org/index.php/topic,1984

Alıntı yapılan: "Ferhat"arkadaşlar sizce hitec teki delayus() veya delayms() tam doğru zamanı veriyor mu

şöyleki basit led yakıp söndürme de 200ms*5=1sn bekle komutlarında ledler yaklaşık 1,4 ~ 1,6 sn yanıp veya sönüyor. bu değerleri kronometre ile aldım
yoksa bende mi yanlışlık var.
...
Alıntı yapılan: "Erol cevap olarak"Selam;
Hi-Tech in delay fonksiyonlari buyuk olcude yanlis cevap veriyor.
En guzeli en cok kullandigin frekanslarda hazir 250 uS lik delay rutinleri kurmak.
Yani 4 Mhz, 20 Mhz vs....
Kolay Gelsin.
Devamı ediyor, bir göz atmakta fayda var:

Başarılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

gazili38

ya dostum ben DTMF ile rolekontrol devresi arıyorum ama bulamadım yardımcı olursanız sevinirim..teşekkürler

DumrulBey

Merhaba,

Aradığınız uygulamanın bir çok örneği internette mevcut. Ne yazık ki C ile yapılmış herhangi bir uygulama görmedim. Ama http://www.geocities.com/constantinescuradu sayfasını tavsiye ederim.

Bu sayfalar Radu Constantinescu'nun projelerini ve kendisini tanıttığı bir site. Orada DTMF ile ilgili röle denetimli ve şifre korumalı bir uygulama var. Ama kodlar assembly dilinde yazılmış.

Aslında orada Goertzel algoritması (-bkz. DSP Applications) kullanılmış. Internette arama yaparsanız C kodları çıkıyor. Bir ara vakit bulursam bu algoritmayı CCS'de DTMF uygulaması için şekilendirmeyi düşünüyorum. O gün gelince ve başarılı olursam buradan naklederim.

Başarılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)