CCS C ile 8255 İle Port Kontrol Uygulaması

pr_01_37_max

8255A yaygın olarak kullanılan, oldukça hızlı, genel amaçlı kullanımlarda karşılaşılacak her duruma uygun özellikleri sağlayan bir entegredir. Esnek, kullanışlı ve ucuz olmasına rağmen, bazı kullanıcılar kullanımını çok karışık bulmaktadır. Bu entegre genel amaçlı paralel Giriş/Çıkış (I/O) cihazıdır ve neredeyse tüm mikroişlemcilerle beraber kullanılabilir. 8255A’nın 24 tane Giriş/Çıkış ucu  vardır. 24 bit giriş çıkış yapılabilmektedir. Bu 24 bit 8 bitlik gruplar halinde gruplanmıştır ve ilk 8 bit A portu, ikinci 8 bit B portu ve üçüncü 8 bit C portu, olarak adlandırılır. C portu ayrıca 4 bitlik iki küçük grup olarak kullanılabilir. (CU ve CL) (Şekil 13). Tüm portların hangi fonksiyonları sağlayacağı kontrol
kaydedicisine (Command register) yazılacak sayı ile belirlenir.
Temel olarak iki mod mevcuttur. Bunlar bit boyutlu işlemler yapmak veya Giriş/Çıkış modlu yani 4-8 bitlik gruplar boyutunda işlemler yapmaktır. Bu ikinci modda kendi içerisinde 3 ayrı işletim moduna ayrılarak incelenir. Bu karmaşık işletim modlarında temel olarak sadece Giriş/Çıkış mod sıfır tercih edilir ve yaygın olarak kullanılır. Diğer modlarda belirli ihtiyaçlara cevap vermek üzere hazırlanmış özel fonksiyonları kolayca elde etmemizi sağlar. Örneğin Giriş/Çıkış Mode1 fonksiyon olarak bir mikroişlemcinin (yazıcı) printer amacı ile de kullanılabilir. Mod2’de ise A port çift yönlü data aktarımı amacıyla kullanılır. C port ise bu haberleşme sistemi içinde karşılıklı onaylama ve diğer gerekli haberleşmeleri içeren tokalaşma (Handshake) sinyallerini sağlar.

Konuyla ilgili daha fazla detayı kitapta bulabilirsiniz. Örnek kodlar ve proteus şeması aşağıdadır.

/******************************************************
 Uygulama Adı : 8255 İle Port Kontrol Uygulaması
*******************************************************/
#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

//***********Denetleyici konfigürasyon ayarları************
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay(clock=4000000) // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor

#use standard_io (a) // A portu için giriş/çıkış yönlendirmesi yapılmasına gerek yok
#use standard_io (b) // B portu için giriş/çıkış yönlendirmesi yapılmasına gerek yok

int data; // Tamsayı tipinde değişken tanımlanıyor

//************** 8255 OKUMA FONKSİYONU ***************
void _8255_yazma (char x, char bilgi)
{
 switch (x)
 {
 case 'k': // Kaydediciye yazma seçilirse
 output_a(0b00001101); // Kaydediciye yazma
 output_b(bilgi); // Yazılacak bilgi gönderiliyor
 break;

 case 'a': // A portuna yazma seçilirse
 output_a(0b00000001); // A portuna yazma
 output_b(bilgi); // Yazılacak bilgi gönderiliyor
 break;

 case 'b': // B portuna yazma seçilirse
 output_a(0b00000101); // B portuna yazma
 output_b(bilgi); // Yazılacak bilgi gönderiliyor
 break;

 case 'c': // C portuna yazma seçilirse
 output_a(0b00001001); // C portuna yazma
 output_b(bilgi); // Yazılacak bilgi gönderiliyor
 break;

 default:
 break;
 }
}

//************** 8255 YAZMA FONKSİYONU ***************
int _8255_okuma (char x)
{
 switch (x)
 {
 case 'k':
 output_a(0b00001110); // Kaydediciden okuma
 return(input_b()); // Kaydedici değeri okunuyor
 break;
 case 'a':
 output_a(0b00000010); // A portundan okuma
 return(input_b()); // A portu değeri okunuyor ve fonksiyondan bu değerle çıkılıyor
 break;
 case 'b':
 output_a(0b00000110); // B portu okuma
 return(input_b()); // B portu değeri okunuyor ve fonksiyondan bu değerle çıkılıyor
 break;
 case 'c':
 output_a(0b00001010); // C portu okuma
 return(input_b()); // C portu değeri okunuyor ve fonksiyondan bu değerle çıkılıyor
 break;
 default:
 break;
 }
}
/********* ANA PROGRAM FONKSİYONU********/

void main ()
{
 setup_psp(PSP_DISABLED); // PSP birimi devre dışı
 setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
 setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
 setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
 setup_adc(ADC_OFF); // ADC birimi devre dışı
 setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
 setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı

 _8255_yazma('k',0b10001001); // A portu çıkış, C portu giriş, B portu çıkış yapılıyor

 while(1) // Sonsuz döngü
 {
 data=(_8255_okuma('c')); // C portu okunuyor
 _8255_yazma('a',data); // A portuna okunan C portu değeri yazılıyor
 }
}

8255 İle Port Kontrol Uygulaması

Bu yazı CCS C Örnekleri kategorisine gönderilmiş ve , , ile etiketlenmiş. Kalıcı bağlantıyı yer imlerinize ekleyin.