Komut İşleme Hızı

Başlatan Sıfır, 30 Temmuz 2015, 15:04:33

Sıfır

Tuş takımı kullanarak bir güvenlik sistemi yapmaya çalışıyorum.Problem tuşa basınca başlıyor.Şöyle ki:
Bir tuşa basıp giriş tuşuna basarsam şifreyi kontrol edecek.Başka bir sayıya basarsam (örneğin ilk başta 1'e sonra 2'ye) 12 yazacak ve yine aynı döngü.Bunun için şöyle bir kod yazdım:
Ekran:
Lcdout,$FE,1,"Şifre:",#Şifre
IF TUS=0 THEN
GOTO MENU
PAUSE 100
RETURN

Ancak ben tuşa basana kadar beklemesi lazım.Böyle yaparsam ben tuşa basmadan if komudunu atlayıp return komuduna geçmez mi?
Telefonda olduğumdan dolayı kodların tamamını paylaşamıyorum.Şimdiden teşekkürler.

ete

Tusa basıncaya kadar beklesin isiyorsan tusa basmanın tersini şart olarak vermen gerekir.
While Tus=1:wend
Bu satır tusa basılıncaya kadar programı bekletir.
Ete

Sıfır

Alıntı yapılan: ete - 30 Temmuz 2015, 18:13:29
Tusa basıncaya kadar beklesin isiyorsan tusa basmanın tersini şart olarak vermen gerekir.
While Tus=1:wend
Bu satır tusa basılıncaya kadar programı bekletir.
Ete
Teşekkür ederim ETE Hocam ancak bunun sorunumu çözeceğini zannetmiyorum.Çünkü tuşa basmak gibi bir zorunluluğum yok.Tekrar bir sayıya basabilirim ve girdiğim şifre iki basamaklı bir sayıya dönüşebilir.Böyle yazarsam tuşa basmak zorunda kalırım.

Kodların tamamı şöyle:
@ DEVICE pic16F628a
@ DEVICE pic16F629a, WDT_ON
@ DEVICE pic16F628a, PWRT_ON
@ DEVICE pic16F628a, PROTECT_OFF
@ DEVICE pic16F628a, MCLR_ON
@ DEVICE pic16F628a, INTRC_OSC_NOCLKOUT

COMCON=7
OPTION_REG.7=0 ' PULL-UP DİRENÇLERİ AKTİF

DEFINE LCD_DREG PORTA
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTA
DEFINE LCD_EBIT 6
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2

TRISA=0
TRISB=%00001110

SYMBOL YATAY1=PORTB.4
SYMBOL YATAY2=PORTB.5
SYMBOL YATAY3=PORTB.6
SYMBOL YATAY4=PORTB.7
SYMBOL DIKEY1=PORTB.1
SYMBOL DIKEY2=PORTB.2
SYMBOL DIKEY3=PORTB.3

SAYI1 VAR BYTE
SAYI2 VAR BYTE
SAYI3 VAR BYTE
ŞİFRE VAR WORD

CLEAR
PAUSE 200
LCDOUT $FE,1

BASLA:
PORTB=254
YATAY1=0
IF DIKEY1=0 THEN
SAYI1=1:GOSUB EKRAN
WHILE DIKEY1=0
WEND
GOTO BASLA2
ENDIF
IF DIKEY2=0 THEN
SAYI1=2:GOSUB EKRAN
WHILE DIKEY2=0
WEND
GOTO BASLA2
ENDIF
IF DIKEY3=0 THEN
SAYI1=3:GOSUB EKRAN
WHILE DIKEY3=0
WEND
GOTO BASLA2
ENDIF
IF DIKEY4=0 THEN
SAYI1=4:GOSUB EKRAN
WHILE DIKEY4=0
WEND
GOTO BASLA2
ENDIF
HIGH YATAY1
YATAY2=0
IF DIKEY1=0 THEN
SAYI1=5:GOSUB EKRAN
WHILE DIKEY1=0
WEND
GOTO BASLA2
ENDIF
ID DIKEY2=0 THEN
SAYI1=6:GOSUB EKRAN
WHILE DIKEY2=0
WEND
GOTO BASLA2
ENDIF
IF DIKEY3=0 THEN
SAYI1=7:GOSUB EKRAN
WHILE DIKEY3=0
WEND
GOTO BASLA2
ENDIF
IF DIKEY4=0 THEN
SAYI1=8:GOSUB EKRAN
WHILE DIKEY4=0
WEND
GOTO BASLA2
ENDIF
HIGH YATAY2
YATAY3=0
IF DIKEY1=0 THEN
SAYI1=9:GOSUB EKRAN
WHILE DIKEY1=0
WEND
GOTO BASLA2
ENDIF
IF DIKEY2=0 THEN
SAYI1=10:GOSUB EKRAN
WHILE DIKEY2=0
WEND
GOTO BASLA2
ENDIF
IF DIKEY3=0 THEN
SAYI1=11:GOSUB EKRAN
WHILE DIKEY3=0
WEND
GOTO BASLA2
ENDIF
IF DIKEY4=0 THEN
SAYI1=12:GOSUB EKRAN
WHILE DIKEY4=0
WEND
GOTO BASLA2
ENDIF
HIGH YATAY3
PAUSE 100
GOTO BASLA

