basıt sifrelı kılit

Başlatan Şahin35, 05 Mart 2014, 11:53:21

Şahin35

hocam öncelıkle merhabalar. dunku cevabınız ıcın tesekkur edıyorum.ama sızın dedgınız konu benı asar. ben daha cok yenıyım. benım yapmak ıstedıgımı sey basıt olucak hocam. ekran kullanmıcam.devremde bır adet keypad , uln2003 bobını cektırsın dıye.bir adet buton,bir adet de buzer var hocam sıze devre semasını gonderıyım. benım yapmak ıstedıgım su sıfre gırıldıkten sonra uln2003 cıkıs verıp bobını cektırsın .orengın hocam ben keypaddan 1234* tusuna bastıgımda role 5 sanıye cekık dursun. sonra kapatsın.butona basıldıgında yenı sıfre atamak ıstıyorum.sıfer dogru oldugunda buzzer otucek. kendı capımda yazdıgımı gonderıyom hocam
trisa=255   
trisb=255
CMCON=7
OPTION_REG.7=0
SYMBOL BUZZER =PORTA.4
SYMBOL BUTON =PORTB.5
SYMBOL ROLE =PORTB.6
SYMBOL KAYIT=PORTB.1
  SYMBOL YATAY_A =PORTA.0
  SYMBOL YATAY_B =PORTA.1
  SYMBOL YATAY_C =PORTA.2
  SYMBOL YATAY_D =PORTA.3
  SYMBOL DIKEY_1=PORTB.0
  SYMBOL DIKEY_2=PORTB.3
  SYMBOL DIKEY_3=PORTB.4
SIFRE VAR BYTE
TUS VAR BYTE
ANA_MENU:
SIFRE=0
TUS=0
ROLE=0
BUZZER=0
BUTON =0
PAUSE 300
BASLA:
       PORTB=255
           YATAY_A=0
       IF DIKEY_1=0 THEN
       TUS=1
       WHILE DIKEY_1=0
       WEND
       ENDIF
         IF DIKEY_2=0 THEN
         TUS=2
         WHILE DIKEY_2=0
         WEND
         ENDIF
       IF DIKEY_3=0 THEN
       TUS=3
       WHILE DIKEY_3=0
       WEND
       ENDIF
           HIGH YATAY_A
         YATAY_B=0
    IF DIKEY_1=0 THEN
    TUS=4
    WHILE DIKEY_1=0
    WEND
    ENDIF
      IF DIKEY_2=0 THEN
      TUS=5
      WHILE DIKEY_2=0
      WEND
      ENDIF
        IF DIKEY_3=0 THEN
        TUS=6
        WHILE DIKEY_3=0
        WEND
        ENDIF
           HIGH YATAY_B
          YATAY_C=0
        IF DIKEY_1=0 THEN
        TUS=7
        WHILE DIKEY_1=0
        WEND
        ENDIF
          IF DIKEY_2=0 THEN
          TUS=8
          WHILE DIKEY_2=0
          WEND
          ENDIF
            IF DIKEY_3=0 THEN
            TUS=9
            WHILE DIKEY_3=0
            WEND
            ENDIF
              HIGH YATAY_C
        YATAY_D=0
         IF DIKEY_1=0 THEN
         TUS=11
         WHILE DIKEY_1=0
         WEND
         ENDIF
           IF DIKEY_2=0 THEN
           TUS=0
           WHILE DIKEY_2=0
           WEND
           ENDIF
           IF DIKEY_3=0 THEN
           TUS=12
           WHILE DIKEY_3=0
           WEND
           ENDIF
            HIGH YATAY_D
            PAUSE 300
           
            IF SIFRE=1 AND SIFRE=2 AND SIFRE=3 AND SIFRE=4 AND SIFRE=12 THEN
            GOSUB ROLEAC
           
            ROLEAC:
            HIGH PORTB.6
            PAUSE 5000
            LOW PORTB.6
            ELSE
            GOTO BASLA
            ENDIF

asagıdada proteusda cızdıgım devrem var hocam..

ete

#1
Daha çok yenisin belli oluyor. O halde ne diye boyundan büyük işlerle uğraşıyorsun. Önce öğrenip en azından bir şeyler öğrenip sonra uğraşsan daha iyi olmazmı.
Yazdığın bu kodlar çalışmayacak besbelli. Bir sürü hata var. Bunları düzeltmeye kalksak bütün gün uğraş dur işin yoksa.
Devre şemanda eksak yada hatalı.
Bunlar düzelmedenbir yere varamazsın. Benden de program yazmamı bekleme lütfen. Hem prensip gereği hemde vakit darlığı nedeni ile yazamam. Ben ancak kodlarını düzeltirim. Ama bütün programını düzeltemem.

