avatar_BİDİL

CD4067 İLE GİRİŞ ÇOĞULLAMA

Başlatan BİDİL, 29 Ağustos 2014, 09:03:17

BİDİL

Merhaba Arkadaşlar;
16f877A ya bağlı olarak işlem yapacak 16 adet buton koymak istiyorum. CD4067 nin uygun olacağı kanaatindeyim ancak daha önce hiç ilgilenmediğim bir konu olduğundan sadece 16 kanal giriş ve çıkış olarak kullanılabildiği için bu entegreyi sectim bilmem doğru yolda mıyım?
Eğer doğru yolda isem ikinci bir sıkıntı bu tür entegrelerin nasıl kullanıldığı hakkında ete hocanın ders notlarına göz attığımda çıkış çoğullamak için kullanılan 4051 entegresi clok ve data pinleri üzerinden haberleşirken bu entegrede A,B,C,D pinleri üzeriden çalışıyor .

Kafanızı çok şişirmeden cd4067 nin giriş çoğullamada kullanılmasına ilişkin önerebileceğiniz bir kaynak varsa paylaşmanızı rica edeceğim.

ete

ABCD pinleri adres pinleridir. Buradan verdiğin adrese bağlı olarak seçilen pin giriş çıkış pini X1 ile birleşir.
Bu birleşme sonucunda ister X1 den girip adres ile seçilen pinden çıkarsın ister adres ile seçilen pinden girip X1 den çıkarsın bu senin tercihine kalmış. 16 adet adres pini olduğuna göre adres bilgisi %0000 ile %1111 arasında değer alacak ve alacağı değere göre giriş çıkış bağlantısı sağlanacak demektir.

Ete

BİDİL

Merhaba Hocam;
Anlamaya çalışıyorum hocam sağ olun.
4067 nin giriş çoğullamada kullanımı ile alakalı ders notları yok değilmi hocam, arama yaptım ama bişey bulamadım.

ete

Ders notlarında bunun çalışmasını yapmadım sanırım.
Ama tarifim yeterli olması gerek. Uygula göreceksin.

Ete

BİDİL

#4
Hocam ekteki tabloya göre şöyle bir sonuca vardım;

TRISD=%11110000  ;A'yı PORTD.6 ya B'yi PORTD.7'ye C'yi PORTD.4'e D'yi ise PORTD.5'e bağladım.
BILGI  VAR  byte
BILGI=0
PORTD=0

pause 500
BASLA:
if PORTD=%0100000 then bILGI=1
Lcdout $FE, 1
Lcdout $FE, 1,"BASILAN TUS",DEC2 BILGI
PAUSE 100
GOTO BASLA



doğru olmadığı kesin çünkü çalıştıramadım. Açıkçası donanım olarak ta çok fazla bilgim yok örneğin COM IN/OUT ve INH uçları ne maçla kullanılıyor. 16 butonun hepsini 2k2 ike pull-up yaptım. Inh nin Okuma yaptığımız zaman GND ye mi çekmeliyiz?

ete

#5
Bağlantı şeklin çok yanlış.
ABCD pinleri adres seçme pinleridir. Bu pinlere 0-15 arasında binary değer vermek gerekir. Bu gerekliliğe uyan bağlantı şekli en iyisi A=PORTD.0, B=PORTD.1, C=PORTD.2 ve D=PORTD.3 şeklindedir. Bir zorunluluk var ise ve D protunun yüksek değerlikli bitlerine bağlanması gerekiyor sa, A=PORTD.4, B=PORTD.5, C=PORTD.6 ve D=PORTD.7 şeklinde bağlanmalıdır.

İsis de ekrana 1 adet 4067 yerleştirirsen entegrenin X0-X15 diye adlandırılan giriş veya çıkış pinlerini görürsün.Ayrıca A-B-C-D diye adlandırıan adres pinlerinide görebilirsin. Geriye 2 pin daha kalıyor. Bunlardan X diye adlandırılan pin COM In/Out denilen pin olup verilen adrese uygun olarak bu pin giriş pinlerinden birisine bağlanır.
EN pini ise enable pinidir. Bu pin sayesinde birden fazla 4067 aynı hatta bağlanabilir. Kullanmak istediğinizin enable bacağını (tabloda inh diye adlandırılmış) LOW a çeker diğerlerini HIGH da tutarsanız verilen adresler yalnızca EN bacağı LOW olan entegreyi çalıştırır. Diğerleri off konumunda beklerler.

