NXP ARM7 – 74HC595 sürmek

led_13 Merhaba, Bilindiği gibi çeşitli haberleşme (I2C, SPI, CAN, UART,USB vs) biçimleri vardır. Çoğu uicrocontroller bu haberleşme modüllerine sahiptir. Tabii uicrocontroller arasında mutlaka yetenek farkları vardır. Mesela microchip 8-16 bit’lerde ürünlerinde haberleşme için bit sayısı sabittir( 8 ve/veya 16bit ). NXP LPC serisinde 4-16 bit sayısı seçilebilir özelliktedir. Bu özelliklik hem hız hemde kullanışlılık sağlar. Mesela bazı SPI haberleşmeye sahip IC’ler 9bit ile sürülür. İlkbit genelde Komut/Data veya Read/Write biti olmaktadır. SPI modulunu 9 bite configure ederek 9bitte rahatça haberleşebiliriz.

Aşağıya SPI modulunu kullanmadan 74HC595’in çıkışlarına bağlı ledleri sürmek için bir program yazacağım.
Burada önemli olan bilgi 74HC595 ‘in CMOS olduğu ve 2V-5V aralığında çalışabildiğidir. (LPC2148 3V3 ile çalışır ve çıkış voltajı lojik hi olarak 3V3’tür). LPC2148, 74HC595’in TTL olan versiyonlarınıda (mesela 74HCT595) sürebilir fakat bu IC’ler 3V3 ile beslenemezler.


/*****************************************************************************/
// Aykut ULUSAN, Elektronik Mühendisi, IZMIR
/*****************************************************************************/
#include "lpc214x.h"	// Nxp LPC2148 iin header file
// P0.21 SDA (74hc595 serial data girişine bağlayınız)
// P0.22 SCK (74hc595 serial clock girişine bağlayınız)
// P0.23 LOAD (74hc595 latch girişine bağlayınız)
#define HC595_SDA_LOW		FIO0CLR = 0x00200000   	// Data low
#define HC595_SDA_HIGH 		FIO0SET = 0x00200000	// Data high
#define HC595_SCK_LOW 		FIO0CLR = 0x00400000   	// clock low
#define HC595_SCK_HIGH 		FIO0SET = 0x00400000	// clock high
#define HC595_LOAD_LOW 		FIO0CLR = 0x00800000   	// Load low
#define HC595_LOAD_HIGH 	FIO0SET = 0x00800000	// Load high

void
s_init(){
// Processor clock=5*12Mhz=60Hz
   PLL0CFG=0x24;
// PLLCON ve PLLCFG registerleri ierigi degistirildiginde , asagidaki
// proses uygulanir, 1) PLL0FEED=0xAA ve 2)PLL0FEED=0x55
   PLL0FEED=0xAA;	 	         // Feed process
   PLL0FEED=0x55;
   PLL0CON=0x1;  		          // PLL'i enable	et
   PLL0FEED=0xAA;		         // Feed process
   PLL0FEED=0x55;
   while(!(PLL0STAT & 0x400)) ;  // PLL'i kitle
   PLL0CON=0x3;	 	          // PLL'i clock kaynagi gibi bagla
   PLL0FEED=0xAA;	 	         // Feed process
   PLL0FEED=0x55;
   MAMCR=0x2;	  		  // MAM full Enable
   MAMTIM=0x4;			 // MAM fetch cycles = 4CCLK
   VPBDIV=0x02;	 	          // Peripheral Clock=30Mhz olsun
}

// CCLK=60MHz iken  1ms
void
DLY_MS(long ms){
   long i,j;
   for (i = 0; i < ms; i++ )
      for (j = 0; j < 7500; j++ );
}

void
HC595_WR(unsigned char c){
   unsigned char t;
   for(t=0;t<8;t++){
      HC595_SDA_LOW;		   // default olarak data low
      if(c&0x80)			 // biti test et
       HC595_SDA_HIGH;	   // bit set ise portu set et
      HC595_SCK_HIGH;	   	   // clock puls
      HC595_SCK_LOW;
      c<<=1;				 // sola 1 kez
   }
   HC595_LOAD_HIGH;		   // latch et
   HC595_LOAD_LOW;
}

void
main(void){
   unsigned char c=0;
   s_init();			            // PLL ve MAM ayarlanir
   SCS = 0x03;				// I/O portlar fast mode'da olsun
   FIO0DIR |= 0x00E00000;	          // pin P0.21,P0.22 ve P0.23 ikis
   while (1){	 			  //
      HC595_WR(c++);
      DLY_MS(1000);
   }
};
/*****************************************************************************/

Bu uygulamada 74HC595 entegresi çıkışlarına bağlı 8 led üzerinde bir counter uygulamasını tamamladık.

Yorum ekle

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir