C

Pic 16f877 Port Çoğullama

Başlatan caresiz_kaptan, 25 Ocak 2013, 16:05:56

caresiz_kaptan

Merhabalar arkadaşlar,

Pic16f877 ile bir devre yaptım ve gayet güzel çalıştı.  Yaptığım devreyi  biraz daha geliştirmek istiyorum devrede LCD çıkışı, 8 adet dijital çıkış, 1 adet analog çıkış, 2 adet analog giriş ve 5 adet dijital giriş. Eklemek istiyorum. Bunun için port çoğullama devresi kullanmam gerekiyor. Biraz araştırma yaptığımda Serdar Çiçek hocanın kitabında bir çoğullama buldum fakat programında hata var herhalde bir türlü çalışmıyor. Bu entegre ile ilgli kodu yazıcam ve nerede hata olduğunu söylerseniz çok sevinirim. Yardımlarınızı bekliyorum...

Port çoğullama 8255a entegresi ile yapılmıştır...


#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
   }
}


Powered by EzPortal