Port Çoğaltma İşlemi
Mikrodenetleyicilerde Port Çoğaltma İşlemi
Bundan önce anlattığımız Pic programlama derslerinde kullandığımız PIC16F877 mikrodenetleyicisinin çoğu uygulamalar için yeterli sayıda giriş/çıkış pini sahip olsa da farklı mikrodenetlyiciler için bu mümkün olmaya bilir. Bazı durumlarda tasarladığımız sistemlerde basit kontrol işlemi için ihtiyacımız olmayan çevresel birimlerimleri içresinde barındıran pahalı mikrodenetleyici yerine bu birimleri içermeyen mikrodenetleyiciler tercih etmek ekonomiktir. Bu bölümde kontrol işlemini normalden daha az pin sayısı ile gerçekleşmesine olanak sağlayan entegrelerden biri üzerinde durulmuştur.
74164 Entegresi
Piyasada çok ekonomik fiyata bulabileceğiniz bir kaymalı kaydedici(shift reister) entegresidir. Bu entegre 8 bitlik bilgi taşır. 8 bitlik bilgiyi seri girişten alıp paralel çıkış hattına gönderir. Aşağıdaki resmi incelediğimiz zaman
- 2 adet bir bitlik seri veri giriş ucuna
- Saat (clock) palsi ucuna
- Temizleme (clear) ucuna
- 8 bitlik paralel veri çıkış ucuna
sahiptir. Saat frekansı 36Mhz olmasına rağmen daha yüksek frekanslarda çalışan entegrelerde mevcuttur.
Çalışma Prensibi
Aşağıda bulunan tabloda 74164 entegresinin fonksiyon tablosu verilmiştir. Tabloda “H,h” harfi lojik-1 (High) “L,l” harfi lojik-0 (Low) “X” harfi ise girişin lojik-1 veya lojik-0 olmasının fark etmeyeceği anlamına gelmektedir. Tabloda bulunanyukarı yönlü ok işareti ise lojik-0 dan lojik-1 geçişi ifade etmektedir. Çıkışlar kısmında bulunan “q0 to q6” veri çıkışlarıdır.
- GND: Toprak
- MR:Reset
- CP: Saat Pasi
- DSA,DSB: Seri data girişleri
- Q0…Q7: Paralel data çıkışları
7414 devresinin çalışma prensibini anlamak için aşağıda verilen resim incelendiğinde entegrenin iç yapısı görüntülenmektedir. 74164 entegresi 8 adet flip-flop içerir. Seri girişten uygulanan ilk bilgi saat sinyalinin düşük seviyeden yüksek seviyeye geçişinde ilk flip-flop çıkışında (Q0) görünür. Saat sinyalinin ikini palsinde bu sefer seri girişteki bilgi yine Q0 flip-flop’una kaydedilir ve Q0 çıkışında görülür. Bu işlemler şekilde devam eder. Böylece seri girişten gelen bilgi her saat sinyali ile bir bit sağa kayarak çıkışında ilk girilen biti ise Q7 kaydedicisinde görülür.
74164 Entegrelerinin Birbiri ile Bağlantısı
Kayan yazı uygulamasında birden fazla 74164 entegresi birbirine ilk entegrenin Q7 çıkışı(13 nolu pin), diğer entegrenin seri girişine (1,2 nolu pinlere) bağlanır. Aşağıda bu bağlantı resmi verilmiştir bağlantılar bu şekilde devam eder.
Pic Programlamada 74164 Entegresi ile Port Çoğaltma Uygulaması
Normalde displayi mikrodenetleyiciye bağladığımız zaman 7 adet çıkışını işgal etmiş durumdaydık aşağıdaki uygulamada 2 adet mikrodenetleyici çıkışı ve 74164 entegre yardımı ile display sürme işlerinini 2 adet çıkış portu ile gerçekleştirilmiştir. Daha önce bu uygulamanın benzerini 7 adet mikrodenetleyici çıkışı kullanarak gerçekleştirmiştik. (buradan ulaşabilirsiniz.)
Uygulamanın kodlarının satır satır incelenmesi aşağıda verilmiştir. Anlamadığınız bir kodu aram bölümüne yazarak o kod ile igili açıklama yazısına ulaşa bilirsiniz. Karakter dizisinin nasıl oluştuğunu öğrenmek için yukarıdaki linke gidebilirsiniz.
(Uygulamanın proteus çizimi ve kodlarına buradan ulaşabilirsiniz.)
#include <16F877.h> #FUSES NOWDT //Watch Dog Timer Kullanma #FUSES XT //Kristal Osilatör ile CLKOUT #FUSES NOPUT //Power Up Timer Kullanma #FUSES NOPROTECT //Rom'a Yazılan Veriler Okunabilir #FUSES NOBROWNOUT //Brownout Reset Kullanma #FUSES NOLVP //Düşük Gerilimler ile Programlamayı Kapt #FUSES NOCPD //Data EEPROM Korumasız #FUSES NOWRT //Program Belleği Yazmaya Açık #FUSES NODEBUG //ICD için Hata Ayıklama Modu Kapalı #use delay(clock=4000000) #use fast_io(b) #define data pin_b0 // data sabiti pin_b0'a eşitlendi #define clock pin_b1 //clock sabiti pin_b1'e eşitlendi int i,j; /* Ortak katot display için rakamlar dizisi*/ int dizi[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x07,0x7F,0x6F}; void main() { setup_psp(PSP_DISABLED); //Paralel Slave Port devre dışı setup_adc_ports(NO_ANALOGS); //Analog sinyal yok setup_adc(ADC_OFF); //Analog Dijital Converter devre dışı setup_timer_1(T1_DISABLED); //Timer1 devre dışı setup_timer_2(T2_DISABLED,0,1); //Timer2 devre dışı setup_CCP1(CCP_OFF); //Capture Compare 1 devre dışı setup_CCP2(CCP_OFF); //Capture Compare 2 devre dışı set_tris_b(0x00); // B portu tümü ile çıkış yapıldı output_b(0x00); // B portu çıkışı program başında sıfırlanıyor while(1) { for(i=0;i<10;i++) // 10 elemanlı dizinin bütün elamanların gezecektir. { for(j=0;j<8;j++) // 0 dan 8. bitine kadar kontrol edilmektedir. { //bit_test(dizi[i],j) ile dizinin i. elemanın j. biti öğrenilmiştir. output_bit(data,bit_test(dizi[i],j)); output_high(clock); // clock 1 output_low(clock); // clock 0 yapılmış ve 1 pulse verilmiştir. /* i=0 da j=0,1,2,3,4,5,6,7 ye sayarken data=pin b0'a bit_test(diz[i],j) komutu ile her pulse'de j dizinin her elamanının her bitini gezecek ve 8. turun her sonunda 74164'e dizinin içinde bir elemanını tamamlamış olacaktır i=10 olduğunda bütün elamanlar yazılmış olur*/ } delay_ms(500); } } }
PIC programlama derslerinin tamamını bu sitede bula bilir miyim?
Elimden geldiğince bu konu ile ilgili bu sitede içerik paylaşmaya çalıştım birçoğunu toplu halde bulabilirsiniz.