Bir tuş takımı nasıl çalışır önce onu incelemekle işe başla. Ders notları var incele örnekler var otur incele. İhtiyacın olan her şey var örneklerde. Ama çalışmadan sahip olayım diyorsan o zaman bekle belki bir yardım eden olur.

Bazı ip uçları vereyim. Giriş yaptığın bir porta bilgi yazamazsın ancak port bilgisini okuyabilirsin.
Sen PORTB ye pullup direnci bağlamamışsın ama PORTB=255 diyerek portu pullup lı gibi görmeye çalışıyorsun. Halbuki PORTB giriş portu olduğu için bu komutu göz ardı edecek zaten.
Devre şemanı düzelt program içinde örnekleri incele.

Ete

Şahin35

Hocam devremın neresı yanlıs anlayamadım. bir tane cıkısısna buton. bir cıkısına buzer, ve bır cıkısına ulne 2003 bagladım. keypadın baglantısı standart mı hocam ? ben o sekıl bagladım yoksa keypad demı sıkıntı var.. max entegresını gormeyın hocam sımdılık. devremdekı hatam enrde hocam ???

ete

Devrende hata yok.  Devrene ne kadar hakimsin ölçmek istedim. Ama programında çok var.
TRISB=255 dedikten sonra  PORTB=255 diyemezsin çünki PORTB artık Giriş oldu.

Tuş takımından girilen değer TUS değişkenine veriliyor. Peki SIFRE isimli değişkene nerede değer veriliyor?

IF SIFRE=1 AND SIFRE=2 AND SIFRE=3 AND SIFRE=4 AND SIFRE=12 THEN  komut satırına bakarsan SIFRE isimli değişkenin
değeri aynı zamanda 1 - 2 -3 - 4 ve 12 olması bekleniyorki bu değerleri aynı zamanda alması mümkün değil.

Desimal sayı sistemi mantığını kullanarak girilen sayıları SIFRE isimli değişkene aktarmalısın. Mantık şu;
İlk girilen tuş değeri 1 , TUS=1 , SIFRE=SIFRE*10+TUS eşitliğini kullanırsak SIFRE=1 olur (SIFRE=0*10+1)
İkinci girilen sayı 2 , TUS=2 , SIFRE=1*10+2=10+2=12
Üçüncü girilen sayı 3, TUS=3, SIFRE=12*10+3=123
Dördüncü girilen sayı 4, TUS=4 , SIFRE=123*10+4 =1234
Beşinci girilen sayı 5, TUS=5, SIFRE=1234*10+5=12345
Bu son limit oluyor çünki bir sayı daha girersen sifre değerin WORD limiti olan 65535'i aşacak o halde maksimum girebileceğin rakam toplam değeri 65535 olmalıdır.

Gosub ROLEAC demişsin hemen altınada ROLEAC diye etiket koymuşsun. Program sen GOSUB ROLEAC demesende zaten o etikete gelecek. Unutma program satır sırası takip eder. Sırası ile satırları takip eder anlayacağın.
GOSUB XXXX  demek gidilip RETURN ile dönülen alt program adı demektir.

Ete

Şahin35

#4
HOCAM SIMDI DEDIKLERINIZI YAPMAYA CALSITIM OLMUS MU ACABA BI BAKARMISINIZ.

@ DEVICE pic16F628A 
@ DEVICE pic16F628A, WDT_ON
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16F628A, MCLR_OFF
@ DEVICE pic16F628A, PROTECT_OFF
@ DEVICE pic16F628A, INTRC_OSC
PortA=0
TrisA=%10000000
PortB=0
TrisB=%00000111
CMCON=7
OPTION_REG.7=0
SYMBOL BUZZER =PORTA.4
SYMBOL BUTON =PORTB.5
SYMBOL ROLE =PORTB.6
SYMBOL KAYIT=PORTB.1
  SYMBOL YATAY_A =PORTA.0
  SYMBOL YATAY_B =PORTA.1
  SYMBOL YATAY_C =PORTA.2
  SYMBOL YATAY_D =PORTA.3
  SYMBOL DIKEY_1=PORTB.0
  SYMBOL DIKEY_2=PORTB.3
  SYMBOL DIKEY_3=PORTB.4
