avatar_ete

PIC Basic Ders-08 (Tuş Takımı, Led Display, Port Çoğullama)

Başlatan ete, 28 Ağustos 2011, 16:15:20

ete

Tuş kontrolünde gecikme aslında gereklidir. Neden gerekli olduğunu da şöyle izah edeyim.
Hiç bir tuş simulasyonda olduğu gibi basınca iki kontağın birleşmesi şeklinde çalışmaz. Gerçek tuşlar iki kontağın birleştiği anda yüzlerce defa birleşip bırakma yaparlar. Bu kontakların fiziksel yapılarından kaynaklanır. Tabii ki çok küçük bir zaman diliminde bu olay gerçekleşir. Daha açık bir deyimle tuşa basıldığı anda kontaklar birleşirken birden fazla birleşip bırakma yaparlar. Program hızlı çalışıyor ise her bir bas bırak olayını algılar ve sorunlu çalışır. Bunu önlemenin birinci yolu araya bir gecikme koymaktır. Çünki bahsini ettiğimiz olay ilk 20-30 ms lik süre içinde meydana gelir. Şayet siz bu gecikmeyi koyarsanız program o gecikme süresince tuş kontrolü yapmayacağı için sorun ortadan kalkar.
Bazen ben programın komutlardan gelen gecikmesinden yararlanırım. Öyle ayarlarım ki tuş kontrolünden sonra program bir tur atar ve geçen süre zaten 20ms dolayında ise bir daha ekstra bir gecikme koymam.

Diğer bir yöntem ise tuşa basmanın devam edeip etmediğini kontrol etmektir. Genelde bri while-wend komutu ile bu sağlanır. Ancak bas bırak olayında çok etkili değildir. En iyisi kısa bir gecikme koyup sonra while wend döngüsünü koymaktır.

Diğer bir yöntem ise tuş kontakları arasına 100nf kondansatör bağlamaktır. Böylece oluşan ve ark tabir edilen bu bas bırakların etkisi bir şekilde elimine edilmiş olur.

Programında bir sürü lüzumsuz satır yada komut var.
Mesela, bir kere HIGH YATAY_D  dedikten sonra her yataylardan birisini değiştirdiğinde aynı komutu vermek zorunda değilsin. Zİra bu Yatay_D değiştirilmediği sürece zaten High da kalacaktır. Onu sürekli vermenin bir anlamı yok.
Üstelik birden fazla komut satırı yerine PORTC=%11110000  komutu LOW YATAY-A ya karşılık kullanılabilir.
PORTC=%11101000  komutu LOW YATAY-B ya karşılık kullanılabilir.
PORTC=%11011000  komutu LOW YATAY-C ya karşılık kullanılabilir.
PORTC=%10111000  komutu LOW YATAY-D ya karşılık kullanılabilir.
Her bir dikey kontrolünden sonra gosub ekran komutunu kullanmanızda anlamsız. En aşağıya tek bir tane gosub ekran demeniz yeterli. Yani yatay lardan birisini LOW yapmadan önce bir pause 10 koymuşsunuz. İşte bu pause den önce bir kere Gosub EKran demeniz yeterli. Diğerlerini silebilirsiniz.

Ete


veli dayı

Maaşallah hocam bu ne hız!bu kadarını beklemiyordum doğrusu.eline ağzına sağlık güzel anlatmışsınız teşekkür ederim.iyi oldu kafamdaki soru işaretleri gidişverdi.uyarılarınız doğrultusunda verimli kod yazımı işene eğilecem.yani az satırla çok iş yapabilmek için tavsiyelerinizi değerlendirecem.tekrar tekrar teşekkür ederim Allah razı olsun

blacklabel35

Merhabalar, öncelikle vermiş olduğunuz bilgiler için teşekkür ediyorum.