EKRAN:
LCDOUT $FE,1,"ŞİFRE:",#SAYI1
IF TUS=0 THEN 'PULL UP
GOTO GİRİS
ENDIF
PAUSE 100
RETURN

BASLA2:
LOW YATAY1
HIGH YATAY2
HIGH YATAY3
IF DIKEY1=0 THEN
SAYI2=1:GOSUB EKRAN2
WHILE DIKEY2=0
WEND
GOTO BASLA3
ENDIF
IF DIKEY2=0 THEN
SAYI2=2:GOSUB EKRAN2
WHILDE DIKEY2=0
WEND
GOTO BASLA3
ENDIF
IF DIKEY3=0 THEN
SAYI2=3:GOSUB EKRAN2
WHILE DIKEY3=0
WEND
GOTO BASLA3
ENDIF
IF DIKEY4=0 THEN
SAYI1=4:GOSUB EKRAN2
WHILE DIKEY4=0
WEND
GOTO BASLA3
ENDIF
HIGH YATAY1
YATAY2=0
IF DIKEY1=0 THEN
SAYI2=5:GOSUB EKRAN2
WHILE DIKEY1=0
WEND
GOTO BASLA3
ENDIF
IF DKEY2=0 THEN
SAYI2=6:GOSUB EKRAN2
WHILE DIKEY2=0
WEND
GOTO BASLA3
ENDIF
IF DIKEY3=0 THEN
SAYI2=7:GOSUB EKRAN2
WHILE DIKEY3=0
WEND
GOTO BASLA3
ENDIF
IF DIKEY4=0 THEN
SAYI2=8:GOSUB EKRAN2
WHILE DIKEY4=0
WEND
GOTO BASLA3
ENDIF
HIGH YATAY2
YATAY3=0
IF DIKEY1=0 THEN
SAYI2=9:GOSUB EKRAN2
WHILE DIKEY1=0
WEND
GOTO BASLA3
ENDIF
IF DIKEY2=0 THEN
SAYI2=10:GOSUB EKRAN2
WHILE DIKEY2=0
WEND
GOTO BASLA3
ENDIF
IF DIKEY3=0 THEN
SAYI2=11:GOSUB EKRAN2
WHILE DIKEY3=0
WEND
GOTO BASLA3
ENDIF
IF DIKEY4=0 THEN
SAYI2=12:GOSUB EKRAN2
WHILE DIKEY4=0
WEND
GOTO BASLA3
ENDIF
HIGH YATAY3
PAUSE 100
GOTO BASLA2

EKRAN2:
ŞİFRE=10*SAYI1+SAYI2
LCDOUT $FE,1,"ŞİFRE:",#ŞİFRE
IF TUS=0 THEN
GOTO GİRİS
ENDIF
PAUSE 100
RETURN

