DTMF Şifre Hatası

Başlatan fy.elek, 05 Temmuz 2015, 21:59:22

fy.elek

Selamın Aleyküm Arkadaşlar;
Ben bir tanıdığıma dtmf alıcı devresi vede dtmf ton üretme devresi yaptım.
--Dtmf alıcı devrem sıkıntısız çalışıyor, iki röleli sistemi yaptım şifreleri ise;
#1 1. röle aç
#2 2.röle aç
*1 1.röle kapat
*2 2.röle kapat
şeklinde düzenledim ve test ettim kart sıkıntısız şekilde çalışıyor.
--Dtmf ton gönderme devremde şöyle bir sıkıntı oluyor.
Yukarıda belirttiğim şifreleri ton gönderme devreme programladıktan sonra sadece röle açma işlemini yapıyor, kapatma işlemini yapmıyor.
En önemli nokta örneğin dtmf alıcı devremin şifrelerini;
1111--1.röle aç
2222--1.röle kapat
3333--2.röle aç
4444--2.röle kapat
Şeklinde düzenledim ve ton gönderme devremde de buna göre düzenleme yaptım ve röle açma ve kapatma işlemini sıkıntısız şekilde gerçekleştirdi sorunum sadece * yapınca neden olmuyor.
Kullandığım kodlar hazır kodlar sadece şifre değişimini kendim yapıyorum.
Not: Program basic dilindedir.
Not: Ekteki program  #1  #2 *1 *2 li olan program sadece röle açma işlemini yapıyor kapatma işlemini yapmıyor.
ŞİMDİDEN ÇOK TEŞEKKÜR EDERİM..

ete

Programda bazı hatalar var. Basic de GOSUB komutu ile ilgili temel kural gittiğin yerden mutlaka RETURN ile dönmelisin der.
Sen GOSUB KONTROL komutu ile programo KONTROL isimli etikete yönlendirmişsin. Etiketin en altında bir RETURN da var bunlarda sorun yok. Ama aynı yerde;
IF PORTB.0=1 THEN AC şeklinde bir komut var. Hemen altında ,
IF PORTB.1=1 THEN KAPA şeklinde komut mevcut. Bu komutlarda yanlış değil. Genelde bir alt programdan programı başka bir yere yönlendirme derler yaparsan ipin ucunu kaçırırsın derim bende. Sende kaçırmışsın işte.
Şimdi AÇ ve KAPA isimli etiket altında yazılanlara bakarsan program oradan tekrar BASLA isimli etikete (geri dönüş yani) nasıl gönderiliyor? GOTO komutu ile. İşte buradaki GOTO BASLA komutu yanlış Bu komut bir anda programda STACK taşması yaratır ve programın yanlış çalışmasına sebep olur ve bir müddet sonra da kilitlenir muhtemelen.
GOTO BASLA komutu yerine orada RETURN olmalıdır.
Bu değişikliği yapıp bir dene bakalım.  Bana kalırsa senin tespitin "Yalnızca AÇMA işlevini yapıyor KAPATMA yapmıyor" de çok doğru değil. Stack taşması nerede olursa ondan sonraki fonksiyonlar çalışmaz. Genelde önce açma yaptığın için o balangıçta doğru çalışıyor gibi gelebilir. Anlamakiçin Önce bir Açma yaptır. Sonra devrenin elektriğini kesip yeniden ver ve bu sefer direk kapatma yap bakalım ne olacak?
Her neyse sorun kesinlikle stack taşması olsa gerek. Ancak tuş kodlamasında da bir hata var. Bak DTMFOUT komut açıklamasında ne söyleniyor
"Tone 10 is the * key, Tone 11 is the #" yani "*" tuşu için senin 10 kullanman gerekiyor sen ise 11 kullanmışsın. Belki asıl yanlış bu gibi gözükebilir ama bence asıl yanlış stack taşması yaratman olmalı.
Her neyse iki düzeltme yapacaksın. 11 yerine 10 kullanacaksın ve Goto BASLA yerine RETURN yazıp işi düzelteceksin.

