16f628 ile şifreli kilit

Başlatan Şahin35, 10 Nisan 2014, 16:20:51

Şahin35

Hocalarım merhaba ben sıfrelı kılıt devresı yaptım. ılave olrak bır buton bagladım. butona bastıgım zaman sıfreyı degıstırsın ıstıyorum. bunuda yaptım.Sorunum  arada buton alıyor bazen almıyor.bread board  devreyı kurdugumda arada alıyor bazen ıse almıyordu.daha sonra devreyı delıklı pertınaksa kurdum. sorun gene devam edıyor.bacak uclarını olctum.butona basılmadan 5 volt gelıyor. butona bastıgımda ıse pice sıfır volt gonderıyor.sorunu anlamadım. bread borda arada calısıp sıfremı degıtrıdıgımde sımdı ıse delıklı pertınaksta sorun .. hocalarım yardımmm..

Şahin35

Yok mu kimse sorumu cevaplayacak hocamm :/

Şahin35


ete

#3
Soru havada kalmış. Sorunu bulmadan yada yorum yapamadan ne cevabı vereyim ben. Nereden bileyim butonu nasıl bağladın. Pullup mı yaptın programda buton titremesini önleyecek tedbir aldınmı. Bunları görmeden ben sana ancak buton kontaklarına 100 nf bağla diye öneride bulunabilirim. Bu tür soruların cevabı ancak şema ve program verilirse doğru şekilde verilebilir.
Havada kalan sorulara havada cevap verilir.

Ete

Şahin35

ete hocam devrme buton pull down baglı. oradakı dırenc ise 10k koydum daha sonra 1 k koydum sorun devam etti.

yazdıgım program :
#include<16f628a.h>
#FUSES NOWDT
#FUSES XT
#FUSES NOPUT
#FUSES NOPROTECT
#FUSES NOBROWNOUT
#FUSES NOMCLR
#FUSES NOLVP
#FUSES NOCPD

#use delay(clock=4000000)

#use fast_io(a)
#use fast_io(b)


#define sut1 pin_b0  // sutun1 ifadesi b0 ifadesi ile eşleniyor.
#define sut2 pin_b3  // sutun2 ifadesi b3 ifadesi ile eşleniyor.
#define sut3 pin_b4  // sutun3 ifadesi b4 ifadesi ile eşleniyor.

#define sat1 pin_a0  // satır1 ifadesi a0 ifadesi ile eşleniyor.
#define sat2 pin_a1  // satır2 ifadesi a1 ifadesi ile eşleniyor.
#define sat3 pin_a2  // satur3 ifadesi a2 ifadesi ile eşleniyor.
#define sat4 pin_a3  // satır4 ifadesi a3 ifadesi ile eşleniyor.