RAKAM VAR BYTE
OKU VAR BYTE
SIFRE VAR WORD
TUS VAR BYTE
ANA_MENU:
SIFRE=0
TUS=0
ROLE=0
BUZZER=0
BUTON =0
PAUSE 300
BASLA: 
       YATAY_A=0
       IF DIKEY_1=0 THEN
         TUS=1
         WHILE DIKEY_1=0:WEND
       ENDIF
       
         IF DIKEY_2=0 THEN
           TUS=2
           WHILE DIKEY_2=0:WEND
         ENDIF
         
       IF DIKEY_3=0 THEN
         TUS=3
         WHILE DIKEY_3=0:WEND
       ENDIF
       
       HIGH YATAY_A
       
       YATAY_B=0
       IF DIKEY_1=0 THEN
         TUS=4
         WHILE DIKEY_1=0:WEND
       ENDIF
       
       IF DIKEY_2=0 THEN
         TUS=5
         WHILE DIKEY_2=0:WEND
      ENDIF
        IF DIKEY_3=0 THEN
           TUS=6
           WHILE DIKEY_3=0:WEND
        ENDIF
       
        HIGH YATAY_B
       
        YATAY_C=0
        IF DIKEY_1=0 THEN
          TUS=7
          WHILE DIKEY_1=0:WEND
        ENDIF
       
          IF DIKEY_2=0 THEN
            TUS=8
            WHILE DIKEY_2=0:WEND
          ENDIF
            IF DIKEY_3=0 THEN
              TUS=9
              WHILE DIKEY_3=0:WEND
            ENDIF
           
            HIGH YATAY_C
       
         YATAY_D=0
         IF DIKEY_1=0 THEN
           TUS=11
           WHILE DIKEY_1=0:WEND
         ENDIF
         
           IF DIKEY_2=0 THEN
             TUS=0
             WHILE DIKEY_2=0:WEND
           ENDIF
           IF DIKEY_3=0 THEN
             TUS=12
             WHILE DIKEY_3=0:WEND
           ENDIF
            HIGH YATAY_D
            PAUSE 30
            IF TUS=10 THEN TUS=0
            IF TUS<11 THEN
              SIFRE=SIFRE*10+TUS
            ENDIF
            IF SIFRE=12345 THEN
              GOSUB ROLEAC
              SIFRE=0
            ENDIF
            IF SIFRE>10000 THEN SIFRE=0
            GOTO BASLA 
             
ROLEAC:
            HIGH PORTB.6
            PAUSE 5000
            LOW PORTB.6
            PAUSE 5000
            RETURN


ete

Olmamış.
Tuş takımı kontrol satırlarının altına;
IF TUS<11 THEN
   SIFRE=SIFRE*10+TUS
ENDIF demen yeterli olacaktı

Ete

Şahin35

#6
   

bu sekıl mı demem gerekıyor hocam. hocam kusuruma bakmayın böle cok soru soruyom.

@ DEVICE pic16F628A 
@ DEVICE pic16F628A, WDT_ON
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16F628A, MCLR_OFF
@ DEVICE pic16F628A, PROTECT_OFF
@ DEVICE pic16F628A, INTRC_OSC
PortA=0
TrisA=%10000000
PortB=0
TrisB=%00000111
CMCON=7
OPTION_REG.7=0
SYMBOL BUZZER =PORTA.4
SYMBOL BUTON =PORTB.5
SYMBOL ROLE =PORTB.6
SYMBOL KAYIT=PORTB.1
  SYMBOL YATAY_A =PORTA.0
  SYMBOL YATAY_B =PORTA.1
  SYMBOL YATAY_C =PORTA.2
  SYMBOL YATAY_D =PORTA.3
  SYMBOL DIKEY_1=PORTB.0
  SYMBOL DIKEY_2=PORTB.3
  SYMBOL DIKEY_3=PORTB.4
RAKAM VAR BYTE
OKU VAR BYTE
SIFRE VAR BYTE
TUS VAR BYTE
ANA_MENU:
SIFRE=0
TUS=0
ROLE=0
BUZZER=0
BUTON =0
PAUSE 300
BASLA: 
       YATAY_A=0
       IF DIKEY_1=0 THEN
         TUS=1
         WHILE DIKEY_1=0:WEND
       ENDIF
       
         IF DIKEY_2=0 THEN
           TUS=2
           WHILE DIKEY_2=0:WEND
         ENDIF
         
       IF DIKEY_3=0 THEN
         TUS=3
         WHILE DIKEY_3=0:WEND
       ENDIF
       
       HIGH YATAY_A
       
       YATAY_B=0
       IF DIKEY_1=0 THEN
         TUS=4
         WHILE DIKEY_1=0:WEND
       ENDIF
       
       IF DIKEY_2=0 THEN
         TUS=5
         WHILE DIKEY_2=0:WEND
      ENDIF
        IF DIKEY_3=0 THEN
           TUS=6
           WHILE DIKEY_3=0:WEND
        ENDIF
       
        HIGH YATAY_B
       
        YATAY_C=0
        IF DIKEY_1=0 THEN
          TUS=7
          WHILE DIKEY_1=0:WEND
        ENDIF
       
          IF DIKEY_2=0 THEN
            TUS=8
            WHILE DIKEY_2=0:WEND
          ENDIF
            IF DIKEY_3=0 THEN
              TUS=9
              WHILE DIKEY_3=0:WEND
            ENDIF
           
            HIGH YATAY_C
       
         YATAY_D=0
         IF DIKEY_1=0 THEN
           TUS=11
           WHILE DIKEY_1=0:WEND
         ENDIF
         
           IF DIKEY_2=0 THEN
             TUS=0
             WHILE DIKEY_2=0:WEND
           ENDIF
           IF DIKEY_3=0 THEN
             TUS=12
             WHILE DIKEY_3=0:WEND
           ENDIF
            HIGH YATAY_D
            PAUSE 30
            IF TUS=10 THEN TUS=0
            IF TUS<11 THEN
              SIFRE=SIFRE*10+TUS
            ENDIF
            IF SIFRE=12345 THEN
              GOSUB ROLEAC
              SIFRE=0
            ENDIF
            IF SIFRE>10000 THEN SIFRE=0
            GOTO BASLA 
             
