Şifreli Kilit

Başlatan mrboler, 24 Aralık 2017, 16:24:26

mrboler

Çeşitli sitelerde türkçe ve ingilizce araştırmama rağmen sorunumu bir türlü çözemedim. Uzun zaman olmuştu picle uğraşmayalı devre kurmayalı kusurua bakmayın.

Sorunum,

  Keypad'den girdiğim değeri LCD de okuyamamam. Pull up ve pull down yapmaktan artık mantık aramadan tek tek denedim. Ete hocanın çoğu konuda yazdıklarını da okudum. Fakat hala çözemedim kusura bakmayın bu sorun için.
  Özetlemek gerekirse 16F877A kullanıyorum, B portunda keypad bağlı (dahili pull up için), aynı satırdaki sayıları rast gele veriyor bana. 9 8 7 / 6 5 4 / 3 2 1 bunları o anda hangisi denk gelirse öyle veriyor. Bunun sebebi yanlış pull up yapmam fakat nasıl çözeceğim peki ?
Kod ve şema ektedir yardımcı olabilenlere şimdiden teşekkürler.

Kod, kusura bakmayın kod bloğu var mı göremedim.

#include        <16f877A.h>
#fuses          XT,NOWDT,NOPROTECT
#use            delay(clock=4000000)
#include        <lcd.c>
#use            fast_io(c) 
#use            fast_io(b)             
#use            fast_io(d)

#define         sut1 pin_B4                                       
#define         sut2 pin_B5                     
#define         sut3 pin_B6 
#define         sat1 pin_B0
#define         sat2 pin_B1               
#define         sat3 pin_B2                   
#define         sat4 pin_B3 


#define buzzer      pin_c0   

#define use_portd_lcd TRUE
           

  unsigned int8  tus,e,a,b,c,d;
 
  unsigned  int16 sifre=0;

void tus_al()// yazılım bu fonksiyona geldiğinde buradan bir
{            // tus değeri almadan bu fonksiyondan çıkmaz
don:

output_low(sut1);output_high(sut2);output_high(sut3);
if(input(sat1)==0){tus=1;goto brk;}
if(input(sat2)==0){tus=4;goto brk;}
if(input(sat3)==0){tus=7;goto brk;}
if(input(sat4)==0){tus=15;goto brk;}

output_high(sut1);output_low(sut2);output_high(sut3);
if(input(sat1)==0){tus=2;goto brk;}
if(input(sat2)==0){tus=5;goto brk;}
if(input(sat3)==0){tus=8;goto brk;}
if(input(sat4)==0){tus=0;goto brk;}                       

output_high(sut1);output_high(sut2);output_low(sut3);
if(input(sat1)==0){tus=3;goto brk;}
if(input(sat2)==0){tus=6;goto brk;}
if(input(sat3)==0){tus=9;goto brk;}     
if(input(sat4)==0){tus=14;goto brk;}


goto don; 
brk:
while(!input(sat1));
while(!input(sat2));         
while(!input(sat3));
while(!input(sat4));                           
output_high(buzzer);delay_ms(100);output_low(buzzer);
}   



void main()
{           
  set_tris_b(0x0F);//keypad baglı   
set_tris_c(0b00000000);
set_tris_d(0b00000000);

port_b_pullups(true);//*** CMOS girişler voltaja hassastır
                           
output_b(0x00);
output_c(0x00);
output_d(0x00);


lcd_init();   // LCD hazırlanıyor
basla:

printf(lcd_putc,"\fsifre:");
delay_ms(100);

  all:

tus_al();
a=tus;
lcd_gotoxy(9,1);
printf(lcd_putc,"%u",tus);
if(tus==14||tus==15) {goto basla;}
delay_ms(20);

tus_al();
b=tus;
lcd_gotoxy(10,1);
printf(lcd_putc,"%u",tus);
if(tus==14||tus==15) {goto basla;}
delay_ms(20);

tus_al();
c=tus;
lcd_gotoxy(11,1);
printf(lcd_putc,"%u",tus);
if(tus==14||tus==15) {goto basla;}
delay_ms(20);
 
tus_al();
d=tus;
lcd_gotoxy(12,1);
printf(lcd_putc,"%u",tus);
if(tus==14||tus==15) {goto basla;}
delay_ms(20);

tus_al();
e=tus;

if(tus==15) {goto basla;}

sifre=(((int16)a*1000)+((int16)b*100)+(c*10)+(d*1));
delay_ms(300);
if(sifre==9876 && e==14)

  {
   lcd_gotoxy(1,1);
  printf(lcd_putc,"\f   DOGRU SIFRE");
  printf(lcd_putc,"\n  PROJE CALISTI");
  delay_ms(300);
   

  while(1) // Sonsuz döngü
   {

output_high(pin_c1);
delay_ms(100);
output_low(pin_c1);
delay_ms(100);

   }
 
  }
 
  else
  {
 
   lcd_gotoxy(1,1);
  printf(lcd_putc,"\f  YANLIS SIFRE");
  printf(lcd_putc,"\nTEKRAR DENEYINIZ");
  delay_ms(1000);
 
  goto basla;
 
}}
 

mg1980

Bir yanlışlık olmadığına emin misiniz , bu kodlar tuş falan okumaz gibime geliyor, eğer gözümden kaçırmamışsam...Çünkü sonsuz döngüde pin_c1'i  low-high yapar durur.. Bana sorarsanız Serdar ÇİÇEK'in CCS C ile ilgili bir kitabı var..Biraz incelemekte yarar var.

mrboler

Alıntı yapılan: mg1980 - 24 Aralık 2017, 18:32:07
Bir yanlışlık olmadığına emin misiniz , bu kodlar tuş falan okumaz gibime geliyor, eğer gözümden kaçırmamışsam...Çünkü sonsuz döngüde pin_c1'i  low-high yapar durur.. Bana sorarsanız Serdar ÇİÇEK'in CCS C ile ilgili bir kitabı var..Biraz incelemekte yarar var.

Merhabalar,
   Ana fonksiyon içerisine girdikten sonra  tus_al(); fonksiyonuna gönderiliyor. Orada goto komutu ile döngü ye giriyor ve tus alana kadar döngüde kalıyor. Dediğiniz şifre doğru girildiği takdirde geçerli. O sonsuz döngü while, if komutu içerisinde çalışıyor.

ete

Öncelikle şemada tuş takımı bağlantını beğenmediğimi söylemek zorundayım.
PORTB.0-3 pinleri giriş ayarlanmış ve Dahili pulluplar aktif edilmiş. Oradaki pullup dirençlerini kaldır.
Sütun pinleri ise pulldown edilmiş buna hiç gerek yok üstelik bağlantı şekline bakılırsa pinler float da kalabilir. Zira 10K pullup ve 10K pulldown ikisi birden gerilim bölücü gibi çalışıp oradaki voltajı yarıya düşürür ve pic high mı low mu karar veremeyebilir.
Bu nedenle pulldown dirençlerinide kaldır. Orada dirençle pulldown yaratmak yerine programdan iligli pin LOW a çekilerek giriş pinlerine LOW veriliyormu bakılması gerekiyor.

C dilinden çok fazla anlamam. İşin mantığına göre düşünür isek, TUSAL fonksiyonunda takip edilmesi gereken yol şu olmalı idi;
1. Çıkış pinleri olan (sütun pinleri) hepsi birden HIGH yapılır
2. Sütun1 pini LOW a çekilip giriş pinlerine bakılır. Her hangi birisi LOW olmuş ise tuşlardan birine basılmış demektir. Hangisi basılmış ise bulunur ve ona uygun tuş sayısı atanır.
3. Sütun1 pini tekrar HIGH yapılır ve hemen ardından Sütun2 pini LOW a çekilir. Yeniden girişlere bakılır ve aynı prosedür uygulanır.
4. Sütun2 pini tekrar HIGH yapılıp ardından Sütun3 pini Low a çekilip girişlere bakılır.
Bu prosedürü senin Tusal fonksiyonunda göremiyorum !!!!.  Sen ne yapmışsın ona bakalım istersen;
-Sütun 1 i low a çekip giriş pinlerine bakmışsın.
- Ardından sütın1 i high yapmışsın ama sütun2 ve sütun 3 pinleri ile iligli bir uyarlama yapmamışsın. Ben öyle görüyorum. Aksini düşünüyor isen anlat anlamaya çalışayım.

Sorunun budur diye düşünüyorum.
Ayrıca Tusal fonksiyonundan nasıl çıkılacağınıda merak ediyorum. Çünki tuşa basıldığında sadece tuş sayısı ataması yapılmış ama çıkış düşünülmemiş gibi. Kapatılmış satırlar yada komutlar bu işi yapabilir ama neden kapattığını bilmiyorum.
Ete

mrboler

#4
Alıntı yapılan: ete - 24 Aralık 2017, 21:08:19
Öncelikle şemada tuş takımı bağlantını beğenmediğimi söylemek zorundayım.
PORTB.0-3 pinleri giriş ayarlanmış ve Dahili pulluplar aktif edilmiş. Oradaki pullup dirençlerini kaldır.
Sütun pinleri ise pulldown edilmiş buna hiç gerek yok üstelik bağlantı şekline bakılırsa pinler float da kalabilir. Zira 10K pullup ve 10K pulldown ikisi birden gerilim bölücü gibi çalışıp oradaki voltajı yarıya düşürür ve pic high mı low mu karar veremeyebilir.
Bu nedenle pulldown dirençlerinide kaldır. Orada dirençle pulldown yaratmak yerine programdan iligli pin LOW a çekilerek giriş pinlerine LOW veriliyormu bakılması gerekiyor.

C dilinden çok fazla anlamam. İşin mantığına göre düşünür isek, TUSAL fonksiyonunda takip edilmesi gereken yol şu olmalı idi;
1. Çıkış pinleri olan (sütun pinleri) hepsi birden HIGH yapılır
2. Sütun1 pini LOW a çekilip giriş pinlerine bakılır. Her hangi birisi LOW olmuş ise tuşlardan birine basılmış demektir. Hangisi basılmış ise bulunur ve ona uygun tuş sayısı atanır.
3. Sütun1 pini tekrar HIGH yapılır ve hemen ardından Sütun2 pini LOW a çekilir. Yeniden girişlere bakılır ve aynı prosedür uygulanır.
4. Sütun2 pini tekrar HIGH yapılıp ardından Sütun3 pini Low a çekilip girişlere bakılır.
Bu prosedürü senin Tusal fonksiyonunda göremiyorum !!!!.  Sen ne yapmışsın ona bakalım istersen;
-Sütun 1 i low a çekip giriş pinlerine bakmışsın.
- Ardından sütın1 i high yapmışsın ama sütun2 ve sütun 3 pinleri ile iligli bir uyarlama yapmamışsın. Ben öyle görüyorum. Aksini düşünüyor isen anlat anlamaya çalışayım.

Sorunun budur diye düşünüyorum.
Ayrıca Tusal fonksiyonundan nasıl çıkılacağınıda merak ediyorum. Çünki tuşa basıldığında sadece tuş sayısı ataması yapılmış ama çıkış düşünülmemiş gibi. Kapatılmış satırlar yada komutlar bu işi yapabilir ama neden kapattığını bilmiyorum.
Ete

Merhabalar, öncelikle ne derseniz haklısınız ben bu resmi attığımda kızacağınızdan emindim zaten hocam. Fakat ne denediysem hiç birinde ne proteus da nede kurduğum devrede yanıt alamadım yanıt aldığım tek bağlantı şekli buydu. O kadar denedim ki artık mantık aramadım tek tek denedim hepsini. Tekrar kusura bakmayın.

Tek tek anlaşılır olamsı için alıntı yaparak gidiyorum hocam,

"1. Çıkış pinleri olan (sütun pinleri) hepsi birden HIGH yapılır"

output_high(sut1); output_high(sut2);output_high(sut3); // Bu kodu koymamıştım haklısnız bu konuda.

"2. Sütun1 pini LOW a çekilip giriş pinlerine bakılır. Her hangi birisi LOW olmuş ise tuşlardan birine basılmış demektir. Hangisi basılmış ise bulunur ve ona uygun tuş sayısı atanır."

output_low(sut1);output_high(sut2);output_high(sut3); // Burada sut1 low yapılırken sut2-3 high yapılıyor.
if(input(sat1)==0){tus=1;delay_ms(20);goto brk;}
if(input(sat2)==0){tus=4;delay_ms(20);goto brk;}
if(input(sat3)==0){tus=7;delay_ms(20);goto brk;}
if(input(sat4)==0){tus=15;delay_ms(20);goto brk;}

Bende burada aslında sut1'i low yapıp sut2 ve sut3 ü high'a çekerek low olan çıkış pinlerini inceledim. Diğer kod bloğunda da sut2 low yaptım ve sonra sut3 low yaptım. Bunları low a çekerken diğer iki sütunuda high yaptım.

Dediğiniz gibi pull up/down'ları kaldırıp devreyi tekrar kurduğumda proteus da o sutun ve satır bağlantıları "GRİ" görünüyor.

Bu noktada birşey mi kaçırıyorum acaba hocam ?

Ayrıca tusal fonksiyonunda eğer tus atması yapılırsa goto ile "brk:" isimli satıra gidiyor. Orada tuşlara hala basılı mı incelenip çıkıyor içerisinden.

ete

C dilinde iki komutun peşpeşe verilişinde arada ; kullanıldığnı bilmiyrdum bana o komutlar kapatılmış gibi geldi.
Her neyse pullup ların kaldırılması ile pinleri gri görüyor isen işlemcide pullup atamasını yapamadığın ortaya çıkıyor demektir.
Komutu vermişsin ama belkide ilave bir şeyler daha vermen gerekiyor gibi.
Yoksa bu sistemle tuş takımının çalışması gerekir.
Ete

ete

Aynı programı en azından şifre griş kısmını Basic de yazdım. Senin şemanın aynısını kullandım.
Direk senin devrende çalışabilir bir programı ilişikte veriyorum. Program açık kodalarında inceleyebilirsin.
Bu sayede belki neyin eksik olduğunuda anlayabilirsin.
Ete

mrboler

#7
Alıntı yapılan: ete - 25 Aralık 2017, 10:47:08
Aynı programı en azından şifre griş kısmını Basic de yazdım. Senin şemanın aynısını kullandım.
Direk senin devrende çalışabilir bir programı ilişikte veriyorum. Program açık kodalarında inceleyebilirsin.
Bu sayede belki neyin eksik olduğunuda anlayabilirsin.
Ete

Saat 4'e geliyor fakat oldu hocam çözdüm sorunu. Devreyi board üzerinde de denedim çalışıyor. Tavsiyeleriniz ve gönderdiğiniz kod için ne kadar teşekkür etsem az. Yarın akşam kod, devre şeması,elemanları ve baskı devre çizimini paylaşacağım. Cuma teslimi yapmadan önce bitmiş halini de paylaşacağım.


Powered by EzPortal