char tus=255  , sayac=0;  // karakter tipinde değişkenler..
int16 buton =0 ;
  //********  Keypad Tarama Kısmı ***********///////
 
  char keypad_oku()
{
tus= 255 ;
output_low(sat1); //  A portu çıkışı sıfırlıyoz
output_low(sat2);
output_low(sat3);
output_low(sat4);

   output_high(sat1);            //1. satırı lojik 1 yapıyoz.
    if (input(sut1))          //1. sutun okunuyor.
    {delay_ms(40); tus=1 ;}
    if (input(sut2))          //2. sutun okunuyor.
    {delay_ms(40); tus=2 ;}
    if (input(sut3))          //3. sutun okunuyor.
    {delay_ms(40); tus=3 ;}
   output_low(sat1);            // 1. satırı lojik 0 yapıyoz.
   
   output_high(sat2);             //2. satırı lojik 1 yapıyoz.
    if (input(sut1))              //1. sutun okunuyor.
    {delay_ms(40); tus=4 ;}
    if (input(sut2))             //2. sutun okunuyor.
    {delay_ms(40); tus=5 ;}
    if (input(sut3))             //3. sutun okunuyor.
    {delay_ms(40); tus=6 ;}
   output_low(sat2);              // 2. satırı lojik 0 yapıyoz.
     
   output_high(sat3);                //3. satırı lojik 1 yapıyoz.
    if (input(sut1))               //1. sutun okunuyor.
    {delay_ms(40); tus=7 ;}
    if (input(sut2))                //2. sutun okunuyor.
    {delay_ms(40); tus=8 ;}
    if (input(sut3))                //3. sutun okunuyor.
    {delay_ms(40); tus=9 ;}
   output_low(sat3);                // 3. satırı lojik 0 yapıyoz.
     
   output_high(sat4);              //4. satırı lojik 1 yapıyoz.
    if (input(sut1))                //1. sutun okunuyor.
    {delay_ms(40); tus='A' ;}
    if (input(sut2))                //2. sutun okunuyor.
    {delay_ms(40); tus=0 ;}
    if (input(sut3))                //3. sutun okunuyor.
    {delay_ms(40); tus='B' ;}
   output_low(sat4);                // 4. satırı lojik 0 yapıyoz.
   
          return tus ;    // Fonksiyonumuz tus değeri ile dönecek.
         
}
 
 
void main()
{
   
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_CCP1(CCP_OFF);
   
      set_tris_a(0x00);   // a portu sıfırlıyoz.
      set_tris_b(0x3f);   // b portu komple cıkış yapıyoz.
     
     
      output_low(pin_a4);     // açılısta buzzer otme suresı
       delay_ms(500);
      output_high(pin_a4);
       delay_ms(500);
      output_low(pin_a4);
      delay_ms(500);
      output_high(pin_a4);
    if (read_eeprom(0) == 255) { write_eeprom(0,1); write_eeprom(1,2); write_eeprom(2,3); write_eeprom(3,4);
    }
      while (TRUE)
      {
      while ( tus == 255 ) { keypad_oku(); }   // tusa basılana kadar bekle
       output_low(pin_a4); delay_ms(300);output_high(pin_a4);   // tusa bastıkca buzzer otme suresi
       
         if ( sayac == 0 && tus == read_eeprom(0)) {sayac++;}
       else if ( sayac == 1 && tus == read_eeprom(1)) {sayac++;}
       else if ( sayac == 2 && tus == read_eeprom(2)) {sayac++;}
       else if ( sayac == 3 && tus == read_eeprom(3)) {sayac++;}
       else if ( sayac == 4 && tus == 'B')
       {
     
         output_high(pin_b6); delay_ms(3000); output_low(pin_b6) ;tus=255;
          sayac=0 ;       

       }
       
         else sayac= 0;
       
     keypad_oku();
     
   
         if ((pin_b5))
         buton++;
         else
         buton = 0;
         if(buton > 500)
         {buton = 0;}
           {
           output_low(pin_a4);delay_ms(750); output_high(pin_a4) ;
         
            while (sayac < 4)
           {
           
           while (tus == 255 ) { keypad_oku (); }
           output_low(pin_a4);delay_ms(300);output_high(pin_a4);
           
           if      (sayac ==0 ) { write_eeprom(0,tus);sayac++ ; }
           else if (sayac ==1 ) { write_eeprom(1,tus);sayac++ ; }
           else if (sayac ==2 ) { write_eeprom(2,tus);sayac++ ; }
           else if (sayac ==3 ) { write_eeprom(3,tus);sayac++ ; }
            tus = 255 ;
            delay_ms(500);
           }
           }
      }

}

ete