Programlama konusuna hobi olarak yeni başladığımdan genelde simulasyon üzerinde çalışıyorum , 7segment display multiplex sürmek için 74595 gibi çoğullayıcılardan bahsetmişsiniz çok faydalı oldu, elimde yapılmış bir saat devresi var ben bu devreyi proteusa aktardım ve programını kendim yazmak için çabalıyorum. üzerinde 4 adet 7 segment display ortak uçları sürmek için , 74HCT393 Dual 4-Stage Binary Counter kullanılmış , devre üzerinde 16F628 A.0 ve A.1 uçlarından 393 ün cp ve mr uçlarına giriş yapılmış , data sheet inceledin fakat bir türlü beceremedim , hangi konmutla nasıl bilgi gönderebileceğim konusunda yardımcı olursanız sevinirim , iyi çalışmlar.

ete

74HC393 bir binary sayıcıdır. İki bacaktan kontrol edilir. CP dediğin bacak CLK girişidir. MR bacağı ise bir nevi enable bacağıdır. Sayıcının 4 adet de ABCD binary çıkışı bulunmaktadır.
MR bacağına sürekli LOW vermelisin. BU bacak HIGH olursa sayac resetler ve sıfıra döner.
CP bacağından clk palsi girilmesi gerekir. Her puls geldiğinde sayac değeri bir artar.
Verilen puls'lara bağlı olarak Q3-Q2-Q1-Q0 çıkışlarının alacağı konumlar şöyledir.
1 puls---------------%0001
2 puls---------------%0010
3 puls---------------%0011
4 puls---------------%0100
5 puls---------------%0101
6 puls---------------%0110
7 puls---------------%0111
8 Puls---------------%1000
9 Puls---------------%1001
10 puls-------------%1010
11 Puls-------------%1011
12 Puls-------------%1100
13 Puls-------------%1101
14 Puls-------------%1110
15 Puls-------------%1111
16. puls'ı verirsen sistem yeniden sıfıra döner.

Ete


blacklabel35

Alıntı yapılan: ete - 29 Ocak 2013, 11:55:06
74HC393 bir binary sayıcıdır. İki bacaktan kontrol edilir. CP dediğin bacak CLK girişidir. MR bacağı ise bir nevi enable bacağıdır. Sayıcının 4 adet de ABCD binary çıkışı bulunmaktadır.
MR bacağına sürekli LOW vermelisin. BU bacak HIGH olursa sayac resetler ve sıfıra döner.
CP bacağından clk palsi girilmesi gerekir. Her puls geldiğinde sayac değeri bir artar.
Verilen puls'lara bağlı olarak Q3-Q2-Q1-Q0 çıkışlarının alacağı konumlar şöyledir.
1 puls---------------%0001
2 puls---------------%0010
3 puls---------------%0011
4 puls---------------%0100
5 puls---------------%0101
6 puls---------------%0110
7 puls---------------%0111
8 Puls---------------%1000
9 Puls---------------%1001
10 puls-------------%1010
11 Puls-------------%1011
12 Puls-------------%1100
13 Puls-------------%1101
14 Puls-------------%1110
15 Puls-------------%1111
16. puls'ı verirsen sistem yeniden sıfıra döner.

Ete

cevabınız için çok teşekkürler.
verdiğiniz bilgi doğrultusunda ,  kodlar bu şekildemi olmalı?

Low porta.1 yapıp

1.display için
pulsout porta.0,10
portb=%0011111111

2.display için
pulsout porta.0,40
portb=%0011111111






ete

İlk mesajında ortak uçları sürmek için 393 kullanılmış demişsin. Bu durumda şemayı görmeden bir şey söylemek yanlış olur ama tahimin ettiğim şekil için açıklama yapayım.

Önce 1. displayde yer alacak bilgi PortB den verilir. Displayi aktif etmek için 393'e 1 adet puls verilir. 5 ms beklenir.
(1. display için 393 den %0001 çıkartılması gerekir.   (Pulsout clk,1))
Sonra Mr ucu HIGH yapılır.
Sonra PortB ye 2. display bilgisi verilir. MR ucu LOW yapılıp 2 puls verilir. 5 ms beklenir
(2. display için 393 den %0010 çıkartılması gerekir   ( 2 adet Pulsout clk,1))
Sonra MR ucu HIGH yapılır
Sonra PortB den 3 nolu display bilgisi verilir. MR ucu Low yapılıp 4 puls verilir ve 5 ms beklenir.
3. Display için 393 den %0100 çıkartılması gerekir. (4 tane pulsout clk,1)
Sonra MR ucu High yapılır
Sonra 4 nolu display bilgisi PortB den çıkartılır. MR ucu LOW yapılıp 8 puls verilir. 5 ms beklenir
4. Display için 393 den %1000 çıkartılması gerekir. (8 tane pulsout clk,1)
verip sonra MR ucu HIGH verilip tekrar başa dönülür.

