Ynt: Ynt: dtmf devresi sorunu

Başlatan Emre MERMİ, 04 Mayıs 2015, 12:50:31

Emre MERMİ

merhaba hocalarım,

bir dtmf devresi yaptım.

cm8870 sinyali çözüyor sorun yok.

pic çalışıyor sorun yok

simülasyonda kodlar çalışıyor sorun yok.

ama gel gelelim devrede çalışmıyor kodlar.

devrenin çalışması şöyle   Birinci röle *123 ile çalışıyor, #123 ile duruyor, İkinci röle *456 ile çalışıyor, #456 ile duruyor. Sistemin ikisi de *789 ile çalışıyor, #789 ile duruyor.

bu devre çalışmadı. daha basite indirgeyeyim dedim

1 e basınca 1.  röle anahtarlanacak 2 ye basınca 1.röle açılcak, 3 e basınca 2.  röle anahtarlanacak 4 ye basınca 2.röle açılcak şeklinde bir program yazdım. devrede o da çalışmadı.

programdaki gibi portlardaki gerilimleri kontrol ediyorum sorun yok.

simülasyonda lojik state ile pinlere gerilim veriyorum çalışıyor.

kafayı yiyeceğim nerede hata yaptığımı bulamıyorum
yardımcı olursanız çok sevinirim.

tüm dosyaları linke yükledim;
http://www.dosya.tc/server/j2tqka/dtmf.rar.html

mesaj birleştirme:: 04 Mayıs 2015, 12:55:30

ayrıca programda aralara programın hangi aşamada takıldığını görmek için pinleri 1 yaptım veya seri porttan bilgi gönderdim.

mesaj birleştirme:: 04 Mayıs 2015, 12:57:29

programın 111. satırında fazladan c=0 varmış onu sildim düzelme olmadı

sadogan

Açık şemanı göremedim.
Devrende led varmı var ise
şunu bir dene
dtmf üreten devrenin herhangi bir tuşuna basında led yanacak tekrar bastıgında sönecek.

#INT_EXT
void  EXT_isr(void) 
{
   d=1;
   output_toggle(bagli olan led pini);
 }

harici kesme çalışıyormu anlaşılacak.
sonra b portunu oku yup başka bir porta yazarak yazdığın portla b portunu logic olarak kontrol edip
okumada bir sorun varmı gibi aşma aşama giderek yapmaya çalış .
if(input(pin_b1)==0 && input(pin_b2)==0 && input(pin_b3)==0 && input(pin_b4)==1)  // 1 e basıldıysa
 {
b=1;
 }
if(input(pin_b1)==0 && input(pin_b2)==0 && input(pin_b3)==1 && input(pin_b4)==0)  // 2 ye basıldıysa
 {
b=2;
 }
 if(input(pin_b1)==0 && input(pin_b2)==0 && input(pin_b3)==1 && input(pin_b4)==1)  // 3 e basıldıysa
 {
b=3;
 }
 if(input(pin_b1)==0 && input(pin_b2)==1 && input(pin_b3)==0 && input(pin_b4)==0)  // 4 e basıldıysa
 {
b=4;
 }
 if(input(pin_b1)==0 && input(pin_b2)==1 && input(pin_b3)==0 && input(pin_b4)==1)  // 5 e basıldıysa
 {
b=5;
 }
 if(input(pin_b1)==0 && input(pin_b2)==1 && input(pin_b3)==1 && input(pin_b4)==0)  // 6 ya basıldıysa
 {
b=6;
 }
 if(input(pin_b1)==0 && input(pin_b2)==1 && input(pin_b3)==1 && input(pin_b4)==1)  // 7 e basıldıysa
 {
b=7;
 }
 if(input(pin_b1)==1 && input(pin_b2)==0 && input(pin_b3)==0 && input(pin_b4)==0)  // 8 e basıldıysa
 {
b=8;
 }
 if(input(pin_b1)==1 && input(pin_b2)==0 && input(pin_b3)==0 && input(pin_b4)==1)  // 9 a basıldıysa
 {
b=9;
 }
 if(input(pin_b1)==1 && input(pin_b2)==0 && input(pin_b3)==1 && input(pin_b4)==1)  // * a basıldıysa
 {
b=11;
 }
  if(input(pin_b1)==1 && input(pin_b2)==1 && input(pin_b3)==0 && input(pin_b4)==0)  // # ye basıldıysa
 {
b=12;
 }

bu satırlar gereksiz
yerine
b=input_b()&0x0F;

Emre MERMİ

#2
hocam şöyle söyleyeyim. kesmeye girip girmediğini

if(a==1){
 c=c+(b*1000);
  output_high(pin_d7);
  output_low(pin_d6);
  output_low(pin_d5);
  output_low(pin_d4);
  printf("%ld  ",c);
 }
  if(a==2){
 c=c+(b*100);
 output_high(pin_d6);
 printf("%ld  ",c);
 }
  if(a==3){
  output_high(pin_d5);
 c=c+(b*10);
 printf("%ld  ",c);
 }
  if(a==4){
  output_high(pin_d4);
 c=c+b;
 a=0;
printf("%ld  ",c); 


şu kodlarda sırayla pinleri high yaparak denedim. bu pinler sırayla high oluyor.
fakat kesme içine sizin dediğini kodu herhangi bir pine atayıp denediğimde olmuyor.

kodu şöyle yazmıştım.
void  EXT_isr(void) 
{
d=1;
output_togle(pin_d2);
 }

d portu tamamen çıkış olarak atanmış.

bir ara  devreyi çalıştırdığımda * a basınca 19 veya 20 yi anahtarlıyordu # ye basınca ikisini birden anahtarlıyordu şimdi o da yok.
bu arada devrede cm8870 in 15. bacağı pic in 33 ünci bacağına bağlı. multimetreyle kontrol ettim sorun yok.

aklıma takılan şey simülasyonda kesmeye girmese nasıl olur da d7 d6 d5 d4 ü sırayla 1 yapar. kesmeye giriyorsa nasıl olur da d2 yi toggle yapmaz ve ve kesme pini doğru bağlandıysa nasıl olur da kesmeye girmez simülasyonda girdiği halde.

bu arada başlangıçta pic in bir bacağını lojik 1 yapıyorum sorunsuz oluyor. pic çalışıyor yani.

indirme linkinde tüm proteus çizimleri var hocam açılmadı mı ? çizimleri nasıl göremediniz.

mesaj birleştirme:: 04 Mayıs 2015, 15:16:29

if kontrolleri içinde seri porttan c değerini yazdırarak programın akışını kontrol ediyorum burada da sorun yok. simülasyonda sıra ile b0b1b2b3b4 pinlerine 11011 10001 10010 10011 verdiğimde  d0 pinindeki led yanıyor ama kodda kesmeye girince çalışması gereken output_togle(pin_d2); komutu çalışmıyor. değişik.