C dili ile aram iyi değil maalesef. Ancak koda bir bakalım istersen;
   output_high(sat1);            //1. satırı lojik 1 yapıyoz.
    if (input(sut1))          //1. sutun okunuyor.
    {delay_ms(40); tus=1 ;
Burada 1 tuşuna basıldığını kim belirleyecek.? C bilenlere de soruyorum.
işlem sırasına bakalım. ,
Satır1=1 yapılıyor. O halde o satıra bağlı tuşlardanbirisine basıldığı zaman hangi sütun=1 olmuş ise tuş odur diye mantık kurarım ben. Peki bu nerede test ediliyor? Test ediliyor aslında şöyle;
IF (input(sut1))   komut satırı bunu test ediyor. Ama sonuç doğru ise tuş=1 denilmeden nasıl hangi tuşa basıldığını anlayacak program.
Sorun burada. Bence programı EKSIK YAZMIŞSIN!!!!!

Ete


Şahin35

Hocam sorun keypad de degıl. orada tarama yapıyorum. sorun if(!input(pin_b5) diye yazılı kısım var .orada sifre degıstırme ıslemı yapıyorum. butona basılı ıse sunları yap gıbısınden. benım keypad tarma kısmında sıkıntım yok. sıfremı gırınce bobın tetık alıyor. port.5 baglı butonum var sorun orda hocam..

ete

c dilinde yardımcı olamayacağım maaleszef.
Ete

Şahin35

pekı hocam saolun. sizin pic basıcde yazdıgınızda nasıl yapıyosunuz.oyle bır orenk verın bana hocam bıde ne gıbı sorunlar cıkabıır. delıklı pertınaksa kurdgumda. ben devreye enerjı verdıgımde butona bastıgımda pic 0 volt gıdıyor. butona basmadıgıma pic 5 v gelıyor. buton saglam gozukuyor. baglnatıda saglam gozukuyor mantık olarak. bread board arada alıyor bazen almıyordu. delıklı pertınaksa kurdugumda ıse hıc almıyor...

ete

Tuş takımında bilgi girişini bir alt programa atmak ve ana program kısmında gerektiği zaman bu alt programa gidip oradan tuş değer okuyup gelmek gerekir.
Bu tür programlarda bir normal şifre girişi bir de şifre değiştirme işlemi olması gerekiyor.
Şifre değiştirme işlemi bir şarta bağlanmalıdır. Öyle her isteyen gelip şifre değiştirmemelidir.
Nedir bunun şartı ? elbette öncelikle bir tuş belirlenmesi gerekiyor. Ancak bu tuşa basılmış ise program şifre değiştirme alt programına gitmelidir. Genellikle "*" yada "#" tuşlarından birisi bu ilk şartı yerine getirir. Diyelimki  # tuşunu kullanıyoruz.
O halde program çalışırken # tuşuna basılmış ise program şifre değiştirme alt programına geçer.
Orada önce eski şifrenin girilmesi istenir. Girilen doğru ise ardından yenisinin girilmesi istenir. Şifrenin yenisi girildikten sonra tekrar # tuşuna basılarak girme işlemi sonlandırılır. O ana kadar girilen değerler yeni şifre olarak kabul edilip eproma kayıt edilerek program ana çalışma kısmına aktarılır.

Bu benimkullandığım usuldür.

Ete

Şahin35

program komutu olarak örneklendırsek hocam ...

ete

Başından beri sana bir sürü örnek verdim. Basic ile başladın C diline döndün sonra yeniden Basic de örnek istiyorsun. Aslında örnek değil kopyala yapıştır kodu istiyorsun. Bu sefer örnek falan veremiyeceğim. Çünki örnekleri önceden vermiştim sana. Üstelik örnek dedğinde öyle bir kaç satır şey değil. Oturup program yazmak lazım.
Mantığını anlattım önceki konulardan tuş takımının nasıl kontrol edileceğine dair örnekleri verdim. Şifre girişine kadar sana hazırlayıp vermiştim.
Bunun üzerine biraz kafayı çalıştırıp ilaveler yapman gerekiyor. Nasıl yapılacağınıda anlattım daha örnek falan bekleme otur kendin yap artık.

Ete

Şahin35

Verdiğiniz örnekler yok suan bende.. Neyse hocam genede saolun. csc de anlayn bırı varsa bana yardım cı olur. program dogru bundan emınım . acaba ılave bırsyeler mı eklmelıım devreye ..pic cıksını olctugumde cıkıs alıyom..butona bastıgımda pıce 0 volt gelıyor. butona basmadıgımda ıse pıc 5 vlt gelıyor. daha ne yapmam gerkeıyor bılmıyorum ?

Powered by EzPortal