Aynı hex kod isiste farklı, gerçekte farklı çalışıyor.

Başlatan est32, 11 Mayıs 2013, 21:40:28

est32

Ne başlık yazacağımı bilemedim doğrusu.
Biliyorsunuz proteus ile reel arasında belki %5 gibi bir farklılık olabiliyor. Bu fark da genelde sigorta ayarları,analog dijital ayarları tarzı, proteusun varsayım veya yoksayımlarından kaynaklanıyor.

Kardeşimin isteği üzerine çok fonksiyonlu bir şifreli kapı kilidi devresi tasarladım.
Bu devre piyasadakilere oranla daha ucuz güvenli(kapı arkası ile ayrı olarak haberleşiyor) ve fonksiyonlu(42 kullanıcı birbirinden bağımsız ayrı şifre kullanıyor, ana parola yardımı ile kişiler sınırlandırılıp yetkilendirilebiliyor, istenirse şifreleri tamamen silinebiliyor)

Tasarladığım bu devredeki sorun ise oldukça şaşırtıcı.
Proteus üzerinde cihaz tam istediğim gibi, hiçbir kusur yok. Ancak gerçek devre ise yapılış gayesini bile boşa çıkarıyor; şifre sorma gereği bile duymuyor, tamamen blöf :)

tuş takımındaki "*" tuşu çıkma/iptal etme ve menü girişi için kullanılıyor, "#" tuşu da giriş/onay maksatlı kullanılıyor. Cihazın çalışması için önce kullanıcı kodu giriliyor(eeprom 42 kullanıcıya kadar destek veriyor), ardından şifre tuşlanıyor. Eğer kişinin giriş yetkisi var ise şifresinin doğru olup olmadığına bakılıyor ve karar veriliyor.

