Şifreli kapı kilit devresi

Başlatan djtur, 21 Mart 2016, 23:00:01

mehmet

Madem Python biliyorsunuz; ESP8266, ESP32,
Raspberry Pi Pico, vs. modüller ile istediğiniz
uygulamayı yapmanız mümkün...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

SSirin

Özellikle pic ile yapılacak diye belirtilmiş. Araştırmadan seçtik düşündüm python ile yazarım bir şekil çeviririm pic'e yazarım diye, yanlış düşünmüşüm. Düşündüğümden daha karışıkmış. Neyse artık yapacak bir şey yok. O iki özelliği de bir şekil eklerim her halde.

Şuan ki sorularım;
-18650 3 seri pille besleyeceğim. 7805 ile 5 volta indirdiğim kısımda veya röle çektiğinde oluşacak parazit ile pic'in düzgün çalışmasına engel bir şey var mı? çizdiğim devrede. Besleme kısmı stabilite önerileri.
-matrix keypad port b ye bağlanmış ve port b'de pull up-down özelliği varmış. pic ile keypad arasına veya her hangi bir yere tekrar direnç vs eklememe gerek yok herhalde. Şuanki hali ile reelde de çalışır sanırım, doğru mudur?
-Diğer kısımlarda hatalı gördüğünüz yer var mı? pcb çizimine geçeceğim.

aRci

Merhaba;
devrede porta.0 ve 1 boşken neden mclr ye buzzer bağlı ve porta.4 de neden direnç bağlanmış anlamdım. buzzeri porta.0 a taşıorsanız problem yaşamayacaksınızdır. portb nin pull-up lqarıda aktif edilmiş bu şekilde direnc kullanmadan butonları kullanabileceksinizdir. röle kısmı için röle bobinleri arasına besleme poleretisine göre ters olacak şekilde bir diyot bağlamalısınız.

SSirin

Siz konu sahibinin devresine bakıyorsunuz sanırım. Ben yeniden çizdim linktekine bakar mısınız?

dosya linki

aRci

sizdeki sürümü açamadım açabildiğim çizim vardı ona baktım ekran görüntüsü atarsanız daha iyi olabilir.

SSirin

buzzer ve butona basıldığında şifreyi 1234 yapma artık çalışıyor.

-MCS'de kodu düzenlerken config kısmında bu ayarda hata veriyor sildim bende problem görülmedi şimdiye kadar ama bu nedir. _DATA_CP_ON

-resetleme için eklediğim buton bir kaç kez basmada ancak aktif oluyor. Yazdığım kodlarda nere de değişiklik yapmam gerekli.

-çizdiğim devreyi hayata geçirmede problem oluşturacak değiştirmemi veya eklememi gereken bir şey var mı?

RESET var portB.7
pwbuf var byte[4]

EEPROM 0,[1,2,3,4]

pause 200

Read 0, pwbuf[0]  
Read 1, pwbuf[1]
Read 2, pwbuf[2]
Read 3, pwbuf[3]

pwOK = 0
keycnt = 0

Main:
   high ld1
   if reset = 0 then 
        high LD3
        pwbuf[0]=1  
        pwbuf[1]=2
        pwbuf[2]=3
        pwbuf[3]=4
   endif
   gosub Chk_KEYPAD
   pause 1
goto Main



ete

#82
Öncelikle devre şemana bakılırsa Buzzer PORTA.4 pinine bağlı gözüküyor.
Bu pin OPEN COLLECTOR çalışır. Yani o pinden normal şartlarda HIGH çıkartamazsın.
Pine bir PULLUP direnci bağlayarak (mesela 4K7) pinin istendiğinde HIGH çıkış vermesini sağlayabilirsin.
DATA_CP_ON komutu  Eprom bilgilerinin kod korumaya dahil edilmesini sağlar. Yani bu komut ON ise eprom bilgileri okunmaz (aslında hepsi 000 000 şeklinde okunur) .

RESET butonunun çalışması için aşağıdakilerin yapılması gerekir.
- INPUT PORTA.5  '(bu pini giriş olarak konfigüre eder)
- RESET pinine  br pullup (10K) direnci bağlanıp pinin HIGH da beklemesi ve butona basılınca LOW olacak şekilde bir buton bağlanması gerekir.
- Buton kontrolü için yazdıkların doğru ancak eksikleri var. Eksik derken programlama amacına bağlı eksiklik. pwbuf
  • değişkenlerine değer verdikten sonra onları eproma kayıt etmez isen devre enerjisini kestiğin anda yeniden çalıştırdığında Eprom 0-1-2-3 adreslerinde neler kayıtlı ise onlar şifre olur. Dolayısıyla bana kalırsa şifreyi değiştirdikten sonra epromada kayıt etmelisin.
