Bu programda yanlışık varmı bakarmısnız lütfen

Başlatan togier, 03 Mayıs 2012, 14:02:36

togier

dtmf çözücü devresinide yaptım 2 gündür uğraşıyom bi türlü çalıştıramadım yazılımı internetten buldum acaba yanlışlıkmı var bakarmısnız.


@ device xt_osc, wdt_off, pwrt_on, protect_off

define osc3
OPTION_REG=0
CMCON=7
TRISA=%00000110
TRISB=%01111111

std var portb.0
led var porta.3
memo var porta.0

symbol d1=portb.5 'dıp swic acma kayıt
symbol d2=portb.6 'dıp swıc kapama kayıt

symbol kapat=porta.2

q4 var portb.1 'q1 8870
q3 var portb.2 'q2 8870
q2 var portb.3 'q3 8870
q1 var portb.4 'q4 8870

dtmfa var byte
dtmfb var byte
dtmfc var byte
dtmfd var byte

ac1 var byte
ac2 var byte
ac3 var byte
ac4 var byte
ka1 var byte
ka2 var byte
ka3 var byte
ka4 var byte
bcl var byte

bcl=0
led=1
pause 1000
led=0

basla:
dtmfa=0
dtmfb=0
dtmfc=0
dtmfd=0

dtmfal:

read 0,ac1               
read 4,ka1
memo=1
if kapat=1 then led=0
if std = 0 then dtmfa=0   'dtmfal
if q1 = 1 then dtmfa = dtmfa + 1
end
if q2 = 1 then dtmfa = dtmfa + 2
end
IF q3 = 1 then dtmfa = dtmfa + 4
end
IF q4 = 1 then dtmfa = dtmfa + 8
end

dtmf_bekl:

if d1=0 then gosub acma_kayit
if d2=0 then gosub kapama_kayit
IF std=1 then dtmf_bekl
if ac1<>dtmfa and ka1<>dtmfa then  goto dtmfak   'reset

dtmfak:
read 1,ac2
read 5,ka2
IF std = 0 then  dtmfb=0 'dtmfak
IF q1 = 1 then dtmfb = dtmfb + 1
end
IF q2 = 1 then dtmfb = dtmfb + 2
end
IF q3 = 1 then dtmfb = dtmfb + 4
end
IF q4 = 1 then dtmfb = dtmfb + 8
end

dtmf_bek:
IF std=1 then dtmf_bek
if d1=0 then gosub acma_kayit
if d2=0 then gosub kapama_kayit
if ac2<>dtmfb and ka2<>dtmfb then reset
goto dtmfakla

dtmfakla:
read 2,ac3
read 6,ka3
if std = 0 then  dtmfc=0  'dtmfakla
IF q1 = 1 then dtmfc = dtmfc + 1
end
IF q2 = 1 then dtmfc = dtmfc + 2
end
IF q3 = 1 then dtmfc = dtmfc + 4
end
IF q4 = 1 then dtmfc = dtmfc + 8
end

dtmf_b:
if std=1 then dtmf_b
if d1=0 then gosub acma_kayit
if d2=0 then gosub kapama_kayit
if ac3<>dtmfc and ka3<>dtmfc then reset
goto dtmfakl

dtmfakl:
read 3,ac4
read 7,ka4
if std = 0 then  dtmfd=0     'dtmfakl
if q1 = 1 then dtmfd = dtmfd + 1
end
if q2 = 1 then dtmfd = dtmfd + 2
end
if q3 = 1 then dtmfd = dtmfd + 4
end
if q4 = 1 then dtmfd = dtmfd + 8
end

dtmf_bet:
if std=1 then dtmf_bet
if d1=0 then gosub acma_kayit
if d2=0 then gosub kapama_kayit
if ac4<>dtmfd and ka4<>dtmfd then reset
gosub komut

reset:
dtmfa=0
dtmfb=0
dtmfc=0
dtmfd=0
goto basla