Belirttiğim bağlantı şekline göre entegreyi buton kontrolü için kullanacak isen X0-X15 pinlerine buton bağlayıp butonların diğer uçlarını GND ye bağlaman ve biraz daha akıllıca davranıp bütün buton pinlerine pullup bağlamak yerine yalnızca X pinine pullup direnci bağlamanız yeterli olacaktır. Zira yalnızca X pini pic pinine bağlı olacak ve o pin Pullup da bekleyecektir. Bir yandan adres girişini değiştirip bir yandan da X pininin LOW olup olup olmadığına bakarak tuşlardan birine basılıp basılmadığını anlamak zor olmasa gerek.
Örnek kontrol kodlarını her iki bağlantı şekline göre aşağıda veriyorum.
Birinci örneğimiz ABCD pinleri PortD de 0-1-2-3 pinlerine bağlı ise ve X pini de PORTB.0 da bağlı ise (giriş pini olmalı)

TUS=255  'kapsam dışı bir değer veriyoruz
For I=0 to 15
PORTD=(PORTD & %11110000)+I
IF PORTB.0=0 THEN TUS=I
Next

bu döngüden çıkıldığında TUS 255 haricinde hangi değeri taşıyor ise basılan tuş numarası odur. Zira I=0 iken PORTB.0=0 ise ilk tuşa basılmış demek olacak ve TUS=0 olacaktır. I=1 iken PORTB.0=0 ise ikinci tuşa basılmış olacak ve TUS=1 değerini alacaktır. Bu döngü sonuna kadar devam edip sonunda basılan tus bu şekilde tespit edilmiş olacaktır.  Döngü sonunda TUS=255 olarak kalmış ise hiç bir tuşa basılmadığı anlaşılacaktır.

Şimdi de ikinci örneğimizi verelim. İkinci örneğimiz ABCD pinleri PortD de 4-5-6-7 pinlerine bağlı ise ve X pini de PORTB.0 da bağlı ise (giriş pini olmalı)

TUS=255
FOR I=0 to 15
PORTD=(PORTD & %00001111)+ (I<<4)'I değerini 4 bit kaydırarak yüksek değerlikli bitlerin pozisyonuna getiriyoruz
IF PORTB.0=0 THEN TUS=I
NEXT

Burada da döngüden çıkınca TUS=255 ise hiç bir tuşa basılmamış demek olacaktır. Tuş, 0-15 arasında bir değer taşıyor ise basılan tuş odur anlamına gelecektir.

Unutma tek 4067 ile çalışıyor ise EN pini sürekli LOW da tutulacaktır. Birden fazla 4067 ile çalışıyor isen yalnızca test edeceğin entegrenin EN bacağını LOW a çekecek diğerlerini HIGH da tutacaksın. Hepsi bu kadar.

Ete

Anlattıklarıma uygun bir örneği ekde veriyorum. Ancak basılan tuşun görülebilmesi amacı ile B portuna 2 ad. BCD ,7 seg. display bağladım. Bu nedenle giriş pinini PORTA.4'e aldım. Değişen bir şey  yok mantık aynı. İnceleyebilirsiniz.


BİDİL

Hocam zahmet etmişsiniz sağ olun
Verdiğiniz örneğe rağmen zor olanı başardım ve beceremedim..

ete

Aşağıdaki kodu dene. Aslında başarmışsın yalnızca ekrana yanlış yerde veriyorsun.

Ete
'@ DEVICE pic16F877
'@ DEVICE pic16F877, WDT_on
'@ DEVICE pic16F877, PWRT_ON
'@ DEVICE pic16F877, PROTECT_OFF
'@ DEVICE pic16F877, XT_OSC
@ __config _XT_OSC  & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _CP_OFF
'****************************LCD TANIMLAMASI***********************************
DEFINE LCD_DREG PORTB 'LCD data bacakları PortB de bağlı
DEFINE LCD_DBIT 0 'LCD data bacakları 1. bitten başlıyor
DEFINE LCD_EREG PORTB 'LCD Enable Bacağı PortB de bağlı
DEFINE LCD_EBIT 5 'LCD Enable Bacağı 3. bite bağlı
DEFINE LCD_RSREG PORTB 'LCD RS Bacağı PortB de bağlı
DEFINE LCD_RSBIT 4 'LCD RAS bacağı 1. Bite bağlı
DEFINE LCD_BITS 4 'LCD 4 bit olarak bağlı
DEFINE LCD_LINES 4 'LCD 4 sıra olarak çalışıyor.

;----------------------------------------------------------------
TRISA=%00000000
TRISB=%10000000
TRISC=%00000000
TRISD=%00000000
PORTD=0
;----------------------------------------------------------------

TUS var byte
I VAR BYTE
Lcdout $FE, 1
PAUSE 200

BASLA:

TUS=255  'kapsam dışı bir değer veriyoruz
For I=0 to 15
  PORTD=(PORTD & %11110000)+I
  IF PORTB.7=0 THEN TUS=I
Next


Lcdout $FE,$C0,"TUS: ",DEC3 TUS
pause 10
GOTO BASLA

BİDİL

Hakkınız var hocam teşekkür ederim. Konuyu ders notlarındaki pdf'lere eklemeniz ayrıca güzel olur kanaatindeyim.
Saygılar.

Powered by EzPortal