Dtmf şifre hane sayısı hakkında

Başlatan truvali, 08 Temmuz 2017, 01:43:15

truvali

Herkese hayırlı geceler arkadaşlar
Daha önce değerli ete hocamızın katkıları  ile yapıp kullandığım gayet güzel çalışan dtmf yazılımı birkaç değişiklik yapma ihtiyacı duydum ete hocam ve  sizlerden yardım bekliyorum yazılımda dtmf kodları açma ve kapama 3 haneli çalışıyor örnek açma 111 kapama 222 aynı zamanda bunları yine 3 haneli kod girerek değiştirebiliyoruz benim  yapmak istediğim açma kodu 3 hane kapama kodu 2 hane veya tam  tersi olma şansı varmı
Örnek 888 tuşlayıp açma şifresi değiştime bölümüne geldim daha önce şifre 111 idi ben bunu 12 olmasını istiyorum kodlar tamamı altta

---------------------------------------------------------------
@ DEVICE pic16F628                      'işlemci 16F628                               
@ DEVICE pic16F628, WDT_OFF              'Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628, PROTECT_ON         'Kod Protek ACIK
@ DEVICE pic16F628, MCLR_OFF             'MCLR pini kullanılıyor.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
CMCON=7    '16F628 de komparatör pinleri iptal hepsi giriş çıkış
'-----------------------------------------------------------------
PORTA=0:PORTB=0
TRISB=%11111001   'PortB.0 giriş diğerleri çıkış yapıldı.
TRISA=%10000000   'A portu tamamı çıkış yapıldı.

SIFRE  VAR WORD
ROLE1  VAR WORD
ROLE2  VAR WORD
KAPA   VAR WORD
RAKAM  var WORD
TEMP   VAR WORD
BASKA  VAR WORD
ZAMAN  VAR WORD 60
SURE   VAR word 62
SAYAC  VAR BYTE 79
SAYI   VAR BYTE
DURUM  VAR BYTE
BIRLER VAR BYTE
ONLAR  VAR BYTE
YUZLER VAR BYTE
BINLER VAR BYTE
CIK    VAR BIT
YAZ    var BIT

SYMBOL CIKIS1=PORTB.2
SYMBOL CIKIS2=PORTB.1
SYMBOL VALDAT=PORTB.3
SYMBOL TUS   =PORTA.7
'--------------------------------------------------------------------------
PAUSE 200
CLEAR
read 0,SAYI:PAUSE 10
IF SAYI=$FF THEN
   SIFRE=111 :GOSUB SIFREYAZ 'DEFAULT MASTER ŞİFRE
   ROLE1=174 :GOSUB AC1YAZ
   ROLE2=170 :GOSUB AC2YAZ
   KAPA =471 :GOSUB KAPAYAZ       
   GOTO BASLA
endIF

READ 1,YUZLER
READ 2,ONLAR
READ 3,BIRLER
SIFRE=YUZLER*100+ONLAR*10+BIRLER

READ 10,YUZLER
READ 12,ONLAR
READ 13,BIRLER
ROLE1=YUZLER*100+ONLAR*10+BIRLER

READ 20,YUZLER
READ 22,ONLAR
READ 23,BIRLER
ROLE2=YUZLER*100+ONLAR*10+BIRLER

READ 30,YUZLER
READ 32,ONLAR
READ 33,BIRLER
KAPA=YUZLER*100+ONLAR*10+BIRLER

durum=PORTB
'--------------------------------------ANA--------------------------------------
BASLA:  Sayac=0:zaman=0
'------------------ZİL SAYMA BÖLÜMÜ BİTTİ------------------                                                           
ROLEKONTROL:   
             RAKAM=0:CIK=0
             GOSUB SIFREAL
             IF CIK=1 THEN BITIR  'süre aşımı olmuş ise
             IF RAKAM=111 THEN 'MASTER SIFRE GİRİLİNCE ESKİ SİFRELER GERİ GELECEK
                  ROLE1=174:GOSUB AC1YAZ
                  ROLE2=170:GOSUB AC2YAZ
                  KAPA =471:GOSUB KAPAYAZ        'şifre değişirken buradaki şifre yerine yenisi yazılacak                 
                GOTO ROLEKONTROL
             ENDIF   
              IF RAKAM=ROLE1 THEN
              PORTB=DURUM | %00000100
              GOTO ROLEKONTROL
              ENDIF
              IF RAKAM=ROLE2 THEN
              PORTB=DURUM | %00000010
              GOTO ROLEKONTROL
              ENDIF
              IF RAKAM=KAPA THEN
              PORTB=DURUM & %11111001
              GOTO ROLEKONTROL
              ENDIF