komut:
if ac1=dtmfa&ac2=dtmfb&ac3=dtmfc&ac4=dtmfd then led=1
if ka1=dtmfa&ka2=dtmfb&ka3=dtmfc&ka4=dtmfd then led=0
return

acma_kayit:
memo=0
ac1=dtmfa
write 0,ac1
ac2=dtmfb
write 1,ac2
ac3=dtmfc
write 2,ac3
ac4=dtmfd
write 3,ac4
memo=1
pause 50
memo=0
return


kapama_kayit:
memo=0
ka1=dtmfa
write 4,ka1
ka2=dtmfb
write 5,ka2
ka3=dtmfc
write 6,ka3
ka4=dtmfd
write 7,ka4
memo=1
pause 50
memo=0
return
end

ete

Programın her tarafında "end" şeklinde sona erdirme komutu bulunuyor. Bu komutlar oralarda olduğu müddetçe bu program çalışmaz zaten.
8870 in çalışma mekanizmasını bilsen daha kolay çözüme gidersin belki. Yada  programı kendi istediğin şekilde yazarsın.
Bu entegrenin bir std (senin adlandırmana göre söyledim) pini vardır. Bu pin entegre herhangi bir gelen kodu çözer ise belirli bir süre HIGH konumunda kalmaktadır. Bu pin HIGH oluncada data bitlerini verdiği diğer 4 bitlere (q1 - q2 - q3 - q4) bakman gerekir
Bu bitler çözülen kodla ilgili rakamı vereceklerdir.
Okuma kolaylığı açısından ben olsam PORTB.0-PORTB.3 aralığını q1-q4 bitlerine bağlardım. Std yi de PortB.4 pinine bağlardım.
Böylece gelen çözülmüş kodu bir seferde okuma imkanın olurdu. Gelen sayılar maksimum 15 rakamına eşdeğer olabilir. Genelde telefon tuş kodları olduklarından 0-12 arasında değerler gelir.
Burada dediğim gibi temel mantık,
IF STD=1 ise
   SAYI=q4*8 + q3*4 + q2*2 + q1  şeklinde elde edilir.
Benim dediğim gibi bağlarsan SAYI=PORTB & %00001111 şeklinde hesaba gerek olmadan alınabilir.
Bir kere bu sayıyı aldıktan sonra STD pininin LOW olmasını beklemen gerekiyor. Pin low olduktan sonra ikinci sayı için yeniden HIGH olmasını beklemen gerekir.
Bu açıklama ile normalde her şey yapılabilir.

Ete

togier


togier

Abi bide pek bilgim yok basic hakkında nasıl çalıştığını anlatırsan çok sevinirim.

ete

Çok basit düşünülmüş kodlar bunlar. Bu kodları normal bir kablolu telefon hattı için çalıştırmaya çalışıyorsan hiç uğraşma derim. Çalışmaz. Zira programın başlangıcında hat açılmış farz ediliyor. Halbuki böyle bir sistemde önce hattı açtırman gerekir.

Programın mantığınıda pek anladım sayılmaz.
Aşağıdaki linkte benim bir projem var. Çalışan denenmiş komple bir projedir.
Neden onu çalıştırmıyorsun?

http://etepic.com/index.php?topic=59.0


Ete

togier

ABİ pek yazılım bilgim yok öle hazır kodlardan projeler yapıyorum bu benim verdiğim çalışmazmı şimdi

ete

İlk bakışta çalışmaz derim ama kesin emin olmak için 1 saat incelemek lazım. satır satır program ne yapıyor anlamak lazım. Bunuda yapmaya değermi sence?
Bence değmez. Çalışıp çalışmayacağını yazan vatandaşa sormak lazım.

Ete

togier

ete abi senin verdiğine baktımda 1-2 saatttir inceliyom abi çok karışık işin içinden çıkamadım  bunu sadece bi led yakcak şekilde bide şifreleri değiştirebili,ecek şekilde yapamazmıyız