BASLA3:
LOW YATAY1
HIGH YATAY2
HIGH YATAY3
IF DIKEY1=0 THEN
SAYI3=1:GOSUB EKRAN3
WHILE DIKEY1=0 THEN
WEND
ENDIF
IF DIKEY2=0 THEN
SAYI3=2:GOSUB EKRAN3
WHILE DIKEY2=0
WEND
ENDIF
IF DIKEY3=0 THEN
SAYI3=3:GOSUB EKRAN3
WHILE DIKEY3=0
WEND
ENDIF
IF DIKEY4=0 THEN
SAYI3=4:GOSUB EKRAN3
WHILE DIKEY4=0
WEND
ENDIF
HOGH YATAY1
YATAY2=0
IF DIKEY1=0 THEN
SAYI3=5:GOSUB EKRAN3
WHILE DIKEY1=0
WEND
ENDIF
IF DIKEY2=0 THEN
SAYI3=6:GOSUB EKRAN3
WHILE DIKEY2=0
WEND
ENDIF
IF DIKEY3=0 THEN
SAYI3=7:GOSUB EKRAN3
WHILE DIKEY3=0
WEND
ENDIF
IF DIKEY4=0 THEN
SAYI3=8:GOSUB EKRAN3
WHILE DIKEY4=0
WEND
ENDIF
HIGH YATAY2
YATAY3=0
IF DIKEY1=0 THEN
SAYI3=9:GOSUB EKRAN3
WHILE DIKEY1=0
WEND
ENDIF
IF DIKEY2=0 THEN
SAYI3=11:GOSUB EKRAN3
WHILE DIKEY2=0
WEND
ENDIF
IF DIKEY3=0 THEN
SAYI3=11:GOSUB EKRAN3
WHILE DIKEY3=0
WEND
ENDIF
IF DIKEY4=0 THEN
SAYI3=12:GOSUB EKRAN3
WHILE DIKEY4=0
WEND
ENDIF
HIGH YATAY3
PAUSE 100
GOTO BASLA3

EKRAN3:
ŞİFRE=100*SAYI1+10*SAYI2+SAYI3
LCDOUT $FE,1,"ŞİFRE:",#ŞİFRE
IF TUS=0 THEN
GOTO GİRİS
ENDIF
PAUSE 100
RETURN

GİRİS:
IF ŞİFRE=210 THEN
HIGH MOTOR
ELSE HIGH ALARM
ENDIF
PAUSE 100
GOTO BASLA




Anlayacağınız üzere ekran menülerinde giriş tuşuna basılmış ise şifreyi kontrol ediyor.Tuşa basılmamış ise sayı2'yi yazdırmak için başka bir etikete gidiyor.Ama sorun şu ki ben daha tuşa basmadan pic,

IF TUS=0 THEN 'PULL UP
GOTO GİRİS
ENDIF
satırlarını atlamış olacaktır ve hemen altında return olduğu için tekrardan başa dönecek.Sonra da sayı2'yi yazdırmak için bir tuşa basmamı bekleyecek.Oysa yapmak istediğim şey sayı2 yazma zorunluluğun ortadan kaldırmak.Tuşa basmış isem şifreyi kontrol etsin.Başka bir sayoya basarsam iki veya üç basamaklı olacak şekilde şifreyi düzenlesin.

ete

Her bir digit için ayrı bir tuş takımı tarama kodu yazmışsın. tek bir tane yazıp oraya gosub ile gidip sayıyı aldıktan sonra dönmen yeterli olurdu.
Bu şekilde yazınca karmakarışık bir kod olmuş içinden zor çıkılıyor. Ayrıca Türkçe karekterler içeren değişken ve etiket isimleri kullanmışsın. Bunlarda yanlış derleme esnasında hata oluştururlar. Onlarıda düzeltmen gerek.

Tek bir tuş takımı alt programı yazarsanistediğin sayı oluşuncaya kadar en azından kaç digit sayı istersen o kadar digit girilmeden tuş alma işlemini bitirmezsin.
Bu düşündüğün mantık da pek doğru değil.

Ete

Sıfır

Alıntı yapılan: ete - 30 Temmuz 2015, 21:49:47
Her bir digit için ayrı bir tuş takımı tarama kodu yazmışsın. tek bir tane yazıp oraya gosub ile gidip sayıyı aldıktan sonra dönmen yeterli olurdu.
Bu şekilde yazınca karmakarışık bir kod olmuş içinden zor çıkılıyor. Ayrıca Türkçe karekterler içeren değişken ve etiket isimleri kullanmışsın. Bunlarda yanlış derleme esnasında hata oluştururlar. Onlarıda düzeltmen gerek.