'rakam 999 yapılınca yukarıdaki hale dönecek sistem master şifre yani
'rakam 888 tuşlanıp ardından yeni 3 haneli sifre role1 açılma değiştirme
'rakam 777 tuşlanıp ardından yeni 3 haneli sifre role2 açılma değiştirme
'rakam 666 tuşlanıp ardından yeni 3 haneli sifre kapama  değiştirme
              IF RAKAM=888 THEN      '1 NOLU RÖLE AÇMA KOD DEĞİŞTİR                 
                  rakam=0:GOSUB SIFREAL
                  IF CIK=1 THEN BITIR
                  ROLE1=RAKAM
                  GOSUB AC1YAZ
              ENDIF
             
              IF RAKAM=777 THEN    '2 NOLU RÖLE AÇMA KOD DEĞİŞTİR
                  rakam=0:GOSUB SIFREAL
                  IF CIK=1 THEN BITIR
                  ROLE2=RAKAM
                  GOSUB AC2YAZ
              ENDIF
             
              IF RAKAM=666 THEN    'KAPAT KODU DEĞİŞTİR
                  rakam=0:GOSUB SIFREAL
                  IF CIK=1 THEN BITIR
                  KAPA=RAKAM
                  GOSUB KAPAYAZ
              ENDIF         
             
              IF RAKAM=999 THEN   'MASTER ŞİFRE DEĞİŞTİR
                 rakam=0:GOSUB SIFREAL
                 IF CIK=1 THEN BITIR
                 SIFRE=RAKAM
                 GOSUB SIFREYAZ
              ENDIF     
                 
             GOTO ROLEKONTROL
     
SIFREAL: 
          GOSUB ALBILGI
          IF CIK=1 THEN RETURN
          RAKAM=RAKAM+SAYI*100
          GOSUB ALBILGI
          IF CIK=1 THEN RETURN
          RAKAM=RAKAM+SAYI*10
          GOSUB ALBILGI
          IF CIK=1 THEN RETURN
          RAKAM=RAKAM+SAYI
          RETURN       

ALBILGI:
          SURE=0:ZAMAN=0
          WHILE VALDAT=0
            SURE=SURE+1
            PAUSE 1
            IF SURE=2000 THEN
              CIK=1:RETURN
            ENDIF
          WEND
           
SAYIAL: SAYI=0
        WHILE VALDAT=1
        SAYI.0=PORTB.7
        SAYI.1=PORTB.6
        SAYI.2=PORTB.5
        SAYI.3=PORTB.4
        WEND
        IF SAYI=10 THEN SAYI=0
        RETURN


SIFREYAZ:
         TEMP=SIFRE       
         YUZLER=TEMP DIG 2
         ONLAR =TEMP DIG 1
         BIRLER=TEMP DIG 0
         WRITE 1,YUZLER:PAUSE 10
         WRITE 2,ONLAR :PAUSE 10
         WRITE 3,BIRLER:PAUSE 10
         RETURN

AC1YAZ:
      TEMP=ROLE1         
      YUZLER=TEMP DIG 2
      ONLAR =TEMP DIG 1
      BIRLER=TEMP DIG 0
      WRITE 10,YUZLER:PAUSE 10
      WRITE 12,ONLAR :PAUSE 10
      WRITE 13,BIRLER:PAUSE 10
      RETURN
AC2YAZ:
      TEMP=ROLE2         
      YUZLER=TEMP DIG 2
      ONLAR =TEMP DIG 1
      BIRLER=TEMP DIG 0
      WRITE 20,YUZLER:PAUSE 10
      WRITE 22,ONLAR :PAUSE 10
      WRITE 23,BIRLER:PAUSE 10
      RETURN