ete

Benim programda tek cıkıs kullanırsın . Ayrıca sifre değiştirmede orada mevcut. Daha ne yapacaksınki.
Ete

togier

Abi bu programı çalıştırdım tek problem  mesala dtmf gelice 3 haneli dtmf şifresiyle açtırmak istiyorum
yada 2 haneli şifreile kapatmak istiyorum ama illa 4 haneli şifre olucak  nerde değişiklik yapmam gerek acaba


define osc 3
OPTION_REG=0
cmcon=7
TRISA=%00000110
TRISB=%01111111
std var portb.0
led var porta.3
memo var porta.0
symbol d1=portb.5 'dıp swic acma kayıt
symbol d2=portb.6 'dıp swıc kapama kayıt

symbol kapat=porta.2

q4 var portb.1 'q1 8870
q3 var portb.2 'q2 8870
q2 var portb.3 'q3 8870
q1 var portb.4 'q4 8870

dtmfa var byte
dtmfb var byte
dtmfc var byte
dtmfd var byte

ac1 var byte
ac2 var byte
ac3 var byte
ac4 var byte
ka1 var byte
ka2 var byte
ka3 var byte
ka4 var byte
bcl var byte
bcl=0



basla:
dtmfa=0
dtmfb=0
dtmfc=0
dtmfd=0

dtmfal:

read 0,ac1
read 4,ka1
memo=1                     // hafıza ledi
if kapat=1 then led=0
if std = 0 then dtmfal
dtmfa=0   

if q1 = 1 then
dtmfa = dtmfa + 1
endIF
if q2 = 1 then
dtmfa = dtmfa + 2
endIF
IF q3 = 1 then
dtmfa = dtmfa + 4
endIF
IF q4 = 1 then
dtmfa = dtmfa + 8
endIF


dtmf_bekl:

IF std=1 then dtmf_bekl
if d1=0 then gosub acma_kayit
if d2=0 then gosub kapama_kayit
if ac1<>dtmfa and ka1<>dtmfa then reset 
goto dtmfak   

dtmfak:
read 1,ac2
read 5,ka2
IF std = 0 then dtmfak 
dtmfb=0
IF q1 = 1 then
dtmfb = dtmfb + 1
endIF
IF q2 = 1 then
dtmfb = dtmfb + 2
endIF
IF q3 = 1 then
dtmfb = dtmfb + 4
endIF
IF q4 = 1 then
dtmfb = dtmfb + 8
endIF

dtmf_bek:
IF std=1 then dtmf_bek
if d1=0 then gosub acma_kayit
if d2=0 then gosub kapama_kayit
if ac2<>dtmfb and ka2<>dtmfb then reset
goto dtmfakla

dtmfakla:
read 2,ac3
read 6,ka3
if std = 0 then dtmfakla
dtmfc=0
IF q1 = 1 then
dtmfc = dtmfc + 1
endIF
IF q2 = 1 then
dtmfc = dtmfc + 2
endIF
IF q3 = 1 then
dtmfc = dtmfc + 4
endIF
IF q4 = 1 then
dtmfc = dtmfc + 8
endIF

dtmf_b:
if std=1 then dtmf_b
if d1=0 then gosub acma_kayit
if d2=0 then gosub kapama_kayit
if ac3<>dtmfc and ka3<>dtmfc then reset
goto dtmfakl

dtmfakl:
read 3,ac4
read 7,ka4
if std = 0 then dtmfakl
dtmfd=0     
if q1 = 1 then
dtmfd = dtmfd + 1
endIF
if q2 = 1 then
dtmfd = dtmfd + 2
endIF
if q3 = 1 then
dtmfd = dtmfd + 4
endIF
if q4 = 1 then
dtmfd = dtmfd + 8
endIF