Ete



blacklabel35

verdiğiniz bilgiye göre yapmaya çalışacağım.
yardımınız ve ilginiz için çok teşekkurler,

ferruh

sevgili hocam  # sesı dtmf te karsılığı 12 mıdır 11 mıdır.1 yerde rastladım 11 bır yerde rastladım 12 deneme yapıyorum sonuc alamayınca epey sıkıldım hıc olmazsa ton seslerıne karsılık gelen tablo bulurum dıye arastırdım onada rastlamadım.bölük pöçük birşeler buldum. kolay gelsin

ete

Bende sürekli karıştırırım. Bazı projelerimde 11 bazılarında 12 olarak kullandım. Sonuçta tuş talımında basılan tuşu belirliyor ona numarayı sen veriyorsun.  Ne olduğu pek önemli değil.
Ete

digiland

Ete hocanın örneğinde küçük değişiklikler yaparak;
5 pin giriş ile 64 pin çıkış verebilen bir proje hazırladım.. umarım yararlı olur

'****************************************************************
'*  Name    : COKCIKIS.BAS                                      *
'*  Author  : [ETE]                                             *
'*  Notice  : Copyright (c) 2005 [ERO]                          *
'*          : All Rights Reserved                               *
'*  Date    : 26.06.2005                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
PORTA=255:portb=0
TRISB=0   'PortB tamamı giriş yapıldı.
TRISA=%00000000  'A portu tamamı çıkış yapıldı.
'-----------------------------------------------------------------
DEVICE 16F628a                      'işlemci 16F628                               
cmCON = 7
symbol CLK=PortA.0
SYMBOL DTA=PORTA.1

symbol CLK2=Portb.0
SYMBOL DTA2=PORTb.1
SYMBOL AKTAR2=PORTb.2

dim BILGI as  WORD
dim TamPon as word
dim SaTiR as  byte
dim DiGit as byte

PORTA=0:
bILGI = 1
satir = 0
digit = 0


BASLA:
    IF BILGI=256 THEN
    BILGI=0
endif
    SHOUT DTA,CLK,1,[BILGI]
    Gosub Yolla
if bilgi = 0 then
    bilgi = 1
    inc satir
    goto basla
endif
    BILGI=BILGI*2
   
    delayms 50
    GOTO BASLA
       
YoLLa: 'BILGI ÇIKIŞA AKTARILDI
if satir = 8 then satir = 0
LOOKUP SATir,[1,2,4,8,16,32,64,128],tampon
IC_SeC:
    SHOUT DTA2,CLK2,1,[tampon]
    HIGH AKTAR2
    delayus 5
    LOW AKTAR2
    SHOUT DTA2,CLK2,1,[digit]
    HIGH AKTAR2
    delayus 5
    LOW AKTAR2
return   
end


ferruh


blacklabel35

selamlar, öncelikle verdiğiniz faydalı bilgiler için teşekkur ederim, sorunuma yardımcı olursanız sevinirim.

tuş takımı ve lcd kullanarak aşagıdaki kodlar ile yer tuşa bastığımda bir karakter yana sayı yazdırmaya çalışıyorum fakat her açılışta direk 0000 olarak yada tuşa bastığımda 7777 gibi direk sayıları arka arkaya  ekliyor , bunu nasıl duzeltebilirim?



@ DEVICE PIC16F877a                      'işlemci 16F877a                               
@ DEVICE PIC16F877a, WDT_on              'Watch Dog timer açık
@ DEVICE PIC16F877a, PWRT_ON             'Power on timer açık
@ DEVICE PIC16F877a, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE PIC16F877a, XT_OSC              'XT osilatör kullanılacak
@ DEVICE pic16F877a, BOD_ON             ' Brown-Out Detect