Tek bir tuş takımı alt programı yazarsanistediğin sayı oluşuncaya kadar en azından kaç digit sayı istersen o kadar digit girilmeden tuş alma işlemini bitirmezsin.
Bu düşündüğün mantık da pek doğru değil.

Ete
Teşekkürler ETE Hocam.Türkçe karakteri fark edememişim bazen gözümden kaçıyor.Nasıl bir mantık önerirsiniz?Digit işi hakkında özellikle.

ete

SAYI=SAYI*10+TUS  formülü her şeyi hallediyor zaten.
IF SAYI<10 then henüz 1 digit girilmiştir.
IF SAYI>9 and SAYI<100 then 2 digit girilmiştir
IF SAYI>99 then 3 veya 4 digit girilmiştir.

Yada onlar=SAYI DIG 1  Onlar>0 ise onlar hanesinde sayı vardır
Yuzler=SAYI DIG 2 Yuzler>0 ise yüzler hanesi girilmiştir anlamına gelebilir.

Yada her girilen tuş ardından hane=hane+1 yaparsın ve hane sayısı sana kaç digit girildiğini verir.
Bir sürü yolu var bu işin.
Ama sen önce tuş tarama mekan,zmasını değiştir tek alt programa çevir bencee.

Ete

Sıfır

Alıntı yapılan: ete - 31 Temmuz 2015, 09:32:16
SAYI=SAYI*10+TUS  formülü her şeyi hallediyor zaten.
IF SAYI<10 then henüz 1 digit girilmiştir.
IF SAYI>9 and SAYI<100 then 2 digit girilmiştir
IF SAYI>99 then 3 veya 4 digit girilmiştir.

Yada onlar=SAYI DIG 1  Onlar>0 ise onlar hanesinde sayı vardır
Yuzler=SAYI DIG 2 Yuzler>0 ise yüzler hanesi girilmiştir anlamına gelebilir.

Yada her girilen tuş ardından hane=hane+1 yaparsın ve hane sayısı sana kaç digit girildiğini verir.
Bir sürü yolu var bu işin.
Ama sen önce tuş tarama mekan,zmasını değiştir tek alt programa çevir bencee.

Ete
Dediklerinizi yaptım Erol Hocam.Türkçe karakteri kaldırdım ve yeni bir program yazarak tek bir alt programa çevirdim(en azından öyle sanıyorum.).3 tane basamak ayarladım ve kodları da burada paylaşıyorum:
@ DEVICE pic16F628a
@ DEVICE pic16F629a, WDT_ON
@ DEVICE pic16F628a, PWRT_ON
@ DEVICE pic16F628a, PROTECT_OFF
@ DEVICE pic16F628a, MCLR_ON
@ DEVICE pic16F628a, INTRC_OSC_NOCLKOUT

COMCON=7
OPTION_REG.7=0 ' PULL-UP DİRENÇLERİ AKTİF

DEFINE LCD_DREG PORTA
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTA
DEFINE LCD_EBIT 6
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2

TRISA=0
TRISB=1

SYMBOL YATAY1=PORTB.4
SYMBOL YATAY2=PORTB.5
SYMBOL YATAY3=PORTB.6
SYMBOL DIKEY4=PORTB.7
SYMBOL DIKEY1=PORTB.1
SYMBOL DIKEY2=PORTB.2
SYMBOL DIKEY3=PORTB.3


S VAR BYTE
A VAR BYTE
B VAR BYTE
I VAR BYTE
SAYI VAR WORD

CLEAR
PAUSE 200
LCDOUT $FE,1