WRITE 0,pwbuf
  • ,pwbuf[1],pwbuf[2],pwbuf[3]:pause 10  şeklinde kayıt edebilirsin.
Bazı basic versiyonlarında dizi değişkenini kayıt formatında kullanmak mümkün olmayabiliyor.
Bu durumda TEMP=pwbuf
  • :WRITE 0,TEMP şeklinde bir yöntem kullanıp teker teker kayıt yapabilirsin.

Program döngüsünde herhangi bir gecikme yok ise RESET butonuna basıp orada yapılması gerekenler yapıldıktan sonra program if-Endif döngüsünden hemen çıkar programın sonuna kadar ilerleyebilir ve yeniden butona basıldığını algılayabilir tabiiki sen elini butondan hemen çekmemiş isen.
Bu gibi olumsuzlukları engellemek için ENDIF satırından hemen önce,
WHILE RESET=0:WEND
PAUSE 100 'bu gecikme tuş titremesini engellemk amacı ile koyulmalıdır.
ENDIF
satırları eklenmelidir.

Buzzer direk pic pinine bağlanmamalı bir transistör aracılığı ile sürülmeldir.
Unutmayın pic pinleri akım kapasiteleri sink-source durumuna göre değişkenlik gösterir ama 20-25 ma seviyesindedir ve bu miktarı aşan güçler pic pinlerini bozar. Bu nedenle arada transistör olmalıdır.

Hepsi bu kadar.
Ete



SSirin

hocam çok teşekkür ederim, değerli vaktiniz alıyorum. dediğiniz düzeltmeleri yaptım. yalnız a5 portundan reset tuşunu çalıştıramıyorum. port b7 de sorunsuz çalışıyor oysa.

TrisA = %00100000 kodu a5 portunu giriş diğer a'ları çıkış yapıyor değil mi?
PortA = 16 ise a4 portuna 1 diğer portlara 0 değerini veriyor? portA= 0 ve portA= 48 denedim olmadı.
INPUT PORTA.5 ile de denedim niye olmadı anlam veremedim.

TrisA = %00100000
PortA = 16 

RESET var portA.5

Main:
   high ld1
   if reset = 0 then 
        high LD3
        pwbuf[0]=4  
        pwbuf[1]=5
        pwbuf[2]=6
        pwbuf[3]=7
        Write 0,pwbuf[0] 
        Write 1,pwbuf[1] 
        Write 2,pwbuf[2]
        Write 3,pwbuf[3]:pause 10 
        WHILE RESET=0: 
            PAUSE 100
        WEND 
   endif
   gosub Chk_KEYPAD
   pause 1
goto Main


Devre son hali için tıkla


ete

Kullanmaya çalıştığın pin aynı zamanda MCLR yani doğal reset pinidir. Bu pini <input> pini olarak kullanabilmen için sigorta ayarlarından MCLR işlevini iptal etmen (kapatman) da gerekir.
#CONFIG
 __config _BODEN_OFF & _CP_ON & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT
#ENDCONFIG
Bu komut satırların abakacak olursan MCLRE_OFF bu işi yapmaktadır. Ancak bundan sonra o pini input yapabilirsin
TRISA=%00100000 şeklinde ayarlama doğrudur. INPUT PORTA.5 komutuda aynı işi yapar.

Ayarlama işlerinde daima binary değer vermek en güzelidir. Nereye ne değer verdiğini kolaylıkla görebilirsin anlaşılır biçimde. Bu nedenle TRISA=%00100000 şeklindeki değer atama en güzelidir bence.

Tuş kontrolünde ufak bir hata olmuş.
WHILE TUS=0
PAUSE 100
WEND
şeklinde ki kullanış tuşa basılı tuttukça 100 ms lik gecikme uygular boş yere gereksiz şekilde.
doğru kodlar aşağıda;

WHILE TUS=0:WEND 'tuş bırakılıncaya kadar program burada döngüye girecek.
PAUSE 100 'bırakıldığı anda 100 ms gecikme uygulanacak çünki bu noktada tuş birden fazla basılıp bırakılmış etkisi yaratacak (Tuş titreşimi) 100ms içinde bunlar kesilecek.

Ete

SSirin

merhaba, tekrardan yardımlarınız için teşekkür ederim.
pickit 2 plus altaş, ödünç aldım okuldan. breadboard üzerinde kurdum devreyi benim oluşturduğum hex dosyası isis simülasyonda çalışıyor ama pic'e yüklediğimde çalışmıyor. ete hocamın daha önce attığı şifre_kil_628 hex'ini pic'e yazdığımda o çalışıyor. Ben microcodestudio'da derledim hex'i orada @ ile config veremiyoruz hata veriyor, asm-endasm ile veriyoruz bu kısımda sıkıntı var sanırım. mesela _DATA_CP_ON ayarını yazamıyorum hata veriyor. Nasıl çıkarım bu işin içinden yardımcı olabilirseniz sevinirim. dosyaların tamamı linkte.