DEFINE LCD_DREG PORTd 'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT 0 'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_RSREG PORTd 'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT 4 'LCD RS bacağı Hangi Bite bağlı ?
DEFINE LCD_EREG PORTd 'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 5 'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_BITS 4 'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 2 'LCD Kaç sıra yazabiliyor
DEFINE LCD_COMMANDUS 2000 'Command delay time in us
DEFINE LCD_DATAUS 50 'Data delay time in us
DEFINE OSC 4                '4mhz osilatör

OPTION_REG.7=0

TRISB=%11110000
TRISD=0
TRISC=1
TRISA=0


Symbol YATAY_A= PORTB.0
Symbol YATAY_B= PORTB.1
Symbol YATAY_C= PORTB.2
Symbol YATAY_D= PORTB.3
Symbol DIKEY_1= PORTB.4
Symbol DIKEY_2= PORTB.5
Symbol DIKEY_3= PORTB.6
TUS VAR WORD
I var BYTE

ILK:
LCDOUT $FE,1,"SIFRE"
PAUSE100
I=0

SIFREGIR1:
GOSUB KEYPATH
IF TUS >9 THEN SIFREGIR1
LCDOUT $FE,$C0+I,#TUS
I=I+1
PAUSE 200
IF I<4 THEN GOTO SIFREGIR1
ENTER: GOSUB KEYPATH
IF TUS <>12 THEN ENTER
GOTO ILK


KEYPATH:
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 100
RETURN



END


ete

Tek bir tuşa basınca ekranda arka arkaya aynı tuşu 3-4 defa tekrarlıyormu? Bunu yapmaması gerekir. Çünki tuşa basıldıktan sonra tuşun bırakılmasını kontrol eden kod var program içinde.
Örnek verecek olursak;
If DIKEY_1=0 THEN
Tus=1
While DIKEY_1=0
Wend
Endif
1 tuşuna basılmış ise TUS=1 yapılıyor ve Dikey_1=0 olduğu müddetçe program orada bekliyor olması gerekir. Beklemiyor ise göremediğimiz bir kusur var demektir.

Aslında programda yer alan;
GOSUB KEYPATH
IF TUS >9 THEN SIFREGIR1
LCDOUT $FE,$C0+I,#TUS
I=I+1
komut satırları her tuş değerini yazdıktan sonra yazılacak konumu bir sonraki haneye almaktadır. Bunu yapmasanızda LCD bu işi otomatik yapıyor zaten ne gerek vardı anlamadım.
Burada basılan her tuş bağımsız olarak kalmakta basılan tuşlar bir şekilde birleştirilip şifre oluşturulmamaktadır.
Ben genelde şu sistemi kullanırım.
Başlangıçta SAYI isimli br word değişkeni tanımlarım. Tuş kontrolünün sonunda,
SAYI=SAYI*10+TUS  şeklinde bir komut koyarım.
Program tuş kontrolünden döndükten sonra basılan tuşu ekrana yazdırmak için,
LCDOUT $FE,$C0,#SAYI,"  "
şeklinde yazdırmanız yeterli oalcaktır. Böylece 4 hane içinde elinizde 4 hanein birleştirildiği bir sayı değeri bulunacak ve bunu şifre ile gerekirse karşılaştıracak uymuyorsa yeniden şifre girişi alabileceksiniz.

Ete




blacklabel35

Dediğiniz gibi yaptım, fakat bu seferde 5 tusuna basınca 5-55-555 gibi gidiyor tuşu basılı görüyor nedenini anlayamadım, dosyayı incelerseniz sevinirim, teşekkurler

ete

Ancak akşama bakabilirim dosyaya dedim ama text olarak bakabiliyorum. BASLA satırı ile KEYPATH etiketleri arasındakileri sil ve aşağıdakileri oraya ekle

BASLA:
TUS=255
GOSUB KEYPATH
IF TUS=255 then BASLA
IF TUS<10 then SAYI=SAYI*10+TUS
IF SAYI>65500 then SAYI=0
LCDOUT $FE,$C0,#SAYI
PAUSE 200
GOTO BASLA

Şimdi bakalım ne olacak
Ete

Powered by EzPortal