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);
}
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...
@dumrulbey
Yazdıgınız kod CCS derleyicisi icin. HiTech te fonksiyonun kullanımı biraz daha farklıdır.
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...
ya dostum ben DTMF ile rolekontrol devresi arıyorum ama bulamadım yardımcı olursanız sevinirim..teşekkürler
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...