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.
