dtmf tonlarını pice çözdürmek

Başlatan Mr.Thinking, 07 Ağustos 2008, 11:52:54

Mr.Thinking

Alıntı yapılan: "hkalaycioglu"bugun gonderemem ancak yarın kodları gonderebılirım bugun nobetcıyım butun kodlar evdekı bılgısayarımda su anda yazmakta bıraz zaman alır yarın ınsallah gonderırım
Allah bin kere razı olsun sizden.
ego=1/Knowledge

mustafa_cmbz

Alıntı yapılan: "hkalaycioglu"elektro77 bende dtmf tonlarını kullandım cep telefonlu uzaktan motor kontrol işleri yaptım kt3170 veya cm8870 bu entegreler dtmf kodlarını binary kodlara cevırır.sen cep telefonundan 1 tusuna bastıgında entegre cıkısında std bınary 1 olur d1 d2 d3 d4 cıkıslarıda 0001 olur her tus bu sekılde kodlanmıstır. kt 3170 in std ucunu kontrol etmene gerek yok aslında. kt 3170 in d1 d2 d3 d4 uclarını pic 16f84 ün portb nin rb0 rb1 rb2 rb3 uclarına bagla. su kodlada konrtol işlemini yapabilirsin

AC:
IF PORTB.0=0 AND PORTB.1=0 AND PORTB.2=0 AND PORTB.3=1 THEN
GOTO ROLE1

ROLE1:
  HIGH PORTB.4
  GOTO DON

gibi kod yazabılırsın bu sana kalmıs hangı tusa gore neyı kontrol etmek ıstıyorsan kontrol işlemini yapabilirsin

verdiğiniz kod mantıksız bu "GOTO DON" satırda program nereye dallanıyor?

birde siz mt8870'in std ucunu algılatmadan nasıl bir kod yazdınız çok merak ediyorum...bu şekilde yazdığınız bir kod çok hassas olmayacaktır bunu unutmayın...çünki mt8870 dtmf üreten bir kaynaktan üretilen tonalra göre çıkış verir ve bu çıkışlar bir başka ton gönderilene kadar çıkışta sabit kalır yani telefondan 4 e bastığınıda 0100 çıkış verir ve bir sonraki ton sesine kadar bu deger çıkışta bulunur...siz bu tarz bir işlem ile şifreleme mantığı oluşturduğunuzda komutlar şu şekilde olması gerekecek


tara_1:

ıf m1=1 then relay_1

..... ' diğer tuşlar

ıf mt4=1 then relay_4  

goto tara_2



tara_2:

ıf m1=1 then relay_1

..... ' diğer tuşlar

ıf mt4=1 then relay_4 

goto tara_3  

...... ' kaç adet şifre girilecek ise o kadar uzar gider



fakat böyle bir kod yazdığınızda siz göndereceğiniz tonlar farklı dahi olsa komut süreleri dahilinde bana kalırsa sadece 2 farklı değer okuyacaksınız

eğer std ucunu kullanmaz iseniz şifre girme veya kontrol işlemini yaprken belkeme süreniz olmayacaktır...ki bunu pause komutuyla yaparsınız sadece isiste çalışır fakat gerçek uygulamada çalışmaz...

birde mantık olarak pic'in portlarındaki değişlemleri algılatarak yapabilirsiniz ama bu da sağlıklı değildir...çünki mt 8870 ilk önce girişindeki ton girişine göre çıkışa bir değer verir sonra std ucunu yetkilendirir bunun sebebi ise yukarıda ki arkadasın yaptığı gibi yapmaya kalkarsanız bu işlem olurken herhangi bir sebebten dolayı ufak bir gecikme dahi çıkıştaki değeri yanlış okumanıza sebep olacaktır...

kafanıza göre işe yapmayın derim bu entegreyi yapan adamlar bu ucu boşuna bırakmamışlar...eğer çok buyuk bir mucit olmayı düşünmüyorsanız kurallara uymama gibi bir lüksünüz yok...

birde bu arkadaş yazdığı kodu koysunda da bizde merakımızı giderelim...

edit:

bu konuda yardım isteyen arkadaşım dtmf kodlarını pic ile algılata bilirsin fakat büyük bir gayret sarf etmen gerek bunun yerine kendisi max. 1ytl olan bir entegreyi kullanarak daha sağlıklı bir tasarım oluşturabilirsiniz...yanlız şu sıralar kt3170 pek bulunmuyor bunun sebebi ise biraz dandik olması onun içindirki bu entegre ile karşılaşsan bile mt8870 almanı tavsiye ederim marka ve kalite olarka aralarında çok fark var...ben çalıştığım şirkette anaons sistemlerinde sorumluyum onların eskilerindede kt3170 var ve çoğunluk ile onlar arıza yapıyor veya tunerin ayarı kaçıyor...projeni yaparken bunları göz önüne alarak işe başla...

elimde hareketli bir resim vardı mt8870 in çalışmasını anlatan onu bulursam ekleyeceğim ozaman daha rahat anlayacaksın...geriside sana kalmış kimse hazır kod vermesin arkadaş kendi yazacak :D

hkalaycioglu