dtmf_bet:
if std=1 then dtmf_bet
if d1=0 then gosub acma_kayit
if d2=0 then gosub kapama_kayit
if ac4<>dtmfd and ka4<>dtmfd then reset
gosub komut

reset:
dtmfa=0
dtmfb=0
dtmfc=0
dtmfd=0
goto basla

komut:
if ac1=dtmfa&ac2=dtmfb&ac3=dtmfc&ac4=dtmfd then led=1

if ka1=dtmfa&ka2=dtmfb&ka3=dtmfc&ka4=dtmfd then led=0

return

acma_kayit:
memo=0
ac1=dtmfa
write 0,ac1
ac2=dtmfb
write 1,ac2
ac3=dtmfc
write 2,ac3
ac4=dtmfd
write 3,ac4
memo=1
pause 50
memo=0
return


kapama_kayit:
memo=0
ka1=dtmfa
write 4,ka1
ka2=dtmfb
write 5,ka2
ka3=dtmfc
write 6,ka3
ka4=dtmfd
write 7,ka4
memo=1
pause 50
memo=0
return
end 


ete

Programda , dtmfal: şeklinde bir etiket mevcut. Bu alt programda Dtmf bilgisi sayıya çevrilmektedir.
Alt kısmına doğru bakarsan orada;
if q1 = 1 then
dtmfa = dtmfa + 1
endIF
if q2 = 1 then
dtmfa = dtmfa + 2
endIF
IF q3 = 1 then
dtmfa = dtmfa + 4
endIF
IF q4 = 1 then
dtmfa = dtmfa + 8

şeklinde kodlar görürsün. Bu kodlar DTMF entegresinden çıkan 4 bitlik binary sayıyı almaktadır. Bu kodların sonunda yer alan;
IF q4 = 1 then
dtmfa = dtmfa + 8
Endif
satırlarını silersen program artık yalnızca 3 bitlik bilgi alır.
Bir öncekinide yani IFq3=1 ile başlayan satırlarıda silersen o zamanda yalnızca 2 bitlik bilgi alır.

Ete


togier

Ete abi öncelkle teşekkür ilgilendiğin için

Abi galiba yanlış anlattım BU program 4 haneli mesala '1234' yani binary 0001-0010-0011-0100 ama illa dört haneli şifre girmem gerekiyo bu programda hem kapama için hemde açma 4 haneli şifre girmen gerkiyo çalışması için .Benim isteğim 1234 yerine 123  yada 1234567 şireleri uzatmam yada kısaltmam bu kapama içinde geçerli olcak abi nasıl bi eklenti yapmam gerekiyo şimdiden teşekkürler abi

weeman

iyi günler , forumda aratmama rağmen cevabını bulamadım bende aktif olan bu konuda sorumu sormayı düşündüm hatam varsa affola.
HIGH PORTB.2:PAUSEUS 2:LOW PORTB.2

buradaki " : " işareti neyi ifade ediyor?
" : " işareti etiketlerde kullanılıyor onu biliyorum ancak komutların arasında görünce yaptığı işi anlayamadım.
Birde 7 segment display ile Tarih-saat projesi yapacağım.4511 decoder kullanarak bunu yapmak mümkün mü?

fahrettink

#13
weeman ,

":" işareti aynı satırda birden fazla kod yazmana yarıyor.

Yani aynı ifadeyi;

HIGH PORTB.2
PAUSEUS 2
LOW PORTB.2


Bu şekilde de yazabilirdin. Aralara ":" işareti koyarak birden fazla kodu aynı satıra yazabilirsin.

4511 yerine 74hc595 kullanman çok daha iyi olur bence. Her ikisi içinde gerekli bilgileri


http://etepic.com/index.php?topic=19.0
linkteki Ete hocanın 8 nolu dersinde bulabilirsin.
"Dahilik %1 ilham, %99 çalışmanın eseridir." Thomas Alva EDISON

weeman


Powered by EzPortal