Ete

fy.elek

Alıntı yapılan: ete - 06 Temmuz 2015, 07:54:42
Programda bazı hatalar var. Basic de GOSUB komutu ile ilgili temel kural gittiğin yerden mutlaka RETURN ile dönmelisin der.
Sen GOSUB KONTROL komutu ile programo KONTROL isimli etikete yönlendirmişsin. Etiketin en altında bir RETURN da var bunlarda sorun yok. Ama aynı yerde;
IF PORTB.0=1 THEN AC şeklinde bir komut var. Hemen altında ,
IF PORTB.1=1 THEN KAPA şeklinde komut mevcut. Bu komutlarda yanlış değil. Genelde bir alt programdan programı başka bir yere yönlendirme derler yaparsan ipin ucunu kaçırırsın derim bende. Sende kaçırmışsın işte.
Şimdi AÇ ve KAPA isimli etiket altında yazılanlara bakarsan program oradan tekrar BASLA isimli etikete (geri dönüş yani) nasıl gönderiliyor? GOTO komutu ile. İşte buradaki GOTO BASLA komutu yanlış Bu komut bir anda programda STACK taşması yaratır ve programın yanlış çalışmasına sebep olur ve bir müddet sonra da kilitlenir muhtemelen.
GOTO BASLA komutu yerine orada RETURN olmalıdır.
Bu değişikliği yapıp bir dene bakalım.  Bana kalırsa senin tespitin "Yalnızca AÇMA işlevini yapıyor KAPATMA yapmıyor" de çok doğru değil. Stack taşması nerede olursa ondan sonraki fonksiyonlar çalışmaz. Genelde önce açma yaptığın için o balangıçta doğru çalışıyor gibi gelebilir. Anlamakiçin Önce bir Açma yaptır. Sonra devrenin elektriğini kesip yeniden ver ve bu sefer direk kapatma yap bakalım ne olacak?
Her neyse sorun kesinlikle stack taşması olsa gerek. Ancak tuş kodlamasında da bir hata var. Bak DTMFOUT komut açıklamasında ne söyleniyor
"Tone 10 is the * key, Tone 11 is the #" yani "*" tuşu için senin 10 kullanman gerekiyor sen ise 11 kullanmışsın. Belki asıl yanlış bu gibi gözükebilir ama bence asıl yanlış stack taşması yaratman olmalı.
Her neyse iki düzeltme yapacaksın. 11 yerine 10 kullanacaksın ve Goto BASLA yerine RETURN yazıp işi düzelteceksin.

Ete


Merhaba Ete Hocam;
Dedeiğiniz gibi Goto BASLA yerine RETURN ile değişiklik yaptım ve sorunum hala devam etmekte.

"*" tuşu için senin 10 kullanman gerekiyor demişşiniz ama dtmf alıcı devremde "*" için 11 kullandım.
Ben programda hata olduğunu düşünmüyorum nedeni ise şifreleri şimdi değiştrip tekrar denedim
Alıcı kartımın şifrelerini;
11--1.röle aç
22--1.röle kapat
33--2.röle aç
44--2.röle kapat
Şeklinde yaptım dtmf göndericiminde aynen bu şekilde düzenledim sıkıntısız çalıştılar nedeni ne acaba..
Not: İyice durumu kafaya takamış durumdayım
Not: Dtmf göndericimin devresini düzenlediğim programı, alıcı devremin ise programı ektedir..
YARDIMLARINIZ İÇİN ŞİMDİDEN ÇOK TEŞEKKÜR EDERİM

ete

DTMF komut açıklamasında "*" işareti için 10 kullanılması gerektiği belirtilmiş. Sen 11 ile çalıştırıyorsan sorun değil çalıştırmaya devam et. Ancak hala nasıl çalıştıklarını anlamış değilim.
Zira ilk verdiğin programla ikinci verdiğin arasında bir fark da yok zaten. (Belkide ikinci defada ilk programı verdin)
Önce birinci programdaki açma komutuna bakalım,