ROLEAC:
            HIGH PORTB.6
            PAUSE 5000
            LOW PORTB.6
            PAUSE 5000
            RETURN

ete

Böyle olur Neden çalıştırıp denemiyorsun?
Ete

Şahin35

#8
pekı hocam denedım .AMA HOCAM BANA EKSIK BIRSEY VAR GELIYOR. BEN BUNU DENEDIM. SIFREM NEDIR? KEYBAD BASIYOR HICBIR ISLEM YAPMIYOR... :-\ ???:(

Ete Edit: Büyük harfle yazı yazma bunu bir anlamı var oda bana bağırıyorsun şu anda !!!!!!!!!!!


ete

Ne bastığını görmeden şifreli kilit olmaz zaten. LCD ekran şart bence.
Yazdıklarında tek eksik şey önceden kayıtlı olan şifren ve onun girilen şifre ile karşılaştırılması aynı ise ona göre işlem yapılması.
Önceki kodlarında buna benzer şeyler vardı sonradan nedense çıkardın. Onları ekle yeniden çalışıtır.

Ete

Şahin35

HANGISI HOCAM HANI BEN IF TUS=1 AND TUS=2 AND DİYE YAZDIGIMIMI HOCAM.. BUNU TEKRAR EKLERSEM OLRU MU DIYONUZ HOCAM..

Şahin35

yok hocam ne bagırması sımdı gordum mesajınızı. caps lock acık kalmıs proramı buyuk harfle yazıyordum ondan ole kalmıs.. :(

ete

Programı düzelttim yukarıda senin verdiklerinle değiştirdim oradan bakıp alabilirsin.

Ete

Şahin35

Hocam günaydın..program degısıklıklıgını fark ettım.ama calsımadı hocam. ısıde play ettıgımde sounder hep calıyor hocam. tuslara basıyorum hıcbır aktıvesını gormuyorum.:( bi sorum olucak hocam neden orda ıf sıfre>10000 dedınız  onu pek anlamadım ???

ete

Çalışmıyorsa sorun yine sende dir. Sounder PORTB.6 dan komut alıyor. Adınada ROLE demişsin.
Devrede ise ULN girişlerini ortaklayıp PORTB.6 ya bağlamışsın. Çıkışıda sounder'e GND sağlayacak şekilde bağlamışsın buraya kadar sorun yok.
Ama program içinde ROLE=1 veya HIGH ROLE diye bir komut yok iken o sounder nasıl çalışıyor orası bir muamma işte.
Sorun bende değil sende. Şema yada simulasyon dosyası koysan anında bulabilirdik elbette ama koymamışsın benden bu kadar.

Tuş takımındna sürekli bilgi girdiğin zaman SIFRE isimli değişken bunu alıp sürekli şifre oluşturur. Bir noktadan sonra SIFRE değişkeninin sıfırlanması gerekir. Diyelimki 5 haneli bir rakam öngördük şifre olarak peki 4 haneli en büyük rakam hangisidir? elbette 9999 bu durumda Sifre değeri 10000 den büyük ise ve  ,
IF SIFRE=12345 THEN
              GOSUB ROLEAC
              SIFRE=0
ENDIF
komut satırları çalışmamış ise demekki sen öyle bir rakam girdinki Sifre 5 haneli oldu ancak oluşan rakam 12345 rakamına eşit değil. Bir tane daha rakam girsen SIFRE değeri taşmaya uğrayacak yani değeri 65535'i geçecek o halde artık Sifre değişkenini reset etme zamanı gelmiş demektir bunu sağlamak için oraya IF SIFRE>10000 .... komut satırını ekledim.

Ete

Powered by EzPortal