Cihaz proteusta normal şekilde çalışıyor. Eğer kullanıcı kodu ve şifre girilmeden doğrudan giriş tuşuna(#) basılırsa yetkiniz yok uyarısı veriyor ve 3 hatalı girişte cihazı 5 dakika kilitliyor. Aynı hex kod gerçekte ise kullanıcı kodsuz ve şifresiz girişe engel olmuyor, hiçbir kod girmeden doğrudan "#" tuşuna basılarak girilmesine izin veriyor. Ama herhangi bir kullanıcının kodu ve şifresi girilirse yine görevini yapıyor.

İlginç bir durum. Aynı hex kod proteusta görevini yaparken gerçekte yapmıyor.
Şifre sorgulama bölümünü veriyorum(proton ile yazıldı)


DOGRULA:
        YETKI=KOD*3-3'SIFIR OLANLAR YETKİLİ, SIFIRDAN YÜKSEK OLANLAR YETKİSİZDİR
        KOD=YETKI
        YETKI=ERead YETKI
        If YETKI>0 Then GoTo YETKISIZ
        EPRM=KOD+1
        SIFRE_BAK.LowByte=ERead EPRM
        EPRM=EPRM+1
        SIFRE_BAK.HighByte=ERead EPRM
       
        If SIFRE=SIFRE_BAK Then 'İŞTE SIKINTI BURADA
        If SRGL=3 Then SIFRE=0 : X=7 : GoTo SIFRE_DEGISTIR_3'ŞİFRE  DEĞİŞTİRME AKTİFSE(sorun bu satırda değil,kontrolünü yaptım)
        Cls
        Print At 1,1,4,2,"FRE DO",1,"RU"
        HSerOut ["ABCD",1,2,3,4,13]'KAPIYI AÇ
        SAY=0
        GoSub YANLIS_SAY
        SES=95:SES_SURE=50
        GoSub BIP
        EndIf
   
        If SIFRE<>SIFRE_BAK Then'EŞİT DEĞİLSE
        Cls
        Print At 1,1,4,2,"FRE YANLI",4
        SAY = SAY + 1
        GoSub YANLIS_SAY
        GoSub GERI_SAY
        SES=80:SES_SURE=100
        GoSub BIP
        EndIf
       
        DelayMS 1000
        GoSub TEMIZLE' clear ile tüm değişkenleri sıfırla
        GoTo KOD_GIR


Ayrıca garip bir durum daha var, bir süre sonra tanımlamış olduğum Türkçe karakterler ekranda bozulmaya başlıyor, taa ki reset atana kadar.
2Kb belleğe bu kadar fonksiyonu sığdırmak zor oldu. Aynı işlemleri tekrar yazmak yerine kod tasarrufu için alt program olarak kullandım.
Unutmadan belirteyim cihazı farklı piclerle de denedim sorun yine aynı.
Donanımsal olma ihtimali üzerinde durmuyorum. Ayrıca protonun hatalarından biri mi diye düşünüyorum ama proteusta canavar gibi çalışıyor.
sigorta kodları;
Xtal=4
Config BOREN_OFF, CP_ON, DATA_CP_ON, PWRTE_ON, WDT_OFF, LVP_OFF, MCLRE_ON, INTRC_OSC_NOCLKOUT
CMCON=7

İğrenç bir görüntü kalitesiyle video çektim. Yine de dikkatli bakılınca belli oluyor.
http://www.dosya.tc/server8/g2xWF4/_ifrelikilit.mp4.html
Yorumlarınızı merakla bekliyorum.

ete

Verdiğin program parçasından bir anlam çıkarmak zor. Üstelik işin gerçek mantığınıda bilmiyorsan hepten zor. Ama bazı tespitler yapılabilir.
Yetki= kod*3-3. Şeklindeki komut datırında kod=0 ise yetki=-3 çıkar. Ancak değişkenin integer ise yetki=252 çıkar bu sence gerçek bir sonuçmudur. Sonuçların eksi çıkma ihtimalini düşünmen gerekirdi. Bence programda buna benzer sorunlar var. Kod değerini eprom sdresi olarak kullanıyorsun. Demekki değeri sıfırda olabilir. Kod değeri 4 den küçük ise yetki hep 250 dolaylarında bir sayı çıkar buda muhtemelen işini bozar.
İşte sıkıntı burada dediğin satırda Sifre ile Sifre_bak değişkenleri karşılaştırılıyor. Acaba her ikiside aynı formattamıdır?. Şifre-bak word tipinde onu anlıyorum ama ya sifre isimli değişken?  Onu bilemiyorum. Bana kalırsa o satır yerine her iki değişkeni ekrana yazan bir satır ekle en azından eşitmi değilmi sende ekranda gör.
Sifre doğru ise ve srgula=3 ise şifre değiştire yollamışsın. Sanki bu iş 3 defa yanlış şifre girilirse yapılacak bir işmiş gibi görünüyor öyle ise komutun yeri yanlış. Dediğim gibi kod her şeyi anlayacak kadar yeterli değil.
Zaman zaman bu gibi durumlarla bende karşılaşırım. Nasıl olur bu? İpin ucunu kaçırmışsam oluyor. Bir kere hata yapmış isem zincirleme mantık hataları uzayıp gider. Bul ak için kodu adım adım çalıştırıp test etmek gerekir.
Ete

est32

Hocam Allah razı olsun.
Değişken word tipinde olduğu için sorun çıkaran yer YETKI=KOD*3-3 hesaplaması değil de, değişkenlerin tümünün sıfır olması imiş.
Beni yanıltan ise aynı hex kodun proteusta çalışıp, gerçekte çalışmaması oldu. Ben buna aldandım.
Kullanıcı kodu sıfır olduğunda nedense eepromdan okunan şifre de sıfır oluyor. Bu nedenle girilen şifre sıfır(yani clear ile değişkenlerin tümü sıfır olduğundan), eepromdan okuduğu da sıfır olunca karşılaştırma doğru oluyor ve kapı açılıyor.
Sorunu çözmek kolay oldu; DOGRULA etiketinin hemen altına If KOD=0 Then GoTo YETKISIZ kodunu ekleyince sorun düzeldi.
Kendimi aptal gibi hissettim, oysa ki dediğiniz gibi ekrana değişkenleri yazınca sorunu buldum.
Sanırım birşeyin üzerine çok düşünce artık basit yöntemler akla gelmiyor.
Tekrar teşekkür ederim, iyi çalışmalar.

Powered by EzPortal