KAPAYAZ:
      TEMP=KAPA       
      YUZLER=TEMP DIG 2
      ONLAR =TEMP DIG 1
      BIRLER=TEMP DIG 0
      WRITE 30,YUZLER:PAUSE 10
      WRITE 32,ONLAR :PAUSE 10
      WRITE 33,BIRLER:PAUSE 10
      RETURN           
                     
BITIR:  GOSUB CIKIS:GOTO BASLA:RETURN         
CIKIS : SURE=0   
        CIK=0
        SAYAC=0
        RAKAM=0
        RETURN
End   

ete

Programcılıkta mantıklı olan her şey mümkündür. Bu istediğinde mümkün görülüyor. Ancak program genel anlamda bu algoritma üzerine yazılmadığı için çok fazla kod yazılması gerekir. Örnek vereyim.
Şifre bilgilerinin girildiği program parçası şu;
SIFREAL: 
          GOSUB ALBILGI
          IF CIK=1 THEN RETURN
          RAKAM=RAKAM+SAYI*100
          GOSUB ALBILGI
          IF CIK=1 THEN RETURN
          RAKAM=RAKAM+SAYI*10
          GOSUB ALBILGI
          IF CIK=1 THEN RETURN
          RAKAM=RAKAM+SAYI
          RETURN

bu kısım 3 haneli rakam girilmesini sağlayacak şekilde yazılmış. sen bir işde 3 hane diğerinde 2 hane kullanacak olursan bu bölüm 2 haneli şifre için kullanılamayacaktır. Dikkatini çekerim daha işin başında girilecek hane sayısı girişte sorun çıkarmış oldu. Hadi diyelimki benzer bir kod daha yazdık ve oda sadece 2 hane almaya müsaade edecek. Bu durumda ne zaman 2 hane alınacak ne zaman 3 hane alınacak karmaşa çıkacak. Bunu biz biliyoruz. İki ayrı program parçamız olacak birisi 2 hane diğeri 3 hane alacak ama kullanan kişi telefonda bir an için ne yaptığını unutursa yada karıştırırsa programı kararsız bırakabilir.
Daha başka neler değişecek onlarıda açıklayayım da işin boyutunu daha iyi anla.
İlk açılışta şifrelerin okunma kısmında epromdan hep 3 hane okunacak şekilde kod yazılmış. 2 haneli bir şifreler,n okunma kısmı değiştirilerek 2 hane okunmaları sağlanacak.
Benzer şekilde yeni şifre kayıtlarında kayıt kısımlarıda hane sayısına uygun olarak kayıt edilmeli.
İlk etapta gördüklerim bunlar.
Ete

truvali

Hocam teşekkürler
Program evet bu hali ile 3 hane çalışıyor benim istediğim bu program üç haneye kadar istediğimiz kadar hanede çalışacak 888 kodu ile açma şifre kayıt bölümüne gelip 2 hane şifre tuşlayıp şifrenin  2 hane olacağını yine bir kod ile yapılır belki diye düşündüm örnek 888 tuşlayıp açma şifresi 11 yapıp 999 tuşladım şifre iki hane olamazmi şifrenin başlangış ve bitiş kısmını programa bir kod ile bildiremezmiyiz

ete

#3
Anlatmaya çalıştım anlamadın. Rakam giriş alt programları kaç hane girilecek ise ona uygun olmalı.
Sen 11 girdin ve ardından ilk 9 rakamını girdin. Sistem bunun 119 olmayacağını nereden anlayacak.? Anlamadığı için o rakamı sonradan gelenlere bakmadan 119 olarak kabul edecektir.