BASLA:
PORTB=254
S=0:A=0:B=0:I=0:SAYI=0
YATAY1=0
IF DIKEY1=0 THEN S=1:A=A+1
WHILE DIKEY1=0
WEND
GOSUB BASAMAK
ENDIF
IF DIKEY2=0 THEN S=2:A=A+1
WHILE DIKEY2=0
WEND
GOSUB BASAMAK
ENDIF
IF DIKEY3=0 THEN S=3:A=A+1
WHILE DIKEY3=0
WEND
GOSUB BASAMAK
ENDIF
IF DIKEY4=0 THEN S=4:A=A+1
WHILE DIKEY4=0
WEND
GOSUB BASAMAK
ENDIF
HIGH YATAY1
YATAY2=0
IF DIKEY1=0 THEN S=5:A=A+1
WHILE DIKEY1=0
WEND
GOSUB BASAMAK
ENDIF
IF DIKEY2=0 THEN S=6:A=A+1
WHILE DIKEY2=0
WEND
GOSUB BASAMAK
ENDIF
IF DIKEY3=0 THEN S=7:A=A+1
WHILE DIKEY3=0
WEND
GOSUB BASAMAK
ENDIF
IF DIKEY4=0 THEN S=8:A=A+1
WHILE DIKEY4=0
WEND
GOSUB BASAMAK
ENDIF
HIGH YATAY2
YATAY3=0
IF DIKEY1=0 THEN S=9:A=A+1
WHILE DIKEY1=0
WEND
GOSUB BASAMAK
ENDIF
IF DIKEY2=0 THEN S=0:A=A+1
WHILE DIKEY2=0
WEND
GOSUB BASAMAK
ENDIF
IF DIKEY3=0 THEN S=*:A=A+1
WHILE DIKEY3=0
WEND
GOSUB BASAMAK
ENDIF
HIGH YATAY3
GOTO BASLA

BASAMAK:
I=A-B
IF I<>0 THEN
IF A=1 THEN SAYI=S
IF A=2 THEN SAYI=SAYI*10+S
IF A=3 THEN SAYI=SAYI*10+S
ENDIF
ENDIF
ENDIF
ENDIF
A=0:B=A
PAUSE 100
GOSUB EKRAN
RETURN

EKRAN:
LCDOUT $FE,"SİFRE:",#SAYI
PAUSE 100
RETURN

Çok rahatsız ettim Hocam ama hâla bir sorundan muzdaribim:
IF I<>0 THEN
IF A=1 THEN SAYI=S
IF A=2 THEN SAYI=SAYI*10+S
IF A=3 THEN SAYI=SAYI*10+S
satırlarını basamaklar için kullandım.İyi çalışıyorlar aslında ama eksiği ilk bastığımız sayı "0" olursa ekranda gözükmeyeceği.Örneğin sırasıyla 0,5 ve 6'ya basarsam ekranda gözükecek olan sayı, "56" olacaktır. "056" olması lazım.

ete

Bu program ile ne yapmak istediğini söyle ve varsa simulasyon devresini ekle bakayım.

Ete

Sıfır

Alıntı yapılan: ete - 31 Temmuz 2015, 14:34:51
Bu program ile ne yapmak istediğini söyle ve varsa simulasyon devresini ekle bakayım.

Ete
Sağolun ETE Hocam.Amacım eğer doğru şifre girilmiş ise kapıyı açmak için motorun çalışmasını istiyorum.Yanlış şifre girilir ise alarm çalışsın.Güvenlik sistemi yani.Aslında bu kadar basit ama benim gibi bir acemi için büyük bir adım.
Maâlesef,şu anda kullandığım bilgisayarda simülasyon hazırlayamıyorum.Fırsatım olunca(ki bu uzun sürebilir.) hazırlayacağım İnşaAllah .

ete

Simulasyon programın yok ise işin zor. Sürekli olarak programı bir devrede test etmek gerçekten zor ve zahmetli bir iştir.
Zaten programın çalışmamasından belli oluyor simule edemediğin.
Programı epeyce çalışır hale getirdim. Şu anda 4-5 basamak şifre girilebiliyor ve sonuçta girilen şifre karşılaştırması yapılabiliyor.
Aslında KAPI isimli bir pin ve ALRM isimli bir başka pinide kullanıp şifre doğru ise kapıyı açtırmayı veya yanlış şifrede ALRM'ı aktif etmeyi de deneyecektim ama kullanmış olduğüun 16F628 de başka kullanılabilecek pin kalmamış ki. Bu işlemci bu iş için yeterli değil. En azından 16F877A ya geçmeni tavsiye ederim.

Program ve simulasyon dosyasını ilişikte veriyorum. Gerisi sana ait artık.
Tuş takımında "*" tuşu bir hane siliyor sürekli basılırsa sıfıra kadar siliyor.
"#" tuşu ise tek basışta tüm SAYI değerini sıfırlıyor.

Ete

Sıfır

#10
Teşekkür ederim ETE Hocam, zahmet etmişsiniz.

Powered by EzPortal