Telefondakı * tusu cıkıstakı roleyı aktıf etmek # tusu ise cıkısı kapatmak amaclı kullanılmıstır.
bunlar dtmf kod cozucu ile ilgili benım kullandıgın kodlar role kontrol amaclı yazılmıstır. motor çalıstırmak amaclı kullanıyorum Elektrık kesıntılerıne karsı cıkısın o ankı durumunu pıcın epromuna yazıyorum elektrık kesılıp tekrar gelırse cıkısın son durumu ne ıse o sekılde calısmaya devam edıyor.Cıkıs komut verıldıkten 3 sanıye sonra çalısmaya baslıyor.

TRISB = %00001111
   TRISA=%00000
   PORTB = 0
   PORTA=0
   i var byte
   B0 VAR BYTE

GEL:
  IF (PORTB.0 = 1) AND (PORTB.1 = 1) AND (PORTB.2 = 0) AND (PORTB.3 = 1) THEN
  write 00,1
  pause 100
  for i=1 to 3
  pause 1000
  next i
  HIGH PORTA.0
  endif
     
  IF (PORTB.0 = 0) AND (PORTB.1 = 0) AND (PORTB.2 = 1) AND (PORTB.3 = 1) THEN
  WRITE 00,0
  pause 100
  LOW PORTA.0
  endif
   
  if PORTB!=%00001011 or PORTB!=%00001100 then
  goto eprom
  else
  goto GEL
  endif
 
EPROM:  
  READ 00,B0
  pause 100
   
  IF B0=01 THEN
  FOR i=1 to 3
  pause 1000
  next i
  high PORTA.0
  endif
   
  if b0=00 then
  low PORTA.0
  endif
  GOTO GEL


bunlarda hex kodu bu kodları pice atarsan yukarıdakı program bırebır calısır. kolay gelsın gerı kalanını ınsallah halledırsınız

:100000005E2889008316081483120808592888007E
:100010008316081555308900AA308900881488187D
:100020000F28081159288F018E00FF308E07031CFE
:100030008F07031C592803308D00DF30212015283D
:100040008D01E83E8C008D09FC30031C2A288C07AA
:10005000031827288C0764008D0F27280C183028D8
:100060008C1C34280000342808008D018F018E007C
:1000700002303E288D018F018E00053094000F085C
:100080000D02031D45280E080C0204300318013030
:10009000031902301405031DFF3059280038031DD1
:1000A000FF300405031DFF3059280404031DFF30F1
:1000B00059288313031383126400080083160F303A
:1000C0008600850183128601850100300618013003
:1000D0008C00013035209E000030861801308C00E5
:1000E00001303520A0001E08840020084E20A0000A
:1000F000A1000030061901308C0000303520A2002C
:1001000020082104840022084E20A200A300003011
:10011000861901308C0001303520A4002208230408
:10012000840024084E20A400A500640024082504AF
:100130000319B028890101300720643013200130F1
:10014000AD00640004302D020318AC2803308F008A
:10015000E8301420AD0FA128051483160510831272
:100160000030061801308C00003035209E00003031
:10017000861801308C0000303520A0001E08840055
:1001800020084E20A000A1000030061901308C008C
:1001900001303520A20020082104840022084E20CE
:1001A000A200A3000030861901308C0001303520F8
:1001B000A40022082304840024084E20A400A500E3
:1001C0006400240825040319EE2889010030072063
:1001D00064301320051083160510831206088C0066
:1001E0000B303A209E0006088C000C303A20A0000C
:1001F0001E08840020085520A000A10064002008EB
:100200002104031905290629062965280030012043
:10021000AC006430132064002C08013C031D21292C
:100220000130AD00640004302D0203181D29033095
:100230008F00E8301420AD0F122905148316051025
:10024000831264002C08003C031D2A290510831624
:0602500005108312652871
:02400E00F53F7C
:00000001FF

Mr.Thinking

merhaba. Bu kodlar sadece tek bir röle için mi açaba. teşekkür ederim.
ego=1/Knowledge

hkalaycioglu

evet tek role ıcın porta.0 ıncı bıtıne baglı roleyı kotrol eder.Ama siz 1 e basıldıgında ıf satırı varya 0001 ise hıgh porta.1 i seklınde devam edersınız.siz 10 role kontrol etmek istiyordunuz bu pıcle 10 role kontrol edemezsınız bunun cıkısını port cogullama işlemıne tabii tutmanız lazım veya 16f877 kullanmanız gerekmektedır o zaman bu kodlar da degısıklık yapmanız gerekır. cunku 16f877 nın cıkısları kımısı analog gırıs cıkıs vs. bunları ayarlamanız gerekmektedır.

mustafa_cmbz

mantık güzel fakat şifreleme işleminde kullanılırmı bilmiyorum...birde gecikmeleri for next ile yapmışsınız ya belirlenen süreyi geçerse ne olacak ?

hkalaycioglu

oyle bır ıhtımal yok pause komutu 4 mhz lık krıstalde birebir çalısır.10 saniye ise sure 10 saniye sonunda çalısır.

orda amacım gecıkme olsu degıl zaten
ben bunu su motoru kontrol devresı olarak kullanıyorum oradakı gecıkme sımdılık 3 sanıye ama pause surelerını 60000 yapıp yanı 60 sanıye yapıp sıstemı 3 dakıka sonra çalısmasını sağlamak cunku motor borulara suyu verıyor sıstemde herhangı bır kesıntı meydana gelırse sular gerı motora dogru gelıyor bu 3 dakıkalık sure ıcınde boru ıcınde su kalmayacagı ıcın tekrar sıstemı devreye verıyorum ve boruların patlaması ıhtımalını ortadan kaldırmaya calısıyorum