Öyle bir şey yapman gerekir ki 11 girdikten sonra bir kod yada rakam girmeliyim ki program rakam girişinin sona erdiğini anlasın ve girilen rakamı şifre rakamı olarak kabul etsin. Ama unutmaki girilen şifre değerleri 0-9 arası rakamlardan oluşmak zorunda o halde gireceğin sonlandırma karekteri 0-9 aralığında olmamalı. Peki 0-9 aralığının dığında ne girilebilir telefondan # ve * girilebiliyor.  O halde bunlardan birisi şifre sonlandırma işareti olarak kullanılabilir. Ancak o iki karekter de bildiğim kadarı ile bir kaç değişik amaçlı kullanılıyor idi zaten programda buda bir karışıklığa sebep olabilir.
Kısaca zor iş bu. Asıl zorluk bütün programa hakim olup ondan sonra değişiklik yapılması bunu yapmadan değişiklik yapma işine girişirsen bir sürü aksaklık çıkacaktır. Bu ise en azından yarım günlük çalışma gerektirir. Daha kısa sürede yapabilirim diyen varsa yapsın.


Ete

truvali

Hocam çok doğru söylüyorsunuz program iyice karışır.çünkü #nin karşılığı 12 geliyor.bu programı unutup başka bir program yazma şansınız var mı. Emeğinizin karşılığını vermek şartıyla.

ete

Yeni program içinde benzer sorunlar var zaten uygun bir yöntem düşünmek gerekiyor. Bu sıralar yazlıktayım ve fazla boş vaktim olmuyor. Yinede üzerinde düşünürüm. Mantıklı bir yolunu bulursam haber veririm.
Ete

truvali

Siz nasıl arzu ederseniz hocam olumlu haberlerinizi bekliyorum uygun vaktinizde ilgilenirseniz sevinirim programın başına 2 haneli başka ad ile açma ve kapama şifre kaydetsek program ana bölümünde or komutu ile ister 3 hanede ister 2 hanede kapatma ve açma olabilir belki

ete

Bu iş sanıldığı kadar kolay bir iş değil. Şifrelerin yada kodların hane sayısı kadar okunması işini hallettik diyelim.
İlk defa bir röleyi aktif etmek için sistemi aradık farzedelim. Program kaç haneli rakam girileceğini nereden bilecek.?
Hadi diyelimki programa iki değişken ilave ettik. ACMAHANE=3 ve KAPAHANE=2 dedik.
Yaptığım aramanın açma içinmi yoksa kapatma içinmi olduğunu nasıl bilipde kaç haneli rakam alacağını bilecek.?
Bunlar hep muamma ve işin zor yanı. Bir çözüm bulmak zor gibi gözüküyor.

Ete


truvali

Teşekkür ederim hocam eğer aklınıza başka bir düşünce gelirse yardımcı olursanız sevinirim

truvali

hocam iyi günler
sizin paylaştığınız dtmf yazılımda dört haneli şifre girdikten sonra * tuşlayıp ardından 1 ile role aktif hale geliyor
benim yazılımda yine o mantıkla 2 hane şifre eklenemez mi

şifre değiştirme altına wend önce
GOSUB ALBILGI
              IF SAYI=79 THEN
              PORTB=DURUM | %00000100
              GOTO ROLEKONTROL
              ENDIF
              IF SAYI=71 THEN
              PORTB=DURUM & %11111011
              GOTO ROLEKONTROL
              ENDIF   
böyle bir olsa çalışmazmı

truvali

hocam bu koyacağımız 2 haneli açma veya kapama şiresini sadece ana kulanıcı bilecek bunu diğer ana şifreler gibi tuşlama yapıp uzaktan değiştirmeye gerek yok sadece bu program haricinde isteğimiz zaman kullanıcaz ama ikiside aynı anda çalışıyor olacak

ete

Şu anda seyehatteyim tekrar düşünürüm olmaz demiyorum ama ilin pratikliği kaçar. Birde karmaşa yaratmayacak çözüm bulmak gerek. Kendi önerini neden denemiyorsun ?
Ete

truvali


ete

O zaman yanlış mantık demekki. Tek bir noktaya değil pek çok noktaya odaklanmak gerekiyor. Dorun orada.
Ete

truvali

Hocam şifreal kısmını 3 hane ben başka bir şifreal1 oluştursam Onuda 2 hane yapsam acaba olur mu deniyorum

Powered by EzPortal