DTMFOUT PORTB.4,90,90,[12,1,12,2]
bu komut telefon hattına #1#2 komutunu verir. Senin sisteminde bu ne demek 1 nolu röleyi aç, 2 nolu röleyi aç . Ancak iki rölenin komutunu aynı anda verirsen birini alacak diğerini almayacaktır muhtemelen.
Şayet 1 nolu röleyi açacak isem #1 vermeliyim. aynı anda #2 de verirsem ya yalnızca ilk algıladığı olan #1 yada son algıladığı olan #2 görülecektir.

Şimdi ikinci olarak veridğin ve sorunsuz çalıştır dediğin programa bakalım.
DTMFOUT PORTB.4,90,90,[12,1,12,2]
Bu komutun yukarıdakinden bir farkı varmıdır ben göremiyorum!!!!.

Şimdi de kapatma komutlarına bakalım.
Birinci programda ;
DTMFOUT PORTB.4,90,90,[11,1,11,2] bu komut da diyelimki *1*2 tonlarını gönderiyor. Anlamı 1 nolu röleyi kapat 2 nolu röleyi kapat.
Peki ilk mesajınızda bir yandan sıkıntısız çalışıyor demişsiniz bir yandan da kapatmada sorun var demişsiniz. Bunada bir anlam veremedim.
Her neyse sonradan 1111 1 nolu röleyi açma 2222 1 nolu röleyi kapatma gibi bir kod kullanmışsınız ama bunun program karşılığını vermemişsiniz. Bu kodu nasıl vereceksiniz?
Ben söyleyeyim DTMFOUT PORTB.4,90,90,[12,1,1,1,1] şeklinde açma, DTMFOUT PORTB.4,90,90,[11,2,2,2,2] şeklinde de kapatma yaptırmanız gerekir. Bu ancak 1 nolu röleyi açar ve kapatır.
İkincisi için kodlar 2 ye göre verilmeli.

Muhtemelen çalışmama sebebi kodları yanlış sırada yollamanız olsa gerek.

Ete


fy.elek

Alıntı yapılan: ete - 06 Temmuz 2015, 10:28:46
DTMF komut açıklamasında "*" işareti için 10 kullanılması gerektiği belirtilmiş. Sen 11 ile çalıştırıyorsan sorun değil çalıştırmaya devam et. Ancak hala nasıl çalıştıklarını anlamış değilim.
Zira ilk verdiğin programla ikinci verdiğin arasında bir fark da yok zaten. (Belkide ikinci defada ilk programı verdin)
Önce birinci programdaki açma komutuna bakalım,

DTMFOUT PORTB.4,90,90,[12,1,12,2]
bu komut telefon hattına #1#2 komutunu verir. Senin sisteminde bu ne demek 1 nolu röleyi aç, 2 nolu röleyi aç . Ancak iki rölenin komutunu aynı anda verirsen birini alacak diğerini almayacaktır muhtemelen.
Şayet 1 nolu röleyi açacak isem #1 vermeliyim. aynı anda #2 de verirsem ya yalnızca ilk algıladığı olan #1 yada son algıladığı olan #2 görülecektir.

Şimdi ikinci olarak veridğin ve sorunsuz çalıştır dediğin programa bakalım.
DTMFOUT PORTB.4,90,90,[12,1,12,2]
Bu komutun yukarıdakinden bir farkı varmıdır ben göremiyorum!!!!.

Şimdi de kapatma komutlarına bakalım.
Birinci programda ;
DTMFOUT PORTB.4,90,90,[11,1,11,2] bu komut da diyelimki *1*2 tonlarını gönderiyor. Anlamı 1 nolu röleyi kapat 2 nolu röleyi kapat.
Peki ilk mesajınızda bir yandan sıkıntısız çalışıyor demişsiniz bir yandan da kapatmada sorun var demişsiniz. Bunada bir anlam veremedim.
Her neyse sonradan 1111 1 nolu röleyi açma 2222 1 nolu röleyi kapatma gibi bir kod kullanmışsınız ama bunun program karşılığını vermemişsiniz. Bu kodu nasıl vereceksiniz?
Ben söyleyeyim DTMFOUT PORTB.4,90,90,[12,1,1,1,1] şeklinde açma, DTMFOUT PORTB.4,90,90,[11,2,2,2,2] şeklinde de kapatma yaptırmanız gerekir. Bu ancak 1 nolu röleyi açar ve kapatır.
İkincisi için kodlar 2 ye göre verilmeli.

Muhtemelen çalışmama sebebi kodları yanlış sırada yollamanız olsa gerek.

Ete



Ete hocam dün geceden beri uğraşıyorum ve hala çözüme ulaşamadım belki de tek bir noktaya saplandım gözüm daha görmüyor sanırım hatayı.
Kodları ekte verdim birde siz bakar mısınız?
Tek gözle bakmak var bide deneyimli çift gözle  :)

İLGİNİZ ALAKANIZ YARDIMLARINIZ İÇİN ÇOK TEŞEKKÜR EDERİM..

ete

Ben hala DTMF kodlarını yanlış verdiğin kanısındayım.
Sorunu çözmek için
1. nolu röle Açma kodu (mesela #1 veya #11)
2. nolu röle Açma kodu (mesela #2 veya #22)

1 nolu röle kapatma kodu (mesela *3 veya *33)
2 nolu röle kapatma kodu (mesela *4 veya *44)

verirsen bunun üzerinden fikir yürütebiliriz. Yada ben ne olması gerektiğini vereyim en iyisi.
1 nolu röleyi #11 kodu ile açmak için .....DTMFOUT PORTB.4,90,90,[12,1,1]
1 nolu röleyi *33 kodu ile kapatmak için  DTMFOUT PORTB.4,90,90,[11,3,3] göndermek gerekir.
Ancak kapatma çalışmaz ise DTMF kod açıklamasında belirtildiği şekilde DTMFOUT PORTB.4,90,90,[10,3,3] gönderilmesi denenmelidir.

2 nolu rölenin #22 kodu ile açılması için DTMFOUT PORTB.4,90,90,[12,2,2]
2 nolu rölenin *44 kodu ile kapatılması için DTMFOUT PORTB.4,90,90,[11,4,4] yolanması çalışmaz ise DTMFOUT PORTB.4,90,90,[10,4,4] şeklinde denenmesi gerekir.

Anlamadığım şey senin gönderme kodlarında yalnızca bir röleye ait komut var. İki röle de aynı andamı açılıp kapatılıyor. O zaman diğerine kod vermenin ne anlamı var. Ayrı açılıp kapanacak ise onlara ait kodlarda yer almalı programda değilmi. Muhtenelen programın bazı bölümlerini burada veriyorsun hepsini değil herhalde.

Ete
   

fy.elek

Ete Hocam verdiğiniz bilgiler sayesinde sorunu çözdüm.  :)
Sorun DTMF OUT komutundan oluyordu yani daha detaylı söylemek gerekirse sizinde önceki mesajlarda söyledğiniz gibi
''Tone 10 is the * key, Tone 11 is the #" yani "*" tuşu için senin 10 kullanman gerekiyor sen ise 11 kullanmışsın.''
Olay yukarıda sizin söyledğiniz cümlede bitmiş zaten bende yaşımın verdiği amatörlük vede sürekli aynı şeye odaklanmamdan sabahlara kadar uğraşmışım ama olsun çok şey öğrendim bana çok şey kattınız katacağınıza da eminim çok teşekkür ederim Ete hocamm
Not: Size devrenin sorununu hallettiğimi yazarken sizde yazmışsınız sorun halloldu  :) :)
FURKAN

Powered by EzPortal