tüm dosyaları tıkla indir

ete

#86
Config satırlarını aşağıdaki şekilde yazmayı dene,

ASM
 __config _BODEN_ON & _BOREN_ON & _CP_ON & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT 
ENDASM

Bu şekilde çalışacaktır. Bu devre dahili OSC ole çalışıyor işlemciye herhangi bir kristal yada rezonatör bağlamaman gerekir. Şemada ne görüyorsan gerçek devrende aynı şekilde olmalı.
Buzzer her nedense ters çalıştırılmış. Ben olsam Buzzer kısmını aşağıdaki şekilde değiştirirm. Bu şekilde tuşa bastıkça daha kısa bir beep sesi duyarsın. En azından beep süresi ile oynayabilirsin.
Beep:
   low ld1
   high buz
   pause 50
   low buz
return

Ayrıca ilk açılışta program kendini toparlayıncaya kadar PORTA.4'ün kontrolünü yapmadığı için komut verilmemiş olmasına rağmen bir BEEP sesi alıyorsun. Bu bir tercih ise bir şey değiştirme ama bu bit tercih değil ise ilk açılıştaki PASUE 200 satırından öncesine BUZ=0 komutunu ekle.
Değişken tanımlama kısmında rölenin açık kalma süresini belirlemek amacı ile
RL1_ON_time con 1000 * 3
şeklinde bir komut verilmiş. Amaç nedir bilemem ancak sonuçta RL1_ON_Time isimli değişkene sabit şekilde 1000*3=3000 değeri veriliyor. Bunu direk de vermek mümkünken bir hesap yaptırılmış.
Bu komut şöylede olabilir  "RL1_ON_time con 3000 "
Amaç sanırım süre ile oynamak 3000 ms yetmedi çarpanı 4 yap olsun sana 4000 gibi düşünülmüş olsa gerek ama oraya o zamanda 4000 yazabilirdim. Hesap yaptırmaya ne gerek var acaba.

Programın bir kusuru daha var. RESET butonu her konumda çalışmıyor. Çünki tuş sayıcı bir değişken var ve sürekli basılan tuşları sayıyor ve belirli bir adet altında ise tuş kontrol bölümünden çıkmıyor program. Bunu düzelttim bir iki tadilat gerekti. Ayrıca Reset yaptığın zaman PORTA.1 pinine bağlı bir led yakılıyor ama söndüren yok. Üstelik bu led şemada da yer almamış.
Bu ledin yandıktan sonra aynı kısımda söndürülmesi gerekir ki onuda yaptım. Şemana eklemek istersen ledi ekleyebilirsin. Aşağıda ekldiğim kod RESET butonunu her koşulda kabul ediyor.
Mevcut hali ile kullanırsan bir kaç defa reset butonuna basıp tuş sayımını tamamlaman gerekiyor. Daha sonra Reset devreye giriyor.
Verdiğim programı kullanırsan CONFIG satırlarını kendine göre düzeltmen gerekecek. Yapman gereken şey #CONFIG yerine ASM ve #ENDCONFIG yerine de ENDASM yazman başka şeye gerek yok.


Ete 

SSirin

config kısmını sizin yazdığınız şekilde değiştirdiğimde, compile ederken şu hatayı veriyor; Illegal opcode (_BOREN_ON)

alt alta yazdığımda problem olmuyor ama onda da program çalışmıyor :) 32bit pc'de  mcs'yi ve pbp'yi eski sürüm kurup orada deneyeceğim birde. Her halde sürüm farkından problem çıkarıyor.

evet buzzer ters çalışıyor. pic devreye girmeyince ses yapıyor. devreye girdikten sonra güzel çalışıyor. baskı devreyi çizdim yoksa değişirdim.

SSirin

Evet sürüm farkındanmış. 32bit işletim sisteminde daha eski sürüm MCS ve PBP kurunca kodlarda hata vermedi. Kendi yazdığımda şifreyi resetleyince ilk girmeye şifre kabul etmiyor ikinciye resetleniyordu. Tam soracaktım buraya sonra farkettim ki bunu görüp gerekli kodları ekleyip düzeltmişsiniz zaten. Buzzer kodlarını da düzelttim. Şuanda muazzam çalışıyor. Başta ete hocam ve emeği geçenlere sonsuz teşekkürler.

Epey uğraştım hatalarla arızalarla ama işi biraz öğrendim. Artık farklı projelerde yapabilirim kodlama da kendimi geliştirirsem.

Powered by EzPortal