NXP ARM7 – 74HC595 sürmek
|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.